@memberjunction/ng-explorer-core 6.1.0-edge.3 → 6.1.0-edge.5

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 (38) hide show
  1. package/dist/app-routing.module.d.ts.map +1 -1
  2. package/dist/app-routing.module.js +10 -0
  3. package/dist/app-routing.module.js.map +1 -1
  4. package/dist/generated/lazy-feature-config.d.ts.map +1 -1
  5. package/dist/generated/lazy-feature-config.js +9 -3
  6. package/dist/generated/lazy-feature-config.js.map +1 -1
  7. package/dist/lib/command-palette/command-palette.component.d.ts +13 -0
  8. package/dist/lib/command-palette/command-palette.component.d.ts.map +1 -1
  9. package/dist/lib/command-palette/command-palette.component.js +105 -41
  10. package/dist/lib/command-palette/command-palette.component.js.map +1 -1
  11. package/dist/lib/identity-claims/claim-redeem.component.d.ts +64 -0
  12. package/dist/lib/identity-claims/claim-redeem.component.d.ts.map +1 -0
  13. package/dist/lib/identity-claims/claim-redeem.component.js +276 -0
  14. package/dist/lib/identity-claims/claim-redeem.component.js.map +1 -0
  15. package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts.map +1 -1
  16. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js +13 -12
  17. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js.map +1 -1
  18. package/dist/lib/resource-wrappers/chat-deeplink-params.d.ts +24 -0
  19. package/dist/lib/resource-wrappers/chat-deeplink-params.d.ts.map +1 -0
  20. package/dist/lib/resource-wrappers/chat-deeplink-params.js +27 -0
  21. package/dist/lib/resource-wrappers/chat-deeplink-params.js.map +1 -0
  22. package/dist/lib/resource-wrappers/dashboard-resource.component.d.ts +7 -0
  23. package/dist/lib/resource-wrappers/dashboard-resource.component.d.ts.map +1 -1
  24. package/dist/lib/resource-wrappers/dashboard-resource.component.js +23 -0
  25. package/dist/lib/resource-wrappers/dashboard-resource.component.js.map +1 -1
  26. package/dist/lib/server-connectivity/server-connectivity-banner.component.d.ts +20 -8
  27. package/dist/lib/server-connectivity/server-connectivity-banner.component.d.ts.map +1 -1
  28. package/dist/lib/server-connectivity/server-connectivity-banner.component.js +25 -20
  29. package/dist/lib/server-connectivity/server-connectivity-banner.component.js.map +1 -1
  30. package/dist/lib/shell/shell.component.d.ts +23 -0
  31. package/dist/lib/shell/shell.component.d.ts.map +1 -1
  32. package/dist/lib/shell/shell.component.js +316 -248
  33. package/dist/lib/shell/shell.component.js.map +1 -1
  34. package/dist/module.d.ts +59 -58
  35. package/dist/module.d.ts.map +1 -1
  36. package/dist/module.js +3 -0
  37. package/dist/module.js.map +1 -1
  38. package/package.json +52 -52
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-resource.component.js","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/dashboard-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewContainerRef, ComponentRef, ViewChild, ElementRef, ChangeDetectorRef, inject } from '@angular/core';\nimport { BaseResourceComponent, NavigationService, BaseDashboard, DashboardConfig } from '@memberjunction/ng-shared';\nimport { ResourceData, MJDashboardEntity, DashboardEngine, MJDashboardUserStateEntity, MJDashboardCategoryEntity, MJDashboardPartTypeEntity, DashboardUserPermissions } from '@memberjunction/core-entities';\nimport { RegisterClass, MJGlobal, SafeJSONParse , UUIDsEqual } from '@memberjunction/global';\nimport { Metadata, CompositeKey, RunView, LogError } from '@memberjunction/core';\nimport type { DataExplorerFilter } from '@memberjunction/ng-dashboards/data-explorer-dashboards.module';\nimport type { ShareDialogResult } from '@memberjunction/ng-dashboards/core-dashboards.module';\nimport { DashboardViewerComponent, DashboardNavRequestEvent, PanelInteractionEvent, AddPanelResult, DashboardPanel } from '@memberjunction/ng-dashboard-viewer';\n/**\n * Dashboard Resource Wrapper - displays a single dashboard in a tab\n * Extends BaseResourceComponent to work with the resource type system\n * Dynamically routes between code-based and config-based dashboards based on dashboard type\n */\n@RegisterClass(BaseResourceComponent, 'DashboardResource')\n@Component({\n standalone: false,\n selector: 'mj-dashboard-resource',\n template: `\n <div class=\"dashboard-resource-wrapper\">\n <!-- Error State -->\n @if (errorMessage) {\n <div class=\"error-state\">\n <div class=\"error-icon\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n </div>\n <h2 class=\"error-title\">Unable to Load Dashboard</h2>\n <p class=\"error-message\">{{ errorMessage }}</p>\n @if (errorDetails) {\n <details class=\"error-details\">\n <summary>Technical Details</summary>\n <pre>{{ errorDetails }}</pre>\n </details>\n }\n </div>\n }\n\n <!-- View Mode Toolbar -->\n @if (configDashboard && !isEditMode && !errorMessage) {\n <div class=\"viewer-toolbar\">\n <div class=\"toolbar-left\">\n <span class=\"dashboard-title\">\n <i class=\"fa-solid fa-chart-line\"></i>\n {{ configDashboard.Name }}\n </span>\n @if (!dashboardPermissions.IsOwner && dashboardPermissions.PermissionSource !== 'none') {\n <span class=\"shared-indicator\" title=\"Shared with you\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n </span>\n }\n </div>\n <div class=\"toolbar-actions\">\n @if (dashboardPermissions.CanShare) {\n <button\n class=\"btn-icon\"\n title=\"Share Dashboard\"\n (click)=\"openShareDialog()\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n </button>\n }\n @if (dashboardPermissions.CanEdit) {\n <button\n class=\"btn-icon\"\n title=\"Edit Dashboard\"\n (click)=\"toggleEditMode()\">\n <i class=\"fa-solid fa-edit\"></i>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Edit Mode Toolbar -->\n @if (configDashboard && isEditMode && !errorMessage) {\n <div class=\"viewer-header editing\">\n <div class=\"header-left\">\n <button class=\"btn-add-part\" (click)=\"openAddPartDialog()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Part\n </button>\n <div class=\"header-separator\"></div>\n <div class=\"dashboard-info-edit\">\n <input\n type=\"text\"\n class=\"dashboard-name-input\"\n [(ngModel)]=\"editingName\"\n placeholder=\"Dashboard name\">\n <input\n type=\"text\"\n class=\"dashboard-description-input\"\n [(ngModel)]=\"editingDescription\"\n placeholder=\"Add a description...\">\n </div>\n </div>\n <div class=\"header-right\">\n <button class=\"btn-primary\" (click)=\"saveDashboard()\">\n <i class=\"fa-solid fa-save\"></i>\n Save\n </button>\n <button class=\"btn-cancel\" (click)=\"cancelEdit()\">\n Cancel\n </button>\n </div>\n </div>\n }\n\n <!-- Dashboard Content Container -->\n <div #container class=\"dashboard-resource-container\"></div>\n\n <!-- Share Dashboard Dialog -->\n @if (configDashboard) {\n <mj-dashboard-share-dialog\n [Visible]=\"showShareDialog\"\n [Dashboard]=\"configDashboard\"\n (Result)=\"onShareDialogResult($event)\">\n </mj-dashboard-share-dialog>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n position: relative;\n overflow: hidden;\n }\n .dashboard-resource-wrapper {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n }\n .dashboard-resource-container {\n flex: 1;\n overflow: hidden;\n min-height: 0;\n }\n\n /* View Mode Toolbar */\n .viewer-toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n gap: 16px;\n }\n .viewer-toolbar .toolbar-left {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n .viewer-toolbar .dashboard-title {\n font-size: 16px;\n font-weight: 500;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .viewer-toolbar .dashboard-title i {\n color: var(--mj-brand-primary);\n }\n .shared-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 11px;\n }\n .viewer-toolbar .toolbar-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n /* Edit Mode Header */\n .viewer-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n transition: background 0.2s, border-color 0.2s;\n }\n .viewer-header.editing {\n background: linear-gradient(135deg, color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface)) 0%, color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-bg-surface)) 100%);\n border-bottom: 2px solid var(--mj-brand-primary);\n }\n .viewer-header .header-left {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n }\n .viewer-header .header-right {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n /* Add Part button */\n .btn-add-part {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s, transform 0.1s;\n box-shadow: 0 2px 4px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n }\n .btn-add-part:hover {\n background: var(--mj-brand-primary-hover);\n transform: translateY(-1px);\n box-shadow: 0 3px 6px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n }\n .btn-add-part i { font-size: 12px; }\n\n /* Header separator */\n .header-separator {\n width: 1px;\n height: 28px;\n background: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n margin: 0 4px;\n }\n\n /* Buttons */\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n .btn-primary:hover { background: var(--mj-brand-primary-hover); }\n\n .btn-icon {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n }\n .btn-icon:hover { background: var(--mj-bg-surface-sunken); }\n\n .btn-cancel {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n font-size: 14px;\n cursor: pointer;\n transition: all 0.2s;\n }\n .btn-cancel:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-default);\n color: var(--mj-text-primary);\n }\n\n /* Dashboard info inputs */\n .dashboard-info-edit {\n display: flex;\n align-items: center;\n gap: 16px;\n flex: 1;\n }\n .dashboard-name-input {\n border: 1px solid transparent;\n border-radius: 4px;\n padding: 6px 12px;\n font-size: 16px;\n font-weight: 500;\n color: var(--mj-text-primary);\n background: rgba(255, 255, 255, 0.7);\n outline: none;\n min-width: 200px;\n max-width: 300px;\n transition: border-color 0.2s, background 0.2s, box-shadow 0.2s;\n }\n .dashboard-name-input:hover { background: rgba(255, 255, 255, 0.9); }\n .dashboard-name-input:focus {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n }\n .dashboard-description-input {\n border: 1px solid transparent;\n border-radius: 4px;\n padding: 6px 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n background: rgba(255, 255, 255, 0.5);\n outline: none;\n flex: 1;\n min-width: 150px;\n max-width: 400px;\n transition: border-color 0.2s, background 0.2s, box-shadow 0.2s;\n }\n .dashboard-description-input:hover { background: rgba(255, 255, 255, 0.8); }\n .dashboard-description-input:focus {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n }\n .dashboard-description-input::placeholder {\n color: var(--mj-text-muted);\n font-style: normal;\n }\n\n /* Error state */\n .error-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 40px;\n text-align: center;\n color: var(--mj-text-secondary);\n }\n .error-icon {\n font-size: 64px;\n color: var(--mj-status-error);\n margin-bottom: 24px;\n opacity: 0.8;\n }\n .error-title {\n font-size: 24px;\n font-weight: 500;\n margin: 0 0 12px 0;\n color: var(--mj-text-primary);\n }\n .error-message {\n font-size: 16px;\n color: var(--mj-text-muted);\n margin: 0 0 24px 0;\n max-width: 500px;\n line-height: 1.5;\n }\n .error-details {\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n padding: 12px 16px;\n max-width: 600px;\n text-align: left;\n font-size: 13px;\n }\n .error-details summary {\n cursor: pointer;\n font-weight: 500;\n color: var(--mj-text-muted);\n margin-bottom: 8px;\n }\n .error-details pre {\n margin: 0;\n white-space: pre-wrap;\n word-break: break-word;\n color: var(--mj-status-error-text);\n font-family: 'Consolas', 'Monaco', monospace;\n font-size: 12px;\n }\n\n /* Responsive */\n @media (max-width: 768px) {\n .viewer-header {\n flex-direction: column;\n gap: 12px;\n align-items: stretch;\n }\n .viewer-header .header-left { flex-wrap: wrap; }\n .dashboard-info-edit {\n flex-direction: column;\n align-items: stretch;\n }\n .dashboard-name-input,\n .dashboard-description-input { max-width: none; }\n }\n `]\n})\nexport class DashboardResource extends BaseResourceComponent {\n private componentRef: ComponentRef<unknown> | null = null;\n private dataLoaded = false;\n @ViewChild('container', { static: true }) containerElement!: ElementRef<HTMLDivElement>;\n\n /** Error message to display when dashboard fails to load */\n public errorMessage: string | null = null;\n /** Technical error details (shown in expandable section) */\n public errorDetails: string | null = null;\n\n /** Cached dashboard categories for breadcrumb navigation */\n private categories: MJDashboardCategoryEntity[] = [];\n\n /** Reference to the dashboard viewer component (for config-based dashboards) */\n private viewerInstance: DashboardViewerComponent | null = null;\n\n /** The config-based dashboard entity (null for code-based dashboards) */\n public configDashboard: MJDashboardEntity | null = null;\n\n /** Whether we're in edit mode */\n public isEditMode = false;\n\n /** Editing fields */\n public editingName = '';\n public editingDescription = '';\n\n /** Current user's permissions for this dashboard */\n public dashboardPermissions: DashboardUserPermissions = {\n DashboardID: '',\n CanRead: true,\n CanEdit: true,\n CanDelete: true,\n CanShare: true,\n IsOwner: true,\n PermissionSource: 'owner'\n };\n\n /** Whether the share dialog is visible */\n public showShareDialog = false;\n\n /**\n * Sets the error state with a user-friendly message and optional technical details\n */\n private setError(message: string, error?: unknown): void {\n this.errorMessage = message;\n if (error instanceof Error) {\n this.errorDetails = error.message;\n if (error.stack) {\n this.errorDetails += '\\n\\nStack trace:\\n' + error.stack;\n }\n } else if (error) {\n this.errorDetails = String(error);\n }\n }\n\n /**\n * Clears any previous error state\n */\n private clearError(): void {\n this.errorMessage = null;\n this.errorDetails = null;\n }\n\n constructor(\n private viewContainer: ViewContainerRef,\n private cdr: ChangeDetectorRef\n ) {\n super();\n }\n\n override set Data(value: ResourceData) {\n const previousRecordId = super.Data?.ResourceRecordID;\n super.Data = value;\n\n const newRecordId = value?.ResourceRecordID;\n\n // Load on first set, or when the dashboard has changed\n if (!this.dataLoaded || newRecordId !== previousRecordId) {\n this.dataLoaded = true;\n // Destroy previous component before loading new one\n if (this.componentRef) {\n this.componentRef.destroy();\n this.componentRef = null;\n }\n this.clearError();\n this.configDashboard = null;\n this.viewerInstance = null;\n this.loadDashboard();\n }\n }\n\n // Need to override the getter too in TS otherwise the override to the setter alone above would break things\n override get Data(): ResourceData {\n return super.Data;\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n if (this.componentRef) {\n this.componentRef.destroy();\n }\n }\n\n // ========================================\n // Edit Mode Methods\n // ========================================\n\n /**\n * Toggle between view and edit mode\n */\n public toggleEditMode(): void {\n if (this.isEditMode) {\n this.cancelEdit();\n } else {\n this.enterEditMode();\n }\n }\n\n /**\n * Enter edit mode\n */\n private enterEditMode(): void {\n if (!this.configDashboard) return;\n\n this.isEditMode = true;\n this.editingName = this.configDashboard.Name;\n this.editingDescription = this.configDashboard.Description || '';\n\n // Tell the viewer to enter edit mode\n if (this.viewerInstance) {\n this.viewerInstance.isEditing = true;\n }\n\n this.cdr.detectChanges();\n }\n\n /**\n * Cancel edit mode and discard changes\n */\n public cancelEdit(): void {\n this.isEditMode = false;\n\n // Tell the viewer to exit edit mode\n if (this.viewerInstance) {\n this.viewerInstance.isEditing = false;\n }\n\n this.cdr.detectChanges();\n }\n\n /**\n * Save dashboard changes\n */\n public async saveDashboard(): Promise<void> {\n if (!this.configDashboard || !this.viewerInstance) return;\n\n try {\n // Update dashboard name and description\n this.configDashboard.Name = this.editingName;\n this.configDashboard.Description = this.editingDescription;\n\n // Save via the viewer (which handles layout saving)\n await this.viewerInstance.save();\n\n // Exit edit mode\n this.isEditMode = false;\n this.viewerInstance.isEditing = false;\n\n this.cdr.detectChanges();\n } catch (error) {\n console.error('Error saving dashboard:', error);\n }\n }\n\n /**\n * Open the add panel dialog\n */\n public openAddPartDialog(): void {\n if (this.viewerInstance) {\n // Trigger the viewer's add panel flow\n this.viewerInstance.onAddPanelClick();\n }\n }\n\n /**\n * Open the share dialog for this dashboard\n */\n public openShareDialog(): void {\n this.showShareDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Close the share dialog\n */\n public closeShareDialog(): void {\n this.showShareDialog = false;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle share dialog result\n */\n public onShareDialogResult(result: ShareDialogResult): void {\n this.showShareDialog = false;\n\n if (result.Action === 'save' && this.configDashboard) {\n // Recompute permissions after sharing changes\n const md = this.ProviderToUse;\n this.dashboardPermissions = DashboardEngine.Instance.GetDashboardPermissions(\n this.configDashboard.ID,\n md.CurrentUser.ID\n );\n }\n\n this.cdr.detectChanges();\n }\n\n /**\n * Load the appropriate dashboard component based on dashboard type\n * Routes between code-based dashboards (registered classes) and config-based dashboards\n */\n private async loadDashboard(): Promise<void> {\n // Clear any previous error state\n this.clearError();\n\n const data = this.Data;\n\n if (!data?.ResourceRecordID) {\n this.NotifyLoadStarted();\n this.NotifyLoadComplete();\n return;\n }\n\n this.NotifyLoadStarted();\n\n try {\n // Check if this is a special dashboard type (not a database record)\n const config = data.Configuration || {};\n\n if (config['dashboardType'] === 'DataExplorer' || data.ResourceRecordID === 'DataExplorer') {\n // Special case: Data Explorer dashboard with optional entity filter\n await this.loadDataExplorer(\n config['entityFilter'],\n config['appName'] as string | undefined,\n config['appIcon'] as string | undefined\n );\n return;\n }\n\n await DashboardEngine.Instance.Config(false); // make sure it is configured, if already configured does nothing\n const dashboard = DashboardEngine.Instance.Dashboards.find(d => UUIDsEqual(d.ID, data.ResourceRecordID));\n if (!dashboard) {\n throw new Error(`Dashboard with ID ${data.ResourceRecordID} not found.`);\n }\n\n // Determine which dashboard component to load based on dashboard type\n if (dashboard.Type === 'Code') {\n // CODE-BASED DASHBOARD: Use registered class via DriverClass\n await this.loadCodeBasedDashboard(dashboard);\n } else {\n // CONFIG-BASED DASHBOARD: Use the generic metadata-driven renderer\n await this.loadConfigBasedDashboard(dashboard);\n }\n } catch (error) {\n console.error('Error loading dashboard:', error);\n this.setError('The dashboard could not be loaded. This may be due to a missing component or configuration issue.', error);\n this.NotifyLoadComplete();\n }\n }\n\n /**\n * Load the Data Explorer dashboard component with optional entity filter and context info\n * @param entityFilter Optional filter to constrain which entities are shown\n * @param contextName Optional name to display in the header (e.g., \"CRM\", \"Association Demo\")\n * @param contextIcon Optional Font Awesome icon class for the header\n */\n private async loadDataExplorer(\n entityFilter?: DataExplorerFilter,\n contextName?: string,\n contextIcon?: string\n ): Promise<void> {\n try {\n // Lazy-load the Data Explorer component to keep it out of the initial bundle\n const { DataExplorerDashboardComponent } = await import('@memberjunction/ng-dashboards/data-explorer-dashboards.module');\n this.containerElement.nativeElement.innerHTML = '';\n const componentRef = this.viewContainer.createComponent(DataExplorerDashboardComponent);\n this.componentRef = componentRef;\n const instance = componentRef.instance;\n\n // Set the entity filter - ngOnInit will use this when it runs\n if (entityFilter) {\n instance.entityFilter = entityFilter;\n }\n\n // Set context name and icon for customized header display\n if (contextName) {\n instance.contextName = contextName;\n }\n if (contextIcon) {\n instance.contextIcon = contextIcon;\n }\n\n // Manually append the component's native element inside the div\n const nativeElement = (componentRef.hostView as any).rootNodes[0];\n nativeElement.style.width = '100%';\n nativeElement.style.height = '100%';\n this.containerElement.nativeElement.appendChild(nativeElement);\n\n // Handle open entity record events\n instance.OpenEntityRecord.subscribe((eventData: { EntityName: string; RecordPKey: CompositeKey }) => {\n if (eventData && eventData.EntityName && eventData.RecordPKey) {\n this.navigationService.OpenEntityRecord(eventData.EntityName, eventData.RecordPKey);\n }\n });\n\n // Setup LoadCompleteEvent to know when the dashboard is ready\n instance.LoadCompleteEvent = () => {\n this.NotifyLoadComplete();\n };\n\n // Surface the dashboard's own load failures — but only for the INITIAL load. Wrap the\n // completion hook to learn when the first load has settled, so a later Refresh() that\n // fails does NOT replace an already-rendered Data Explorer with a sticky error card.\n let initialLoadSettled = false;\n const onComplete = instance.LoadCompleteEvent;\n instance.LoadCompleteEvent = () => { initialLoadSettled = true; onComplete?.(); };\n instance.Error.subscribe((err: Error) => {\n if (initialLoadSettled) return; // post-mount refresh failure — already logged by BaseDashboard.runGuardedLoad\n this.setError('The Data Explorer could not be loaded.', err);\n this.cdr.markForCheck();\n });\n\n // Initialize dashboard (no database config needed for DataExplorer)\n const config: DashboardConfig = {\n dashboard: null as unknown as MJDashboardEntity, // No database record\n userState: {}\n };\n instance.Config = config;\n instance.Refresh();\n\n // Trigger change detection to ensure the component updates\n componentRef.changeDetectorRef.detectChanges();\n } catch (error) {\n console.error('Error loading Data Explorer:', error);\n this.setError('The Data Explorer could not be loaded.', error);\n this.NotifyLoadComplete();\n }\n }\n\n /**\n * Load a code-based dashboard by looking up the registered class\n */\n private async loadCodeBasedDashboard(dashboard: MJDashboardEntity): Promise<void> {\n try {\n if (!dashboard.DriverClass) {\n throw new Error(`Dashboard '${dashboard.Name}' is marked as Code type but has no DriverClass specified`);\n }\n\n // Look up the registered class using the DriverClass name (with lazy loading fallback via ClassFactory)\n const classReg = await MJGlobal.Instance.ClassFactory.GetRegistrationAsync(\n BaseDashboard,\n dashboard.DriverClass\n );\n\n if (!classReg?.SubClass) {\n throw new Error(`Dashboard class '${dashboard.DriverClass}' is not registered. Please check the class registration.`);\n }\n\n // Create the component instance\n this.containerElement.nativeElement.innerHTML = '';\n this.componentRef = this.viewContainer.createComponent<BaseDashboard>(classReg.SubClass);\n const instance = this.componentRef.instance as BaseDashboard;\n\n // Setup LoadCompleteEvent() to know when the dashboard is ready\n instance.LoadCompleteEvent = () => {\n this.NotifyLoadComplete();\n };\n\n // Surface the dashboard's own load failures in the host's error card — but only for the\n // INITIAL load. BaseDashboard guarantees the loading screen is released even when\n // initDashboard()/loadData() throws (it emits Error, then NotifyLoadComplete in a\n // finally). Wrap the completion hook to learn when the first load has settled, so a later\n // Refresh() failure keeps the rendered dashboard instead of blanking it to a sticky error\n // card. Wired BEFORE the first await below, so an Error during the instance's own\n // ngOnInit isn't missed.\n let initialLoadSettled = false;\n const onComplete = instance.LoadCompleteEvent;\n instance.LoadCompleteEvent = () => { initialLoadSettled = true; onComplete?.(); };\n instance.Error.subscribe((err: Error) => {\n if (initialLoadSettled) return; // post-mount refresh failure — already logged by BaseDashboard.runGuardedLoad\n this.setError(`The dashboard \"${dashboard.Name}\" could not be loaded.`, err);\n this.cdr.markForCheck();\n });\n\n // Initialize with dashboard data\n const userStateEntity = await this.loadDashboardUserState(dashboard.ID);\n const config: DashboardConfig = {\n dashboard,\n userState: userStateEntity.UserState ? SafeJSONParse(userStateEntity.UserState) : {}\n };\n\n instance.Config = config;\n\n // Manually append the component's native element inside the div\n const nativeElement = (this.componentRef.hostView as any).rootNodes[0];\n nativeElement.style.width = '100%';\n nativeElement.style.height = '100%';\n this.containerElement.nativeElement.appendChild(nativeElement);\n\n // handle open entity record events in MJ Explorer with routing\n instance.OpenEntityRecord.subscribe((data: { EntityName: string; RecordPKey: CompositeKey }) => {\n // check to see if the data has entityname/pkey\n if (data && data.EntityName && data.RecordPKey) {\n // Use NavigationService to open entity record in new tab\n this.navigationService.OpenEntityRecord(data.EntityName, data.RecordPKey);\n } else {\n console.warn('DashboardResource - invalid data, missing EntityName or RecordPKey:', data);\n }\n });\n\n instance.UserStateChanged.subscribe(async (userState: any) => {\n if (!userState) {\n // if the user state is null, we need to remove it from the user state\n userState = {};\n }\n // save the user state to the dashboard user state entity\n userStateEntity.UserState = JSON.stringify(userState);\n if (!await userStateEntity.Save()) {\n LogError('Error saving user state', null, userStateEntity.LatestResult?.CompleteMessage);\n }\n });\n\n instance.Refresh();\n } catch (error) {\n console.error('Error loading code-based dashboard:', error);\n this.setError(`The dashboard \"${dashboard.Name}\" could not be loaded. The dashboard class may not be registered or may have failed to initialize.`, error);\n this.NotifyLoadComplete();\n }\n }\n\n protected async loadDashboardUserState(dashboardId: string): Promise<MJDashboardUserStateEntity> {\n // handle user state changes for the dashboard\n const md = this.ProviderToUse;\n const stateResult = DashboardEngine.Instance.DashboardUserStates.filter(dus => UUIDsEqual(dus.DashboardID, dashboardId) && UUIDsEqual(dus.UserID, md.CurrentUser.ID));\n let stateObject: MJDashboardUserStateEntity;\n if (stateResult && stateResult.length > 0) {\n stateObject = stateResult[0];\n }\n else {\n stateObject = await md.GetEntityObject<MJDashboardUserStateEntity>('MJ: Dashboard User States');\n stateObject.DashboardID = dashboardId;\n stateObject.UserID = md.CurrentUser.ID;\n // don't save becuase we don't care about the state until something changes\n }\n return stateObject;\n }\n\n /**\n * Load a config-based dashboard using the new DashboardViewerComponent (Golden Layout)\n */\n private async loadConfigBasedDashboard(dashboard: MJDashboardEntity): Promise<void> {\n try {\n this.containerElement.nativeElement.innerHTML = '';\n const componentRef = this.viewContainer.createComponent(DashboardViewerComponent);\n this.componentRef = componentRef;\n const instance = componentRef.instance;\n\n // Store references for external toolbar control\n this.viewerInstance = instance;\n this.configDashboard = dashboard;\n\n // Compute user permissions for this dashboard\n const md = this.ProviderToUse;\n this.dashboardPermissions = DashboardEngine.Instance.GetDashboardPermissions(\n dashboard.ID,\n md.CurrentUser.ID\n );\n\n // Manually append the component's native element inside the div\n const nativeElement = (this.componentRef.hostView as any).rootNodes[0];\n nativeElement.style.width = '100%';\n nativeElement.style.height = '100%';\n this.containerElement.nativeElement.appendChild(nativeElement);\n\n // Load categories for breadcrumb navigation (if not already loaded)\n if (this.categories.length === 0) {\n this.categories = DashboardEngine.Instance.DashboardCategories;\n }\n\n // Configure the viewer before assigning the dashboard. The dashboard input\n // starts the layout lifecycle synchronously, so event handlers need to be\n // wired first.\n instance.showToolbar = false; // We provide external toolbar\n instance.showBreadcrumb = false; // Already in its own tab, no breadcrumb needed\n instance.showOpenInTabButton = false; // Already in its own tab\n instance.showEditButton = false; // External toolbar handles edit\n instance.Categories = this.categories;\n\n // Wire up navigation events - handle navigation requests from the dashboard\n instance.navigationRequested.subscribe((event: DashboardNavRequestEvent) => {\n this.handleNavigationRequest(event);\n });\n\n // Wire up \"Open in Tab\" button click\n instance.openInTab.subscribe((event: { dashboardId: string; dashboardName: string }) => {\n this.navigationService.OpenDashboard(event.dashboardId, event.dashboardName);\n });\n\n // Wire up dashboard saved event\n instance.dashboardSaved.subscribe((savedDashboard: MJDashboardEntity) => {\n this.ResourceRecordSaved(savedDashboard);\n });\n\n // Wire up error events\n instance.error.subscribe((errorEvent: { message: string; error?: Error }) => {\n console.error('Dashboard error:', errorEvent.message, errorEvent.error);\n });\n\n // Set the dashboard entity directly on the viewer and wait for Golden Layout\n // to initialize against a real container before clearing the resource loader.\n instance.dashboard = dashboard;\n await instance.waitForLayoutReady();\n this.NotifyLoadComplete();\n this.cdr.detectChanges();\n\n } catch (error) {\n console.error('Error loading config-based dashboard:', error);\n this.setError(`The dashboard \"${dashboard.Name}\" could not be loaded. There may be an issue with the dashboard configuration.`, error);\n this.NotifyLoadComplete();\n }\n }\n\n /**\n * Handle navigation requests from the dashboard viewer\n */\n private handleNavigationRequest(event: DashboardNavRequestEvent): void {\n const request = event.request;\n\n switch (request.type) {\n case 'OpenEntityRecord': {\n const entityRequest = request as { type: 'OpenEntityRecord'; entityName: string; recordId: string };\n // `recordId` is documented as URL-segment format (see OpenEntityRecordNavRequest in\n // @memberjunction/ng-dashboard-viewer). E.g. a single-PK record is `\"ID|11055\"`; a\n // composite-PK record is `\"Field1|Value1||Field2|Value2\"`. Senders in\n // dashboard-viewer (artifact-part, view-part) intentionally call\n // `compositeKey.ToURLSegment()` to produce this shape.\n //\n // Wrapping that string verbatim into `{ FieldName: 'ID', Value: <segment> }` makes\n // ToURLSegment serialize it a second time as `ID|<segment>` and produces a\n // malformed `Field|Field|Value` URL the host parser silently mis-reads (manifesting\n // downstream as `BaseEntity.Load(... Key: ID=ID)` and `Primary Key value is not a\n // valid number`). Parse the segment with `LoadFromURLSegment` against the entity's\n // PK metadata instead, so single-PK and composite-PK both round-trip correctly.\n const md = this.ProviderToUse;\n const entityInfo = md.EntityByName(entityRequest.entityName);\n const pkey = new CompositeKey();\n if (entityInfo) {\n pkey.LoadFromURLSegment(entityInfo, entityRequest.recordId);\n } else {\n // Last-resort fallback when entity metadata isn't resolvable — preserves\n // pre-fix behavior so we don't NRE on an unknown entity name.\n pkey.KeyValuePairs = [{ FieldName: 'ID', Value: entityRequest.recordId }];\n }\n this.navigationService.OpenEntityRecord(entityRequest.entityName, pkey);\n break;\n }\n case 'OpenDashboard': {\n const dashRequest = request as { type: 'OpenDashboard'; dashboardId: string };\n // Load dashboard name from engine cache\n const targetDashboard = DashboardEngine.Instance.Dashboards.find(d => UUIDsEqual(d.ID, dashRequest.dashboardId));\n const name = targetDashboard?.Name || 'Dashboard';\n this.navigationService.OpenDashboard(dashRequest.dashboardId, name);\n break;\n }\n case 'OpenQuery': {\n const queryRequest = request as { type: 'OpenQuery'; queryId: string };\n this.navigationService.OpenQuery(queryRequest.queryId, 'Query');\n break;\n }\n default:\n console.warn('Unhandled navigation request type:', request.type);\n }\n }\n\n /**\n * Get the display name for a dashboard resource\n * Loads the actual dashboard name from the database if available\n */\n override async GetResourceDisplayName(data: ResourceData): Promise<string> {\n try {\n // Try to load dashboard metadata if we have the record ID\n if (data.ResourceRecordID && data.ResourceRecordID.length > 0) {\n const md = this.ProviderToUse;\n const compositeKey = new CompositeKey([{ FieldName: 'ID', Value: data.ResourceRecordID }]);\n const name = await md.GetEntityRecordName('Dashboards', compositeKey);\n if (name) {\n return name;\n }\n }\n } catch (error) {\n // Silently fail and use fallback\n }\n\n // Fallback: use provided name or generic label\n return data.Name || 'Dashboard';\n }\n\n /**\n * Get the icon class for dashboard resources\n */\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-table-columns';\n }\n}\n"]}
1
+ {"version":3,"file":"dashboard-resource.component.js","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/dashboard-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewContainerRef, ComponentRef, ViewChild, ElementRef, ChangeDetectorRef, inject } from '@angular/core';\nimport { BaseResourceComponent, NavigationService, BaseDashboard, DashboardConfig } from '@memberjunction/ng-shared';\nimport { ResourceData, MJDashboardEntity, DashboardEngine, MJDashboardUserStateEntity, MJDashboardCategoryEntity, MJDashboardPartTypeEntity, DashboardUserPermissions } from '@memberjunction/core-entities';\nimport { RegisterClass, MJGlobal, SafeJSONParse , UUIDsEqual } from '@memberjunction/global';\nimport { Metadata, CompositeKey, RunView, LogError } from '@memberjunction/core';\nimport type { DataExplorerFilter } from '@memberjunction/ng-dashboards/data-explorer-dashboards.module';\nimport type { ShareDialogResult } from '@memberjunction/ng-dashboards/core-dashboards.module';\nimport { DashboardViewerComponent, DashboardNavRequestEvent, PanelInteractionEvent, AddPanelResult, DashboardPanel } from '@memberjunction/ng-dashboard-viewer';\n/**\n * Dashboard Resource Wrapper - displays a single dashboard in a tab\n * Extends BaseResourceComponent to work with the resource type system\n * Dynamically routes between code-based and config-based dashboards based on dashboard type\n */\n@RegisterClass(BaseResourceComponent, 'DashboardResource')\n@Component({\n standalone: false,\n selector: 'mj-dashboard-resource',\n template: `\n <div class=\"dashboard-resource-wrapper\">\n <!-- Error State -->\n @if (errorMessage) {\n <div class=\"error-state\">\n <div class=\"error-icon\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n </div>\n <h2 class=\"error-title\">Unable to Load Dashboard</h2>\n <p class=\"error-message\">{{ errorMessage }}</p>\n @if (errorDetails) {\n <details class=\"error-details\">\n <summary>Technical Details</summary>\n <pre>{{ errorDetails }}</pre>\n </details>\n }\n </div>\n }\n\n <!-- View Mode Toolbar -->\n @if (configDashboard && !isEditMode && !errorMessage) {\n <div class=\"viewer-toolbar\">\n <div class=\"toolbar-left\">\n <span class=\"dashboard-title\">\n <i class=\"fa-solid fa-chart-line\"></i>\n {{ configDashboard.Name }}\n </span>\n @if (!dashboardPermissions.IsOwner && dashboardPermissions.PermissionSource !== 'none') {\n <span class=\"shared-indicator\" title=\"Shared with you\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n </span>\n }\n </div>\n <div class=\"toolbar-actions\">\n @if (dashboardPermissions.CanShare) {\n <button\n class=\"btn-icon\"\n title=\"Share Dashboard\"\n (click)=\"openShareDialog()\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n </button>\n }\n @if (dashboardPermissions.CanEdit) {\n <button\n class=\"btn-icon\"\n title=\"Edit Dashboard\"\n (click)=\"toggleEditMode()\">\n <i class=\"fa-solid fa-edit\"></i>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Edit Mode Toolbar -->\n @if (configDashboard && isEditMode && !errorMessage) {\n <div class=\"viewer-header editing\">\n <div class=\"header-left\">\n <button class=\"btn-add-part\" (click)=\"openAddPartDialog()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Part\n </button>\n <div class=\"header-separator\"></div>\n <div class=\"dashboard-info-edit\">\n <input\n type=\"text\"\n class=\"dashboard-name-input\"\n [(ngModel)]=\"editingName\"\n placeholder=\"Dashboard name\">\n <input\n type=\"text\"\n class=\"dashboard-description-input\"\n [(ngModel)]=\"editingDescription\"\n placeholder=\"Add a description...\">\n </div>\n </div>\n <div class=\"header-right\">\n <button class=\"btn-primary\" (click)=\"saveDashboard()\">\n <i class=\"fa-solid fa-save\"></i>\n Save\n </button>\n <button class=\"btn-cancel\" (click)=\"cancelEdit()\">\n Cancel\n </button>\n </div>\n </div>\n }\n\n <!-- Dashboard Content Container -->\n <div #container class=\"dashboard-resource-container\"></div>\n\n <!-- Share Dashboard Dialog -->\n @if (configDashboard) {\n <mj-dashboard-share-dialog\n [Visible]=\"showShareDialog\"\n [Dashboard]=\"configDashboard\"\n (Result)=\"onShareDialogResult($event)\">\n </mj-dashboard-share-dialog>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n position: relative;\n overflow: hidden;\n }\n .dashboard-resource-wrapper {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n }\n .dashboard-resource-container {\n flex: 1;\n overflow: hidden;\n min-height: 0;\n }\n\n /* View Mode Toolbar */\n .viewer-toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n gap: 16px;\n }\n .viewer-toolbar .toolbar-left {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n .viewer-toolbar .dashboard-title {\n font-size: 16px;\n font-weight: 500;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .viewer-toolbar .dashboard-title i {\n color: var(--mj-brand-primary);\n }\n .shared-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 11px;\n }\n .viewer-toolbar .toolbar-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n /* Edit Mode Header */\n .viewer-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n transition: background 0.2s, border-color 0.2s;\n }\n .viewer-header.editing {\n background: linear-gradient(135deg, color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface)) 0%, color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-bg-surface)) 100%);\n border-bottom: 2px solid var(--mj-brand-primary);\n }\n .viewer-header .header-left {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n }\n .viewer-header .header-right {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n /* Add Part button */\n .btn-add-part {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s, transform 0.1s;\n box-shadow: 0 2px 4px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n }\n .btn-add-part:hover {\n background: var(--mj-brand-primary-hover);\n transform: translateY(-1px);\n box-shadow: 0 3px 6px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n }\n .btn-add-part i { font-size: 12px; }\n\n /* Header separator */\n .header-separator {\n width: 1px;\n height: 28px;\n background: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n margin: 0 4px;\n }\n\n /* Buttons */\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n .btn-primary:hover { background: var(--mj-brand-primary-hover); }\n\n .btn-icon {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n }\n .btn-icon:hover { background: var(--mj-bg-surface-sunken); }\n\n .btn-cancel {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n font-size: 14px;\n cursor: pointer;\n transition: all 0.2s;\n }\n .btn-cancel:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-default);\n color: var(--mj-text-primary);\n }\n\n /* Dashboard info inputs */\n .dashboard-info-edit {\n display: flex;\n align-items: center;\n gap: 16px;\n flex: 1;\n }\n .dashboard-name-input {\n border: 1px solid transparent;\n border-radius: 4px;\n padding: 6px 12px;\n font-size: 16px;\n font-weight: 500;\n color: var(--mj-text-primary);\n background: rgba(255, 255, 255, 0.7);\n outline: none;\n min-width: 200px;\n max-width: 300px;\n transition: border-color 0.2s, background 0.2s, box-shadow 0.2s;\n }\n .dashboard-name-input:hover { background: rgba(255, 255, 255, 0.9); }\n .dashboard-name-input:focus {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n }\n .dashboard-description-input {\n border: 1px solid transparent;\n border-radius: 4px;\n padding: 6px 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n background: rgba(255, 255, 255, 0.5);\n outline: none;\n flex: 1;\n min-width: 150px;\n max-width: 400px;\n transition: border-color 0.2s, background 0.2s, box-shadow 0.2s;\n }\n .dashboard-description-input:hover { background: rgba(255, 255, 255, 0.8); }\n .dashboard-description-input:focus {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n }\n .dashboard-description-input::placeholder {\n color: var(--mj-text-muted);\n font-style: normal;\n }\n\n /* Error state */\n .error-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 40px;\n text-align: center;\n color: var(--mj-text-secondary);\n }\n .error-icon {\n font-size: 64px;\n color: var(--mj-status-error);\n margin-bottom: 24px;\n opacity: 0.8;\n }\n .error-title {\n font-size: 24px;\n font-weight: 500;\n margin: 0 0 12px 0;\n color: var(--mj-text-primary);\n }\n .error-message {\n font-size: 16px;\n color: var(--mj-text-muted);\n margin: 0 0 24px 0;\n max-width: 500px;\n line-height: 1.5;\n }\n .error-details {\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n padding: 12px 16px;\n max-width: 600px;\n text-align: left;\n font-size: 13px;\n }\n .error-details summary {\n cursor: pointer;\n font-weight: 500;\n color: var(--mj-text-muted);\n margin-bottom: 8px;\n }\n .error-details pre {\n margin: 0;\n white-space: pre-wrap;\n word-break: break-word;\n color: var(--mj-status-error-text);\n font-family: 'Consolas', 'Monaco', monospace;\n font-size: 12px;\n }\n\n /* Responsive */\n @media (max-width: 768px) {\n .viewer-header {\n flex-direction: column;\n gap: 12px;\n align-items: stretch;\n }\n .viewer-header .header-left { flex-wrap: wrap; }\n .dashboard-info-edit {\n flex-direction: column;\n align-items: stretch;\n }\n .dashboard-name-input,\n .dashboard-description-input { max-width: none; }\n }\n `]\n})\nexport class DashboardResource extends BaseResourceComponent {\n private componentRef: ComponentRef<unknown> | null = null;\n\n /**\n * A cache reattach moves this wrapper to another tab without recreating the dashboard inside it,\n * so the child's tab stamp — taken when we created it — has to move too. Without this the\n * dashboard keeps reading and writing the params of the tab it was born in, from inside a tab it\n * no longer belongs to.\n */\n protected override onTabIdRebound(tabId: string): void {\n this.rehomeChildToTab(this.componentRef?.instance as BaseResourceComponent | undefined, tabId);\n }\n private dataLoaded = false;\n @ViewChild('container', { static: true }) containerElement!: ElementRef<HTMLDivElement>;\n\n /** Error message to display when dashboard fails to load */\n public errorMessage: string | null = null;\n /** Technical error details (shown in expandable section) */\n public errorDetails: string | null = null;\n\n /** Cached dashboard categories for breadcrumb navigation */\n private categories: MJDashboardCategoryEntity[] = [];\n\n /** Reference to the dashboard viewer component (for config-based dashboards) */\n private viewerInstance: DashboardViewerComponent | null = null;\n\n /** The config-based dashboard entity (null for code-based dashboards) */\n public configDashboard: MJDashboardEntity | null = null;\n\n /** Whether we're in edit mode */\n public isEditMode = false;\n\n /** Editing fields */\n public editingName = '';\n public editingDescription = '';\n\n /** Current user's permissions for this dashboard */\n public dashboardPermissions: DashboardUserPermissions = {\n DashboardID: '',\n CanRead: true,\n CanEdit: true,\n CanDelete: true,\n CanShare: true,\n IsOwner: true,\n PermissionSource: 'owner'\n };\n\n /** Whether the share dialog is visible */\n public showShareDialog = false;\n\n /**\n * Sets the error state with a user-friendly message and optional technical details\n */\n private setError(message: string, error?: unknown): void {\n this.errorMessage = message;\n if (error instanceof Error) {\n this.errorDetails = error.message;\n if (error.stack) {\n this.errorDetails += '\\n\\nStack trace:\\n' + error.stack;\n }\n } else if (error) {\n this.errorDetails = String(error);\n }\n }\n\n /**\n * Clears any previous error state\n */\n private clearError(): void {\n this.errorMessage = null;\n this.errorDetails = null;\n }\n\n constructor(\n private viewContainer: ViewContainerRef,\n private cdr: ChangeDetectorRef\n ) {\n super();\n }\n\n override set Data(value: ResourceData) {\n const previousRecordId = super.Data?.ResourceRecordID;\n super.Data = value;\n\n const newRecordId = value?.ResourceRecordID;\n\n // Load on first set, or when the dashboard has changed\n if (!this.dataLoaded || newRecordId !== previousRecordId) {\n this.dataLoaded = true;\n // Destroy previous component before loading new one\n if (this.componentRef) {\n this.componentRef.destroy();\n this.componentRef = null;\n }\n this.clearError();\n this.configDashboard = null;\n this.viewerInstance = null;\n this.loadDashboard();\n }\n }\n\n // Need to override the getter too in TS otherwise the override to the setter alone above would break things\n override get Data(): ResourceData {\n return super.Data;\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n if (this.componentRef) {\n this.componentRef.destroy();\n }\n }\n\n // ========================================\n // Edit Mode Methods\n // ========================================\n\n /**\n * Toggle between view and edit mode\n */\n public toggleEditMode(): void {\n if (this.isEditMode) {\n this.cancelEdit();\n } else {\n this.enterEditMode();\n }\n }\n\n /**\n * Enter edit mode\n */\n private enterEditMode(): void {\n if (!this.configDashboard) return;\n\n this.isEditMode = true;\n this.editingName = this.configDashboard.Name;\n this.editingDescription = this.configDashboard.Description || '';\n\n // Tell the viewer to enter edit mode\n if (this.viewerInstance) {\n this.viewerInstance.isEditing = true;\n }\n\n this.cdr.detectChanges();\n }\n\n /**\n * Cancel edit mode and discard changes\n */\n public cancelEdit(): void {\n this.isEditMode = false;\n\n // Tell the viewer to exit edit mode\n if (this.viewerInstance) {\n this.viewerInstance.isEditing = false;\n }\n\n this.cdr.detectChanges();\n }\n\n /**\n * Save dashboard changes\n */\n public async saveDashboard(): Promise<void> {\n if (!this.configDashboard || !this.viewerInstance) return;\n\n try {\n // Update dashboard name and description\n this.configDashboard.Name = this.editingName;\n this.configDashboard.Description = this.editingDescription;\n\n // Save via the viewer (which handles layout saving)\n await this.viewerInstance.save();\n\n // Exit edit mode\n this.isEditMode = false;\n this.viewerInstance.isEditing = false;\n\n this.cdr.detectChanges();\n } catch (error) {\n console.error('Error saving dashboard:', error);\n }\n }\n\n /**\n * Open the add panel dialog\n */\n public openAddPartDialog(): void {\n if (this.viewerInstance) {\n // Trigger the viewer's add panel flow\n this.viewerInstance.onAddPanelClick();\n }\n }\n\n /**\n * Open the share dialog for this dashboard\n */\n public openShareDialog(): void {\n this.showShareDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Close the share dialog\n */\n public closeShareDialog(): void {\n this.showShareDialog = false;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle share dialog result\n */\n public onShareDialogResult(result: ShareDialogResult): void {\n this.showShareDialog = false;\n\n if (result.Action === 'save' && this.configDashboard) {\n // Recompute permissions after sharing changes\n const md = this.ProviderToUse;\n this.dashboardPermissions = DashboardEngine.Instance.GetDashboardPermissions(\n this.configDashboard.ID,\n md.CurrentUser.ID\n );\n }\n\n this.cdr.detectChanges();\n }\n\n /**\n * Load the appropriate dashboard component based on dashboard type\n * Routes between code-based dashboards (registered classes) and config-based dashboards\n */\n private async loadDashboard(): Promise<void> {\n // Clear any previous error state\n this.clearError();\n\n const data = this.Data;\n\n if (!data?.ResourceRecordID) {\n this.NotifyLoadStarted();\n this.NotifyLoadComplete();\n return;\n }\n\n this.NotifyLoadStarted();\n\n try {\n // Check if this is a special dashboard type (not a database record)\n const config = data.Configuration || {};\n\n if (config['dashboardType'] === 'DataExplorer' || data.ResourceRecordID === 'DataExplorer') {\n // Special case: Data Explorer dashboard with optional entity filter\n await this.loadDataExplorer(\n config['entityFilter'],\n config['appName'] as string | undefined,\n config['appIcon'] as string | undefined\n );\n return;\n }\n\n await DashboardEngine.Instance.Config(false); // make sure it is configured, if already configured does nothing\n const dashboard = DashboardEngine.Instance.Dashboards.find(d => UUIDsEqual(d.ID, data.ResourceRecordID));\n if (!dashboard) {\n throw new Error(`Dashboard with ID ${data.ResourceRecordID} not found.`);\n }\n\n // Determine which dashboard component to load based on dashboard type\n if (dashboard.Type === 'Code') {\n // CODE-BASED DASHBOARD: Use registered class via DriverClass\n await this.loadCodeBasedDashboard(dashboard);\n } else {\n // CONFIG-BASED DASHBOARD: Use the generic metadata-driven renderer\n await this.loadConfigBasedDashboard(dashboard);\n }\n } catch (error) {\n console.error('Error loading dashboard:', error);\n this.setError('The dashboard could not be loaded. This may be due to a missing component or configuration issue.', error);\n this.NotifyLoadComplete();\n }\n }\n\n /**\n * Load the Data Explorer dashboard component with optional entity filter and context info\n * @param entityFilter Optional filter to constrain which entities are shown\n * @param contextName Optional name to display in the header (e.g., \"CRM\", \"Association Demo\")\n * @param contextIcon Optional Font Awesome icon class for the header\n */\n private async loadDataExplorer(\n entityFilter?: DataExplorerFilter,\n contextName?: string,\n contextIcon?: string\n ): Promise<void> {\n try {\n // Lazy-load the Data Explorer component to keep it out of the initial bundle\n const { DataExplorerDashboardComponent } = await import('@memberjunction/ng-dashboards/data-explorer-dashboards.module');\n this.containerElement.nativeElement.innerHTML = '';\n const componentRef = this.viewContainer.createComponent(DataExplorerDashboardComponent);\n this.componentRef = componentRef;\n const instance = componentRef.instance;\n\n // Scope the child's query-param reads/writes to THIS tab. A dashboard we instantiate\n // ourselves has no ResourceData and therefore no tab id of its own; without this it\n // cannot update the URL at all (BaseResourceComponent refuses tab-less writes rather\n // than corrupting whichever tab the user is viewing). Set before any await below —\n // Angular can run the child's ngOnInit, which binds its param subscription, while we\n // are suspended.\n instance.ParentTabId = this.getTabId();\n\n // Set the entity filter - ngOnInit will use this when it runs\n if (entityFilter) {\n instance.entityFilter = entityFilter;\n }\n\n // Set context name and icon for customized header display\n if (contextName) {\n instance.contextName = contextName;\n }\n if (contextIcon) {\n instance.contextIcon = contextIcon;\n }\n\n // Manually append the component's native element inside the div\n const nativeElement = (componentRef.hostView as any).rootNodes[0];\n nativeElement.style.width = '100%';\n nativeElement.style.height = '100%';\n this.containerElement.nativeElement.appendChild(nativeElement);\n\n // Handle open entity record events\n instance.OpenEntityRecord.subscribe((eventData: { EntityName: string; RecordPKey: CompositeKey }) => {\n if (eventData && eventData.EntityName && eventData.RecordPKey) {\n this.navigationService.OpenEntityRecord(eventData.EntityName, eventData.RecordPKey);\n }\n });\n\n // Setup LoadCompleteEvent to know when the dashboard is ready\n instance.LoadCompleteEvent = () => {\n this.NotifyLoadComplete();\n };\n\n // Surface the dashboard's own load failures — but only for the INITIAL load. Wrap the\n // completion hook to learn when the first load has settled, so a later Refresh() that\n // fails does NOT replace an already-rendered Data Explorer with a sticky error card.\n let initialLoadSettled = false;\n const onComplete = instance.LoadCompleteEvent;\n instance.LoadCompleteEvent = () => { initialLoadSettled = true; onComplete?.(); };\n instance.Error.subscribe((err: Error) => {\n if (initialLoadSettled) return; // post-mount refresh failure — already logged by BaseDashboard.runGuardedLoad\n this.setError('The Data Explorer could not be loaded.', err);\n this.cdr.markForCheck();\n });\n\n // Initialize dashboard (no database config needed for DataExplorer)\n const config: DashboardConfig = {\n dashboard: null as unknown as MJDashboardEntity, // No database record\n userState: {}\n };\n instance.Config = config;\n instance.Refresh();\n\n // Trigger change detection to ensure the component updates\n componentRef.changeDetectorRef.detectChanges();\n } catch (error) {\n console.error('Error loading Data Explorer:', error);\n this.setError('The Data Explorer could not be loaded.', error);\n this.NotifyLoadComplete();\n }\n }\n\n /**\n * Load a code-based dashboard by looking up the registered class\n */\n private async loadCodeBasedDashboard(dashboard: MJDashboardEntity): Promise<void> {\n try {\n if (!dashboard.DriverClass) {\n throw new Error(`Dashboard '${dashboard.Name}' is marked as Code type but has no DriverClass specified`);\n }\n\n // Look up the registered class using the DriverClass name (with lazy loading fallback via ClassFactory)\n const classReg = await MJGlobal.Instance.ClassFactory.GetRegistrationAsync(\n BaseDashboard,\n dashboard.DriverClass\n );\n\n if (!classReg?.SubClass) {\n throw new Error(`Dashboard class '${dashboard.DriverClass}' is not registered. Please check the class registration.`);\n }\n\n // Create the component instance\n this.containerElement.nativeElement.innerHTML = '';\n this.componentRef = this.viewContainer.createComponent<BaseDashboard>(classReg.SubClass);\n const instance = this.componentRef.instance as BaseDashboard;\n\n // Scope the child's query-param reads/writes to THIS tab. Code dashboards resolved via\n // ClassFactory (every Open App dashboard, MCPDashboard, DataExplorer) get no\n // ResourceData and so have no tab id of their own; without this their UpdateQueryParams\n // calls are refused (and previously — worse — landed in whatever tab the user happened\n // to be looking at). Set before the awaits below: Angular can run the child's ngOnInit,\n // which binds its param subscription, while we are suspended.\n instance.ParentTabId = this.getTabId();\n\n // Setup LoadCompleteEvent() to know when the dashboard is ready\n instance.LoadCompleteEvent = () => {\n this.NotifyLoadComplete();\n };\n\n // Surface the dashboard's own load failures in the host's error card — but only for the\n // INITIAL load. BaseDashboard guarantees the loading screen is released even when\n // initDashboard()/loadData() throws (it emits Error, then NotifyLoadComplete in a\n // finally). Wrap the completion hook to learn when the first load has settled, so a later\n // Refresh() failure keeps the rendered dashboard instead of blanking it to a sticky error\n // card. Wired BEFORE the first await below, so an Error during the instance's own\n // ngOnInit isn't missed.\n let initialLoadSettled = false;\n const onComplete = instance.LoadCompleteEvent;\n instance.LoadCompleteEvent = () => { initialLoadSettled = true; onComplete?.(); };\n instance.Error.subscribe((err: Error) => {\n if (initialLoadSettled) return; // post-mount refresh failure — already logged by BaseDashboard.runGuardedLoad\n this.setError(`The dashboard \"${dashboard.Name}\" could not be loaded.`, err);\n this.cdr.markForCheck();\n });\n\n // Initialize with dashboard data\n const userStateEntity = await this.loadDashboardUserState(dashboard.ID);\n const config: DashboardConfig = {\n dashboard,\n userState: userStateEntity.UserState ? SafeJSONParse(userStateEntity.UserState) : {}\n };\n\n instance.Config = config;\n\n // Manually append the component's native element inside the div\n const nativeElement = (this.componentRef.hostView as any).rootNodes[0];\n nativeElement.style.width = '100%';\n nativeElement.style.height = '100%';\n this.containerElement.nativeElement.appendChild(nativeElement);\n\n // handle open entity record events in MJ Explorer with routing\n instance.OpenEntityRecord.subscribe((data: { EntityName: string; RecordPKey: CompositeKey }) => {\n // check to see if the data has entityname/pkey\n if (data && data.EntityName && data.RecordPKey) {\n // Use NavigationService to open entity record in new tab\n this.navigationService.OpenEntityRecord(data.EntityName, data.RecordPKey);\n } else {\n console.warn('DashboardResource - invalid data, missing EntityName or RecordPKey:', data);\n }\n });\n\n instance.UserStateChanged.subscribe(async (userState: any) => {\n if (!userState) {\n // if the user state is null, we need to remove it from the user state\n userState = {};\n }\n // save the user state to the dashboard user state entity\n userStateEntity.UserState = JSON.stringify(userState);\n if (!await userStateEntity.Save()) {\n LogError('Error saving user state', null, userStateEntity.LatestResult?.CompleteMessage);\n }\n });\n\n instance.Refresh();\n } catch (error) {\n console.error('Error loading code-based dashboard:', error);\n this.setError(`The dashboard \"${dashboard.Name}\" could not be loaded. The dashboard class may not be registered or may have failed to initialize.`, error);\n this.NotifyLoadComplete();\n }\n }\n\n protected async loadDashboardUserState(dashboardId: string): Promise<MJDashboardUserStateEntity> {\n // handle user state changes for the dashboard\n const md = this.ProviderToUse;\n const stateResult = DashboardEngine.Instance.DashboardUserStates.filter(dus => UUIDsEqual(dus.DashboardID, dashboardId) && UUIDsEqual(dus.UserID, md.CurrentUser.ID));\n let stateObject: MJDashboardUserStateEntity;\n if (stateResult && stateResult.length > 0) {\n stateObject = stateResult[0];\n }\n else {\n stateObject = await md.GetEntityObject<MJDashboardUserStateEntity>('MJ: Dashboard User States');\n stateObject.DashboardID = dashboardId;\n stateObject.UserID = md.CurrentUser.ID;\n // don't save becuase we don't care about the state until something changes\n }\n return stateObject;\n }\n\n /**\n * Load a config-based dashboard using the new DashboardViewerComponent (Golden Layout)\n */\n private async loadConfigBasedDashboard(dashboard: MJDashboardEntity): Promise<void> {\n try {\n this.containerElement.nativeElement.innerHTML = '';\n const componentRef = this.viewContainer.createComponent(DashboardViewerComponent);\n this.componentRef = componentRef;\n const instance = componentRef.instance;\n\n // Store references for external toolbar control\n this.viewerInstance = instance;\n this.configDashboard = dashboard;\n\n // Compute user permissions for this dashboard\n const md = this.ProviderToUse;\n this.dashboardPermissions = DashboardEngine.Instance.GetDashboardPermissions(\n dashboard.ID,\n md.CurrentUser.ID\n );\n\n // Manually append the component's native element inside the div\n const nativeElement = (this.componentRef.hostView as any).rootNodes[0];\n nativeElement.style.width = '100%';\n nativeElement.style.height = '100%';\n this.containerElement.nativeElement.appendChild(nativeElement);\n\n // Load categories for breadcrumb navigation (if not already loaded)\n if (this.categories.length === 0) {\n this.categories = DashboardEngine.Instance.DashboardCategories;\n }\n\n // Configure the viewer before assigning the dashboard. The dashboard input\n // starts the layout lifecycle synchronously, so event handlers need to be\n // wired first.\n instance.showToolbar = false; // We provide external toolbar\n instance.showBreadcrumb = false; // Already in its own tab, no breadcrumb needed\n instance.showOpenInTabButton = false; // Already in its own tab\n instance.showEditButton = false; // External toolbar handles edit\n instance.Categories = this.categories;\n\n // Wire up navigation events - handle navigation requests from the dashboard\n instance.navigationRequested.subscribe((event: DashboardNavRequestEvent) => {\n this.handleNavigationRequest(event);\n });\n\n // Wire up \"Open in Tab\" button click\n instance.openInTab.subscribe((event: { dashboardId: string; dashboardName: string }) => {\n this.navigationService.OpenDashboard(event.dashboardId, event.dashboardName);\n });\n\n // Wire up dashboard saved event\n instance.dashboardSaved.subscribe((savedDashboard: MJDashboardEntity) => {\n this.ResourceRecordSaved(savedDashboard);\n });\n\n // Wire up error events\n instance.error.subscribe((errorEvent: { message: string; error?: Error }) => {\n console.error('Dashboard error:', errorEvent.message, errorEvent.error);\n });\n\n // Set the dashboard entity directly on the viewer and wait for Golden Layout\n // to initialize against a real container before clearing the resource loader.\n instance.dashboard = dashboard;\n await instance.waitForLayoutReady();\n this.NotifyLoadComplete();\n this.cdr.detectChanges();\n\n } catch (error) {\n console.error('Error loading config-based dashboard:', error);\n this.setError(`The dashboard \"${dashboard.Name}\" could not be loaded. There may be an issue with the dashboard configuration.`, error);\n this.NotifyLoadComplete();\n }\n }\n\n /**\n * Handle navigation requests from the dashboard viewer\n */\n private handleNavigationRequest(event: DashboardNavRequestEvent): void {\n const request = event.request;\n\n switch (request.type) {\n case 'OpenEntityRecord': {\n const entityRequest = request as { type: 'OpenEntityRecord'; entityName: string; recordId: string };\n // `recordId` is documented as URL-segment format (see OpenEntityRecordNavRequest in\n // @memberjunction/ng-dashboard-viewer). E.g. a single-PK record is `\"ID|11055\"`; a\n // composite-PK record is `\"Field1|Value1||Field2|Value2\"`. Senders in\n // dashboard-viewer (artifact-part, view-part) intentionally call\n // `compositeKey.ToURLSegment()` to produce this shape.\n //\n // Wrapping that string verbatim into `{ FieldName: 'ID', Value: <segment> }` makes\n // ToURLSegment serialize it a second time as `ID|<segment>` and produces a\n // malformed `Field|Field|Value` URL the host parser silently mis-reads (manifesting\n // downstream as `BaseEntity.Load(... Key: ID=ID)` and `Primary Key value is not a\n // valid number`). Parse the segment with `LoadFromURLSegment` against the entity's\n // PK metadata instead, so single-PK and composite-PK both round-trip correctly.\n const md = this.ProviderToUse;\n const entityInfo = md.EntityByName(entityRequest.entityName);\n const pkey = new CompositeKey();\n if (entityInfo) {\n pkey.LoadFromURLSegment(entityInfo, entityRequest.recordId);\n } else {\n // Last-resort fallback when entity metadata isn't resolvable — preserves\n // pre-fix behavior so we don't NRE on an unknown entity name.\n pkey.KeyValuePairs = [{ FieldName: 'ID', Value: entityRequest.recordId }];\n }\n this.navigationService.OpenEntityRecord(entityRequest.entityName, pkey);\n break;\n }\n case 'OpenDashboard': {\n const dashRequest = request as { type: 'OpenDashboard'; dashboardId: string };\n // Load dashboard name from engine cache\n const targetDashboard = DashboardEngine.Instance.Dashboards.find(d => UUIDsEqual(d.ID, dashRequest.dashboardId));\n const name = targetDashboard?.Name || 'Dashboard';\n this.navigationService.OpenDashboard(dashRequest.dashboardId, name);\n break;\n }\n case 'OpenQuery': {\n const queryRequest = request as { type: 'OpenQuery'; queryId: string };\n this.navigationService.OpenQuery(queryRequest.queryId, 'Query');\n break;\n }\n default:\n console.warn('Unhandled navigation request type:', request.type);\n }\n }\n\n /**\n * Get the display name for a dashboard resource\n * Loads the actual dashboard name from the database if available\n */\n override async GetResourceDisplayName(data: ResourceData): Promise<string> {\n try {\n // Try to load dashboard metadata if we have the record ID\n if (data.ResourceRecordID && data.ResourceRecordID.length > 0) {\n const md = this.ProviderToUse;\n const compositeKey = new CompositeKey([{ FieldName: 'ID', Value: data.ResourceRecordID }]);\n const name = await md.GetEntityRecordName('Dashboards', compositeKey);\n if (name) {\n return name;\n }\n }\n } catch (error) {\n // Silently fail and use fallback\n }\n\n // Fallback: use provided name or generic label\n return data.Name || 'Dashboard';\n }\n\n /**\n * Get the icon class for dashboard resources\n */\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-table-columns';\n }\n}\n"]}
@@ -1,19 +1,31 @@
1
- import { OnInit, OnDestroy } from '@angular/core';
1
+ import { OnDestroy } from '@angular/core';
2
2
  import { AnimationEvent } from '@angular/animations';
3
- import { ServerConnectivityService } from '../services/server-connectivity.service';
4
3
  import * as i0 from "@angular/core";
5
4
  /**
6
5
  * When visible, this banner sets --mj-connectivity-banner-height on <html>
7
6
  * so that any position:fixed element referencing the shell header offset
8
7
  * (e.g. app-switcher mobile dropdown) can account for the banner.
9
8
  */
10
- export declare class ServerConnectivityBannerComponent implements OnInit, OnDestroy {
11
- private connectivityService;
9
+ export declare class ServerConnectivityBannerComponent implements OnDestroy {
12
10
  private static readonly CSS_VAR;
13
- IsConnected: boolean;
14
- private subscription;
15
- constructor(connectivityService: ServerConnectivityService);
16
- ngOnInit(): void;
11
+ private readonly connectivityService;
12
+ /**
13
+ * Connectivity state as a **signal**, not a plain property — and that distinction is the
14
+ * whole point of this shape.
15
+ *
16
+ * The socket state that feeds `IsConnected$` is reported by graphql-ws, which can announce
17
+ * a drop from a callback that lands *inside* an in-flight change-detection pass (during app
18
+ * startup this reliably happens after the banner's own view has been checked). Assigning a
19
+ * plain property there mutates state the `@if` was already evaluated against, so dev-mode
20
+ * check-no-changes reports `NG0100 ... Previous value: '-1'` — `-1` being the `@if` branch
21
+ * index for "no branch rendered". Reading a signal from the template instead registers the
22
+ * view as its consumer, so a write marks the view dirty and Angular re-refreshes it within
23
+ * the same pass; the DOM and the expression can no longer disagree.
24
+ *
25
+ * `toSignal` also owns the subscription lifetime via `DestroyRef`, so there is no manual
26
+ * `Subscription` to unsubscribe.
27
+ */
28
+ readonly IsConnected: import("@angular/core").Signal<boolean>;
17
29
  ngOnDestroy(): void;
18
30
  /** After the enter/leave animation finishes, publish the banner height as a CSS custom property */
19
31
  OnAnimationDone(event: AnimationEvent): void;
@@ -1 +1 @@
1
- {"version":3,"file":"server-connectivity-banner.component.d.ts","sourceRoot":"","sources":["../../../src/lib/server-connectivity/server-connectivity-banner.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAuC,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1F,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;;AAEpF;;;;GAIG;AACH,qBA0Da,iCAAkC,YAAW,MAAM,EAAE,SAAS;IAM7D,OAAO,CAAC,mBAAmB;IALvC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAE7D,WAAW,UAAQ;IAC1B,OAAO,CAAC,YAAY,CAA2B;gBAE3B,mBAAmB,EAAE,yBAAyB;IAElE,QAAQ,IAAI,IAAI;IAMhB,WAAW,IAAI,IAAI;IAOnB,mGAAmG;IACnG,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAS5C,OAAO,CAAC,eAAe;yCA/BZ,iCAAiC;2CAAjC,iCAAiC;CAqC7C"}
1
+ {"version":3,"file":"server-connectivity-banner.component.d.ts","sourceRoot":"","sources":["../../../src/lib/server-connectivity/server-connectivity-banner.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,SAAS,EAAU,MAAM,eAAe,CAAC;AAE7D,OAAO,EAAuC,cAAc,EAAE,MAAM,qBAAqB,CAAC;;AAG1F;;;;GAIG;AACH,qBA0Da,iCAAkC,YAAW,SAAS;IACjE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAEpE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAqC;IAEzE;;;;;;;;;;;;;;;OAeG;IACH,SAAgB,WAAW,0CAA2E;IAEtG,WAAW,IAAI,IAAI;IAInB,mGAAmG;IACnG,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAS5C,OAAO,CAAC,eAAe;yCArCZ,iCAAiC;2CAAjC,iCAAiC;CA2C7C"}
@@ -1,7 +1,8 @@
1
- import { Component } from '@angular/core';
1
+ import { Component, inject } from '@angular/core';
2
+ import { toSignal } from '@angular/core/rxjs-interop';
2
3
  import { trigger, transition, style, animate } from '@angular/animations';
4
+ import { ServerConnectivityService } from '../services/server-connectivity.service';
3
5
  import * as i0 from "@angular/core";
4
- import * as i1 from "../services/server-connectivity.service";
5
6
  function ServerConnectivityBannerComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
6
7
  const _r1 = i0.ɵɵgetCurrentView();
7
8
  i0.ɵɵdomElementStart(0, "div", 0);
@@ -19,22 +20,26 @@ function ServerConnectivityBannerComponent_Conditional_0_Template(rf, ctx) { if
19
20
  * (e.g. app-switcher mobile dropdown) can account for the banner.
20
21
  */
21
22
  export class ServerConnectivityBannerComponent {
22
- connectivityService;
23
23
  static CSS_VAR = '--mj-connectivity-banner-height';
24
- IsConnected = true;
25
- subscription;
26
- constructor(connectivityService) {
27
- this.connectivityService = connectivityService;
28
- }
29
- ngOnInit() {
30
- this.subscription = this.connectivityService.IsConnected$.subscribe(connected => {
31
- this.IsConnected = connected;
32
- });
33
- }
24
+ connectivityService = inject(ServerConnectivityService);
25
+ /**
26
+ * Connectivity state as a **signal**, not a plain property — and that distinction is the
27
+ * whole point of this shape.
28
+ *
29
+ * The socket state that feeds `IsConnected$` is reported by graphql-ws, which can announce
30
+ * a drop from a callback that lands *inside* an in-flight change-detection pass (during app
31
+ * startup this reliably happens after the banner's own view has been checked). Assigning a
32
+ * plain property there mutates state the `@if` was already evaluated against, so dev-mode
33
+ * check-no-changes reports `NG0100 ... Previous value: '-1'` — `-1` being the `@if` branch
34
+ * index for "no branch rendered". Reading a signal from the template instead registers the
35
+ * view as its consumer, so a write marks the view dirty and Angular re-refreshes it within
36
+ * the same pass; the DOM and the expression can no longer disagree.
37
+ *
38
+ * `toSignal` also owns the subscription lifetime via `DestroyRef`, so there is no manual
39
+ * `Subscription` to unsubscribe.
40
+ */
41
+ IsConnected = toSignal(this.connectivityService.IsConnected$, { initialValue: true });
34
42
  ngOnDestroy() {
35
- if (this.subscription) {
36
- this.subscription.unsubscribe();
37
- }
38
43
  this.setBannerHeight(0);
39
44
  }
40
45
  /** After the enter/leave animation finishes, publish the banner height as a CSS custom property */
@@ -50,11 +55,11 @@ export class ServerConnectivityBannerComponent {
50
55
  setBannerHeight(px) {
51
56
  document.documentElement.style.setProperty(ServerConnectivityBannerComponent.CSS_VAR, `${px}px`);
52
57
  }
53
- static ɵfac = function ServerConnectivityBannerComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ServerConnectivityBannerComponent)(i0.ɵɵdirectiveInject(i1.ServerConnectivityService)); };
58
+ static ɵfac = function ServerConnectivityBannerComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ServerConnectivityBannerComponent)(); };
54
59
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ServerConnectivityBannerComponent, selectors: [["mj-server-connectivity-banner"]], decls: 1, vars: 1, consts: [[1, "connectivity-banner"], [1, "fa-solid", "fa-triangle-exclamation"]], template: function ServerConnectivityBannerComponent_Template(rf, ctx) { if (rf & 1) {
55
60
  i0.ɵɵconditionalCreate(0, ServerConnectivityBannerComponent_Conditional_0_Template, 4, 1, "div", 0);
56
61
  } if (rf & 2) {
57
- i0.ɵɵconditional(!ctx.IsConnected ? 0 : -1);
62
+ i0.ɵɵconditional(!ctx.IsConnected() ? 0 : -1);
58
63
  } }, styles: ["[_nghost-%COMP%] {\n flex-shrink: 0;\n width: 100%;\n }\n\n .connectivity-banner[_ngcontent-%COMP%] {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n border-bottom: 2px solid var(--mj-status-warning-border);\n padding: 8px 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 500;\n }\n\n .connectivity-banner[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n flex-shrink: 0;\n }\n\n .connectivity-banner[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n text-align: center;\n }\n\n @media (max-width: 480px) {\n .connectivity-banner[_ngcontent-%COMP%] {\n padding: 6px 12px;\n font-size: 13px;\n }\n }"], data: { animation: [
59
64
  trigger('slideDown', [
60
65
  transition(':enter', [
@@ -80,13 +85,13 @@ export class ServerConnectivityBannerComponent {
80
85
  ])
81
86
  ])
82
87
  ], template: `
83
- @if (!IsConnected) {
88
+ @if (!IsConnected()) {
84
89
  <div class="connectivity-banner" @slideDown (@slideDown.done)="OnAnimationDone($event)">
85
90
  <i class="fa-solid fa-triangle-exclamation"></i>
86
91
  <span>Server unavailable &mdash; viewing cached data. Some features may not work.</span>
87
92
  </div>
88
93
  }
89
94
  `, styles: ["\n :host {\n flex-shrink: 0;\n width: 100%;\n }\n\n .connectivity-banner {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n border-bottom: 2px solid var(--mj-status-warning-border);\n padding: 8px 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 500;\n }\n\n .connectivity-banner i {\n font-size: 16px;\n flex-shrink: 0;\n }\n\n .connectivity-banner span {\n text-align: center;\n }\n\n @media (max-width: 480px) {\n .connectivity-banner {\n padding: 6px 12px;\n font-size: 13px;\n }\n }\n "] }]
90
- }], () => [{ type: i1.ServerConnectivityService }], null); })();
95
+ }], null, null); })();
91
96
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ServerConnectivityBannerComponent, { className: "ServerConnectivityBannerComponent", filePath: "src/lib/server-connectivity/server-connectivity-banner.component.ts", lineNumber: 69 }); })();
92
97
  //# sourceMappingURL=server-connectivity-banner.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server-connectivity-banner.component.js","sourceRoot":"","sources":["../../../src/lib/server-connectivity/server-connectivity-banner.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy } from '@angular/core';\nimport { trigger, transition, style, animate, AnimationEvent } from '@angular/animations';\nimport { Subscription } from 'rxjs';\nimport { ServerConnectivityService } from '../services/server-connectivity.service';\n\n/**\n * When visible, this banner sets --mj-connectivity-banner-height on <html>\n * so that any position:fixed element referencing the shell header offset\n * (e.g. app-switcher mobile dropdown) can account for the banner.\n */\n@Component({\n selector: 'mj-server-connectivity-banner',\n standalone: true,\n animations: [\n trigger('slideDown', [\n transition(':enter', [\n style({ height: 0, opacity: 0, overflow: 'hidden' }),\n animate('300ms ease-out', style({ height: '*', opacity: 1 }))\n ]),\n transition(':leave', [\n animate('200ms ease-in', style({ height: 0, opacity: 0, overflow: 'hidden' }))\n ])\n ])\n ],\n template: `\n @if (!IsConnected) {\n <div class=\"connectivity-banner\" @slideDown (@slideDown.done)=\"OnAnimationDone($event)\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>Server unavailable &mdash; viewing cached data. Some features may not work.</span>\n </div>\n }\n `,\n styles: [`\n :host {\n flex-shrink: 0;\n width: 100%;\n }\n\n .connectivity-banner {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n border-bottom: 2px solid var(--mj-status-warning-border);\n padding: 8px 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 500;\n }\n\n .connectivity-banner i {\n font-size: 16px;\n flex-shrink: 0;\n }\n\n .connectivity-banner span {\n text-align: center;\n }\n\n @media (max-width: 480px) {\n .connectivity-banner {\n padding: 6px 12px;\n font-size: 13px;\n }\n }\n `]\n})\nexport class ServerConnectivityBannerComponent implements OnInit, OnDestroy {\n private static readonly CSS_VAR = '--mj-connectivity-banner-height';\n\n public IsConnected = true;\n private subscription: Subscription | undefined;\n\n constructor(private connectivityService: ServerConnectivityService) {}\n\n ngOnInit(): void {\n this.subscription = this.connectivityService.IsConnected$.subscribe(connected => {\n this.IsConnected = connected;\n });\n }\n\n ngOnDestroy(): void {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n this.setBannerHeight(0);\n }\n\n /** After the enter/leave animation finishes, publish the banner height as a CSS custom property */\n OnAnimationDone(event: AnimationEvent): void {\n if (event.toState === 'void') {\n this.setBannerHeight(0);\n } else {\n const height = (event.element as HTMLElement).offsetHeight;\n this.setBannerHeight(height);\n }\n }\n\n private setBannerHeight(px: number): void {\n document.documentElement.style.setProperty(\n ServerConnectivityBannerComponent.CSS_VAR,\n `${px}px`\n );\n }\n}\n"]}
