@memberjunction/ng-dashboard-viewer 6.2.0-edge.2 → 6.2.0-edge.4

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 (99) hide show
  1. package/README.md +165 -17
  2. package/dist/lib/config-dialogs/confirm-dialog.component.d.ts +3 -4
  3. package/dist/lib/config-dialogs/confirm-dialog.component.d.ts.map +1 -1
  4. package/dist/lib/config-dialogs/confirm-dialog.component.js +3 -2
  5. package/dist/lib/config-dialogs/confirm-dialog.component.js.map +1 -1
  6. package/dist/lib/config-panels/artifact-config-panel.component.d.ts.map +1 -1
  7. package/dist/lib/config-panels/artifact-config-panel.component.js +59 -50
  8. package/dist/lib/config-panels/artifact-config-panel.component.js.map +1 -1
  9. package/dist/lib/config-panels/base-config-panel.d.ts +8 -3
  10. package/dist/lib/config-panels/base-config-panel.d.ts.map +1 -1
  11. package/dist/lib/config-panels/base-config-panel.js +10 -3
  12. package/dist/lib/config-panels/base-config-panel.js.map +1 -1
  13. package/dist/lib/config-panels/query-config-panel.component.js +124 -99
  14. package/dist/lib/config-panels/query-config-panel.component.js.map +1 -1
  15. package/dist/lib/config-panels/view-config-panel.component.js +111 -103
  16. package/dist/lib/config-panels/view-config-panel.component.js.map +1 -1
  17. package/dist/lib/config-panels/weburl-config-panel.component.js +89 -80
  18. package/dist/lib/config-panels/weburl-config-panel.component.js.map +1 -1
  19. package/dist/lib/dashboard-browser/dashboard-browser.component.d.ts +79 -28
  20. package/dist/lib/dashboard-browser/dashboard-browser.component.d.ts.map +1 -1
  21. package/dist/lib/dashboard-browser/dashboard-browser.component.js +446 -447
  22. package/dist/lib/dashboard-browser/dashboard-browser.component.js.map +1 -1
  23. package/dist/lib/dashboard-card/dashboard-card.component.d.ts +69 -0
  24. package/dist/lib/dashboard-card/dashboard-card.component.d.ts.map +1 -0
  25. package/dist/lib/dashboard-card/dashboard-card.component.js +281 -0
  26. package/dist/lib/dashboard-card/dashboard-card.component.js.map +1 -0
  27. package/dist/lib/dashboard-card/dashboard-card.helpers.d.ts +18 -0
  28. package/dist/lib/dashboard-card/dashboard-card.helpers.d.ts.map +1 -0
  29. package/dist/lib/dashboard-card/dashboard-card.helpers.js +43 -0
  30. package/dist/lib/dashboard-card/dashboard-card.helpers.js.map +1 -0
  31. package/dist/lib/dashboard-card/layout-preview-cache.d.ts +15 -0
  32. package/dist/lib/dashboard-card/layout-preview-cache.d.ts.map +1 -0
  33. package/dist/lib/dashboard-card/layout-preview-cache.js +22 -0
  34. package/dist/lib/dashboard-card/layout-preview-cache.js.map +1 -0
  35. package/dist/lib/dashboard-viewer/dashboard-viewer.component.d.ts +69 -12
  36. package/dist/lib/dashboard-viewer/dashboard-viewer.component.d.ts.map +1 -1
  37. package/dist/lib/dashboard-viewer/dashboard-viewer.component.js +173 -145
  38. package/dist/lib/dashboard-viewer/dashboard-viewer.component.js.map +1 -1
  39. package/dist/lib/dashboard-viewer.module.d.ts +24 -20
  40. package/dist/lib/dashboard-viewer.module.d.ts.map +1 -1
  41. package/dist/lib/dashboard-viewer.module.js +42 -5
  42. package/dist/lib/dashboard-viewer.module.js.map +1 -1
  43. package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.d.ts +7 -12
  44. package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.d.ts.map +1 -1
  45. package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.js +3 -1
  46. package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.js.map +1 -1
  47. package/dist/lib/dialogs/dashboard-name-dialog/dashboard-name-dialog.component.d.ts +54 -0
  48. package/dist/lib/dialogs/dashboard-name-dialog/dashboard-name-dialog.component.d.ts.map +1 -0
  49. package/dist/lib/dialogs/dashboard-name-dialog/dashboard-name-dialog.component.js +156 -0
  50. package/dist/lib/dialogs/dashboard-name-dialog/dashboard-name-dialog.component.js.map +1 -0
  51. package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.d.ts +5 -11
  52. package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.d.ts.map +1 -1
  53. package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.js +3 -1
  54. package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.js.map +1 -1
  55. package/dist/lib/dialogs/part-dialog/dashboard-part-dialog.component.d.ts +147 -0
  56. package/dist/lib/dialogs/part-dialog/dashboard-part-dialog.component.d.ts.map +1 -0
  57. package/dist/lib/dialogs/part-dialog/dashboard-part-dialog.component.js +536 -0
  58. package/dist/lib/dialogs/part-dialog/dashboard-part-dialog.component.js.map +1 -0
  59. package/dist/lib/layout-preview/dashboard-layout-preview-node.component.d.ts +20 -0
  60. package/dist/lib/layout-preview/dashboard-layout-preview-node.component.d.ts.map +1 -0
  61. package/dist/lib/layout-preview/dashboard-layout-preview-node.component.js +80 -0
  62. package/dist/lib/layout-preview/dashboard-layout-preview-node.component.js.map +1 -0
  63. package/dist/lib/layout-preview/dashboard-layout-preview.component.d.ts +28 -0
  64. package/dist/lib/layout-preview/dashboard-layout-preview.component.d.ts.map +1 -0
  65. package/dist/lib/layout-preview/dashboard-layout-preview.component.js +62 -0
  66. package/dist/lib/layout-preview/dashboard-layout-preview.component.js.map +1 -0
  67. package/dist/lib/layout-preview/dashboard-layout-preview.d.ts +33 -0
  68. package/dist/lib/layout-preview/dashboard-layout-preview.d.ts.map +1 -0
  69. package/dist/lib/layout-preview/dashboard-layout-preview.js +138 -0
  70. package/dist/lib/layout-preview/dashboard-layout-preview.js.map +1 -0
  71. package/dist/lib/models/dashboard-layout-editor.d.ts +78 -0
  72. package/dist/lib/models/dashboard-layout-editor.d.ts.map +1 -0
  73. package/dist/lib/models/dashboard-layout-editor.js +374 -0
  74. package/dist/lib/models/dashboard-layout-editor.js.map +1 -0
  75. package/dist/lib/models/remove-part-confirm.d.ts +8 -0
  76. package/dist/lib/models/remove-part-confirm.d.ts.map +1 -0
  77. package/dist/lib/models/remove-part-confirm.js +23 -0
  78. package/dist/lib/models/remove-part-confirm.js.map +1 -0
  79. package/dist/lib/parts/artifact-part.component.js +2 -2
  80. package/dist/lib/parts/artifact-part.component.js.map +1 -1
  81. package/dist/lib/parts/query-part.component.js +2 -2
  82. package/dist/lib/parts/query-part.component.js.map +1 -1
  83. package/dist/lib/parts/view-part.component.js +2 -2
  84. package/dist/lib/parts/view-part.component.js.map +1 -1
  85. package/dist/lib/parts/weburl-part.component.js +2 -2
  86. package/dist/lib/parts/weburl-part.component.js.map +1 -1
  87. package/dist/lib/services/golden-layout-wrapper.service.d.ts +40 -0
  88. package/dist/lib/services/golden-layout-wrapper.service.d.ts.map +1 -1
  89. package/dist/lib/services/golden-layout-wrapper.service.js +117 -9
  90. package/dist/lib/services/golden-layout-wrapper.service.js.map +1 -1
  91. package/dist/lib/services/stack-part-actions.d.ts +11 -0
  92. package/dist/lib/services/stack-part-actions.d.ts.map +1 -0
  93. package/dist/lib/services/stack-part-actions.js +41 -0
  94. package/dist/lib/services/stack-part-actions.js.map +1 -0
  95. package/dist/public-api.d.ts +9 -0
  96. package/dist/public-api.d.ts.map +1 -1
  97. package/dist/public-api.js +13 -0
  98. package/dist/public-api.js.map +1 -1
  99. package/package.json +13 -13
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-viewer.component.js","sourceRoot":"","sources":["../../../src/lib/dashboard-viewer/dashboard-viewer.component.ts","../../../src/lib/dashboard-viewer/dashboard-viewer.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnDestroy,\n ViewChild,\n ElementRef,\n ChangeDetectorRef,\n ApplicationRef,\n Injector,\n ComponentRef,\n createComponent,\n EnvironmentInjector,\n Type,\n ViewEncapsulation\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { MJGlobal, UUIDsEqual, EscapeHTML } from '@memberjunction/global';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { DashboardEngine, MJDashboardEntity, MJDashboardPartTypeEntity, MJDashboardCategoryEntity } from '@memberjunction/core-entities';\nimport { BreadcrumbNavigateEvent } from '../breadcrumb/dashboard-breadcrumb.component';\nimport { ResolvedLayoutConfig } from 'golden-layout';\nimport {\n DashboardConfig,\n DashboardPanel,\n PanelConfig,\n PanelInteractionEvent,\n DashboardConfigChangedEvent,\n LayoutChangedEvent,\n DashboardNavRequestEvent,\n CreateDefaultDashboardConfig,\n GeneratePanelId,\n ExtractPanelsFromLayout,\n FindPanelInLayout\n} from '../models/dashboard-types';\nimport { GoldenLayoutWrapperService, LayoutLocation } from '../services/golden-layout-wrapper.service';\nimport { BaseDashboardPart } from '../parts/base-dashboard-part';\n\nexport type DashboardLayoutReadyState =\n | 'pending-dashboard'\n | 'pending-parts'\n | 'waiting-for-size'\n | 'initializing'\n | 'ready'\n | 'error';\n\nexport interface DashboardLayoutLifecycleEvent {\n state: DashboardLayoutReadyState;\n dashboardId?: string;\n reason?: string;\n error?: Error;\n}\n\nconst LAYOUT_CONTAINER_SIZE_TIMEOUT_MS = 10_000;\n\n/**\n * Main dashboard viewer component.\n * Renders a configurable dashboard with draggable/resizable panels using Golden Layout.\n *\n * This component is GENERIC and has no routing dependencies.\n * Navigation events are bubbled up for the parent component to handle.\n */\n@Component({\n standalone: false,\n selector: 'mj-dashboard-viewer',\n templateUrl: './dashboard-viewer.component.html',\n styleUrls: ['./dashboard-viewer.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class DashboardViewerComponent extends BaseAngularComponent implements OnDestroy {\n // ========================================\n // Inputs\n // ========================================\n\n private _dashboard: MJDashboardEntity | null = null;\n private _dashboardId: string | null = null;\n\n /** The dashboard entity to display */\n @Input()\n set Dashboard(value: MJDashboardEntity | null) {\n const previous = this._dashboard;\n this._dashboard = value;\n if (value && value !== previous) {\n this.onDashboardChanged();\n }\n }\n get Dashboard(): MJDashboardEntity | null {\n return this._dashboard;\n }\n\n /** @deprecated Use {@link Dashboard}. */\n get dashboard(): MJDashboardEntity | null {\n return this.Dashboard;\n }\n /** @deprecated Use {@link Dashboard}. */\n @Input() set dashboard(value: MJDashboardEntity | null) {\n this.Dashboard = value;\n }\n\n /** Alternative: Load dashboard by ID */\n @Input()\n set DashboardId(value: string | null) {\n const previous = this._dashboardId;\n this._dashboardId = value;\n if (value && value !== previous) {\n this.loadDashboardById(value);\n }\n }\n get DashboardId(): string | null {\n return this._dashboardId;\n }\n\n /** @deprecated Use {@link DashboardId}. */\n get dashboardId(): string | null {\n return this.DashboardId;\n }\n /** @deprecated Use {@link DashboardId}. */\n @Input() set dashboardId(value: string | null) {\n this.DashboardId = value;\n }\n\n /** Whether the dashboard is in edit mode */\n private _isEditing = false;\n\n @Input()\n set IsEditing(value: boolean) {\n const previous = this._isEditing;\n this._isEditing = value;\n // When isEditing changes (and layout exists), reinitialize to apply GL settings\n if (value !== previous && this._glService) {\n console.log('[DashboardViewer] isEditing changed from', previous, 'to', value);\n this.updatePanelEditModes();\n }\n }\n get IsEditing(): boolean {\n return this._isEditing;\n }\n\n /** @deprecated Use {@link IsEditing}. */\n get isEditing(): boolean {\n return this.IsEditing;\n }\n /** @deprecated Use {@link IsEditing}. */\n @Input() set isEditing(value: boolean) {\n this.IsEditing = value;\n }\n\n /** Whether to show the toolbar */\n private _showToolbar = true;\n\n @Input()\n set ShowToolbar(value: boolean) {\n this._showToolbar = value;\n }\n get ShowToolbar(): boolean {\n return this._showToolbar;\n }\n\n /** @deprecated Use {@link ShowToolbar}. */\n get showToolbar(): boolean {\n return this.ShowToolbar;\n }\n /** @deprecated Use {@link ShowToolbar}. */\n @Input() set showToolbar(value: boolean) {\n this.ShowToolbar = value;\n }\n\n /** Whether to auto-save layout changes */\n private _autoSave = false;\n\n @Input()\n set AutoSave(value: boolean) {\n this._autoSave = value;\n }\n get AutoSave(): boolean {\n return this._autoSave;\n }\n\n /** @deprecated Use {@link AutoSave}. */\n get autoSave(): boolean {\n return this.AutoSave;\n }\n /** @deprecated Use {@link AutoSave}. */\n @Input() set autoSave(value: boolean) {\n this.AutoSave = value;\n }\n\n /** Whether to show the breadcrumb navigation */\n @Input() ShowBreadcrumb = true;\n\n /** @deprecated Use {@link ShowBreadcrumb}. */\n @Input() set showBreadcrumb(value: DashboardViewerComponent['ShowBreadcrumb']) {\n this.ShowBreadcrumb = value;\n }\n /** @deprecated Use {@link ShowBreadcrumb}. */\n get showBreadcrumb(): DashboardViewerComponent['ShowBreadcrumb'] {\n return this.ShowBreadcrumb;\n }\n\n /** Whether to show the \"Open in Tab\" button (for embedded dashboards) */\n @Input() ShowOpenInTabButton = false;\n\n /** @deprecated Use {@link ShowOpenInTabButton}. */\n @Input() set showOpenInTabButton(value: DashboardViewerComponent['ShowOpenInTabButton']) {\n this.ShowOpenInTabButton = value;\n }\n /** @deprecated Use {@link ShowOpenInTabButton}. */\n get showOpenInTabButton(): DashboardViewerComponent['ShowOpenInTabButton'] {\n return this.ShowOpenInTabButton;\n }\n\n /** Whether to show the Edit button */\n @Input() ShowEditButton = true;\n\n /** @deprecated Use {@link ShowEditButton}. */\n @Input() set showEditButton(value: DashboardViewerComponent['ShowEditButton']) {\n this.ShowEditButton = value;\n }\n /** @deprecated Use {@link ShowEditButton}. */\n get showEditButton(): DashboardViewerComponent['ShowEditButton'] {\n return this.ShowEditButton;\n }\n\n /** All categories for breadcrumb path resolution */\n @Input() Categories: MJDashboardCategoryEntity[] = [];\n\n /**\n * Computed: Should the toolbar be visible?\n * Auto-hides when showToolbar=false OR when all toolbar elements are disabled\n */\n public get ShouldShowToolbar(): boolean {\n if (!this._showToolbar) {\n return false;\n }\n // If all elements are hidden, hide the toolbar entirely\n return this.ShowBreadcrumb || this.ShowOpenInTabButton || this.ShowEditButton;\n }\n\n /** @deprecated Use {@link ShouldShowToolbar}. */\n public get shouldShowToolbar(): boolean {\n return this.ShouldShowToolbar;\n }\n\n // ========================================\n // Outputs\n // ========================================\n\n /** Emitted when dashboard configuration changes */\n @Output() configChanged = new EventEmitter<DashboardConfigChangedEvent>();\n\n /** Emitted when a panel requests navigation to another resource */\n @Output() NavigationRequested = new EventEmitter<DashboardNavRequestEvent>();\n\n /**\n * @deprecated Use {@link NavigationRequested}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (navigationRequested) keeps working. Must stay AFTER NavigationRequested: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() navigationRequested = this.NavigationRequested;\n\n /** Emitted when a panel interaction occurs */\n @Output() PanelInteraction = new EventEmitter<PanelInteractionEvent>();\n\n /**\n * @deprecated Use {@link PanelInteraction}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (panelInteraction) keeps working. Must stay AFTER PanelInteraction: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() panelInteraction = this.PanelInteraction;\n\n /** Emitted when the dashboard is saved */\n @Output() DashboardSaved = new EventEmitter<MJDashboardEntity>();\n\n /**\n * @deprecated Use {@link DashboardSaved}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (dashboardSaved) keeps working. Must stay AFTER DashboardSaved: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() dashboardSaved = this.DashboardSaved;\n\n /** Emitted when an error occurs */\n @Output() error = new EventEmitter<{ message: string; error?: Error }>();\n\n /** Emitted when edit mode changes */\n @Output() EditModeChanged = new EventEmitter<boolean>();\n\n /**\n * @deprecated Use {@link EditModeChanged}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (editModeChanged) keeps working. Must stay AFTER EditModeChanged: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() editModeChanged = this.EditModeChanged;\n\n /** Emitted when user navigates via breadcrumb */\n @Output() BreadcrumbNavigate = new EventEmitter<BreadcrumbNavigateEvent>();\n\n /**\n * @deprecated Use {@link BreadcrumbNavigate}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (breadcrumbNavigate) keeps working. Must stay AFTER BreadcrumbNavigate: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() breadcrumbNavigate = this.BreadcrumbNavigate;\n\n /** Emitted when user clicks \"Open in Tab\" button */\n @Output() OpenInTab = new EventEmitter<{ dashboardId: string; dashboardName: string }>();\n\n /**\n * @deprecated Use {@link OpenInTab}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (openInTab) keeps working. Must stay AFTER OpenInTab: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() openInTab = this.OpenInTab;\n\n /** Emitted as the Golden Layout viewer moves through dashboard/layout readiness states. */\n @Output() LayoutLifecycle = new EventEmitter<DashboardLayoutLifecycleEvent>();\n\n /**\n * @deprecated Use {@link LayoutLifecycle}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (layoutLifecycle) keeps working. Must stay AFTER LayoutLifecycle: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() layoutLifecycle = this.LayoutLifecycle;\n\n /** Emitted once Golden Layout has initialized with a non-zero container and updated its size. */\n @Output() LayoutReady = new EventEmitter<void>();\n\n /**\n * @deprecated Use {@link LayoutReady}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (layoutReady) keeps working. Must stay AFTER LayoutReady: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() layoutReady = this.LayoutReady;\n\n /** Emitted when layout initialization is deferred because the container cannot be initialized yet. */\n @Output() LayoutDeferred = new EventEmitter<{ reason: string }>();\n\n /**\n * @deprecated Use {@link LayoutDeferred}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (layoutDeferred) keeps working. Must stay AFTER LayoutDeferred: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() layoutDeferred = this.LayoutDeferred;\n\n // ========================================\n // View Children\n // ========================================\n\n @ViewChild('layoutContainer', { static: true }) LayoutContainer!: ElementRef<HTMLElement>;\n\n /** @deprecated Use {@link LayoutContainer}. */\n get layoutContainer(): ElementRef<HTMLElement> {\n return this.LayoutContainer;\n }\n /** @deprecated Use {@link LayoutContainer}. */\n set layoutContainer(value: ElementRef<HTMLElement>) {\n this.LayoutContainer = value;\n }\n\n // ========================================\n // State\n // ========================================\n\n public isLoading = false;\n public config: DashboardConfig | null = null;\n public PartTypes: MJDashboardPartTypeEntity[] = [];\n\n /** @deprecated Use {@link PartTypes}. */\n public get partTypes(): MJDashboardPartTypeEntity[] {\n return this.PartTypes;\n }\n /** @deprecated Use {@link PartTypes}. */\n public set partTypes(value: MJDashboardPartTypeEntity[]) {\n this.PartTypes = value;\n }\n public HasUnsavedChanges = false;\n\n /** @deprecated Use {@link HasUnsavedChanges}. */\n public get hasUnsavedChanges() {\n return this.HasUnsavedChanges;\n }\n /** @deprecated Use {@link HasUnsavedChanges}. */\n public set hasUnsavedChanges(value) {\n this.HasUnsavedChanges = value;\n }\n\n /**\n * Helper to check if layout has any panels (for template use).\n * Panels are stored in componentState within the layout tree.\n */\n public get HasPanels(): boolean {\n return ExtractPanelsFromLayout(this.config?.layout ?? null).length > 0;\n }\n\n /** @deprecated Use {@link HasPanels}. */\n public get hasPanels(): boolean {\n return this.HasPanels;\n }\n\n private readonly _destroy$ = new Subject<void>();\n private readonly _panelComponents = new Map<string, { wrapper: HTMLElement; componentRef?: ComponentRef<BaseDashboardPart> }>();\n private _glService: GoldenLayoutWrapperService | null = null;\n\n /** Promise that resolves when part types are loaded - used to ensure layout waits for part types */\n private _partTypesLoaded: Promise<void> | null = null;\n private _layoutReadyPromise: Promise<void> = Promise.resolve();\n private _resolveLayoutReady: (() => void) | null = null;\n private _rejectLayoutReady: ((error: Error) => void) | null = null;\n private _layoutInitGeneration = 0;\n private _layoutReadyTimer: ReturnType<typeof setTimeout> | null = null;\n private _resolveDeferredLayoutInit: (() => void) | null = null;\n private _rejectDeferredLayoutInit: ((error: Error) => void) | null = null;\n private _deferredLayoutInitTimer: ReturnType<typeof setTimeout> | null = null;\n\n // ========================================\n // Constructor\n // ========================================\n\n constructor(\n private readonly cdr: ChangeDetectorRef,\n private readonly appRef: ApplicationRef,\n private readonly injector: Injector,\n private readonly environmentInjector: EnvironmentInjector\n ) {\n super();\n // Store the promise so layout initialization can wait for it\n this._partTypesLoaded = this.loadPartTypes();\n }\n\n // ========================================\n // Lifecycle\n // ========================================\n\n ngOnDestroy(): void {\n this._destroy$.next();\n this._destroy$.complete();\n const generation = this._layoutInitGeneration;\n this.resolveLayoutReady(generation);\n this._layoutInitGeneration++;\n this.clearLayoutReadyTimer();\n this.cancelDeferredLayoutInit();\n this.destroyLayout();\n }\n\n // ========================================\n // Public Methods\n // ========================================\n\n /**\n * Toggle edit mode\n */\n public ToggleEditMode(): void {\n this.IsEditing = !this.IsEditing;\n this.EditModeChanged.emit(this.IsEditing);\n this.updatePanelEditModes();\n }\n\n /** @deprecated Use {@link ToggleEditMode}. */\n public toggleEditMode(): void {\n return this.ToggleEditMode();\n }\n\n /**\n * Add a new panel to the dashboard.\n * The panel is stored in GL's componentState - no separate panels array.\n */\n public async AddPanel(\n partTypeId: string,\n panelConfig: PanelConfig,\n title: string,\n icon?: string,\n location?: LayoutLocation\n ): Promise<void> {\n if (!this.config || !this._glService) {\n return;\n }\n\n const partType = this.PartTypes.find(pt => UUIDsEqual(pt.ID, partTypeId));\n if (!partType) {\n this.error.emit({ message: `Unknown panel type: ${partTypeId}` });\n return;\n }\n\n const panel: DashboardPanel = {\n id: GeneratePanelId(),\n partTypeId,\n title,\n icon: icon || partType.Icon || 'fa-solid fa-window-maximize',\n config: panelConfig\n };\n\n // Add to Golden Layout - panel data stored in componentState\n this._glService.addPanel(panel, location);\n\n // Sync the layout config from Golden Layout to capture the new panel\n // The layout IS the source of truth - it contains the panel in componentState\n const currentLayout = this._glService.getLayoutConfig();\n if (currentLayout) {\n this.config.layout = currentLayout;\n }\n\n this.markDirty();\n }\n\n /** @deprecated Use {@link AddPanel}. */\n public async addPanel(\n partTypeId: string,\n panelConfig: PanelConfig,\n title: string,\n icon?: string,\n location?: LayoutLocation\n ): Promise<void> {\n return this.AddPanel(partTypeId, panelConfig, title, icon, location);\n }\n\n /**\n * Remove a panel from the dashboard.\n * Panels live in GL's componentState, so removing from GL removes the panel.\n */\n public RemovePanel(panelId: string): void {\n if (!this.config || !this._glService) return;\n\n // Remove from layout (panel data is in componentState)\n this._glService.removePanel(panelId);\n\n // Sync layout config to persist the removal\n const currentLayout = this._glService.getLayoutConfig();\n if (currentLayout) {\n this.config.layout = currentLayout;\n }\n\n // Destroy component\n this.destroyPanelComponent(panelId);\n\n this.markDirty();\n }\n\n /** @deprecated Use {@link RemovePanel}. */\n public removePanel(panelId: string): void {\n return this.RemovePanel(panelId);\n }\n\n /**\n * Save the current dashboard configuration\n */\n public async save(): Promise<boolean> {\n if (!this._dashboard || !this.config) return false;\n\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n // Update the layout config from Golden Layout\n if (this._glService) {\n const glConfig = this._glService.getLayoutConfig();\n if (glConfig) {\n this.config.layout = glConfig;\n }\n }\n\n // Save to UIConfigDetails\n this._dashboard.UIConfigDetails = JSON.stringify(this.config);\n const saved = await this._dashboard.Save();\n\n if (saved) {\n this.HasUnsavedChanges = false;\n this.DashboardSaved.emit(this._dashboard);\n }\n\n return saved;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n this.error.emit({ message: 'Failed to save dashboard', error });\n return false;\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Refresh all panels\n */\n public async RefreshAllPanels(): Promise<void> {\n // For placeholder implementation, reinitialize the layout\n if (this._glService) {\n await this.initializeLayout();\n }\n }\n\n /** @deprecated Use {@link RefreshAllPanels}. */\n public async refreshAllPanels(): Promise<void> {\n return this.RefreshAllPanels();\n }\n\n /**\n * Resolves when the current dashboard's Golden Layout instance has initialized\n * against a non-zero container and completed its first size update.\n */\n public WaitForLayoutReady(): Promise<void> {\n return this._layoutReadyPromise;\n }\n\n /** @deprecated Use {@link WaitForLayoutReady}. */\n public waitForLayoutReady(): Promise<void> {\n return this.WaitForLayoutReady();\n }\n\n /**\n * Get the current configuration\n */\n public getConfig(): DashboardConfig | null {\n return this.config;\n }\n\n /**\n * Get available part types\n */\n public GetPartTypes(): MJDashboardPartTypeEntity[] {\n return this.PartTypes;\n }\n\n /** @deprecated Use {@link GetPartTypes}. */\n public getPartTypes(): MJDashboardPartTypeEntity[] {\n return this.GetPartTypes();\n }\n\n /**\n * Get a panel by ID.\n * Extracts panel from the layout's componentState (single source of truth).\n */\n public GetPanel(panelId: string): DashboardPanel | null {\n return FindPanelInLayout(this.config?.layout ?? null, panelId);\n }\n\n /** @deprecated Use {@link GetPanel}. */\n public getPanel(panelId: string): DashboardPanel | null {\n return this.GetPanel(panelId);\n }\n\n /**\n * Get the part type for a panel\n */\n public GetPartTypeForPanel(panelId: string): MJDashboardPartTypeEntity | null {\n const panel = this.GetPanel(panelId);\n if (!panel) return null;\n return this.PartTypes.find(pt => UUIDsEqual(pt.ID, panel.partTypeId)) ?? null;\n }\n\n /** @deprecated Use {@link GetPartTypeForPanel}. */\n public getPartTypeForPanel(panelId: string): MJDashboardPartTypeEntity | null {\n return this.GetPartTypeForPanel(panelId);\n }\n\n /**\n * Update a panel's configuration.\n * Since panels live in componentState within the layout, we need to\n * update the layout tree directly or reinitialize with updated data.\n */\n public UpdatePanelConfig(panelId: string, newConfig: PanelConfig, title?: string, icon?: string): void {\n if (!this.config || !this._glService) return;\n\n // Get current layout which contains all panel data\n const currentLayout = this._glService.getLayoutConfig();\n if (!currentLayout) return;\n\n // Update panel in the layout tree\n this.updatePanelInLayout(currentLayout, panelId, newConfig, title, icon);\n this.config.layout = currentLayout;\n\n this.markDirty();\n\n // Reinitialize layout to reflect the updated panel\n this.initializeLayout();\n }\n\n /** @deprecated Use {@link UpdatePanelConfig}. */\n public updatePanelConfig(panelId: string, newConfig: PanelConfig, title?: string, icon?: string): void {\n return this.UpdatePanelConfig(panelId, newConfig, title, icon);\n }\n\n /**\n * Recursively update a panel's config within the layout tree\n */\n private updatePanelInLayout(\n layout: ResolvedLayoutConfig,\n panelId: string,\n newConfig: PanelConfig,\n title?: string,\n icon?: string\n ): void {\n if (!layout.root) return;\n\n const updateNode = (node: ResolvedLayoutConfig['root']): void => {\n if (!node) return;\n\n // If this is a component with matching panelId\n if (node.type === 'component') {\n const componentNode = node as unknown as { componentState?: DashboardPanel; title?: string };\n if (componentNode.componentState?.id === panelId) {\n componentNode.componentState.config = newConfig;\n if (title) {\n componentNode.componentState.title = title;\n componentNode.title = title;\n }\n if (icon) componentNode.componentState.icon = icon;\n }\n }\n\n // Recursively process children\n const containerNode = node as unknown as { content?: ResolvedLayoutConfig['root'][] };\n if (containerNode.content && Array.isArray(containerNode.content)) {\n for (const child of containerNode.content) {\n updateNode(child);\n }\n }\n };\n\n updateNode(layout.root);\n }\n\n /**\n * Handle add panel button click - emits event for parent to show dialog\n */\n public OnAddPanelClick(): void {\n // Emit interaction event for parent to handle\n // Parent should show AddPanelDialog and call addPanel() with result\n this.PanelInteraction.emit({\n panelId: '',\n interactionType: 'custom',\n payload: { action: 'add-panel-requested', partTypes: this.PartTypes }\n });\n }\n\n /** @deprecated Use {@link OnAddPanelClick}. */\n public onAddPanelClick(): void {\n return this.OnAddPanelClick();\n }\n\n /**\n * Handle \"Open in Tab\" button click - emits event for parent to open dashboard in its own tab\n */\n public OnOpenInTabClick(): void {\n if (this._dashboard) {\n this.OpenInTab.emit({\n dashboardId: this._dashboard.ID,\n dashboardName: this._dashboard.Name\n });\n }\n }\n\n /** @deprecated Use {@link OnOpenInTabClick}. */\n public onOpenInTabClick(): void {\n return this.OnOpenInTabClick();\n }\n\n /**\n * Handle breadcrumb navigation\n */\n public OnBreadcrumbNavigate(event: BreadcrumbNavigateEvent): void {\n this.BreadcrumbNavigate.emit(event);\n }\n\n /** @deprecated Use {@link OnBreadcrumbNavigate}. */\n public onBreadcrumbNavigate(event: BreadcrumbNavigateEvent): void {\n return this.OnBreadcrumbNavigate(event);\n }\n\n // ========================================\n // Private Methods - Initialization\n // ========================================\n\n private async loadPartTypes(): Promise<void> {\n try {\n await DashboardEngine.Instance.Config(false);\n this.PartTypes = DashboardEngine.Instance.DashboardPartTypes;\n } catch (err) {\n console.error('Failed to load dashboard part types:', err);\n }\n }\n\n private async loadDashboardById(id: string): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n const p = this.ProviderToUse;\n const dashboard = await p.GetEntityObject<MJDashboardEntity>('MJ: Dashboards', p.CurrentUser);\n const loaded = await dashboard.Load(id);\n\n if (loaded) {\n this._dashboard = dashboard;\n this.onDashboardChanged();\n } else {\n this.error.emit({ message: `Dashboard not found: ${id}` });\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n this.error.emit({ message: 'Failed to load dashboard', error });\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n private async onDashboardChanged(): Promise<void> {\n if (!this._dashboard) return;\n\n const generation = this.startLayoutReadyCycle();\n\n try {\n // Parse or create config\n this.config = this.parseOrCreateConfig();\n\n // Wait for part types to be loaded before initializing layout\n // This ensures partTypes array is populated when createPanelComponent is called\n if (this._partTypesLoaded) {\n this.emitLayoutLifecycle('pending-parts');\n await this._partTypesLoaded;\n }\n\n if (generation !== this._layoutInitGeneration) {\n return;\n }\n\n // Initialize layout\n await this.initializeLayout(generation);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n this.emitLayoutLifecycle('error', undefined, error);\n this.rejectLayoutReady(error, generation);\n this.error.emit({ message: 'Failed to initialize dashboard layout', error });\n }\n }\n\n private parseOrCreateConfig(): DashboardConfig {\n if (!this._dashboard?.UIConfigDetails) {\n return CreateDefaultDashboardConfig();\n }\n\n try {\n const parsed = JSON.parse(this._dashboard.UIConfigDetails);\n\n // Validate it has the expected structure (layout + settings)\n if (parsed.layout !== undefined && parsed.settings) {\n return parsed as DashboardConfig;\n }\n\n // Invalid format, return default\n console.warn('[DashboardViewer] Invalid config format, using default');\n return CreateDefaultDashboardConfig();\n } catch {\n return CreateDefaultDashboardConfig();\n }\n }\n\n // ========================================\n // Private Methods - Layout\n // ========================================\n\n private async initializeLayout(generation = this._layoutInitGeneration): Promise<void> {\n if (!this.config || !this.LayoutContainer?.nativeElement) {\n return;\n }\n\n const el = this.LayoutContainer.nativeElement;\n const rect = el.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) {\n // The container has no size yet — typically because Explorer is reattaching\n // this cached resource component on browser back/forward and the pane hasn't\n // been laid out. GoldenLayout never fires its 'show' event for a zero-size\n // container, so each panel's lazy content factory never runs and the panel is\n // stuck on \"Loading…\" forever (the React component inside never even mounts).\n // Defer init until the container actually has a size, then build the layout.\n const reason = 'layout container has zero size';\n this.emitLayoutLifecycle('waiting-for-size', reason);\n this.LayoutDeferred.emit({ reason });\n await this.waitForLayoutContainerSize(el, generation);\n if (generation !== this._layoutInitGeneration) {\n return;\n }\n }\n\n // We're proceeding with a real init — cancel any pending deferred attempt.\n this.cancelDeferredLayoutInit();\n this.emitLayoutLifecycle('initializing');\n\n // Destroy existing layout\n this.destroyLayout();\n\n // Create new Golden Layout service\n this._glService = new GoldenLayoutWrapperService();\n\n // Subscribe to layout events\n this.subscribeToLayoutEvents();\n\n const pendingPanelCreations: Promise<void>[] = [];\n\n // Panel factory - called by GL when it binds a component\n // The panel comes directly from GL's componentState (single source of truth)\n const panelFactory = (panel: DashboardPanel, container: HTMLElement) => {\n const creation = this.createPanelComponent(panel, container);\n pendingPanelCreations.push(\n creation.catch(error => {\n console.error('[DashboardViewer] Failed to create panel component:', error);\n })\n );\n };\n\n // Initialize with saved layout (or null for empty dashboard)\n // Golden Layout's native ResolvedLayoutConfig is the source of truth\n // Panel data is embedded in each component's componentState\n this._glService.initialize(\n this.LayoutContainer.nativeElement,\n this.config.layout,\n panelFactory,\n this.IsEditing\n );\n\n if (pendingPanelCreations.length > 0) {\n await Promise.all(pendingPanelCreations);\n }\n\n // After GL.initialize() completes, all components from the saved layout\n // have been synchronously bound via the panelFactory callback.\n // However, Angular needs time to complete change detection and render\n // the dynamic components. A single delayed updateSize() ensures GL\n // recalculates dimensions after Angular has finished rendering.\n await new Promise<void>(resolve => {\n this.clearLayoutReadyTimer();\n this._layoutReadyTimer = setTimeout(() => {\n this._layoutReadyTimer = null;\n resolve();\n }, 100);\n });\n\n if (generation !== this._layoutInitGeneration) {\n return;\n }\n\n this._glService?.updateSize();\n this.cdr.detectChanges();\n this.emitLayoutLifecycle('ready');\n this.LayoutReady.emit();\n this.resolveLayoutReady(generation);\n }\n\n /** ResizeObserver used to wait for a zero-size container to gain a size before init. */\n private _layoutSizeObserver: ResizeObserver | null = null;\n\n /**\n * Wait (via ResizeObserver) until the layout container has a non-zero size, then\n * (re)initialize. Used when initializeLayout() is called while the container is\n * still 0×0 — e.g. during a cached-component reattach on browser back/forward —\n * where GoldenLayout would otherwise bind panels that never receive a 'show' event.\n */\n private waitForLayoutContainerSize(el: HTMLElement, generation: number): Promise<void> {\n this.cancelDeferredLayoutInit();\n\n return new Promise<void>((resolve, reject) => {\n this._resolveDeferredLayoutInit = resolve;\n this._rejectDeferredLayoutInit = reject;\n const ro = new ResizeObserver(() => {\n if (generation !== this._layoutInitGeneration) {\n this.cancelDeferredLayoutInit();\n return;\n }\n\n const r = el.getBoundingClientRect();\n if (r.width > 0 && r.height > 0) {\n this.cancelDeferredLayoutInit();\n }\n });\n\n const r = el.getBoundingClientRect();\n if (r.width > 0 && r.height > 0) {\n this._resolveDeferredLayoutInit = null;\n this._rejectDeferredLayoutInit = null;\n resolve();\n return;\n }\n\n this._deferredLayoutInitTimer = setTimeout(() => {\n const error = new Error(\n `Dashboard layout container stayed at zero size for ${LAYOUT_CONTAINER_SIZE_TIMEOUT_MS}ms`\n );\n this.failDeferredLayoutInit(error);\n }, LAYOUT_CONTAINER_SIZE_TIMEOUT_MS);\n ro.observe(el);\n this._layoutSizeObserver = ro;\n });\n }\n\n private cancelDeferredLayoutInit(): void {\n this.clearDeferredLayoutInitTimer();\n if (this._layoutSizeObserver) {\n this._layoutSizeObserver.disconnect();\n this._layoutSizeObserver = null;\n }\n if (this._resolveDeferredLayoutInit) {\n this._resolveDeferredLayoutInit();\n this._resolveDeferredLayoutInit = null;\n }\n this._rejectDeferredLayoutInit = null;\n }\n\n private failDeferredLayoutInit(error: Error): void {\n this.clearDeferredLayoutInitTimer();\n if (this._layoutSizeObserver) {\n this._layoutSizeObserver.disconnect();\n this._layoutSizeObserver = null;\n }\n if (this._rejectDeferredLayoutInit) {\n this._rejectDeferredLayoutInit(error);\n this._rejectDeferredLayoutInit = null;\n }\n this._resolveDeferredLayoutInit = null;\n }\n\n private clearDeferredLayoutInitTimer(): void {\n if (this._deferredLayoutInitTimer) {\n clearTimeout(this._deferredLayoutInitTimer);\n this._deferredLayoutInitTimer = null;\n }\n }\n\n private startLayoutReadyCycle(): number {\n const generation = ++this._layoutInitGeneration;\n this.clearLayoutReadyTimer();\n this.cancelDeferredLayoutInit();\n this._resolveLayoutReady?.();\n\n this._layoutReadyPromise = new Promise<void>((resolve, reject) => {\n this._resolveLayoutReady = resolve;\n this._rejectLayoutReady = reject;\n });\n this._layoutReadyPromise.catch(() => undefined);\n\n this.emitLayoutLifecycle('pending-dashboard');\n return generation;\n }\n\n private resolveLayoutReady(generation: number): void {\n if (generation !== this._layoutInitGeneration) {\n return;\n }\n\n this._resolveLayoutReady?.();\n this._resolveLayoutReady = null;\n this._rejectLayoutReady = null;\n }\n\n private rejectLayoutReady(error: Error, generation: number): void {\n if (generation !== this._layoutInitGeneration) {\n return;\n }\n\n this._rejectLayoutReady?.(error);\n this._resolveLayoutReady = null;\n this._rejectLayoutReady = null;\n }\n\n private clearLayoutReadyTimer(): void {\n if (this._layoutReadyTimer) {\n clearTimeout(this._layoutReadyTimer);\n this._layoutReadyTimer = null;\n }\n }\n\n private emitLayoutLifecycle(state: DashboardLayoutReadyState, reason?: string, error?: Error): void {\n this.LayoutLifecycle.emit({\n state,\n dashboardId: this._dashboard?.ID,\n reason,\n error,\n });\n }\n\n /** Flag to prevent panel removal during layout reinit */\n private _isReinitializing = false;\n\n private destroyLayout(): void {\n // Set flag to prevent onPanelClosed from removing panels during reinit\n this._isReinitializing = true;\n\n // Destroy all panel components\n this._panelComponents.forEach((entry, panelId) => {\n this.destroyPanelComponent(panelId);\n });\n this._panelComponents.clear();\n\n // Destroy Golden Layout\n if (this._glService) {\n this._glService.destroy();\n this._glService = null;\n }\n\n this._isReinitializing = false;\n }\n\n private subscribeToLayoutEvents(): void {\n if (!this._glService) return;\n\n this._glService.onLayoutChanged\n .pipe(takeUntil(this._destroy$))\n .subscribe((event: LayoutChangedEvent) => {\n this.onLayoutChanged(event);\n });\n\n this._glService.onPanelClosed\n .pipe(takeUntil(this._destroy$))\n .subscribe((panelId: string) => {\n this.onPanelClosed(panelId);\n });\n\n this._glService.onPanelSelected\n .pipe(takeUntil(this._destroy$))\n .subscribe((panelId: string) => {\n this.onPanelSelected(panelId);\n });\n }\n\n private onLayoutChanged(event: LayoutChangedEvent): void {\n if (this.config) {\n this.config.layout = event.layout;\n this.markDirty();\n\n // Map layout change types to config change types\n const changeType = event.changeType === 'close' ? 'panel-removed' : 'layout';\n this.configChanged.emit({\n config: this.config,\n changeType\n });\n }\n }\n\n private onPanelClosed(panelId: string): void {\n // Skip panel removal during layout reinit (panels are being recreated, not actually closed)\n if (this._isReinitializing) {\n return;\n }\n\n // Sync layout config - panel was removed from GL's tree\n if (this.config && this._glService) {\n const currentLayout = this._glService.getLayoutConfig();\n if (currentLayout) {\n this.config.layout = currentLayout;\n }\n }\n\n // Destroy component\n this.destroyPanelComponent(panelId);\n this.markDirty();\n }\n\n private onPanelSelected(panelId: string): void {\n // Could be used to highlight selected panel in edit mode\n }\n\n // ========================================\n // Private Methods - Panel Components\n // ========================================\n\n /**\n * Create a panel component from the DashboardPanel data.\n * Panel comes directly from GL's componentState - no lookup needed.\n */\n private async createPanelComponent(panel: DashboardPanel, container: HTMLElement): Promise<void> {\n const partType = this.PartTypes.find(pt => UUIDsEqual(pt.ID, panel.partTypeId));\n\n // Create the panel wrapper with header and content\n const wrapper = document.createElement('div');\n wrapper.className = 'dashboard-part-wrapper';\n wrapper.style.cssText = 'display: flex; flex-direction: column; height: 100%; background: var(--mj-bg-surface);';\n\n // Only show header in edit mode - GL tabs already display the title in view mode\n if (this.IsEditing) {\n const header = this.createPartHeader(panel, panel.id);\n wrapper.appendChild(header);\n }\n\n // Create content area\n const content = document.createElement('div');\n content.className = 'dashboard-part-content';\n content.style.cssText = 'flex: 1; overflow: auto; min-height: 0;';\n\n // Try to create dynamic component via ClassFactory\n const componentRef = await this.createDynamicPartComponent(panel, partType, content);\n\n if (!componentRef) {\n // Fallback to static rendering if no DriverClass or component creation failed\n this.renderPartContent(panel, content, partType);\n }\n\n wrapper.appendChild(content);\n container.appendChild(wrapper);\n\n // Store reference for cleanup\n this._panelComponents.set(panel.id, { wrapper, componentRef: componentRef || undefined });\n }\n\n /**\n * Create a dynamic part component using ClassFactory\n */\n private async createDynamicPartComponent(\n panel: DashboardPanel,\n partType: MJDashboardPartTypeEntity | undefined,\n container: HTMLElement\n ): Promise<ComponentRef<BaseDashboardPart> | null> {\n if (!partType?.DriverClass) {\n return null;\n }\n\n try {\n // Use ClassFactory to create instance and get the component class\n const partInstance = await MJGlobal.Instance.ClassFactory.CreateInstanceAsync<BaseDashboardPart>(\n BaseDashboardPart,\n partType.DriverClass\n );\n\n if (!partInstance) {\n return null;\n }\n\n // Get the Angular component class from the instance\n // The constructor is a concrete class that extends BaseDashboardPart\n const componentClass = (partInstance as object).constructor as Type<BaseDashboardPart>;\n\n // Create the component dynamically\n const componentRef = createComponent(componentClass, {\n environmentInjector: this.environmentInjector,\n elementInjector: this.injector\n });\n\n // Set inputs on the component\n const instance = componentRef.instance;\n instance.Panel = panel;\n instance.PartType = partType;\n instance.IsEditing = this.IsEditing;\n\n // Subscribe to events\n instance.ConfigureRequested.subscribe(() => {\n this.onConfigurePart(panel.id);\n });\n instance.RemoveRequested.subscribe(() => {\n this.onRemovePart(panel.id);\n });\n instance.NavigationRequested.subscribe((event: DashboardNavRequestEvent) => {\n this.NavigationRequested.emit(event);\n });\n\n // Attach component to DOM\n container.appendChild(componentRef.location.nativeElement);\n\n // Attach to Angular's change detection\n this.appRef.attachView(componentRef.hostView);\n\n return componentRef;\n } catch (error) {\n console.error('[DashboardViewer] Failed to create dynamic component:', error);\n return null;\n }\n }\n\n private createPartHeader(panel: DashboardPanel, panelId: string): HTMLElement {\n const header = document.createElement('div');\n header.className = 'dashboard-part-header';\n header.style.cssText = `\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 12px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n min-height: 40px;\n `;\n\n // Icon and title\n const titleSection = document.createElement('div');\n titleSection.style.cssText = 'display: flex; align-items: center; gap: 8px; flex: 1; min-width: 0;';\n titleSection.innerHTML = `\n <i class=\"${EscapeHTML(panel.icon || 'fa-solid fa-puzzle-piece')}\" style=\"color: var(--mj-brand-primary); font-size: 14px;\"></i>\n <span style=\"font-weight: 500; font-size: 14px; color: var(--mj-text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\">${EscapeHTML(panel.title)}</span>\n `;\n header.appendChild(titleSection);\n\n // Action buttons (only in edit mode)\n if (this.IsEditing) {\n const actions = document.createElement('div');\n actions.style.cssText = 'display: flex; gap: 4px;';\n\n // Configure button\n const configBtn = document.createElement('button');\n configBtn.className = 'part-action-btn';\n configBtn.title = 'Configure';\n configBtn.style.cssText = `\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: 4px;\n background: transparent;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s;\n `;\n configBtn.innerHTML = '<i class=\"fa-solid fa-cog\" style=\"font-size: 12px;\"></i>';\n configBtn.addEventListener('click', () => this.onConfigurePart(panelId));\n configBtn.addEventListener('mouseenter', () => {\n configBtn.style.background = 'var(--mj-border-default)';\n configBtn.style.color = 'var(--mj-text-primary)';\n });\n configBtn.addEventListener('mouseleave', () => {\n configBtn.style.background = 'transparent';\n configBtn.style.color = 'var(--mj-text-secondary)';\n });\n\n // Remove button\n const removeBtn = document.createElement('button');\n removeBtn.className = 'part-action-btn';\n removeBtn.title = 'Remove';\n removeBtn.style.cssText = `\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: 4px;\n background: transparent;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s;\n `;\n removeBtn.innerHTML = '<i class=\"fa-solid fa-times\" style=\"font-size: 12px;\"></i>';\n removeBtn.addEventListener('click', () => this.onRemovePart(panelId));\n removeBtn.addEventListener('mouseenter', () => {\n removeBtn.style.background = 'color-mix(in srgb, var(--mj-status-error) 10%, transparent)';\n removeBtn.style.color = 'var(--mj-status-error)';\n });\n removeBtn.addEventListener('mouseleave', () => {\n removeBtn.style.background = 'transparent';\n removeBtn.style.color = 'var(--mj-text-secondary)';\n });\n\n actions.appendChild(configBtn);\n actions.appendChild(removeBtn);\n header.appendChild(actions);\n }\n\n return header;\n }\n\n private renderPartContent(panel: DashboardPanel, container: HTMLElement, partType: MJDashboardPartTypeEntity | undefined): void {\n const config = panel.config;\n\n switch (config?.type) {\n case 'WebURL':\n this.renderWebURLPart(panel, container, config);\n break;\n case 'View':\n this.renderViewPart(panel, container, config);\n break;\n case 'Query':\n this.renderQueryPart(panel, container, config);\n break;\n case 'Artifact':\n this.renderArtifactPart(panel, container, config);\n break;\n default:\n this.renderPlaceholderPart(panel, container, partType);\n }\n }\n\n private renderWebURLPart(panel: DashboardPanel, container: HTMLElement, config: PanelConfig): void {\n const url = config['url'] as string | undefined;\n if (!url) {\n container.innerHTML = `\n <div style=\"display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; color: var(--mj-text-secondary); text-align: center; padding: 24px;\">\n <i class=\"fa-solid fa-globe\" style=\"font-size: 48px; color: var(--mj-text-muted); margin-bottom: 16px;\"></i>\n <h4 style=\"margin: 0 0 8px 0; color: var(--mj-text-primary);\">No URL Configured</h4>\n <p style=\"margin: 0; font-size: 13px;\">Click the configure button to set a URL for this part.</p>\n </div>\n `;\n return;\n }\n\n const sandboxMode = config['sandboxMode'] as string | undefined;\n // Determine sandbox permissions based on mode\n let sandbox = 'allow-scripts allow-same-origin allow-forms allow-popups';\n if (sandboxMode === 'strict') {\n sandbox = 'allow-scripts';\n } else if (sandboxMode === 'permissive') {\n sandbox = 'allow-scripts allow-same-origin allow-forms allow-popups allow-modals allow-top-navigation';\n }\n\n const iframe = document.createElement('iframe');\n iframe.src = url;\n iframe.style.cssText = 'width: 100%; height: 100%; border: none;';\n iframe.sandbox.value = sandbox;\n if (config['allowFullscreen'] !== false) {\n iframe.allowFullscreen = true;\n }\n iframe.title = panel.title;\n\n container.appendChild(iframe);\n }\n\n private renderViewPart(panel: DashboardPanel, container: HTMLElement, config: PanelConfig): void {\n const viewId = config['viewId'] as string | undefined;\n const entityName = config['entityName'] as string | undefined;\n if (!viewId && !entityName) {\n container.innerHTML = `\n <div style=\"display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; color: var(--mj-text-secondary); text-align: center; padding: 24px;\">\n <i class=\"fa-solid fa-table\" style=\"font-size: 48px; color: var(--mj-text-muted); margin-bottom: 16px;\"></i>\n <h4 style=\"margin: 0 0 8px 0; color: var(--mj-text-primary);\">No View Selected</h4>\n <p style=\"margin: 0; font-size: 13px;\">Click configure to select a view for this part.</p>\n </div>\n `;\n return;\n }\n\n const viewInfo = viewId ? viewId.substring(0, 8) + '...' : entityName;\n const displayModeValue = config['displayMode'] as string | undefined;\n const displayMode = displayModeValue === 'grid' ? 'Grid View' : displayModeValue === 'cards' ? 'Card View' : 'Timeline View';\n container.innerHTML = `\n <div style=\"display: flex; flex-direction: column; height: 100%; background: var(--mj-bg-surface);\">\n <div style=\"padding: 16px 20px; border-bottom: 1px solid var(--mj-border-default); background: var(--mj-bg-surface-card);\">\n <div style=\"display: flex; align-items: center; gap: 12px;\">\n <i class=\"fa-solid fa-table\" style=\"font-size: 20px; color: var(--mj-brand-primary);\"></i>\n <div>\n <div style=\"font-weight: 500; color: var(--mj-text-primary); font-size: 14px;\">Entity View</div>\n <div style=\"font-size: 12px; color: var(--mj-text-secondary);\">${EscapeHTML(entityName || 'View ' + viewInfo)}</div>\n </div>\n <span style=\"margin-left: auto; padding: 4px 10px; background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent); color: var(--mj-brand-primary); border-radius: 12px; font-size: 11px; font-weight: 500;\">${EscapeHTML(displayMode)}</span>\n </div>\n </div>\n <div style=\"flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; color: var(--mj-text-muted); padding: 24px;\">\n <i class=\"fa-solid fa-spinner fa-spin\" style=\"font-size: 24px; margin-bottom: 12px;\"></i>\n <p style=\"margin: 0; font-size: 13px;\">Entity grid loading...</p>\n <p style=\"margin: 8px 0 0 0; font-size: 11px; color: var(--mj-text-muted);\">Full implementation pending Angular integration</p>\n </div>\n </div>\n `;\n }\n\n private renderQueryPart(panel: DashboardPanel, container: HTMLElement, config: PanelConfig): void {\n const queryId = config['queryId'] as string | undefined;\n const queryName = config['queryName'] as string | undefined;\n if (!queryId && !queryName) {\n container.innerHTML = `\n <div style=\"display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; color: var(--mj-text-secondary); text-align: center; padding: 24px;\">\n <i class=\"fa-solid fa-database\" style=\"font-size: 48px; color: var(--mj-text-muted); margin-bottom: 16px;\"></i>\n <h4 style=\"margin: 0 0 8px 0; color: var(--mj-text-primary);\">No Query Selected</h4>\n <p style=\"margin: 0; font-size: 13px;\">Click configure to select a query for this part.</p>\n </div>\n `;\n return;\n }\n\n const autoRefreshSeconds = (config['autoRefreshSeconds'] as number) || 0;\n const queryInfo = queryName || (queryId ? queryId.substring(0, 8) + '...' : 'Unknown');\n container.innerHTML = `\n <div style=\"display: flex; flex-direction: column; height: 100%; background: var(--mj-bg-surface);\">\n <div style=\"padding: 16px 20px; border-bottom: 1px solid var(--mj-border-default); background: var(--mj-bg-surface-card);\">\n <div style=\"display: flex; align-items: center; gap: 12px;\">\n <i class=\"fa-solid fa-database\" style=\"font-size: 20px; color: var(--mj-brand-primary);\"></i>\n <div>\n <div style=\"font-weight: 500; color: var(--mj-text-primary); font-size: 14px;\">Query Results</div>\n <div style=\"font-size: 12px; color: var(--mj-text-secondary);\">${EscapeHTML(queryInfo)}</div>\n </div>\n <span style=\"margin-left: auto; padding: 4px 10px; background: color-mix(in srgb, var(--mj-status-success) 10%, transparent); color: var(--mj-status-success); border-radius: 12px; font-size: 11px; font-weight: 500;\">${autoRefreshSeconds > 0 ? 'Refresh: ' + autoRefreshSeconds + 's' : 'Manual refresh'}</span>\n </div>\n </div>\n <div style=\"flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; color: var(--mj-text-muted); padding: 24px;\">\n <i class=\"fa-solid fa-spinner fa-spin\" style=\"font-size: 24px; margin-bottom: 12px;\"></i>\n <p style=\"margin: 0; font-size: 13px;\">Query grid loading...</p>\n <p style=\"margin: 8px 0 0 0; font-size: 11px; color: var(--mj-text-muted);\">Full implementation pending Angular integration</p>\n </div>\n </div>\n `;\n }\n\n private renderArtifactPart(panel: DashboardPanel, container: HTMLElement, config: PanelConfig): void {\n const artifactId = config['artifactId'] as string | undefined;\n if (!artifactId) {\n container.innerHTML = `\n <div style=\"display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; color: var(--mj-text-secondary); text-align: center; padding: 24px;\">\n <i class=\"fa-solid fa-cube\" style=\"font-size: 48px; color: var(--mj-text-muted); margin-bottom: 16px;\"></i>\n <h4 style=\"margin: 0 0 8px 0; color: var(--mj-text-primary);\">No Artifact Selected</h4>\n <p style=\"margin: 0; font-size: 13px;\">Click configure to select an artifact for this part.</p>\n </div>\n `;\n return;\n }\n\n const versionNumber = config['versionNumber'] as number | undefined;\n const artifactInfo = artifactId.substring(0, 8) + '...';\n const versionInfo = versionNumber ? `v${versionNumber}` : 'Latest';\n container.innerHTML = `\n <div style=\"display: flex; flex-direction: column; height: 100%; background: var(--mj-bg-surface);\">\n <div style=\"padding: 16px 20px; border-bottom: 1px solid var(--mj-border-default); background: var(--mj-bg-surface-card);\">\n <div style=\"display: flex; align-items: center; gap: 12px;\">\n <i class=\"fa-solid fa-cube\" style=\"font-size: 20px; color: var(--mj-brand-primary);\"></i>\n <div>\n <div style=\"font-weight: 500; color: var(--mj-text-primary); font-size: 14px;\">Artifact</div>\n <div style=\"font-size: 12px; color: var(--mj-text-secondary);\">ID: ${EscapeHTML(artifactInfo)}</div>\n </div>\n <span style=\"margin-left: auto; padding: 4px 10px; background: color-mix(in srgb, var(--mj-status-error) 10%, transparent); color: var(--mj-status-error); border-radius: 12px; font-size: 11px; font-weight: 500;\">${EscapeHTML(versionInfo)}</span>\n </div>\n </div>\n <div style=\"flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; color: var(--mj-text-muted); padding: 24px;\">\n <i class=\"fa-solid fa-spinner fa-spin\" style=\"font-size: 24px; margin-bottom: 12px;\"></i>\n <p style=\"margin: 0; font-size: 13px;\">Artifact viewer loading...</p>\n <p style=\"margin: 8px 0 0 0; font-size: 11px; color: var(--mj-text-muted);\">Full implementation pending Angular integration</p>\n </div>\n </div>\n `;\n }\n\n private renderPlaceholderPart(panel: DashboardPanel, container: HTMLElement, partType: MJDashboardPartTypeEntity | undefined): void {\n const partTypeName = partType?.Name || 'Custom';\n container.innerHTML = `\n <div style=\"display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; color: var(--mj-text-secondary); text-align: center; padding: 24px;\">\n <i class=\"fa-solid fa-puzzle-piece\" style=\"font-size: 48px; color: var(--mj-text-muted); margin-bottom: 16px;\"></i>\n <h4 style=\"margin: 0 0 8px 0; color: var(--mj-text-primary);\">${EscapeHTML(partTypeName)} Part</h4>\n <p style=\"margin: 0; font-size: 13px;\">This part type is not yet fully implemented.</p>\n </div>\n `;\n }\n\n private onConfigurePart(panelId: string): void {\n // Emit event for parent to handle configuration\n this.PanelInteraction.emit({\n panelId,\n interactionType: 'custom',\n payload: { action: 'configure-part-requested' }\n });\n }\n\n private onRemovePart(panelId: string): void {\n // Emit event for parent to show confirmation dialog\n const panel = FindPanelInLayout(this.config?.layout ?? null, panelId);\n this.PanelInteraction.emit({\n panelId,\n interactionType: 'custom',\n payload: {\n action: 'remove-part-requested',\n panelTitle: panel?.title || 'this part'\n }\n });\n }\n\n /**\n * Confirm removal of a panel (called by parent after confirmation dialog)\n */\n public ConfirmRemovePanel(panelId: string): void {\n this.RemovePanel(panelId);\n }\n\n /** @deprecated Use {@link ConfirmRemovePanel}. */\n public confirmRemovePanel(panelId: string): void {\n return this.ConfirmRemovePanel(panelId);\n }\n\n private destroyPanelComponent(panelId: string): void {\n const entry = this._panelComponents.get(panelId);\n if (entry) {\n // Destroy the Angular component if present\n if (entry.componentRef) {\n this.appRef.detachView(entry.componentRef.hostView);\n entry.componentRef.destroy();\n }\n this._panelComponents.delete(panelId);\n }\n }\n\n private updatePanelEditModes(): void {\n // Update IsEditing on all dynamic components\n this._panelComponents.forEach((entry) => {\n if (entry.componentRef) {\n entry.componentRef.instance.IsEditing = this.IsEditing;\n }\n });\n\n // Save current layout before reinitializing (preserves user's arrangement)\n if (this._glService && this.config) {\n const currentLayout = this._glService.getLayoutConfig();\n if (currentLayout) {\n this.config.layout = currentLayout;\n }\n }\n\n // Reinitialize layout to apply new Golden Layout settings (edit mode lock/unlock)\n if (this._glService) {\n this.initializeLayout();\n }\n }\n\n // ========================================\n // Private Methods - State\n // ========================================\n\n private markDirty(): void {\n this.HasUnsavedChanges = true;\n\n if (this.AutoSave && this.config) {\n this.save();\n }\n }\n}\n","<!-- Dashboard Viewer Component -->\n<div class=\"dashboard-viewer\" [class.editing]=\"isEditing\" [class.has-toolbar]=\"shouldShowToolbar\">\n <!-- Breadcrumb Navigation (hidden in edit mode) -->\n @if (showBreadcrumb && !isEditing && dashboard) {\n <mj-dashboard-breadcrumb\n [Categories]=\"Categories\"\n [CurrentCategoryId]=\"dashboard.CategoryID\"\n [CurrentDashboard]=\"dashboard\"\n [ShowDashboardName]=\"true\"\n [AllowDragDrop]=\"false\"\n Size=\"large\"\n RootIcon=\"fa-solid fa-gauge-high\"\n RootLabel=\"Dashboards\"\n (Navigate)=\"onBreadcrumbNavigate($event)\">\n </mj-dashboard-breadcrumb>\n }\n\n <!-- Toolbar (auto-hides when all elements are disabled) -->\n @if (shouldShowToolbar) {\n <div class=\"dashboard-toolbar\">\n <div class=\"toolbar-left\">\n @if (dashboard && (isEditing || !showBreadcrumb)) {\n <span class=\"dashboard-title\">\n <i class=\"fa-solid fa-chart-line\"></i>\n {{ dashboard.Name }}\n </span>\n }\n </div>\n <div class=\"toolbar-center\">\n @if (hasUnsavedChanges && isEditing) {\n <span class=\"unsaved-indicator\">\n <i class=\"fa-solid fa-circle\"></i>\n Unsaved changes\n </span>\n }\n </div>\n <div class=\"toolbar-right\">\n <!-- Open in New Tab button (when embedded) -->\n @if (showOpenInTabButton && !isEditing) {\n <button\n class=\"toolbar-button\"\n (click)=\"onOpenInTabClick()\"\n title=\"Open in its own tab\">\n <i class=\"fa-solid fa-up-right-from-square\"></i>\n Open in Tab\n </button>\n }\n @if (isEditing) {\n <button\n class=\"toolbar-button\"\n (click)=\"onAddPanelClick()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Part\n </button>\n }\n @if (showEditButton) {\n <button\n class=\"toolbar-button\"\n [class.active]=\"isEditing\"\n (click)=\"toggleEditMode()\">\n <i class=\"fa-solid fa-edit\"></i>\n {{ isEditing ? 'Editing' : 'Edit' }}\n </button>\n }\n @if (isEditing && hasUnsavedChanges) {\n <button\n class=\"toolbar-button primary\"\n (click)=\"save()\">\n <i class=\"fa-solid fa-save\"></i>\n Save\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Loading Overlay -->\n @if (isLoading) {\n <div class=\"loading-overlay\">\n <mj-loading text=\"Loading dashboard...\"></mj-loading>\n </div>\n }\n\n <!-- Layout Container -->\n <div class=\"layout-container\" #layoutContainer>\n <!-- Golden Layout will render panels here -->\n </div>\n\n <!-- Empty State -->\n @if (!hasPanels && !isLoading) {\n <mj-empty-state\n class=\"dashboard-empty\"\n Icon=\"fa-solid fa-layer-group\"\n Title=\"No parts configured\"\n Message=\"This dashboard has no parts yet. Add your first part to start visualizing your data.\"\n [ActionText]=\"isEditing ? 'Add Your First Part' : ''\"\n ActionIcon=\"fa-solid fa-plus\"\n (Action)=\"onAddPanelClick()\" />\n }\n</div>\n"]}
1
+ {"version":3,"file":"dashboard-viewer.component.js","sourceRoot":"","sources":["../../../src/lib/dashboard-viewer/dashboard-viewer.component.ts","../../../src/lib/dashboard-viewer/dashboard-viewer.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnDestroy,\n ViewChild,\n ElementRef,\n ChangeDetectorRef,\n ApplicationRef,\n Injector,\n ComponentRef,\n createComponent,\n EnvironmentInjector,\n Type,\n ViewEncapsulation\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { MJGlobal, UUIDsEqual, EscapeHTML } from '@memberjunction/global';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { DashboardEngine, MJDashboardEntity, MJDashboardPartTypeEntity, MJDashboardCategoryEntity } from '@memberjunction/core-entities';\nimport { BreadcrumbNavigateEvent } from '../breadcrumb/dashboard-breadcrumb.component';\nimport { ResolvedLayoutConfig } from 'golden-layout';\nimport {\n DashboardConfig,\n DashboardPanel,\n PanelConfig,\n PanelInteractionEvent,\n DashboardConfigChangedEvent,\n LayoutChangedEvent,\n DashboardNavRequestEvent,\n CreateDefaultDashboardConfig,\n GeneratePanelId,\n ExtractPanelsFromLayout,\n FindPanelInLayout\n} from '../models/dashboard-types';\nimport { GoldenLayoutWrapperService, StackActionEvent } from '../services/golden-layout-wrapper.service';\nimport { InsertPanel, FindPanelPath, DescribePath, type PanelPosition } from '../models/dashboard-layout-editor';\nimport { BaseDashboardPart } from '../parts/base-dashboard-part';\n\nexport type DashboardLayoutReadyState =\n | 'pending-dashboard'\n | 'pending-parts'\n | 'waiting-for-size'\n | 'initializing'\n | 'ready'\n | 'error';\n\nexport interface DashboardLayoutLifecycleEvent {\n state: DashboardLayoutReadyState;\n dashboardId?: string;\n reason?: string;\n error?: Error;\n}\n\nconst LAYOUT_CONTAINER_SIZE_TIMEOUT_MS = 10_000;\n/** Time a layout build waits after its parts are created, before its final size update. */\nconst LAYOUT_SETTLE_DELAY_MS = 100;\n\n/**\n * Main dashboard viewer component.\n * Renders a configurable dashboard with draggable/resizable panels using Golden Layout.\n *\n * This component is GENERIC and has no routing dependencies.\n * Navigation events are bubbled up for the parent component to handle.\n */\n@Component({\n standalone: false,\n selector: 'mj-dashboard-viewer',\n templateUrl: './dashboard-viewer.component.html',\n styleUrls: ['./dashboard-viewer.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class DashboardViewerComponent extends BaseAngularComponent implements OnDestroy {\n // ========================================\n // Inputs\n // ========================================\n\n private _dashboard: MJDashboardEntity | null = null;\n private _dashboardId: string | null = null;\n\n /** The dashboard entity to display */\n @Input()\n set Dashboard(value: MJDashboardEntity | null) {\n const previous = this._dashboard;\n this._dashboard = value;\n if (value && value !== previous) {\n this.onDashboardChanged();\n }\n }\n get Dashboard(): MJDashboardEntity | null {\n return this._dashboard;\n }\n\n /** @deprecated Use {@link Dashboard}. */\n get dashboard(): MJDashboardEntity | null {\n return this.Dashboard;\n }\n /** @deprecated Use {@link Dashboard}. */\n @Input() set dashboard(value: MJDashboardEntity | null) {\n this.Dashboard = value;\n }\n\n /** Alternative: Load dashboard by ID */\n @Input()\n set DashboardId(value: string | null) {\n const previous = this._dashboardId;\n this._dashboardId = value;\n if (value && value !== previous) {\n this.loadDashboardById(value);\n }\n }\n get DashboardId(): string | null {\n return this._dashboardId;\n }\n\n /** @deprecated Use {@link DashboardId}. */\n get dashboardId(): string | null {\n return this.DashboardId;\n }\n /** @deprecated Use {@link DashboardId}. */\n @Input() set dashboardId(value: string | null) {\n this.DashboardId = value;\n }\n\n /** Whether the dashboard is in edit mode */\n private _isEditing = false;\n\n @Input()\n set IsEditing(value: boolean) {\n const previous = this._isEditing;\n this._isEditing = value;\n // When isEditing changes (and layout exists), reinitialize to apply GL settings\n if (value !== previous && this._glService) {\n this.updatePanelEditModes();\n }\n }\n get IsEditing(): boolean {\n return this._isEditing;\n }\n\n /** @deprecated Use {@link IsEditing}. */\n get isEditing(): boolean {\n return this.IsEditing;\n }\n /** @deprecated Use {@link IsEditing}. */\n @Input() set isEditing(value: boolean) {\n this.IsEditing = value;\n }\n\n /**\n * Whether the user may edit this dashboard. An empty dashboard then offers Add part in view mode\n * too; the host decides how to get into edit mode.\n */\n @Input() CanEdit = false;\n\n /** Whether to show the toolbar */\n private _showToolbar = true;\n\n @Input()\n set ShowToolbar(value: boolean) {\n this._showToolbar = value;\n }\n get ShowToolbar(): boolean {\n return this._showToolbar;\n }\n\n /** @deprecated Use {@link ShowToolbar}. */\n get showToolbar(): boolean {\n return this.ShowToolbar;\n }\n /** @deprecated Use {@link ShowToolbar}. */\n @Input() set showToolbar(value: boolean) {\n this.ShowToolbar = value;\n }\n\n /** Whether to auto-save layout changes */\n private _autoSave = false;\n\n @Input()\n set AutoSave(value: boolean) {\n this._autoSave = value;\n }\n get AutoSave(): boolean {\n return this._autoSave;\n }\n\n /** @deprecated Use {@link AutoSave}. */\n get autoSave(): boolean {\n return this.AutoSave;\n }\n /** @deprecated Use {@link AutoSave}. */\n @Input() set autoSave(value: boolean) {\n this.AutoSave = value;\n }\n\n /** Whether to show the breadcrumb navigation */\n @Input() ShowBreadcrumb = true;\n\n /** @deprecated Use {@link ShowBreadcrumb}. */\n @Input() set showBreadcrumb(value: DashboardViewerComponent['ShowBreadcrumb']) {\n this.ShowBreadcrumb = value;\n }\n /** @deprecated Use {@link ShowBreadcrumb}. */\n get showBreadcrumb(): DashboardViewerComponent['ShowBreadcrumb'] {\n return this.ShowBreadcrumb;\n }\n\n /** Whether to show the \"Open in Tab\" button (for embedded dashboards) */\n @Input() ShowOpenInTabButton = false;\n\n /** @deprecated Use {@link ShowOpenInTabButton}. */\n @Input() set showOpenInTabButton(value: DashboardViewerComponent['ShowOpenInTabButton']) {\n this.ShowOpenInTabButton = value;\n }\n /** @deprecated Use {@link ShowOpenInTabButton}. */\n get showOpenInTabButton(): DashboardViewerComponent['ShowOpenInTabButton'] {\n return this.ShowOpenInTabButton;\n }\n\n /** Whether to show the Edit button */\n @Input() ShowEditButton = true;\n\n /** @deprecated Use {@link ShowEditButton}. */\n @Input() set showEditButton(value: DashboardViewerComponent['ShowEditButton']) {\n this.ShowEditButton = value;\n }\n /** @deprecated Use {@link ShowEditButton}. */\n get showEditButton(): DashboardViewerComponent['ShowEditButton'] {\n return this.ShowEditButton;\n }\n\n /** All categories for breadcrumb path resolution */\n @Input() Categories: MJDashboardCategoryEntity[] = [];\n\n /**\n * Computed: Should the toolbar be visible?\n * Auto-hides when showToolbar=false OR when all toolbar elements are disabled\n */\n public get ShouldShowToolbar(): boolean {\n if (!this._showToolbar) {\n return false;\n }\n // If all elements are hidden, hide the toolbar entirely\n return this.ShowBreadcrumb || this.ShowOpenInTabButton || this.ShowEditButton;\n }\n\n /** @deprecated Use {@link ShouldShowToolbar}. */\n public get shouldShowToolbar(): boolean {\n return this.ShouldShowToolbar;\n }\n\n // ========================================\n // Outputs\n // ========================================\n\n /** Emitted when dashboard configuration changes */\n @Output() configChanged = new EventEmitter<DashboardConfigChangedEvent>();\n\n /** Emitted when a panel requests navigation to another resource */\n @Output() NavigationRequested = new EventEmitter<DashboardNavRequestEvent>();\n\n /**\n * @deprecated Use {@link NavigationRequested}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (navigationRequested) keeps working. Must stay AFTER NavigationRequested: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() navigationRequested = this.NavigationRequested;\n\n /** Emitted when a panel interaction occurs */\n @Output() PanelInteraction = new EventEmitter<PanelInteractionEvent>();\n\n /**\n * @deprecated Use {@link PanelInteraction}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (panelInteraction) keeps working. Must stay AFTER PanelInteraction: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() panelInteraction = this.PanelInteraction;\n\n /** Emitted when the dashboard is saved */\n @Output() DashboardSaved = new EventEmitter<MJDashboardEntity>();\n\n /**\n * @deprecated Use {@link DashboardSaved}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (dashboardSaved) keeps working. Must stay AFTER DashboardSaved: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() dashboardSaved = this.DashboardSaved;\n\n /** Emitted when an error occurs */\n @Output() error = new EventEmitter<{ message: string; error?: Error }>();\n\n /** Emitted when edit mode changes */\n @Output() EditModeChanged = new EventEmitter<boolean>();\n\n /**\n * @deprecated Use {@link EditModeChanged}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (editModeChanged) keeps working. Must stay AFTER EditModeChanged: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() editModeChanged = this.EditModeChanged;\n\n /** Emitted when user navigates via breadcrumb */\n @Output() BreadcrumbNavigate = new EventEmitter<BreadcrumbNavigateEvent>();\n\n /**\n * @deprecated Use {@link BreadcrumbNavigate}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (breadcrumbNavigate) keeps working. Must stay AFTER BreadcrumbNavigate: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() breadcrumbNavigate = this.BreadcrumbNavigate;\n\n /** Emitted when user clicks \"Open in Tab\" button */\n @Output() OpenInTab = new EventEmitter<{ dashboardId: string; dashboardName: string }>();\n\n /**\n * @deprecated Use {@link OpenInTab}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (openInTab) keeps working. Must stay AFTER OpenInTab: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() openInTab = this.OpenInTab;\n\n /** Emitted as the Golden Layout viewer moves through dashboard/layout readiness states. */\n @Output() LayoutLifecycle = new EventEmitter<DashboardLayoutLifecycleEvent>();\n\n /**\n * @deprecated Use {@link LayoutLifecycle}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (layoutLifecycle) keeps working. Must stay AFTER LayoutLifecycle: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() layoutLifecycle = this.LayoutLifecycle;\n\n /** Emitted once Golden Layout has initialized with a non-zero container and updated its size. */\n @Output() LayoutReady = new EventEmitter<void>();\n\n /**\n * @deprecated Use {@link LayoutReady}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (layoutReady) keeps working. Must stay AFTER LayoutReady: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() layoutReady = this.LayoutReady;\n\n /** Emitted when layout initialization is deferred because the container cannot be initialized yet. */\n @Output() LayoutDeferred = new EventEmitter<{ reason: string }>();\n\n /**\n * @deprecated Use {@link LayoutDeferred}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (layoutDeferred) keeps working. Must stay AFTER LayoutDeferred: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() layoutDeferred = this.LayoutDeferred;\n\n // ========================================\n // View Children\n // ========================================\n\n @ViewChild('layoutContainer', { static: true }) LayoutContainer!: ElementRef<HTMLElement>;\n\n /** @deprecated Use {@link LayoutContainer}. */\n get layoutContainer(): ElementRef<HTMLElement> {\n return this.LayoutContainer;\n }\n /** @deprecated Use {@link LayoutContainer}. */\n set layoutContainer(value: ElementRef<HTMLElement>) {\n this.LayoutContainer = value;\n }\n\n // ========================================\n // State\n // ========================================\n\n public isLoading = false;\n public config: DashboardConfig | null = null;\n public PartTypes: MJDashboardPartTypeEntity[] = [];\n\n /** @deprecated Use {@link PartTypes}. */\n public get partTypes(): MJDashboardPartTypeEntity[] {\n return this.PartTypes;\n }\n /** @deprecated Use {@link PartTypes}. */\n public set partTypes(value: MJDashboardPartTypeEntity[]) {\n this.PartTypes = value;\n }\n public HasUnsavedChanges = false;\n\n /** @deprecated Use {@link HasUnsavedChanges}. */\n public get hasUnsavedChanges() {\n return this.HasUnsavedChanges;\n }\n /** @deprecated Use {@link HasUnsavedChanges}. */\n public set hasUnsavedChanges(value) {\n this.HasUnsavedChanges = value;\n }\n\n /** The saved configuration (UIConfigDetails) the layout was loaded from or last saved as. */\n private _loadedConfigDetails: string | null = null;\n\n /**\n * Helper to check if layout has any panels (for template use).\n * Panels are stored in componentState within the layout tree.\n */\n public get HasPanels(): boolean {\n return ExtractPanelsFromLayout(this.config?.layout ?? null).length > 0;\n }\n\n /** @deprecated Use {@link HasPanels}. */\n public get hasPanels(): boolean {\n return this.HasPanels;\n }\n\n private readonly _destroy$ = new Subject<void>();\n private readonly _panelComponents = new Map<string, { wrapper: HTMLElement; componentRef?: ComponentRef<BaseDashboardPart> }>();\n private _glService: GoldenLayoutWrapperService | null = null;\n\n /** Promise that resolves when part types are loaded - used to ensure layout waits for part types */\n private _partTypesLoaded: Promise<void> | null = null;\n private _layoutReadyPromise: Promise<void> = Promise.resolve();\n private _resolveLayoutReady: (() => void) | null = null;\n private _rejectLayoutReady: ((error: Error) => void) | null = null;\n private _layoutInitGeneration = 0;\n /** Number of the latest layout build. A build that is no longer the latest stops at its next step. */\n private _layoutBuild = 0;\n private _resolveDeferredLayoutInit: (() => void) | null = null;\n private _rejectDeferredLayoutInit: ((error: Error) => void) | null = null;\n private _deferredLayoutInitTimer: ReturnType<typeof setTimeout> | null = null;\n\n // ========================================\n // Constructor\n // ========================================\n\n constructor(\n private readonly cdr: ChangeDetectorRef,\n private readonly appRef: ApplicationRef,\n private readonly injector: Injector,\n private readonly environmentInjector: EnvironmentInjector\n ) {\n super();\n // Store the promise so layout initialization can wait for it\n this._partTypesLoaded = this.loadPartTypes();\n }\n\n // ========================================\n // Lifecycle\n // ========================================\n\n ngOnDestroy(): void {\n this._destroy$.next();\n this._destroy$.complete();\n const generation = this._layoutInitGeneration;\n this.resolveLayoutReady(generation);\n this._layoutInitGeneration++;\n this.cancelDeferredLayoutInit();\n this.destroyLayout();\n }\n\n // ========================================\n // Public Methods\n // ========================================\n\n /**\n * Toggle edit mode\n */\n public ToggleEditMode(): void {\n this.IsEditing = !this.IsEditing;\n this.EditModeChanged.emit(this.IsEditing);\n this.updatePanelEditModes();\n }\n\n /** @deprecated Use {@link ToggleEditMode}. */\n public toggleEditMode(): void {\n return this.ToggleEditMode();\n }\n\n /**\n * Adds a panel and returns its id, or null when nothing was added (no layout yet, or an unknown\n * part type). With a location, the layout editor places the panel there and the layout is\n * rebuilt; without one, Golden Layout adds the panel to its first stack.\n * @throws LayoutEditError when the location is not valid or names a panel that is not in the layout.\n */\n public async AddPanel(\n partTypeId: string,\n panelConfig: PanelConfig,\n title: string,\n icon?: string,\n location?: PanelPosition\n ): Promise<string | null> {\n if (!this.config || !this._glService) {\n return null;\n }\n\n const partType = this.PartTypes.find(pt => UUIDsEqual(pt.ID, partTypeId));\n if (!partType) {\n this.error.emit({ message: `Unknown panel type: ${partTypeId}` });\n return null;\n }\n\n const panel: DashboardPanel = {\n id: GeneratePanelId(),\n partTypeId,\n title,\n icon: icon || partType.Icon || 'fa-solid fa-window-maximize',\n config: panelConfig\n };\n\n if (location) {\n await this.ApplyLayout(InsertPanel(this._glService.getLayoutConfig() ?? this.config.layout, panel, location));\n return panel.id;\n }\n\n // Add to Golden Layout - panel data stored in componentState\n this._glService.addPanel(panel);\n\n // Sync the layout config from Golden Layout to capture the new panel\n const currentLayout = this._glService.getLayoutConfig();\n if (currentLayout) {\n this.config.layout = currentLayout;\n }\n\n this.markDirty();\n return panel.id;\n }\n\n /** @deprecated Use {@link AddPanel}. */\n public async addPanel(\n partTypeId: string,\n panelConfig: PanelConfig,\n title: string,\n icon?: string,\n location?: PanelPosition\n ): Promise<string | null> {\n return this.AddPanel(partTypeId, panelConfig, title, icon, location);\n }\n\n /**\n * Remove a panel from the dashboard.\n * Panels live in GL's componentState, so removing from GL removes the panel.\n */\n public RemovePanel(panelId: string): void {\n if (!this.config || !this._glService) return;\n\n // Remove from layout (panel data is in componentState)\n this._glService.removePanel(panelId);\n\n // Sync layout config to persist the removal\n const currentLayout = this._glService.getLayoutConfig();\n if (currentLayout) {\n this.config.layout = currentLayout;\n }\n\n // Destroy component\n this.destroyPanelComponent(panelId);\n\n this.markDirty();\n }\n\n /** @deprecated Use {@link RemovePanel}. */\n public removePanel(panelId: string): void {\n return this.RemovePanel(panelId);\n }\n\n /**\n * Save the current dashboard configuration\n */\n public async save(): Promise<boolean> {\n if (!this._dashboard || !this.config) return false;\n\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n // Update the layout config from Golden Layout\n if (this._glService) {\n const glConfig = this._glService.getLayoutConfig();\n if (glConfig) {\n this.config.layout = glConfig;\n }\n }\n\n // Save to UIConfigDetails\n this._dashboard.UIConfigDetails = JSON.stringify(this.config);\n const saved = await this._dashboard.Save();\n\n if (saved) {\n this.HasUnsavedChanges = false;\n this._loadedConfigDetails = this._dashboard.UIConfigDetails ?? null;\n this.DashboardSaved.emit(this._dashboard);\n }\n\n return saved;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n this.error.emit({ message: 'Failed to save dashboard', error });\n return false;\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Refresh all panels\n */\n public async RefreshAllPanels(): Promise<void> {\n // For placeholder implementation, reinitialize the layout\n if (this._glService) {\n await this.initializeLayout();\n }\n }\n\n /** @deprecated Use {@link RefreshAllPanels}. */\n public async refreshAllPanels(): Promise<void> {\n return this.RefreshAllPanels();\n }\n\n /**\n * Shows `layout`: stores it as the dashboard's layout, rebuilds the panels, marks the dashboard\n * changed and emits a `layout` config change. Build the layout with the layout editor functions.\n * Rejects when the rebuild fails, for example when the container stays at zero size.\n */\n public async ApplyLayout(layout: ResolvedLayoutConfig): Promise<void> {\n if (!this.config) return;\n this.config.layout = layout;\n try {\n if (this._glService) {\n await this.initializeLayout();\n }\n } finally {\n // After the rebuild, so an auto-save reads the new layout back from Golden Layout.\n // The layout has changed even when the rebuild fails.\n this.markDirty();\n }\n this.configChanged.emit({ config: this.config, changeType: 'layout' });\n }\n\n /** The panel's address in the layout, for example `row/1 › tab 0`, or null when it is not in the layout. */\n public GetPanelPath(panelId: string): string | null {\n const path = FindPanelPath(this.config?.layout ?? null, panelId);\n return path ? DescribePath(path) : null;\n }\n\n /**\n * Resolves when the current dashboard's Golden Layout instance has initialized\n * against a non-zero container and completed its first size update.\n */\n public WaitForLayoutReady(): Promise<void> {\n return this._layoutReadyPromise;\n }\n\n /** @deprecated Use {@link WaitForLayoutReady}. */\n public waitForLayoutReady(): Promise<void> {\n return this.WaitForLayoutReady();\n }\n\n /**\n * True when the dashboard's saved layout differs from the one this viewer last loaded or saved,\n * for example after another tab saved the dashboard.\n * @param dashboard A saved copy of the shown dashboard. Defaults to the shown dashboard.\n */\n public HasNewerSavedLayout(dashboard: MJDashboardEntity | null = this._dashboard): boolean {\n return !!dashboard && (dashboard.UIConfigDetails ?? null) !== this._loadedConfigDetails;\n }\n\n /**\n * Shows the dashboard's saved layout again and drops unsaved layout changes. The current layout\n * is removed at once, so an edit-mode change made right after the call applies to the new\n * layout. A hidden viewer builds the layout when its container gets a size, with no time limit.\n * @param dashboard A saved copy of the shown dashboard to show instead. Defaults to the shown dashboard.\n */\n public ReloadFromSaved(dashboard: MJDashboardEntity | null = this._dashboard): Promise<void> {\n if (!dashboard) {\n return Promise.resolve();\n }\n this._dashboard = dashboard;\n this.HasUnsavedChanges = false;\n this.destroyLayout();\n return this.onDashboardChanged(false);\n }\n\n /**\n * Takes another copy of the shown dashboard without rebuilding the layout, for example after\n * DashboardEngine reloaded its dashboards. Later saves write that copy. Returns false, and changes\n * nothing, when the copy is of another dashboard or its saved layout differs from the one this\n * viewer last loaded or saved (use ReloadFromSaved then).\n */\n public UseSavedCopy(dashboard: MJDashboardEntity): boolean {\n if (!this._dashboard || !UUIDsEqual(dashboard.ID, this._dashboard.ID) || this.HasNewerSavedLayout(dashboard)) {\n return false;\n }\n this._dashboard = dashboard;\n return true;\n }\n\n /**\n * Get the current configuration\n */\n public getConfig(): DashboardConfig | null {\n return this.config;\n }\n\n /**\n * Get available part types\n */\n public GetPartTypes(): MJDashboardPartTypeEntity[] {\n return this.PartTypes;\n }\n\n /** @deprecated Use {@link GetPartTypes}. */\n public getPartTypes(): MJDashboardPartTypeEntity[] {\n return this.GetPartTypes();\n }\n\n /**\n * Get a panel by ID.\n * Extracts panel from the layout's componentState (single source of truth).\n */\n public GetPanel(panelId: string): DashboardPanel | null {\n return FindPanelInLayout(this.config?.layout ?? null, panelId);\n }\n\n /** @deprecated Use {@link GetPanel}. */\n public getPanel(panelId: string): DashboardPanel | null {\n return this.GetPanel(panelId);\n }\n\n /**\n * Get the part type for a panel\n */\n public GetPartTypeForPanel(panelId: string): MJDashboardPartTypeEntity | null {\n const panel = this.GetPanel(panelId);\n if (!panel) return null;\n return this.PartTypes.find(pt => UUIDsEqual(pt.ID, panel.partTypeId)) ?? null;\n }\n\n /** @deprecated Use {@link GetPartTypeForPanel}. */\n public getPartTypeForPanel(panelId: string): MJDashboardPartTypeEntity | null {\n return this.GetPartTypeForPanel(panelId);\n }\n\n /**\n * Update a panel's configuration.\n * Since panels live in componentState within the layout, we need to\n * update the layout tree directly or reinitialize with updated data.\n * Resolves once the layout is rebuilt with the updated panel; rejects when the rebuild fails.\n */\n public async UpdatePanelConfig(panelId: string, newConfig: PanelConfig, title?: string, icon?: string): Promise<void> {\n if (!this.config || !this._glService) return;\n\n // Get current layout which contains all panel data\n const currentLayout = this._glService.getLayoutConfig();\n if (!currentLayout) return;\n\n // Update panel in the layout tree\n this.updatePanelInLayout(currentLayout, panelId, newConfig, title, icon);\n this.config.layout = currentLayout;\n\n this.markDirty();\n\n // Reinitialize layout to reflect the updated panel\n await this.initializeLayout();\n }\n\n /** @deprecated Use {@link UpdatePanelConfig}. */\n public updatePanelConfig(panelId: string, newConfig: PanelConfig, title?: string, icon?: string): Promise<void> {\n return this.UpdatePanelConfig(panelId, newConfig, title, icon);\n }\n\n /**\n * Recursively update a panel's config within the layout tree\n */\n private updatePanelInLayout(\n layout: ResolvedLayoutConfig,\n panelId: string,\n newConfig: PanelConfig,\n title?: string,\n icon?: string\n ): void {\n if (!layout.root) return;\n\n const updateNode = (node: ResolvedLayoutConfig['root']): void => {\n if (!node) return;\n\n // If this is a component with matching panelId\n if (node.type === 'component') {\n const componentNode = node as unknown as { componentState?: DashboardPanel; title?: string };\n if (componentNode.componentState?.id === panelId) {\n componentNode.componentState.config = newConfig;\n if (title) {\n componentNode.componentState.title = title;\n componentNode.title = title;\n }\n if (icon) componentNode.componentState.icon = icon;\n }\n }\n\n // Recursively process children\n const containerNode = node as unknown as { content?: ResolvedLayoutConfig['root'][] };\n if (containerNode.content && Array.isArray(containerNode.content)) {\n for (const child of containerNode.content) {\n updateNode(child);\n }\n }\n };\n\n updateNode(layout.root);\n }\n\n /**\n * Handle add panel button click - emits event for parent to show dialog\n */\n public OnAddPanelClick(): void {\n // Emit interaction event for parent to handle\n // Parent should show AddPanelDialog and call addPanel() with result\n this.PanelInteraction.emit({\n panelId: '',\n interactionType: 'custom',\n payload: { action: 'add-panel-requested', partTypes: this.PartTypes }\n });\n }\n\n /** @deprecated Use {@link OnAddPanelClick}. */\n public onAddPanelClick(): void {\n return this.OnAddPanelClick();\n }\n\n /**\n * Handle \"Open in Tab\" button click - emits event for the parent to open the dashboard in a dashboard tab\n */\n public OnOpenInTabClick(): void {\n if (this._dashboard) {\n this.OpenInTab.emit({\n dashboardId: this._dashboard.ID,\n dashboardName: this._dashboard.Name\n });\n }\n }\n\n /** @deprecated Use {@link OnOpenInTabClick}. */\n public onOpenInTabClick(): void {\n return this.OnOpenInTabClick();\n }\n\n /**\n * Handle breadcrumb navigation\n */\n public OnBreadcrumbNavigate(event: BreadcrumbNavigateEvent): void {\n this.BreadcrumbNavigate.emit(event);\n }\n\n /** @deprecated Use {@link OnBreadcrumbNavigate}. */\n public onBreadcrumbNavigate(event: BreadcrumbNavigateEvent): void {\n return this.OnBreadcrumbNavigate(event);\n }\n\n // ========================================\n // Private Methods - Initialization\n // ========================================\n\n private async loadPartTypes(): Promise<void> {\n try {\n await DashboardEngine.Instance.Config(false);\n this.PartTypes = DashboardEngine.Instance.DashboardPartTypes;\n } catch (err) {\n console.error('Failed to load dashboard part types:', err);\n }\n }\n\n private async loadDashboardById(id: string): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n const p = this.ProviderToUse;\n const dashboard = await p.GetEntityObject<MJDashboardEntity>('MJ: Dashboards', p.CurrentUser);\n const loaded = await dashboard.Load(id);\n\n if (loaded) {\n this._dashboard = dashboard;\n this.onDashboardChanged();\n } else {\n this.error.emit({ message: `Dashboard not found: ${id}` });\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n this.error.emit({ message: 'Failed to load dashboard', error });\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Builds the layout from the dashboard's saved configuration.\n * @param limitSizeWait When true, a container that stays at zero size fails the build after\n * LAYOUT_CONTAINER_SIZE_TIMEOUT_MS. When false, the build waits until the container gets a size.\n */\n private async onDashboardChanged(limitSizeWait = true): Promise<void> {\n if (!this._dashboard) return;\n\n const generation = this.startLayoutReadyCycle();\n\n try {\n // Parse or create config\n this.config = this.parseOrCreateConfig();\n this._loadedConfigDetails = this._dashboard.UIConfigDetails ?? null;\n\n // Wait for part types to be loaded before initializing layout\n // This ensures partTypes array is populated when createPanelComponent is called\n if (this._partTypesLoaded) {\n this.emitLayoutLifecycle('pending-parts');\n await this._partTypesLoaded;\n }\n\n if (generation !== this._layoutInitGeneration) {\n return;\n }\n\n // Initialize layout\n await this.initializeLayout(generation, limitSizeWait);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n this.emitLayoutLifecycle('error', undefined, error);\n this.rejectLayoutReady(error, generation);\n this.error.emit({ message: 'Failed to initialize dashboard layout', error });\n }\n }\n\n private parseOrCreateConfig(): DashboardConfig {\n if (!this._dashboard?.UIConfigDetails) {\n return CreateDefaultDashboardConfig();\n }\n\n try {\n const parsed = JSON.parse(this._dashboard.UIConfigDetails);\n\n // Validate it has the expected structure (layout + settings)\n if (parsed.layout !== undefined && parsed.settings) {\n return parsed as DashboardConfig;\n }\n\n // Invalid format, return default\n console.warn('[DashboardViewer] Invalid config format, using default');\n return CreateDefaultDashboardConfig();\n } catch {\n return CreateDefaultDashboardConfig();\n }\n }\n\n // ========================================\n // Private Methods - Layout\n // ========================================\n\n private async initializeLayout(generation = this._layoutInitGeneration, limitSizeWait = true): Promise<void> {\n if (!this.config || !this.LayoutContainer?.nativeElement) {\n return;\n }\n\n const build = ++this._layoutBuild;\n const el = this.LayoutContainer.nativeElement;\n const rect = el.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) {\n // The container has no size yet — typically because Explorer is reattaching\n // this cached resource component on browser back/forward and the pane hasn't\n // been laid out. GoldenLayout never fires its 'show' event for a zero-size\n // container, so each panel's lazy content factory never runs and the panel is\n // stuck on \"Loading…\" forever (the React component inside never even mounts).\n // Defer init until the container actually has a size, then build the layout.\n const reason = 'layout container has zero size';\n this.emitLayoutLifecycle('waiting-for-size', reason);\n this.LayoutDeferred.emit({ reason });\n await this.waitForLayoutContainerSize(el, generation, limitSizeWait);\n if (!this.isCurrentLayoutBuild(build, generation)) {\n return;\n }\n }\n\n // We're proceeding with a real init — cancel any pending deferred attempt.\n this.cancelDeferredLayoutInit();\n this.emitLayoutLifecycle('initializing');\n\n // Destroy existing layout\n this.destroyLayout();\n\n // Create new Golden Layout service\n const glService = new GoldenLayoutWrapperService();\n this._glService = glService;\n\n // Subscribe to layout events\n this.subscribeToLayoutEvents();\n\n const pendingPanelCreations: Promise<void>[] = [];\n\n // Panel factory - called by GL when it binds a component\n // The panel comes directly from GL's componentState (single source of truth)\n const panelFactory = (panel: DashboardPanel, container: HTMLElement) => {\n const creation = this.createPanelComponent(panel, container, glService);\n pendingPanelCreations.push(\n creation.catch(error => {\n console.error('[DashboardViewer] Failed to create panel component:', error);\n })\n );\n };\n\n // Initialize with saved layout (or null for empty dashboard)\n // Golden Layout's native ResolvedLayoutConfig is the source of truth\n // Panel data is embedded in each component's componentState\n this._glService.initialize(\n this.LayoutContainer.nativeElement,\n this.config.layout,\n panelFactory,\n this.IsEditing\n );\n\n if (pendingPanelCreations.length > 0) {\n await Promise.all(pendingPanelCreations);\n }\n\n // After GL.initialize() completes, all components from the saved layout\n // have been synchronously bound via the panelFactory callback.\n // However, Angular needs time to complete change detection and render\n // the dynamic components. A single delayed updateSize() ensures GL\n // recalculates dimensions after Angular has finished rendering.\n await this.waitForLayoutToSettle();\n\n if (!this.isCurrentLayoutBuild(build, generation)) {\n return;\n }\n\n this._glService?.updateSize();\n this.cdr.detectChanges();\n this.emitLayoutLifecycle('ready');\n this.LayoutReady.emit();\n this.resolveLayoutReady(generation);\n }\n\n /** ResizeObserver used to wait for a zero-size container to gain a size before init. */\n private _layoutSizeObserver: ResizeObserver | null = null;\n\n /**\n * Wait (via ResizeObserver) until the layout container has a non-zero size, then\n * (re)initialize. Used when initializeLayout() is called while the container is\n * still 0×0 — e.g. during a cached-component reattach on browser back/forward —\n * where GoldenLayout would otherwise bind panels that never receive a 'show' event.\n * With `limitSizeWait`, the wait fails after LAYOUT_CONTAINER_SIZE_TIMEOUT_MS.\n */\n private waitForLayoutContainerSize(el: HTMLElement, generation: number, limitSizeWait = true): Promise<void> {\n this.cancelDeferredLayoutInit();\n\n return new Promise<void>((resolve, reject) => {\n this._resolveDeferredLayoutInit = resolve;\n this._rejectDeferredLayoutInit = reject;\n const ro = new ResizeObserver(() => {\n if (generation !== this._layoutInitGeneration) {\n this.cancelDeferredLayoutInit();\n return;\n }\n\n const r = el.getBoundingClientRect();\n if (r.width > 0 && r.height > 0) {\n this.cancelDeferredLayoutInit();\n }\n });\n\n const r = el.getBoundingClientRect();\n if (r.width > 0 && r.height > 0) {\n this._resolveDeferredLayoutInit = null;\n this._rejectDeferredLayoutInit = null;\n resolve();\n return;\n }\n\n if (limitSizeWait) {\n this._deferredLayoutInitTimer = setTimeout(() => {\n const error = new Error(\n `Dashboard layout container stayed at zero size for ${LAYOUT_CONTAINER_SIZE_TIMEOUT_MS}ms`\n );\n this.failDeferredLayoutInit(error);\n }, LAYOUT_CONTAINER_SIZE_TIMEOUT_MS);\n }\n ro.observe(el);\n this._layoutSizeObserver = ro;\n });\n }\n\n private cancelDeferredLayoutInit(): void {\n this.clearDeferredLayoutInitTimer();\n if (this._layoutSizeObserver) {\n this._layoutSizeObserver.disconnect();\n this._layoutSizeObserver = null;\n }\n if (this._resolveDeferredLayoutInit) {\n this._resolveDeferredLayoutInit();\n this._resolveDeferredLayoutInit = null;\n }\n this._rejectDeferredLayoutInit = null;\n }\n\n private failDeferredLayoutInit(error: Error): void {\n this.clearDeferredLayoutInitTimer();\n if (this._layoutSizeObserver) {\n this._layoutSizeObserver.disconnect();\n this._layoutSizeObserver = null;\n }\n if (this._rejectDeferredLayoutInit) {\n this._rejectDeferredLayoutInit(error);\n this._rejectDeferredLayoutInit = null;\n }\n this._resolveDeferredLayoutInit = null;\n }\n\n private clearDeferredLayoutInitTimer(): void {\n if (this._deferredLayoutInitTimer) {\n clearTimeout(this._deferredLayoutInitTimer);\n this._deferredLayoutInitTimer = null;\n }\n }\n\n /** True while the build is the latest layout build and its layout cycle is still current. */\n private isCurrentLayoutBuild(build: number, generation: number): boolean {\n return build === this._layoutBuild && generation === this._layoutInitGeneration;\n }\n\n /**\n * Resolves after LAYOUT_SETTLE_DELAY_MS. Each build waits on its own timer; a build that a newer\n * build replaced stops after the wait.\n */\n private waitForLayoutToSettle(): Promise<void> {\n return new Promise<void>(resolve => setTimeout(resolve, LAYOUT_SETTLE_DELAY_MS));\n }\n\n private startLayoutReadyCycle(): number {\n const generation = ++this._layoutInitGeneration;\n this.cancelDeferredLayoutInit();\n this._resolveLayoutReady?.();\n\n this._layoutReadyPromise = new Promise<void>((resolve, reject) => {\n this._resolveLayoutReady = resolve;\n this._rejectLayoutReady = reject;\n });\n this._layoutReadyPromise.catch(() => undefined);\n\n this.emitLayoutLifecycle('pending-dashboard');\n return generation;\n }\n\n private resolveLayoutReady(generation: number): void {\n if (generation !== this._layoutInitGeneration) {\n return;\n }\n\n this._resolveLayoutReady?.();\n this._resolveLayoutReady = null;\n this._rejectLayoutReady = null;\n }\n\n private rejectLayoutReady(error: Error, generation: number): void {\n if (generation !== this._layoutInitGeneration) {\n return;\n }\n\n this._rejectLayoutReady?.(error);\n this._resolveLayoutReady = null;\n this._rejectLayoutReady = null;\n }\n\n private emitLayoutLifecycle(state: DashboardLayoutReadyState, reason?: string, error?: Error): void {\n this.LayoutLifecycle.emit({\n state,\n dashboardId: this._dashboard?.ID,\n reason,\n error,\n });\n }\n\n /** Flag to prevent panel removal during layout reinit */\n private _isReinitializing = false;\n\n private destroyLayout(): void {\n // Set flag to prevent onPanelClosed from removing panels during reinit\n this._isReinitializing = true;\n\n // Destroy all panel components\n this._panelComponents.forEach((entry, panelId) => {\n this.destroyPanelComponent(panelId);\n });\n this._panelComponents.clear();\n\n // Destroy Golden Layout\n if (this._glService) {\n this._glService.destroy();\n this._glService = null;\n }\n\n this._isReinitializing = false;\n }\n\n private subscribeToLayoutEvents(): void {\n if (!this._glService) return;\n\n this._glService.onLayoutChanged\n .pipe(takeUntil(this._destroy$))\n .subscribe((event: LayoutChangedEvent) => {\n this.onLayoutChanged(event);\n });\n\n this._glService.onPanelClosed\n .pipe(takeUntil(this._destroy$))\n .subscribe((panelId: string) => {\n this.onPanelClosed(panelId);\n });\n\n this._glService.onPanelSelected\n .pipe(takeUntil(this._destroy$))\n .subscribe((panelId: string) => {\n this.onPanelSelected(panelId);\n });\n\n this._glService.OnStackAction\n .pipe(takeUntil(this._destroy$))\n .subscribe((event: StackActionEvent) => this.onStackAction(event));\n }\n\n /** Asks the host to edit or remove the part a stack header button acts on. */\n private onStackAction(event: StackActionEvent): void {\n switch (event.Action) {\n case 'edit':\n this.onConfigurePart(event.PanelId);\n break;\n case 'remove':\n this.onRemovePart(event.PanelId);\n break;\n }\n }\n\n private onLayoutChanged(event: LayoutChangedEvent): void {\n if (this.config) {\n this.config.layout = event.layout;\n this.markDirty();\n\n // Map layout change types to config change types\n const changeType = event.changeType === 'close' ? 'panel-removed' : 'layout';\n this.configChanged.emit({\n config: this.config,\n changeType\n });\n }\n }\n\n private onPanelClosed(panelId: string): void {\n // Skip panel removal during layout reinit (panels are being recreated, not actually closed)\n if (this._isReinitializing) {\n return;\n }\n\n // Sync layout config - panel was removed from GL's tree\n if (this.config && this._glService) {\n const currentLayout = this._glService.getLayoutConfig();\n if (currentLayout) {\n this.config.layout = currentLayout;\n }\n }\n\n // Destroy component\n this.destroyPanelComponent(panelId);\n this.markDirty();\n }\n\n private onPanelSelected(panelId: string): void {\n // Could be used to highlight selected panel in edit mode\n }\n\n // ========================================\n // Private Methods - Panel Components\n // ========================================\n\n /**\n * Create a panel component from the DashboardPanel data.\n * Panel comes directly from GL's componentState - no lookup needed.\n * @param glService The layout that asks for the part. When it is no longer the viewer's layout\n * once the part is created (a newer build replaced it, or it was removed), the part is destroyed.\n */\n private async createPanelComponent(panel: DashboardPanel, container: HTMLElement, glService: GoldenLayoutWrapperService): Promise<void> {\n const partType = this.PartTypes.find(pt => UUIDsEqual(pt.ID, panel.partTypeId));\n\n // Create the panel wrapper; the Golden Layout tab shows the part's title\n const wrapper = document.createElement('div');\n wrapper.className = 'dashboard-part-wrapper';\n wrapper.style.cssText = 'display: flex; flex-direction: column; height: 100%; background: var(--mj-bg-surface);';\n\n // Create content area\n const content = document.createElement('div');\n content.className = 'dashboard-part-content';\n content.style.cssText = 'flex: 1; overflow: auto; min-height: 0;';\n\n // Try to create dynamic component via ClassFactory\n const componentRef = await this.createDynamicPartComponent(panel, partType, content);\n\n if (glService !== this._glService) {\n if (componentRef) {\n this.releasePartComponent(componentRef);\n }\n return;\n }\n\n if (!componentRef) {\n // Fallback to static rendering if no DriverClass or component creation failed\n this.renderPartContent(panel, content, partType);\n }\n\n wrapper.appendChild(content);\n container.appendChild(wrapper);\n\n // Store reference for cleanup\n this._panelComponents.set(panel.id, { wrapper, componentRef: componentRef || undefined });\n }\n\n /**\n * Create a dynamic part component using ClassFactory\n */\n private async createDynamicPartComponent(\n panel: DashboardPanel,\n partType: MJDashboardPartTypeEntity | undefined,\n container: HTMLElement\n ): Promise<ComponentRef<BaseDashboardPart> | null> {\n if (!partType?.DriverClass) {\n return null;\n }\n\n try {\n // Use ClassFactory to create instance and get the component class\n const partInstance = await MJGlobal.Instance.ClassFactory.CreateInstanceAsync<BaseDashboardPart>(\n BaseDashboardPart,\n partType.DriverClass\n );\n\n if (!partInstance) {\n return null;\n }\n\n // Get the Angular component class from the instance\n // The constructor is a concrete class that extends BaseDashboardPart\n const componentClass = (partInstance as object).constructor as Type<BaseDashboardPart>;\n\n // Create the component dynamically\n const componentRef = createComponent(componentClass, {\n environmentInjector: this.environmentInjector,\n elementInjector: this.injector\n });\n\n // Set inputs on the component\n const instance = componentRef.instance;\n instance.Panel = panel;\n instance.PartType = partType;\n instance.IsEditing = this.IsEditing;\n\n // Subscribe to events\n instance.ConfigureRequested.subscribe(() => {\n this.onConfigurePart(panel.id);\n });\n instance.RemoveRequested.subscribe(() => {\n this.onRemovePart(panel.id);\n });\n instance.NavigationRequested.subscribe((event: DashboardNavRequestEvent) => {\n this.NavigationRequested.emit(event);\n });\n\n // Attach component to DOM\n container.appendChild(componentRef.location.nativeElement);\n\n // Attach to Angular's change detection\n this.appRef.attachView(componentRef.hostView);\n\n return componentRef;\n } catch (error) {\n console.error('[DashboardViewer] Failed to create dynamic component:', error);\n return null;\n }\n }\n\n private renderPartContent(panel: DashboardPanel, container: HTMLElement, partType: MJDashboardPartTypeEntity | undefined): void {\n const config = panel.config;\n\n switch (config?.type) {\n case 'WebURL':\n this.renderWebURLPart(panel, container, config);\n break;\n case 'View':\n this.renderViewPart(panel, container, config);\n break;\n case 'Query':\n this.renderQueryPart(panel, container, config);\n break;\n case 'Artifact':\n this.renderArtifactPart(panel, container, config);\n break;\n default:\n this.renderPlaceholderPart(panel, container, partType);\n }\n }\n\n private renderWebURLPart(panel: DashboardPanel, container: HTMLElement, config: PanelConfig): void {\n const url = config['url'] as string | undefined;\n if (!url) {\n container.innerHTML = `\n <div style=\"display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; color: var(--mj-text-secondary); text-align: center; padding: 24px;\">\n <i class=\"fa-solid fa-globe\" style=\"font-size: 48px; color: var(--mj-text-muted); margin-bottom: 16px;\"></i>\n <h4 style=\"margin: 0 0 8px 0; color: var(--mj-text-primary);\">No URL Configured</h4>\n <p style=\"margin: 0; font-size: 13px;\">Use Edit part to set a URL.</p>\n </div>\n `;\n return;\n }\n\n const sandboxMode = config['sandboxMode'] as string | undefined;\n // Determine sandbox permissions based on mode\n let sandbox = 'allow-scripts allow-same-origin allow-forms allow-popups';\n if (sandboxMode === 'strict') {\n sandbox = 'allow-scripts';\n } else if (sandboxMode === 'permissive') {\n sandbox = 'allow-scripts allow-same-origin allow-forms allow-popups allow-modals allow-top-navigation';\n }\n\n const iframe = document.createElement('iframe');\n iframe.src = url;\n iframe.style.cssText = 'width: 100%; height: 100%; border: none;';\n iframe.sandbox.value = sandbox;\n if (config['allowFullscreen'] !== false) {\n iframe.allowFullscreen = true;\n }\n iframe.title = panel.title;\n\n container.appendChild(iframe);\n }\n\n private renderViewPart(panel: DashboardPanel, container: HTMLElement, config: PanelConfig): void {\n const viewId = config['viewId'] as string | undefined;\n const entityName = config['entityName'] as string | undefined;\n if (!viewId && !entityName) {\n container.innerHTML = `\n <div style=\"display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; color: var(--mj-text-secondary); text-align: center; padding: 24px;\">\n <i class=\"fa-solid fa-table\" style=\"font-size: 48px; color: var(--mj-text-muted); margin-bottom: 16px;\"></i>\n <h4 style=\"margin: 0 0 8px 0; color: var(--mj-text-primary);\">No View Selected</h4>\n <p style=\"margin: 0; font-size: 13px;\">Use Edit part to choose a view.</p>\n </div>\n `;\n return;\n }\n\n const viewInfo = viewId ? viewId.substring(0, 8) + '...' : entityName;\n const displayModeValue = config['displayMode'] as string | undefined;\n const displayMode = displayModeValue === 'grid' ? 'Grid View' : displayModeValue === 'cards' ? 'Card View' : 'Timeline View';\n container.innerHTML = `\n <div style=\"display: flex; flex-direction: column; height: 100%; background: var(--mj-bg-surface);\">\n <div style=\"padding: 16px 20px; border-bottom: 1px solid var(--mj-border-default); background: var(--mj-bg-surface-card);\">\n <div style=\"display: flex; align-items: center; gap: 12px;\">\n <i class=\"fa-solid fa-table\" style=\"font-size: 20px; color: var(--mj-brand-primary);\"></i>\n <div>\n <div style=\"font-weight: 500; color: var(--mj-text-primary); font-size: 14px;\">Entity View</div>\n <div style=\"font-size: 12px; color: var(--mj-text-secondary);\">${EscapeHTML(entityName || 'View ' + viewInfo)}</div>\n </div>\n <span style=\"margin-left: auto; padding: 4px 10px; background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent); color: var(--mj-brand-primary); border-radius: 12px; font-size: 11px; font-weight: 500;\">${EscapeHTML(displayMode)}</span>\n </div>\n </div>\n <div style=\"flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; color: var(--mj-text-muted); padding: 24px;\">\n <i class=\"fa-solid fa-spinner fa-spin\" style=\"font-size: 24px; margin-bottom: 12px;\"></i>\n <p style=\"margin: 0; font-size: 13px;\">Entity grid loading...</p>\n <p style=\"margin: 8px 0 0 0; font-size: 11px; color: var(--mj-text-muted);\">Full implementation pending Angular integration</p>\n </div>\n </div>\n `;\n }\n\n private renderQueryPart(panel: DashboardPanel, container: HTMLElement, config: PanelConfig): void {\n const queryId = config['queryId'] as string | undefined;\n const queryName = config['queryName'] as string | undefined;\n if (!queryId && !queryName) {\n container.innerHTML = `\n <div style=\"display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; color: var(--mj-text-secondary); text-align: center; padding: 24px;\">\n <i class=\"fa-solid fa-database\" style=\"font-size: 48px; color: var(--mj-text-muted); margin-bottom: 16px;\"></i>\n <h4 style=\"margin: 0 0 8px 0; color: var(--mj-text-primary);\">No Query Selected</h4>\n <p style=\"margin: 0; font-size: 13px;\">Use Edit part to choose a query.</p>\n </div>\n `;\n return;\n }\n\n const autoRefreshSeconds = (config['autoRefreshSeconds'] as number) || 0;\n const queryInfo = queryName || (queryId ? queryId.substring(0, 8) + '...' : 'Unknown');\n container.innerHTML = `\n <div style=\"display: flex; flex-direction: column; height: 100%; background: var(--mj-bg-surface);\">\n <div style=\"padding: 16px 20px; border-bottom: 1px solid var(--mj-border-default); background: var(--mj-bg-surface-card);\">\n <div style=\"display: flex; align-items: center; gap: 12px;\">\n <i class=\"fa-solid fa-database\" style=\"font-size: 20px; color: var(--mj-brand-primary);\"></i>\n <div>\n <div style=\"font-weight: 500; color: var(--mj-text-primary); font-size: 14px;\">Query Results</div>\n <div style=\"font-size: 12px; color: var(--mj-text-secondary);\">${EscapeHTML(queryInfo)}</div>\n </div>\n <span style=\"margin-left: auto; padding: 4px 10px; background: color-mix(in srgb, var(--mj-status-success) 10%, transparent); color: var(--mj-status-success); border-radius: 12px; font-size: 11px; font-weight: 500;\">${autoRefreshSeconds > 0 ? 'Refresh: ' + autoRefreshSeconds + 's' : 'Manual refresh'}</span>\n </div>\n </div>\n <div style=\"flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; color: var(--mj-text-muted); padding: 24px;\">\n <i class=\"fa-solid fa-spinner fa-spin\" style=\"font-size: 24px; margin-bottom: 12px;\"></i>\n <p style=\"margin: 0; font-size: 13px;\">Query grid loading...</p>\n <p style=\"margin: 8px 0 0 0; font-size: 11px; color: var(--mj-text-muted);\">Full implementation pending Angular integration</p>\n </div>\n </div>\n `;\n }\n\n private renderArtifactPart(panel: DashboardPanel, container: HTMLElement, config: PanelConfig): void {\n const artifactId = config['artifactId'] as string | undefined;\n if (!artifactId) {\n container.innerHTML = `\n <div style=\"display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; color: var(--mj-text-secondary); text-align: center; padding: 24px;\">\n <i class=\"fa-solid fa-cube\" style=\"font-size: 48px; color: var(--mj-text-muted); margin-bottom: 16px;\"></i>\n <h4 style=\"margin: 0 0 8px 0; color: var(--mj-text-primary);\">No Artifact Selected</h4>\n <p style=\"margin: 0; font-size: 13px;\">Use Edit part to choose an artifact.</p>\n </div>\n `;\n return;\n }\n\n const versionNumber = config['versionNumber'] as number | undefined;\n const artifactInfo = artifactId.substring(0, 8) + '...';\n const versionInfo = versionNumber ? `v${versionNumber}` : 'Latest';\n container.innerHTML = `\n <div style=\"display: flex; flex-direction: column; height: 100%; background: var(--mj-bg-surface);\">\n <div style=\"padding: 16px 20px; border-bottom: 1px solid var(--mj-border-default); background: var(--mj-bg-surface-card);\">\n <div style=\"display: flex; align-items: center; gap: 12px;\">\n <i class=\"fa-solid fa-cube\" style=\"font-size: 20px; color: var(--mj-brand-primary);\"></i>\n <div>\n <div style=\"font-weight: 500; color: var(--mj-text-primary); font-size: 14px;\">Artifact</div>\n <div style=\"font-size: 12px; color: var(--mj-text-secondary);\">ID: ${EscapeHTML(artifactInfo)}</div>\n </div>\n <span style=\"margin-left: auto; padding: 4px 10px; background: color-mix(in srgb, var(--mj-status-error) 10%, transparent); color: var(--mj-status-error); border-radius: 12px; font-size: 11px; font-weight: 500;\">${EscapeHTML(versionInfo)}</span>\n </div>\n </div>\n <div style=\"flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; color: var(--mj-text-muted); padding: 24px;\">\n <i class=\"fa-solid fa-spinner fa-spin\" style=\"font-size: 24px; margin-bottom: 12px;\"></i>\n <p style=\"margin: 0; font-size: 13px;\">Artifact viewer loading...</p>\n <p style=\"margin: 8px 0 0 0; font-size: 11px; color: var(--mj-text-muted);\">Full implementation pending Angular integration</p>\n </div>\n </div>\n `;\n }\n\n private renderPlaceholderPart(panel: DashboardPanel, container: HTMLElement, partType: MJDashboardPartTypeEntity | undefined): void {\n const partTypeName = partType?.Name || 'Custom';\n container.innerHTML = `\n <div style=\"display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; color: var(--mj-text-secondary); text-align: center; padding: 24px;\">\n <i class=\"fa-solid fa-puzzle-piece\" style=\"font-size: 48px; color: var(--mj-text-muted); margin-bottom: 16px;\"></i>\n <h4 style=\"margin: 0 0 8px 0; color: var(--mj-text-primary);\">${EscapeHTML(partTypeName)} Part</h4>\n <p style=\"margin: 0; font-size: 13px;\">This part type is not yet fully implemented.</p>\n </div>\n `;\n }\n\n private onConfigurePart(panelId: string): void {\n // Emit event for parent to handle configuration\n this.PanelInteraction.emit({\n panelId,\n interactionType: 'custom',\n payload: { action: 'configure-part-requested' }\n });\n }\n\n private onRemovePart(panelId: string): void {\n // Emit event for parent to show confirmation dialog, with the part's title and part type name\n const panel = FindPanelInLayout(this.config?.layout ?? null, panelId);\n this.PanelInteraction.emit({\n panelId,\n interactionType: 'custom',\n payload: {\n action: 'remove-part-requested',\n panelTitle: panel?.title || 'this part',\n partTypeName: this.GetPartTypeForPanel(panelId)?.Name ?? null\n }\n });\n }\n\n /**\n * Confirm removal of a panel (called by parent after confirmation dialog)\n */\n public ConfirmRemovePanel(panelId: string): void {\n this.RemovePanel(panelId);\n }\n\n /** @deprecated Use {@link ConfirmRemovePanel}. */\n public confirmRemovePanel(panelId: string): void {\n return this.ConfirmRemovePanel(panelId);\n }\n\n private destroyPanelComponent(panelId: string): void {\n const entry = this._panelComponents.get(panelId);\n if (entry) {\n // Destroy the Angular component if present\n if (entry.componentRef) {\n this.releasePartComponent(entry.componentRef);\n }\n this._panelComponents.delete(panelId);\n }\n }\n\n /** Detaches a part component from change detection and destroys it. */\n private releasePartComponent(componentRef: ComponentRef<BaseDashboardPart>): void {\n this.appRef.detachView(componentRef.hostView);\n componentRef.destroy();\n }\n\n private updatePanelEditModes(): void {\n // Update IsEditing on all dynamic components\n this._panelComponents.forEach((entry) => {\n if (entry.componentRef) {\n entry.componentRef.instance.IsEditing = this.IsEditing;\n }\n });\n\n // Save current layout before reinitializing (preserves user's arrangement)\n if (this._glService && this.config) {\n const currentLayout = this._glService.getLayoutConfig();\n if (currentLayout) {\n this.config.layout = currentLayout;\n }\n }\n\n // Reinitialize layout to apply new Golden Layout settings (edit mode lock/unlock)\n if (this._glService) {\n this.initializeLayout();\n }\n }\n\n // ========================================\n // Private Methods - State\n // ========================================\n\n private markDirty(): void {\n this.HasUnsavedChanges = true;\n\n if (this.AutoSave && this.config) {\n this.save();\n }\n }\n}\n","<!-- Dashboard Viewer Component -->\n<div class=\"dashboard-viewer\" [class.editing]=\"isEditing\" [class.has-toolbar]=\"shouldShowToolbar\">\n <!-- Breadcrumb Navigation (hidden in edit mode) -->\n @if (showBreadcrumb && !isEditing && dashboard) {\n <mj-dashboard-breadcrumb\n [Categories]=\"Categories\"\n [CurrentCategoryId]=\"dashboard.CategoryID\"\n [CurrentDashboard]=\"dashboard\"\n [ShowDashboardName]=\"true\"\n [AllowDragDrop]=\"false\"\n Size=\"large\"\n RootIcon=\"fa-solid fa-gauge-high\"\n RootLabel=\"Dashboards\"\n (Navigate)=\"onBreadcrumbNavigate($event)\">\n </mj-dashboard-breadcrumb>\n }\n\n <!-- Toolbar (auto-hides when all elements are disabled) -->\n @if (shouldShowToolbar) {\n <div class=\"dashboard-toolbar\">\n <div class=\"toolbar-left\">\n @if (dashboard && (isEditing || !showBreadcrumb)) {\n <span class=\"dashboard-title\">\n <i class=\"fa-solid fa-chart-line\"></i>\n {{ dashboard.Name }}\n </span>\n }\n </div>\n <div class=\"toolbar-center\">\n @if (hasUnsavedChanges && isEditing) {\n <span class=\"unsaved-indicator\">\n <i class=\"fa-solid fa-circle\"></i>\n Unsaved changes\n </span>\n }\n </div>\n <div class=\"toolbar-right\">\n <!-- Open in New Tab button (when embedded) -->\n @if (showOpenInTabButton && !isEditing) {\n <button\n class=\"toolbar-button\"\n (click)=\"onOpenInTabClick()\"\n title=\"Open in a dashboard tab\">\n <i class=\"fa-solid fa-up-right-from-square\"></i>\n Open in Tab\n </button>\n }\n @if (isEditing) {\n <button\n class=\"toolbar-button\"\n (click)=\"onAddPanelClick()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Part\n </button>\n }\n @if (showEditButton) {\n <button\n class=\"toolbar-button\"\n [class.active]=\"isEditing\"\n (click)=\"toggleEditMode()\">\n <i class=\"fa-solid fa-edit\"></i>\n {{ isEditing ? 'Editing' : 'Edit' }}\n </button>\n }\n @if (isEditing && hasUnsavedChanges) {\n <button\n class=\"toolbar-button primary\"\n (click)=\"save()\">\n <i class=\"fa-solid fa-save\"></i>\n Save\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Loading Overlay -->\n @if (isLoading) {\n <div class=\"loading-overlay\">\n <mj-loading text=\"Loading dashboard...\"></mj-loading>\n </div>\n }\n\n <!-- Layout Container -->\n <div class=\"layout-container\" #layoutContainer>\n <!-- Golden Layout will render panels here -->\n </div>\n\n <!-- Empty State: Add part shows in edit mode, and in view mode to a user who can edit -->\n @if (!HasPanels && !isLoading) {\n <mj-empty-state\n class=\"dashboard-empty\"\n Icon=\"fa-solid fa-table-columns\"\n Title=\"No parts yet\"\n Message=\"Add a view, query, artifact, or web page to get started.\"\n [ActionText]=\"IsEditing || CanEdit ? 'Add part' : ''\"\n ActionIcon=\"fa-solid fa-plus\"\n (Action)=\"OnAddPanelClick()\" />\n }\n</div>\n"]}
@@ -2,28 +2,32 @@ import * as i0 from "@angular/core";
2
2
  import * as i1 from "./dashboard-viewer/dashboard-viewer.component";
3
3
  import * as i2 from "./dashboard-browser/dashboard-browser.component";
4
4
  import * as i3 from "./breadcrumb/dashboard-breadcrumb.component";
5
- import * as i4 from "./dialogs/add-panel-dialog/add-panel-dialog.component";
6
- import * as i5 from "./dialogs/edit-part-dialog/edit-part-dialog.component";
7
- import * as i6 from "./config-dialogs/confirm-dialog.component";
8
- import * as i7 from "./config-panels/weburl-config-panel.component";
9
- import * as i8 from "./config-panels/view-config-panel.component";
10
- import * as i9 from "./config-panels/query-config-panel.component";
11
- import * as i10 from "./config-panels/artifact-config-panel.component";
12
- import * as i11 from "./parts/weburl-part.component";
13
- import * as i12 from "./parts/view-part.component";
14
- import * as i13 from "./parts/query-part.component";
15
- import * as i14 from "./parts/artifact-part.component";
16
- import * as i15 from "@angular/common";
17
- import * as i16 from "@angular/forms";
18
- import * as i17 from "@memberjunction/ng-shared-generic";
19
- import * as i18 from "@memberjunction/ng-trees";
20
- import * as i19 from "@memberjunction/ng-entity-viewer";
21
- import * as i20 from "@memberjunction/ng-query-viewer";
22
- import * as i21 from "@memberjunction/ng-artifacts";
23
- import * as i22 from "@memberjunction/ng-ui-components";
5
+ import * as i4 from "./layout-preview/dashboard-layout-preview.component";
6
+ import * as i5 from "./layout-preview/dashboard-layout-preview-node.component";
7
+ import * as i6 from "./dashboard-card/dashboard-card.component";
8
+ import * as i7 from "./dialogs/part-dialog/dashboard-part-dialog.component";
9
+ import * as i8 from "./dialogs/add-panel-dialog/add-panel-dialog.component";
10
+ import * as i9 from "./dialogs/edit-part-dialog/edit-part-dialog.component";
11
+ import * as i10 from "./config-dialogs/confirm-dialog.component";
12
+ import * as i11 from "./config-panels/weburl-config-panel.component";
13
+ import * as i12 from "./config-panels/view-config-panel.component";
14
+ import * as i13 from "./config-panels/query-config-panel.component";
15
+ import * as i14 from "./config-panels/artifact-config-panel.component";
16
+ import * as i15 from "./parts/weburl-part.component";
17
+ import * as i16 from "./parts/view-part.component";
18
+ import * as i17 from "./parts/query-part.component";
19
+ import * as i18 from "./parts/artifact-part.component";
20
+ import * as i19 from "@angular/common";
21
+ import * as i20 from "@angular/forms";
22
+ import * as i21 from "@memberjunction/ng-shared-generic";
23
+ import * as i22 from "@memberjunction/ng-trees";
24
+ import * as i23 from "@memberjunction/ng-entity-viewer";
25
+ import * as i24 from "@memberjunction/ng-query-viewer";
26
+ import * as i25 from "@memberjunction/ng-artifacts";
27
+ import * as i26 from "@memberjunction/ng-ui-components";
24
28
  export declare class DashboardViewerModule {
25
29
  static ɵfac: i0.ɵɵFactoryDeclaration<DashboardViewerModule, never>;
26
- static ɵmod: i0.ɵɵNgModuleDeclaration<DashboardViewerModule, [typeof i1.DashboardViewerComponent, typeof i2.DashboardBrowserComponent, typeof i3.DashboardBreadcrumbComponent, typeof i4.AddPanelDialogComponent, typeof i5.EditPartDialogComponent, typeof i6.ConfirmDialogComponent, typeof i7.WebURLConfigPanelComponent, typeof i8.ViewConfigPanelComponent, typeof i9.QueryConfigPanelComponent, typeof i10.ArtifactConfigPanelComponent, typeof i11.WebURLPartComponent, typeof i12.ViewPartComponent, typeof i13.QueryPartComponent, typeof i14.ArtifactPartComponent], [typeof i15.CommonModule, typeof i16.FormsModule, typeof i17.SharedGenericModule, typeof i18.NgTreesModule, typeof i19.EntityViewerModule, typeof i20.QueryViewerModule, typeof i21.ArtifactsModule, typeof i22.MJEmptyStateComponent, typeof i22.MJAccordionModule], [typeof i1.DashboardViewerComponent, typeof i2.DashboardBrowserComponent, typeof i3.DashboardBreadcrumbComponent, typeof i4.AddPanelDialogComponent, typeof i5.EditPartDialogComponent, typeof i6.ConfirmDialogComponent, typeof i7.WebURLConfigPanelComponent, typeof i8.ViewConfigPanelComponent, typeof i9.QueryConfigPanelComponent, typeof i10.ArtifactConfigPanelComponent, typeof i11.WebURLPartComponent, typeof i12.ViewPartComponent, typeof i13.QueryPartComponent, typeof i14.ArtifactPartComponent]>;
30
+ static ɵmod: i0.ɵɵNgModuleDeclaration<DashboardViewerModule, [typeof i1.DashboardViewerComponent, typeof i2.DashboardBrowserComponent, typeof i3.DashboardBreadcrumbComponent, typeof i4.DashboardLayoutPreviewComponent, typeof i5.DashboardLayoutPreviewNodeComponent, typeof i6.DashboardCardComponent, typeof i7.DashboardPartDialogComponent, typeof i8.AddPanelDialogComponent, typeof i9.EditPartDialogComponent, typeof i10.ConfirmDialogComponent, typeof i11.WebURLConfigPanelComponent, typeof i12.ViewConfigPanelComponent, typeof i13.QueryConfigPanelComponent, typeof i14.ArtifactConfigPanelComponent, typeof i15.WebURLPartComponent, typeof i16.ViewPartComponent, typeof i17.QueryPartComponent, typeof i18.ArtifactPartComponent], [typeof i19.CommonModule, typeof i20.FormsModule, typeof i21.SharedGenericModule, typeof i22.NgTreesModule, typeof i23.EntityViewerModule, typeof i24.QueryViewerModule, typeof i25.ArtifactsModule, typeof i26.MJEmptyStateComponent, typeof i26.MJAccordionModule, typeof i26.MJDialogComponent, typeof i26.MJDialogActionsComponent, typeof i26.MJButtonDirective], [typeof i1.DashboardViewerComponent, typeof i2.DashboardBrowserComponent, typeof i3.DashboardBreadcrumbComponent, typeof i4.DashboardLayoutPreviewComponent, typeof i6.DashboardCardComponent, typeof i7.DashboardPartDialogComponent, typeof i8.AddPanelDialogComponent, typeof i9.EditPartDialogComponent, typeof i10.ConfirmDialogComponent, typeof i11.WebURLConfigPanelComponent, typeof i12.ViewConfigPanelComponent, typeof i13.QueryConfigPanelComponent, typeof i14.ArtifactConfigPanelComponent, typeof i15.WebURLPartComponent, typeof i16.ViewPartComponent, typeof i17.QueryPartComponent, typeof i18.ArtifactPartComponent]>;
27
31
  static ɵinj: i0.ɵɵInjectorDeclaration<DashboardViewerModule>;
28
32
  }
29
33
  //# sourceMappingURL=dashboard-viewer.module.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-viewer.module.d.ts","sourceRoot":"","sources":["../../src/lib/dashboard-viewer.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAkDA,qBAqEa,qBAAqB;yCAArB,qBAAqB;0CAArB,qBAAqB;0CAArB,qBAAqB;CAAI"}
1
+ {"version":3,"file":"dashboard-viewer.module.d.ts","sourceRoot":"","sources":["../../src/lib/dashboard-viewer.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAiEA,qBAuFa,qBAAqB;yCAArB,qBAAqB;0CAArB,qBAAqB;0CAArB,qBAAqB;CAAI"}