1
+ {"version":3,"file":"server-connectivity-banner.component.js","sourceRoot":"","sources":["../../../src/lib/server-connectivity/server-connectivity-banner.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAa,MAAM,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAkB,MAAM,qBAAqB,CAAC;AAC1F,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;;;;IAuB9E,iCAAwF;IAA5C,qOAAmB,8BAAuB,KAAC;IACrF,0BAAgD;IAChD,+BAAM;IAAA,0FAA2E;IACnF,AADmF,oBAAO,EACpF;;IAH2B,sCAAU;;AArBjD;;;;GAIG;AA2DH,MAAM,OAAO,iCAAiC;IACpC,MAAM,CAAU,OAAO,GAAG,iCAAiC,CAAC;IAEnD,mBAAmB,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAC;IAEzE;;;;;;;;;;;;;;;OAeG;IACa,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtG,WAAW;QACT,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IAED,mGAAmG;IACnG,eAAe,CAAC,KAAqB;QACnC,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;YAC7B,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAI,KAAK,CAAC,OAAuB,CAAC,YAAY,CAAC;YAC3D,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,EAAU;QAChC,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CACxC,iCAAiC,CAAC,OAAO,EACzC,GAAG,EAAE,IAAI,CACV,CAAC;IACJ,CAAC;2HA1CU,iCAAiC;6DAAjC,iCAAiC;YA3C1C,mGAAsB;;YAAtB,6CAKC;23BAjBS;gBACV,OAAO,CAAC,WAAW,EAAE;oBACnB,UAAU,CAAC,QAAQ,EAAE;wBACnB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;wBACpD,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;qBAC9D,CAAC;oBACF,UAAU,CAAC,QAAQ,EAAE;wBACnB,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;qBAC/E,CAAC;iBACH,CAAC;aACH;;iFA6CU,iCAAiC;cA1D7C,SAAS;2BACE,+BAA+B,cAC7B,IAAI,cACJ;oBACV,OAAO,CAAC,WAAW,EAAE;wBACnB,UAAU,CAAC,QAAQ,EAAE;4BACnB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;4BACpD,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;yBAC9D,CAAC;wBACF,UAAU,CAAC,QAAQ,EAAE;4BACnB,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;yBAC/E,CAAC;qBACH,CAAC;iBACH,YACS;;;;;;;GAOT;;kFAqCU,iCAAiC","sourcesContent":["import { Component, OnDestroy, inject } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { trigger, transition, style, animate, AnimationEvent } from '@angular/animations';\nimport { ServerConnectivityService } from '../services/server-connectivity.service';\n\n/**\n * When visible, this banner sets --mj-connectivity-banner-height on <html>\n * so that any position:fixed element referencing the shell header offset\n * (e.g. app-switcher mobile dropdown) can account for the banner.\n */\n@Component({\n selector: 'mj-server-connectivity-banner',\n standalone: true,\n animations: [\n trigger('slideDown', [\n transition(':enter', [\n style({ height: 0, opacity: 0, overflow: 'hidden' }),\n animate('300ms ease-out', style({ height: '*', opacity: 1 }))\n ]),\n transition(':leave', [\n animate('200ms ease-in', style({ height: 0, opacity: 0, overflow: 'hidden' }))\n ])\n ])\n ],\n template: `\n @if (!IsConnected()) {\n <div class=\"connectivity-banner\" @slideDown (@slideDown.done)=\"OnAnimationDone($event)\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>Server unavailable &mdash; viewing cached data. Some features may not work.</span>\n </div>\n }\n `,\n styles: [`\n :host {\n flex-shrink: 0;\n width: 100%;\n }\n\n .connectivity-banner {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n border-bottom: 2px solid var(--mj-status-warning-border);\n padding: 8px 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 500;\n }\n\n .connectivity-banner i {\n font-size: 16px;\n flex-shrink: 0;\n }\n\n .connectivity-banner span {\n text-align: center;\n }\n\n @media (max-width: 480px) {\n .connectivity-banner {\n padding: 6px 12px;\n font-size: 13px;\n }\n }\n `]\n})\nexport class ServerConnectivityBannerComponent implements OnDestroy {\n private static readonly CSS_VAR = '--mj-connectivity-banner-height';\n\n private readonly connectivityService = inject(ServerConnectivityService);\n\n /**\n * Connectivity state as a **signal**, not a plain property — and that distinction is the\n * whole point of this shape.\n *\n * The socket state that feeds `IsConnected$` is reported by graphql-ws, which can announce\n * a drop from a callback that lands *inside* an in-flight change-detection pass (during app\n * startup this reliably happens after the banner's own view has been checked). Assigning a\n * plain property there mutates state the `@if` was already evaluated against, so dev-mode\n * check-no-changes reports `NG0100 ... Previous value: '-1'` — `-1` being the `@if` branch\n * index for \"no branch rendered\". Reading a signal from the template instead registers the\n * view as its consumer, so a write marks the view dirty and Angular re-refreshes it within\n * the same pass; the DOM and the expression can no longer disagree.\n *\n * `toSignal` also owns the subscription lifetime via `DestroyRef`, so there is no manual\n * `Subscription` to unsubscribe.\n */\n public readonly IsConnected = toSignal(this.connectivityService.IsConnected$, { initialValue: true });\n\n ngOnDestroy(): void {\n this.setBannerHeight(0);\n }\n\n /** After the enter/leave animation finishes, publish the banner height as a CSS custom property */\n OnAnimationDone(event: AnimationEvent): void {\n if (event.toState === 'void') {\n this.setBannerHeight(0);\n } else {\n const height = (event.element as HTMLElement).offsetHeight;\n this.setBannerHeight(height);\n }\n }\n\n private setBannerHeight(px: number): void {\n document.documentElement.style.setProperty(\n ServerConnectivityBannerComponent.CSS_VAR,\n `${px}px`\n );\n }\n}\n"]}
@@ -107,6 +107,9 @@ export declare class ShellComponent extends BaseAngularComponent implements OnIn
107
107
  searchableEntities: EntityInfo[];
108
108
  selectedEntity: EntityInfo | null;
109
109
  searchInput: ElementRef<HTMLInputElement>;
110
+ /** Mobile drawer + its toggle — used to return focus to the toggle when the drawer closes. */
111
+ mobileNavDrawer?: ElementRef<HTMLElement>;
112
+ mobileNavToggle?: ElementRef<HTMLButtonElement>;
110
113
  LegacySearchOpen: boolean;
111
114
  private _chromeFlags;
112
115
  /**
@@ -380,6 +383,26 @@ export declare class ShellComponent extends BaseAngularComponent implements OnIn
380
383
  * Close mobile navigation drawer
381
384
  */
382
385
  closeMobileNav(): void;
386
+ /**
387
+ * When the drawer closes it becomes `inert`, which drops focus to <body> if focus was
388
+ * inside it — the user's place in the page is gone and the next Tab restarts at the top.
389
+ * Hand focus back to the control that opened it instead. No-op when focus was elsewhere
390
+ * (e.g. the drawer was closed from a keyboard shortcut while the user was in the content).
391
+ */
392
+ private returnFocusFromMobileNav;
393
+ /**
394
+ * Accessible name for the avatar button. The name must never depend on the avatar image
395
+ * rendering — a Gravatar CORS failure drops to the icon fallback, and an icon carries no
396
+ * name of its own — so it is set on the BUTTON and falls back to a generic label before
397
+ * the user record has loaded.
398
+ */
399
+ get avatarAriaLabel(): string;
400
+ /**
401
+ * Skip link target handoff (WCAG 2.4.1). Focus is moved programmatically rather than left
402
+ * to the browser's fragment navigation: the shell's main region is a Golden Layout host,
403
+ * and letting the URL hash change here would collide with the deep-link/tab restore path.
404
+ */
405
+ skipToMainContent(event: Event): void;
383
406
  /**
384
407
  * Toggle user menu visibility
385
408
  */
@@ -1 +1 @@
1
- {"version":3,"file":"shell.component.d.ts","sourceRoot":"","sources":["../../../src/lib/shell/shell.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shell.component.d.ts","sourceRoot":"","sources":["../../../src/lib/shell/shell.component.ts"],"names":[],"mappings":"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"}