@memberjunction/ng-dashboard-viewer 6.1.4 → 6.2.0-edge.1

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 (60) hide show
  1. package/dist/lib/config-dialogs/confirm-dialog.component.d.ts +58 -8
  2. package/dist/lib/config-dialogs/confirm-dialog.component.d.ts.map +1 -1
  3. package/dist/lib/config-dialogs/confirm-dialog.component.js +119 -17
  4. package/dist/lib/config-dialogs/confirm-dialog.component.js.map +1 -1
  5. package/dist/lib/config-panels/artifact-config-panel.component.d.ts +63 -11
  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 +152 -48
  8. package/dist/lib/config-panels/artifact-config-panel.component.js.map +1 -1
  9. package/dist/lib/config-panels/query-config-panel.component.d.ts +57 -9
  10. package/dist/lib/config-panels/query-config-panel.component.d.ts.map +1 -1
  11. package/dist/lib/config-panels/query-config-panel.component.js +142 -46
  12. package/dist/lib/config-panels/query-config-panel.component.js.map +1 -1
  13. package/dist/lib/config-panels/view-config-panel.component.d.ts +69 -11
  14. package/dist/lib/config-panels/view-config-panel.component.d.ts.map +1 -1
  15. package/dist/lib/config-panels/view-config-panel.component.js +165 -49
  16. package/dist/lib/config-panels/view-config-panel.component.js.map +1 -1
  17. package/dist/lib/config-panels/weburl-config-panel.component.d.ts +42 -6
  18. package/dist/lib/config-panels/weburl-config-panel.component.d.ts.map +1 -1
  19. package/dist/lib/config-panels/weburl-config-panel.component.js +113 -41
  20. package/dist/lib/config-panels/weburl-config-panel.component.js.map +1 -1
  21. package/dist/lib/dashboard-browser/dashboard-browser.component.d.ts.map +1 -1
  22. package/dist/lib/dashboard-browser/dashboard-browser.component.js +7 -4
  23. package/dist/lib/dashboard-browser/dashboard-browser.component.js.map +1 -1
  24. package/dist/lib/dashboard-viewer/dashboard-viewer.component.d.ts +163 -12
  25. package/dist/lib/dashboard-viewer/dashboard-viewer.component.d.ts.map +1 -1
  26. package/dist/lib/dashboard-viewer/dashboard-viewer.component.js +332 -78
  27. package/dist/lib/dashboard-viewer/dashboard-viewer.component.js.map +1 -1
  28. package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.d.ts +63 -9
  29. package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.d.ts.map +1 -1
  30. package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.js +172 -66
  31. package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.js.map +1 -1
  32. package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.d.ts +11 -1
  33. package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.d.ts.map +1 -1
  34. package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.js +30 -10
  35. package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.js.map +1 -1
  36. package/dist/lib/models/dashboard-types.d.ts +8 -0
  37. package/dist/lib/models/dashboard-types.d.ts.map +1 -1
  38. package/dist/lib/models/dashboard-types.js +21 -5
  39. package/dist/lib/models/dashboard-types.js.map +1 -1
  40. package/dist/lib/parts/artifact-part.component.d.ts +63 -7
  41. package/dist/lib/parts/artifact-part.component.d.ts.map +1 -1
  42. package/dist/lib/parts/artifact-part.component.js +98 -22
  43. package/dist/lib/parts/artifact-part.component.js.map +1 -1
  44. package/dist/lib/parts/query-part.component.d.ts +26 -4
  45. package/dist/lib/parts/query-part.component.d.ts.map +1 -1
  46. package/dist/lib/parts/query-part.component.js +62 -18
  47. package/dist/lib/parts/query-part.component.js.map +1 -1
  48. package/dist/lib/parts/view-part.component.d.ts +21 -3
  49. package/dist/lib/parts/view-part.component.d.ts.map +1 -1
  50. package/dist/lib/parts/view-part.component.js +55 -19
  51. package/dist/lib/parts/view-part.component.js.map +1 -1
  52. package/dist/lib/parts/weburl-part.component.d.ts +29 -5
  53. package/dist/lib/parts/weburl-part.component.d.ts.map +1 -1
  54. package/dist/lib/parts/weburl-part.component.js +63 -15
  55. package/dist/lib/parts/weburl-part.component.js.map +1 -1
  56. package/dist/lib/services/golden-layout-wrapper.service.d.ts +65 -5
  57. package/dist/lib/services/golden-layout-wrapper.service.d.ts.map +1 -1
  58. package/dist/lib/services/golden-layout-wrapper.service.js +135 -27
  59. package/dist/lib/services/golden-layout-wrapper.service.js.map +1 -1
  60. package/package.json +13 -13
@@ -122,7 +122,15 @@ export class EditPartDialogComponent {
122
122
  /**
123
123
  * Container for dynamically loaded config panel
124
124
  */
125
- configPanelContainer;
125
+ ConfigPanelContainer;
126
+ /** @deprecated Use {@link ConfigPanelContainer}. */
127
+ get configPanelContainer() {
128
+ return this.ConfigPanelContainer;
129
+ }
130
+ /** @deprecated Use {@link ConfigPanelContainer}. */
131
+ set configPanelContainer(value) {
132
+ this.ConfigPanelContainer = value;
133
+ }
126
134
  /**
127
135
  * Reference to the dynamically created config panel component
128
136
  */
@@ -190,7 +198,7 @@ export class EditPartDialogComponent {
190
198
  this.cdr.detectChanges();
191
199
  return;
192
200
  }
193
- if (!this.configPanelContainer) {
201
+ if (!this.ConfigPanelContainer) {
194
202
  // Container not ready yet - will be called again from ngAfterViewInit
195
203
  console.log('[EditPartDialog] Container not ready yet');
196
204
  return;
@@ -215,8 +223,8 @@ export class EditPartDialogComponent {
215
223
  const componentClass = panelInstance.constructor;
216
224
  console.log('[EditPartDialog] Component class:', componentClass.name);
217
225
  // Clear the container and create the component
218
- this.configPanelContainer.clear();
219
- this.configPanelRef = this.configPanelContainer.createComponent(componentClass);
226
+ this.ConfigPanelContainer.clear();
227
+ this.configPanelRef = this.ConfigPanelContainer.createComponent(componentClass);
220
228
  console.log('[EditPartDialog] Component created successfully');
221
229
  // Set inputs on the component
222
230
  const panel = this.configPanelRef.instance;
@@ -225,7 +233,7 @@ export class EditPartDialogComponent {
225
233
  panel.config = this.Config;
226
234
  // Subscribe to config changes
227
235
  panel.configChanged.subscribe((result) => {
228
- this.onConfigChanged(result);
236
+ this.OnConfigChanged(result);
229
237
  });
230
238
  this.IsLoading = false;
231
239
  this.LoadError = null; // Ensure error is cleared on success
@@ -251,18 +259,26 @@ export class EditPartDialogComponent {
251
259
  /**
252
260
  * Handle configuration changes from the embedded panel
253
261
  */
254
- onConfigChanged(result) {
262
+ OnConfigChanged(result) {
255
263
  this.latestResult = result;
256
264
  this.IsValid = result.isValid;
257
265
  this.cdr.detectChanges();
258
266
  }
267
+ /** @deprecated Use {@link OnConfigChanged}. */
268
+ onConfigChanged(result) {
269
+ return this.OnConfigChanged(result);
270
+ }
259
271
  /**
260
272
  * Get the dialog title based on part type
261
273
  */
262
- getDialogTitle() {
274
+ GetDialogTitle() {
263
275
  const partName = this.PartType?.Name || 'Part';
264
276
  return this.Panel ? `Configure ${partName}` : `Add ${partName}`;
265
277
  }
278
+ /** @deprecated Use {@link GetDialogTitle}. */
279
+ getDialogTitle() {
280
+ return this.GetDialogTitle();
281
+ }
266
282
  /**
267
283
  * Get the part type icon
268
284
  */
@@ -291,15 +307,19 @@ export class EditPartDialogComponent {
291
307
  /**
292
308
  * Get save button text
293
309
  */
294
- getSaveButtonText() {
310
+ GetSaveButtonText() {
295
311
  return this.Panel ? 'Save Changes' : 'Add Part';
296
312
  }
313
+ /** @deprecated Use {@link GetSaveButtonText}. */
314
+ getSaveButtonText() {
315
+ return this.GetSaveButtonText();
316
+ }
297
317
  static ɵfac = function EditPartDialogComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || EditPartDialogComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
298
318
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: EditPartDialogComponent, selectors: [["mj-edit-part-dialog"]], viewQuery: function EditPartDialogComponent_Query(rf, ctx) { if (rf & 1) {
299
319
  i0.ɵɵviewQuery(_c0, 5, ViewContainerRef);
300
320
  } if (rf & 2) {
301
321
  let _t;
302
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.configPanelContainer = _t.first);
322
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.ConfigPanelContainer = _t.first);
303
323
  } }, inputs: { Visible: "Visible", PartType: "PartType", Panel: "Panel", Config: "Config" }, outputs: { Saved: "Saved", Cancelled: "Cancelled" }, standalone: false, decls: 1, vars: 1, consts: [["configPanelContainer", ""], [1, "edit-part-dialog-overlay"], [1, "edit-part-dialog-overlay", 3, "click"], [1, "edit-part-dialog", 3, "click"], [1, "dialog-header"], [1, "header-icon"], [1, "close-button", 3, "click"], [1, "fa-solid", "fa-times"], [1, "dialog-content"], [1, "loading-state"], [1, "error-state"], [1, "dialog-footer"], [1, "btn-primary", 3, "click", "disabled"], [1, "fa-solid", "fa-check"], [1, "btn-secondary", 3, "click"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-exclamation-triangle"]], template: function EditPartDialogComponent_Template(rf, ctx) { if (rf & 1) {
304
324
  i0.ɵɵconditionalCreate(0, EditPartDialogComponent_Conditional_0_Template, 20, 7, "div", 1);
305
325
  } if (rf & 2) {
@@ -321,7 +341,7 @@ export class EditPartDialogComponent {
321
341
  type: Output
322
342
  }], Cancelled: [{
323
343
  type: Output
324
- }], configPanelContainer: [{
344
+ }], ConfigPanelContainer: [{
325
345
  type: ViewChild,
326
346
  args: ['configPanelContainer', { read: ViewContainerRef, static: false }]
327
347
  }] }); })();
@@ -1 +1 @@
1
- {"version":3,"file":"edit-part-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/dialogs/edit-part-dialog/edit-part-dialog.component.ts","../../../../src/lib/dialogs/edit-part-dialog/edit-part-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectorRef,\n ViewChild,\n ViewContainerRef,\n ComponentRef,\n OnDestroy,\n AfterViewInit\n} from '@angular/core';\nimport { MJGlobal } from '@memberjunction/global';\nimport { MJDashboardPartTypeEntity } from '@memberjunction/core-entities';\nimport { PanelConfig, DashboardPanel } from '../../models/dashboard-types';\nimport { BaseConfigPanel, ConfigPanelResult } from '../../config-panels/base-config-panel';\n\n/**\n * Result from the edit part dialog\n */\nexport interface EditPartDialogResult {\n /** The updated panel configuration */\n Config: PanelConfig;\n /** Updated title */\n Title: string;\n /** Updated icon (optional) */\n Icon?: string;\n}\n\n/**\n * Generic dialog for editing dashboard part configuration.\n *\n * This dialog dynamically loads the appropriate config panel based on the\n * DashboardPartType.ConfigDialogClass field, using MJGlobal.ClassFactory.\n *\n * This allows new part types to be added without modifying this dialog -\n * just create a config panel, register it, and set the ConfigDialogClass.\n */\n@Component({\n standalone: false,\n selector: 'mj-edit-part-dialog',\n templateUrl: './edit-part-dialog.component.html',\n styleUrls: ['./edit-part-dialog.component.css']\n})\nexport class EditPartDialogComponent implements OnDestroy, AfterViewInit {\n /**\n * Whether the dialog is visible\n */\n @Input()\n set Visible(value: boolean) {\n const previous = this._visible;\n this._visible = value;\n if (value && !previous) {\n this.onDialogOpened();\n // Delay loadConfigPanel to next tick to ensure all inputs are set\n // Angular doesn't guarantee input order, so PartType might not be set yet\n if (this.viewInitialized) {\n setTimeout(() => this.loadConfigPanel(), 0);\n }\n } else if (!value && previous) {\n this.onDialogClosed();\n }\n }\n get Visible(): boolean {\n return this._visible;\n }\n private _visible = false;\n\n /**\n * The part type being configured\n */\n @Input() PartType: MJDashboardPartTypeEntity | null = null;\n\n /**\n * The panel being edited\n */\n @Input() Panel: DashboardPanel | null = null;\n\n /**\n * The current configuration\n */\n @Input() Config: PanelConfig | null = null;\n\n /**\n * Emitted when configuration is saved\n */\n @Output() Saved = new EventEmitter<EditPartDialogResult>();\n\n /**\n * Emitted when dialog is cancelled\n */\n @Output() Cancelled = new EventEmitter<void>();\n\n /**\n * Container for dynamically loaded config panel\n */\n @ViewChild('configPanelContainer', { read: ViewContainerRef, static: false })\n configPanelContainer!: ViewContainerRef;\n\n /**\n * Reference to the dynamically created config panel component\n */\n private configPanelRef: ComponentRef<BaseConfigPanel> | null = null;\n\n /**\n * Track validity from the embedded panel\n */\n public IsValid = false;\n\n /**\n * Store the latest result from the panel\n */\n private latestResult: ConfigPanelResult | null = null;\n\n /**\n * Error message if panel failed to load\n */\n public LoadError: string | null = null;\n\n /**\n * Whether the panel is loading\n */\n public IsLoading = false;\n\n private viewInitialized = false;\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n ngAfterViewInit(): void {\n this.viewInitialized = true;\n if (this.Visible) {\n this.loadConfigPanel();\n }\n }\n\n ngOnDestroy(): void {\n this.destroyConfigPanel();\n }\n\n /**\n * Called when dialog opens\n */\n private onDialogOpened(): void {\n this.IsValid = false;\n this.latestResult = null;\n this.LoadError = null;\n\n if (this.viewInitialized) {\n this.loadConfigPanel();\n }\n }\n\n /**\n * Called when dialog closes\n */\n private onDialogClosed(): void {\n this.destroyConfigPanel();\n }\n\n /**\n * Dynamically load the config panel component\n */\n private async loadConfigPanel(): Promise<void> {\n this.destroyConfigPanel();\n this.LoadError = null; // Clear any previous error\n\n console.log('[EditPartDialog] loadConfigPanel() called');\n console.log('[EditPartDialog] PartType:', this.PartType?.Name);\n console.log('[EditPartDialog] ConfigDialogClass:', this.PartType?.ConfigDialogClass);\n\n if (!this.PartType?.ConfigDialogClass) {\n // No config class specified - this is okay for simple part types\n // Just enable the save button with default config\n console.log('[EditPartDialog] No ConfigDialogClass specified, using default');\n this.IsValid = true;\n this.cdr.detectChanges();\n return;\n }\n\n if (!this.configPanelContainer) {\n // Container not ready yet - will be called again from ngAfterViewInit\n console.log('[EditPartDialog] Container not ready yet');\n return;\n }\n\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n // Use ClassFactory to create the config panel instance\n console.log('[EditPartDialog] Attempting to create instance via ClassFactory:', this.PartType.ConfigDialogClass);\n const panelInstance = await MJGlobal.Instance.ClassFactory.CreateInstanceAsync<BaseConfigPanel>(\n BaseConfigPanel,\n this.PartType.ConfigDialogClass\n );\n\n console.log('[EditPartDialog] ClassFactory returned:', panelInstance);\n\n if (!panelInstance) {\n this.LoadError = `Could not create config panel: ${this.PartType.ConfigDialogClass}`;\n console.error('[EditPartDialog]', this.LoadError);\n this.IsLoading = false;\n this.IsValid = true; // Allow saving with default config\n this.cdr.detectChanges();\n return;\n }\n\n // Get the component class from the instance\n // We need to find the Angular component class that was registered\n const componentClass = (panelInstance as object).constructor as typeof BaseConfigPanel;\n console.log('[EditPartDialog] Component class:', componentClass.name);\n\n // Clear the container and create the component\n this.configPanelContainer.clear();\n this.configPanelRef = this.configPanelContainer.createComponent(componentClass as never);\n console.log('[EditPartDialog] Component created successfully');\n\n // Set inputs on the component\n const panel = this.configPanelRef.instance;\n panel.partType = this.PartType;\n panel.panel = this.Panel;\n panel.config = this.Config;\n\n // Subscribe to config changes\n panel.configChanged.subscribe((result: ConfigPanelResult) => {\n this.onConfigChanged(result);\n });\n\n this.IsLoading = false;\n this.LoadError = null; // Ensure error is cleared on success\n this.cdr.detectChanges();\n\n } catch (error) {\n this.LoadError = `Failed to load config panel: ${error instanceof Error ? error.message : String(error)}`;\n console.error('[EditPartDialog]', this.LoadError, error);\n this.IsLoading = false;\n this.IsValid = true; // Allow saving with default config\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Destroy the dynamically created config panel\n */\n private destroyConfigPanel(): void {\n if (this.configPanelRef) {\n this.configPanelRef.destroy();\n this.configPanelRef = null;\n }\n }\n\n /**\n * Handle configuration changes from the embedded panel\n */\n public onConfigChanged(result: ConfigPanelResult): void {\n this.latestResult = result;\n this.IsValid = result.isValid;\n this.cdr.detectChanges();\n }\n\n /**\n * Get the dialog title based on part type\n */\n public getDialogTitle(): string {\n const partName = this.PartType?.Name || 'Part';\n return this.Panel ? `Configure ${partName}` : `Add ${partName}`;\n }\n\n /**\n * Get the part type icon\n */\n public getIcon(): string {\n return this.PartType?.Icon || 'fa-solid fa-puzzle-piece';\n }\n\n /**\n * Save the configuration\n */\n public save(): void {\n if (!this.IsValid || !this.latestResult) {\n return;\n }\n\n this.Saved.emit({\n Config: this.latestResult.config,\n Title: this.latestResult.title,\n Icon: this.latestResult.icon\n });\n }\n\n /**\n * Cancel and close the dialog\n */\n public cancel(): void {\n this.Cancelled.emit();\n }\n\n /**\n * Get save button text\n */\n public getSaveButtonText(): string {\n return this.Panel ? 'Save Changes' : 'Add Part';\n }\n}\n","<!-- Generic Edit Part Dialog -->\n@if (Visible) {\n <div class=\"edit-part-dialog-overlay\" (click)=\"cancel()\">\n <div class=\"edit-part-dialog\" (click)=\"$event.stopPropagation()\">\n <!-- Header -->\n <div class=\"dialog-header\">\n <div class=\"header-icon\">\n <i [class]=\"getIcon()\"></i>\n </div>\n <h3>{{ getDialogTitle() }}</h3>\n <button class=\"close-button\" (click)=\"cancel()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <!-- Content -->\n <div class=\"dialog-content\">\n <!-- Loading state -->\n @if (IsLoading) {\n <div class=\"loading-state\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading configuration panel...</span>\n </div>\n }\n <!-- Error state -->\n @if (LoadError && !IsLoading) {\n <div class=\"error-state\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <span>{{ LoadError }}</span>\n </div>\n }\n <!-- Dynamic config panel container -->\n <ng-container #configPanelContainer></ng-container>\n </div>\n <!-- Footer -->\n <div class=\"dialog-footer\">\n <button\n class=\"btn-primary\"\n (click)=\"save()\"\n [disabled]=\"!IsValid || IsLoading || LoadError\">\n <i class=\"fa-solid fa-check\"></i>\n {{ getSaveButtonText() }}\n </button>\n <button class=\"btn-secondary\" (click)=\"cancel()\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n}\n"]}
1
+ {"version":3,"file":"edit-part-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/dialogs/edit-part-dialog/edit-part-dialog.component.ts","../../../../src/lib/dialogs/edit-part-dialog/edit-part-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectorRef,\n ViewChild,\n ViewContainerRef,\n ComponentRef,\n OnDestroy,\n AfterViewInit\n} from '@angular/core';\nimport { MJGlobal } from '@memberjunction/global';\nimport { MJDashboardPartTypeEntity } from '@memberjunction/core-entities';\nimport { PanelConfig, DashboardPanel } from '../../models/dashboard-types';\nimport { BaseConfigPanel, ConfigPanelResult } from '../../config-panels/base-config-panel';\n\n/**\n * Result from the edit part dialog\n */\nexport interface EditPartDialogResult {\n /** The updated panel configuration */\n Config: PanelConfig;\n /** Updated title */\n Title: string;\n /** Updated icon (optional) */\n Icon?: string;\n}\n\n/**\n * Generic dialog for editing dashboard part configuration.\n *\n * This dialog dynamically loads the appropriate config panel based on the\n * DashboardPartType.ConfigDialogClass field, using MJGlobal.ClassFactory.\n *\n * This allows new part types to be added without modifying this dialog -\n * just create a config panel, register it, and set the ConfigDialogClass.\n */\n@Component({\n standalone: false,\n selector: 'mj-edit-part-dialog',\n templateUrl: './edit-part-dialog.component.html',\n styleUrls: ['./edit-part-dialog.component.css']\n})\nexport class EditPartDialogComponent implements OnDestroy, AfterViewInit {\n /**\n * Whether the dialog is visible\n */\n @Input()\n set Visible(value: boolean) {\n const previous = this._visible;\n this._visible = value;\n if (value && !previous) {\n this.onDialogOpened();\n // Delay loadConfigPanel to next tick to ensure all inputs are set\n // Angular doesn't guarantee input order, so PartType might not be set yet\n if (this.viewInitialized) {\n setTimeout(() => this.loadConfigPanel(), 0);\n }\n } else if (!value && previous) {\n this.onDialogClosed();\n }\n }\n get Visible(): boolean {\n return this._visible;\n }\n private _visible = false;\n\n /**\n * The part type being configured\n */\n @Input() PartType: MJDashboardPartTypeEntity | null = null;\n\n /**\n * The panel being edited\n */\n @Input() Panel: DashboardPanel | null = null;\n\n /**\n * The current configuration\n */\n @Input() Config: PanelConfig | null = null;\n\n /**\n * Emitted when configuration is saved\n */\n @Output() Saved = new EventEmitter<EditPartDialogResult>();\n\n /**\n * Emitted when dialog is cancelled\n */\n @Output() Cancelled = new EventEmitter<void>();\n\n /**\n * Container for dynamically loaded config panel\n */\n @ViewChild('configPanelContainer', { read: ViewContainerRef, static: false })\n ConfigPanelContainer!: ViewContainerRef;\n\n /** @deprecated Use {@link ConfigPanelContainer}. */\n get configPanelContainer(): ViewContainerRef {\n return this.ConfigPanelContainer;\n }\n /** @deprecated Use {@link ConfigPanelContainer}. */\n set configPanelContainer(value: ViewContainerRef) {\n this.ConfigPanelContainer = value;\n }\n\n /**\n * Reference to the dynamically created config panel component\n */\n private configPanelRef: ComponentRef<BaseConfigPanel> | null = null;\n\n /**\n * Track validity from the embedded panel\n */\n public IsValid = false;\n\n /**\n * Store the latest result from the panel\n */\n private latestResult: ConfigPanelResult | null = null;\n\n /**\n * Error message if panel failed to load\n */\n public LoadError: string | null = null;\n\n /**\n * Whether the panel is loading\n */\n public IsLoading = false;\n\n private viewInitialized = false;\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n ngAfterViewInit(): void {\n this.viewInitialized = true;\n if (this.Visible) {\n this.loadConfigPanel();\n }\n }\n\n ngOnDestroy(): void {\n this.destroyConfigPanel();\n }\n\n /**\n * Called when dialog opens\n */\n private onDialogOpened(): void {\n this.IsValid = false;\n this.latestResult = null;\n this.LoadError = null;\n\n if (this.viewInitialized) {\n this.loadConfigPanel();\n }\n }\n\n /**\n * Called when dialog closes\n */\n private onDialogClosed(): void {\n this.destroyConfigPanel();\n }\n\n /**\n * Dynamically load the config panel component\n */\n private async loadConfigPanel(): Promise<void> {\n this.destroyConfigPanel();\n this.LoadError = null; // Clear any previous error\n\n console.log('[EditPartDialog] loadConfigPanel() called');\n console.log('[EditPartDialog] PartType:', this.PartType?.Name);\n console.log('[EditPartDialog] ConfigDialogClass:', this.PartType?.ConfigDialogClass);\n\n if (!this.PartType?.ConfigDialogClass) {\n // No config class specified - this is okay for simple part types\n // Just enable the save button with default config\n console.log('[EditPartDialog] No ConfigDialogClass specified, using default');\n this.IsValid = true;\n this.cdr.detectChanges();\n return;\n }\n\n if (!this.ConfigPanelContainer) {\n // Container not ready yet - will be called again from ngAfterViewInit\n console.log('[EditPartDialog] Container not ready yet');\n return;\n }\n\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n // Use ClassFactory to create the config panel instance\n console.log('[EditPartDialog] Attempting to create instance via ClassFactory:', this.PartType.ConfigDialogClass);\n const panelInstance = await MJGlobal.Instance.ClassFactory.CreateInstanceAsync<BaseConfigPanel>(\n BaseConfigPanel,\n this.PartType.ConfigDialogClass\n );\n\n console.log('[EditPartDialog] ClassFactory returned:', panelInstance);\n\n if (!panelInstance) {\n this.LoadError = `Could not create config panel: ${this.PartType.ConfigDialogClass}`;\n console.error('[EditPartDialog]', this.LoadError);\n this.IsLoading = false;\n this.IsValid = true; // Allow saving with default config\n this.cdr.detectChanges();\n return;\n }\n\n // Get the component class from the instance\n // We need to find the Angular component class that was registered\n const componentClass = (panelInstance as object).constructor as typeof BaseConfigPanel;\n console.log('[EditPartDialog] Component class:', componentClass.name);\n\n // Clear the container and create the component\n this.ConfigPanelContainer.clear();\n this.configPanelRef = this.ConfigPanelContainer.createComponent(componentClass as never);\n console.log('[EditPartDialog] Component created successfully');\n\n // Set inputs on the component\n const panel = this.configPanelRef.instance;\n panel.partType = this.PartType;\n panel.panel = this.Panel;\n panel.config = this.Config;\n\n // Subscribe to config changes\n panel.configChanged.subscribe((result: ConfigPanelResult) => {\n this.OnConfigChanged(result);\n });\n\n this.IsLoading = false;\n this.LoadError = null; // Ensure error is cleared on success\n this.cdr.detectChanges();\n\n } catch (error) {\n this.LoadError = `Failed to load config panel: ${error instanceof Error ? error.message : String(error)}`;\n console.error('[EditPartDialog]', this.LoadError, error);\n this.IsLoading = false;\n this.IsValid = true; // Allow saving with default config\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Destroy the dynamically created config panel\n */\n private destroyConfigPanel(): void {\n if (this.configPanelRef) {\n this.configPanelRef.destroy();\n this.configPanelRef = null;\n }\n }\n\n /**\n * Handle configuration changes from the embedded panel\n */\n public OnConfigChanged(result: ConfigPanelResult): void {\n this.latestResult = result;\n this.IsValid = result.isValid;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnConfigChanged}. */\n public onConfigChanged(result: ConfigPanelResult): void {\n return this.OnConfigChanged(result);\n }\n\n /**\n * Get the dialog title based on part type\n */\n public GetDialogTitle(): string {\n const partName = this.PartType?.Name || 'Part';\n return this.Panel ? `Configure ${partName}` : `Add ${partName}`;\n }\n\n /** @deprecated Use {@link GetDialogTitle}. */\n public getDialogTitle(): string {\n return this.GetDialogTitle();\n }\n\n /**\n * Get the part type icon\n */\n public getIcon(): string {\n return this.PartType?.Icon || 'fa-solid fa-puzzle-piece';\n }\n\n /**\n * Save the configuration\n */\n public save(): void {\n if (!this.IsValid || !this.latestResult) {\n return;\n }\n\n this.Saved.emit({\n Config: this.latestResult.config,\n Title: this.latestResult.title,\n Icon: this.latestResult.icon\n });\n }\n\n /**\n * Cancel and close the dialog\n */\n public cancel(): void {\n this.Cancelled.emit();\n }\n\n /**\n * Get save button text\n */\n public GetSaveButtonText(): string {\n return this.Panel ? 'Save Changes' : 'Add Part';\n }\n\n /** @deprecated Use {@link GetSaveButtonText}. */\n public getSaveButtonText(): string {\n return this.GetSaveButtonText();\n }\n}\n","<!-- Generic Edit Part Dialog -->\n@if (Visible) {\n <div class=\"edit-part-dialog-overlay\" (click)=\"cancel()\">\n <div class=\"edit-part-dialog\" (click)=\"$event.stopPropagation()\">\n <!-- Header -->\n <div class=\"dialog-header\">\n <div class=\"header-icon\">\n <i [class]=\"getIcon()\"></i>\n </div>\n <h3>{{ getDialogTitle() }}</h3>\n <button class=\"close-button\" (click)=\"cancel()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <!-- Content -->\n <div class=\"dialog-content\">\n <!-- Loading state -->\n @if (IsLoading) {\n <div class=\"loading-state\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading configuration panel...</span>\n </div>\n }\n <!-- Error state -->\n @if (LoadError && !IsLoading) {\n <div class=\"error-state\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <span>{{ LoadError }}</span>\n </div>\n }\n <!-- Dynamic config panel container -->\n <ng-container #configPanelContainer></ng-container>\n </div>\n <!-- Footer -->\n <div class=\"dialog-footer\">\n <button\n class=\"btn-primary\"\n (click)=\"save()\"\n [disabled]=\"!IsValid || IsLoading || LoadError\">\n <i class=\"fa-solid fa-check\"></i>\n {{ getSaveButtonText() }}\n </button>\n <button class=\"btn-secondary\" (click)=\"cancel()\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n}\n"]}
@@ -211,18 +211,26 @@ export interface ValidationWarning {
211
211
  /**
212
212
  * Creates a default dashboard configuration with empty layout
213
213
  */
214
+ export declare function CreateDefaultDashboardConfig(): DashboardConfig;
215
+ /** @deprecated Use {@link CreateDefaultDashboardConfig}. */
214
216
  export declare function createDefaultDashboardConfig(): DashboardConfig;
215
217
  /**
216
218
  * Generates a unique panel ID
217
219
  */
220
+ export declare function GeneratePanelId(): string;
221
+ /** @deprecated Use {@link GeneratePanelId}. */
218
222
  export declare function generatePanelId(): string;
219
223
  /**
220
224
  * Extract all panels from a Golden Layout config.
221
225
  * Walks the layout tree and extracts DashboardPanel from each component's componentState.
222
226
  */
227
+ export declare function ExtractPanelsFromLayout(layout: ResolvedLayoutConfig | null): DashboardPanel[];
228
+ /** @deprecated Use {@link ExtractPanelsFromLayout}. */
223
229
  export declare function extractPanelsFromLayout(layout: ResolvedLayoutConfig | null): DashboardPanel[];
224
230
  /**
225
231
  * Find a panel in the layout by ID
226
232
  */
233
+ export declare function FindPanelInLayout(layout: ResolvedLayoutConfig | null, panelId: string): DashboardPanel | null;
234
+ /** @deprecated Use {@link FindPanelInLayout}. */
227
235
  export declare function findPanelInLayout(layout: ResolvedLayoutConfig | null, panelId: string): DashboardPanel | null;
228
236
  //# sourceMappingURL=dashboard-types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-types.d.ts","sourceRoot":"","sources":["../../../src/lib/models/dashboard-types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dashboard-types.d.ts","sourceRoot":"","sources":["../../../src/lib/models/dashboard-types.ts"],"names":[],"mappings":"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"}
@@ -24,23 +24,31 @@ export const DEFAULT_DASHBOARD_SETTINGS = {
24
24
  /**
25
25
  * Creates a default dashboard configuration with empty layout
26
26
  */
27
- export function createDefaultDashboardConfig() {
27
+ export function CreateDefaultDashboardConfig() {
28
28
  return {
29
29
  layout: null,
30
30
  settings: { ...DEFAULT_DASHBOARD_SETTINGS }
31
31
  };
32
32
  }
33
+ /** @deprecated Use {@link CreateDefaultDashboardConfig}. */
34
+ export function createDefaultDashboardConfig() {
35
+ return CreateDefaultDashboardConfig();
36
+ }
33
37
  /**
34
38
  * Generates a unique panel ID
35
39
  */
36
- export function generatePanelId() {
40
+ export function GeneratePanelId() {
37
41
  return `panel-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
38
42
  }
43
+ /** @deprecated Use {@link GeneratePanelId}. */
44
+ export function generatePanelId() {
45
+ return GeneratePanelId();
46
+ }
39
47
  /**
40
48
  * Extract all panels from a Golden Layout config.
41
49
  * Walks the layout tree and extracts DashboardPanel from each component's componentState.
42
50
  */
43
- export function extractPanelsFromLayout(layout) {
51
+ export function ExtractPanelsFromLayout(layout) {
44
52
  if (!layout?.root) {
45
53
  return [];
46
54
  }
@@ -66,11 +74,19 @@ export function extractPanelsFromLayout(layout) {
66
74
  extractFromNode(layout.root);
67
75
  return panels;
68
76
  }
77
+ /** @deprecated Use {@link ExtractPanelsFromLayout}. */
78
+ export function extractPanelsFromLayout(layout) {
79
+ return ExtractPanelsFromLayout(layout);
80
+ }
69
81
  /**
70
82
  * Find a panel in the layout by ID
71
83
  */
72
- export function findPanelInLayout(layout, panelId) {
73
- const panels = extractPanelsFromLayout(layout);
84
+ export function FindPanelInLayout(layout, panelId) {
85
+ const panels = ExtractPanelsFromLayout(layout);
74
86
  return panels.find(p => p.id === panelId) || null;
75
87
  }
88
+ /** @deprecated Use {@link FindPanelInLayout}. */
89
+ export function findPanelInLayout(layout, panelId) {
90
+ return FindPanelInLayout(layout, panelId);
91
+ }
76
92
  //# sourceMappingURL=dashboard-types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-types.js","sourceRoot":"","sources":["../../../src/lib/models/dashboard-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA4CH;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAsB;IACzD,KAAK,EAAE,OAAO;IACd,WAAW,EAAE,IAAI;IACjB,YAAY,EAAE,KAAK;IACnB,cAAc,EAAE,IAAI;IACpB,cAAc,EAAE,IAAI;IACpB,YAAY,EAAE,IAAI;CACrB,CAAC;AAyMF,2CAA2C;AAC3C,oBAAoB;AACpB,2CAA2C;AAE3C;;GAEG;AACH,MAAM,UAAU,4BAA4B;IACxC,OAAO;QACH,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,EAAE,GAAG,0BAA0B,EAAE;KAC9C,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC3B,OAAO,SAAS,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AAC/E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAmC;IACvE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;QAChB,OAAO,EAAE,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAqB,EAAE,CAAC;IAEpC,MAAM,eAAe,GAAG,CAAC,IAAkC,EAAQ,EAAE;QACjE,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,gEAAgE;QAChE,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC5B,MAAM,aAAa,GAAG,IAAsD,CAAC;YAC7E,IAAI,aAAa,CAAC,cAAc,EAAE,EAAE,EAAE,CAAC;gBACnC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;YAC9C,CAAC;QACL,CAAC;QAED,+BAA+B;QAC/B,MAAM,aAAa,GAAG,IAA+D,CAAC;QACtF,IAAI,aAAa,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;YAChE,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;gBACxC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC;QACL,CAAC;IACL,CAAC,CAAC;IAEF,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAmC,EAAE,OAAe;IAClF,MAAM,MAAM,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAC/C,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,IAAI,IAAI,CAAC;AACtD,CAAC","sourcesContent":["/**\n * Types and interfaces for the Dashboard Viewer component.\n * These define the configuration schema for metadata-driven dashboards.\n *\n * DESIGN PRINCIPLE: Single Source of Truth\n * - Golden Layout's native config is the ground truth for layout AND panel data\n * - Full DashboardPanel objects are stored in componentState within the layout\n * - No redundant arrays or conversion functions needed\n */\n\nimport { ResolvedLayoutConfig } from 'golden-layout';\n\n// ========================================\n// Dashboard Configuration\n// ========================================\n\n/**\n * Root configuration for a dashboard.\n * Stored in Dashboard.UIConfigDetails as JSON.\n *\n * The layout contains EVERYTHING - both geometry AND panel configurations.\n * Panel data is embedded in each component's componentState within the layout tree.\n */\nexport interface DashboardConfig {\n /**\n * Golden Layout configuration - THE SINGLE SOURCE OF TRUTH\n * Contains both layout geometry AND panel configurations (in componentState)\n * Stored as GL's native format for lossless persistence\n */\n layout: ResolvedLayoutConfig | null;\n /** Dashboard-level settings (not per-panel) */\n settings: DashboardSettings;\n}\n\n/**\n * Dashboard-level settings\n */\nexport interface DashboardSettings {\n /** Visual theme */\n theme: 'light' | 'dark';\n /** Show panel headers with title/actions */\n showHeaders: boolean;\n /** Allow panels to pop out into separate windows */\n enablePopout: boolean;\n /** Allow panels to be maximized */\n enableMaximize: boolean;\n /** Allow users to rearrange panels */\n enableDragDrop: boolean;\n /** Allow users to resize panels */\n enableResize: boolean;\n}\n\n/**\n * Default dashboard settings\n */\nexport const DEFAULT_DASHBOARD_SETTINGS: DashboardSettings = {\n theme: 'light',\n showHeaders: true,\n enablePopout: false,\n enableMaximize: true,\n enableDragDrop: true,\n enableResize: true\n};\n\n// ========================================\n// Panel Configuration (stored in componentState)\n// ========================================\n\n/**\n * Complete panel data stored in Golden Layout's componentState.\n * This is the ONLY place panel configuration lives.\n */\nexport interface DashboardPanel {\n /** Unique panel identifier */\n id: string;\n /** Display title */\n title: string;\n /** Optional icon class (Font Awesome) */\n icon?: string;\n /** Reference to DashboardPartType.ID */\n partTypeId: string;\n /** Type-specific configuration */\n config: PanelConfig;\n /** Persisted panel state (e.g., scroll position, selections) */\n state?: Record<string, unknown>;\n}\n\n/**\n * Generic panel configuration interface.\n * Each panel type (View, Query, Artifact, WebURL, etc.) defines its own config shape.\n * The `type` field must match the DashboardPartType.Name from metadata.\n *\n * This is intentionally generic to support pluggable panel types - new types can be\n * added via metadata without requiring code changes to this interface.\n */\nexport interface PanelConfig {\n /** Type discriminator - must match DashboardPartType.Name */\n type: string;\n /** Any additional configuration properties specific to the panel type */\n [key: string]: unknown;\n}\n\n// ========================================\n// Events\n// ========================================\n\n/**\n * Event emitted when a panel interacts with content\n */\nexport interface PanelInteractionEvent {\n /** Panel that emitted the event */\n panelId: string;\n /** Type of interaction */\n interactionType: 'record-select' | 'record-open' | 'entity-link' | 'query-execute' | 'custom';\n /** Interaction payload */\n payload: Record<string, unknown>;\n}\n\n/**\n * Event emitted when dashboard configuration changes\n */\nexport interface DashboardConfigChangedEvent {\n /** Updated configuration */\n config: DashboardConfig;\n /** What changed */\n changeType: 'panel-added' | 'panel-removed' | 'panel-config' | 'layout' | 'settings';\n}\n\n/**\n * Event emitted when layout changes (resize, move, etc.)\n */\nexport interface LayoutChangedEvent {\n /** Updated layout - Golden Layout's native format */\n layout: ResolvedLayoutConfig;\n /** What changed */\n changeType: 'resize' | 'move' | 'stack' | 'close' | 'maximize';\n}\n\n// ========================================\n// Navigation Request Events\n// ========================================\n\n/**\n * Union type for all navigation requests from dashboard parts.\n * These are high-level abstractions - the parent component handles routing.\n */\nexport type DashboardNavRequest =\n | OpenEntityRecordNavRequest\n | OpenDashboardNavRequest\n | OpenQueryNavRequest\n | OpenApplicationNavRequest\n | OpenNavItemNavRequest;\n\n/**\n * Base interface for navigation requests\n */\nexport interface BaseNavRequest {\n /** Type discriminator for the navigation request */\n type: string;\n /** Source panel ID that initiated the request */\n sourcePanelId: string;\n /** Whether to open in a new tab/window */\n openInNewTab?: boolean;\n}\n\n/**\n * Request to open a specific entity record by entity name and ID\n */\nexport interface OpenEntityRecordNavRequest extends BaseNavRequest {\n type: 'OpenEntityRecord';\n /** Entity name */\n entityName: string;\n /** Record primary key value (URL segment format) */\n recordId: string;\n /** Optional: Open in edit or view mode */\n mode?: 'view' | 'edit';\n}\n\n/**\n * Request to navigate to another dashboard\n */\nexport interface OpenDashboardNavRequest extends BaseNavRequest {\n type: 'OpenDashboard';\n /** Dashboard ID */\n dashboardId: string;\n /** Optional: Dashboard category to navigate to first */\n categoryId?: string;\n}\n\n/**\n * Request to navigate to a query\n */\nexport interface OpenQueryNavRequest extends BaseNavRequest {\n type: 'OpenQuery';\n /** Query ID */\n queryId: string;\n /** Optional: Pre-filled parameter values */\n parameters?: Record<string, unknown>;\n /** Optional: Auto-execute on open */\n autoExecute?: boolean;\n}\n\n/**\n * Request to navigate to another application\n */\nexport interface OpenApplicationNavRequest extends BaseNavRequest {\n type: 'OpenApplication';\n /** Application name or ID */\n applicationId: string;\n /** Optional: Specific resource/tab within the app */\n resourceName?: string;\n}\n\n/**\n * Request to navigate to a specific nav item within an application.\n * Supports setting URL query parameters after navigation.\n */\nexport interface OpenNavItemNavRequest extends BaseNavRequest {\n type: 'OpenNavItem';\n /** Application name (e.g., 'Data Explorer'). If omitted, stays in current app. */\n appName?: string;\n /** Navigation item label within the app (e.g., 'Queries') */\n navItemName: string;\n /** URL query parameters to apply after navigation */\n queryParams?: Record<string, string>;\n}\n\n/**\n * Event wrapper for navigation requests emitted from dashboard parts\n */\nexport interface DashboardNavRequestEvent {\n /** The navigation request */\n request: DashboardNavRequest;\n /** Panel data at time of request (for context) */\n panel: DashboardPanel;\n}\n\n// ========================================\n// Validation\n// ========================================\n\n/**\n * Result of configuration validation\n */\nexport interface ValidationResult {\n /** Whether the configuration is valid */\n valid: boolean;\n /** Validation errors */\n errors: ValidationError[];\n /** Validation warnings */\n warnings: ValidationWarning[];\n}\n\nexport interface ValidationError {\n field: string;\n message: string;\n}\n\nexport interface ValidationWarning {\n field: string;\n message: string;\n}\n\n// ========================================\n// Utility Functions\n// ========================================\n\n/**\n * Creates a default dashboard configuration with empty layout\n */\nexport function createDefaultDashboardConfig(): DashboardConfig {\n return {\n layout: null,\n settings: { ...DEFAULT_DASHBOARD_SETTINGS }\n };\n}\n\n/**\n * Generates a unique panel ID\n */\nexport function generatePanelId(): string {\n return `panel-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Extract all panels from a Golden Layout config.\n * Walks the layout tree and extracts DashboardPanel from each component's componentState.\n */\nexport function extractPanelsFromLayout(layout: ResolvedLayoutConfig | null): DashboardPanel[] {\n if (!layout?.root) {\n return [];\n }\n\n const panels: DashboardPanel[] = [];\n\n const extractFromNode = (node: ResolvedLayoutConfig['root']): void => {\n if (!node) return;\n\n // If this is a component, extract the panel from componentState\n if (node.type === 'component') {\n const componentNode = node as unknown as { componentState?: DashboardPanel };\n if (componentNode.componentState?.id) {\n panels.push(componentNode.componentState);\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 extractFromNode(child);\n }\n }\n };\n\n extractFromNode(layout.root);\n return panels;\n}\n\n/**\n * Find a panel in the layout by ID\n */\nexport function findPanelInLayout(layout: ResolvedLayoutConfig | null, panelId: string): DashboardPanel | null {\n const panels = extractPanelsFromLayout(layout);\n return panels.find(p => p.id === panelId) || null;\n}\n\n"]}
1
+ {"version":3,"file":"dashboard-types.js","sourceRoot":"","sources":["../../../src/lib/models/dashboard-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA4CH;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAsB;IACzD,KAAK,EAAE,OAAO;IACd,WAAW,EAAE,IAAI;IACjB,YAAY,EAAE,KAAK;IACnB,cAAc,EAAE,IAAI;IACpB,cAAc,EAAE,IAAI;IACpB,YAAY,EAAE,IAAI;CACrB,CAAC;AAyMF,2CAA2C;AAC3C,oBAAoB;AACpB,2CAA2C;AAE3C;;GAEG;AACH,MAAM,UAAU,4BAA4B;IACxC,OAAO;QACH,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,EAAE,GAAG,0BAA0B,EAAE;KAC9C,CAAC;AACN,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,4BAA4B;IACxC,OAAO,4BAA4B,EAAE,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC3B,OAAO,SAAS,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AAC/E,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,eAAe;IAC3B,OAAO,eAAe,EAAE,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAmC;IACvE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;QAChB,OAAO,EAAE,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAqB,EAAE,CAAC;IAEpC,MAAM,eAAe,GAAG,CAAC,IAAkC,EAAQ,EAAE;QACjE,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,gEAAgE;QAChE,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC5B,MAAM,aAAa,GAAG,IAAsD,CAAC;YAC7E,IAAI,aAAa,CAAC,cAAc,EAAE,EAAE,EAAE,CAAC;gBACnC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;YAC9C,CAAC;QACL,CAAC;QAED,+BAA+B;QAC/B,MAAM,aAAa,GAAG,IAA+D,CAAC;QACtF,IAAI,aAAa,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;YAChE,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;gBACxC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC;QACL,CAAC;IACL,CAAC,CAAC;IAEF,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,uBAAuB,CAAC,MAAmC;IACvE,OAAO,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAmC,EAAE,OAAe;IAClF,MAAM,MAAM,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAC/C,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,IAAI,IAAI,CAAC;AACtD,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,iBAAiB,CAAC,MAAmC,EAAE,OAAe;IAClF,OAAO,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC","sourcesContent":["/**\n * Types and interfaces for the Dashboard Viewer component.\n * These define the configuration schema for metadata-driven dashboards.\n *\n * DESIGN PRINCIPLE: Single Source of Truth\n * - Golden Layout's native config is the ground truth for layout AND panel data\n * - Full DashboardPanel objects are stored in componentState within the layout\n * - No redundant arrays or conversion functions needed\n */\n\nimport { ResolvedLayoutConfig } from 'golden-layout';\n\n// ========================================\n// Dashboard Configuration\n// ========================================\n\n/**\n * Root configuration for a dashboard.\n * Stored in Dashboard.UIConfigDetails as JSON.\n *\n * The layout contains EVERYTHING - both geometry AND panel configurations.\n * Panel data is embedded in each component's componentState within the layout tree.\n */\nexport interface DashboardConfig {\n /**\n * Golden Layout configuration - THE SINGLE SOURCE OF TRUTH\n * Contains both layout geometry AND panel configurations (in componentState)\n * Stored as GL's native format for lossless persistence\n */\n layout: ResolvedLayoutConfig | null;\n /** Dashboard-level settings (not per-panel) */\n settings: DashboardSettings;\n}\n\n/**\n * Dashboard-level settings\n */\nexport interface DashboardSettings {\n /** Visual theme */\n theme: 'light' | 'dark';\n /** Show panel headers with title/actions */\n showHeaders: boolean;\n /** Allow panels to pop out into separate windows */\n enablePopout: boolean;\n /** Allow panels to be maximized */\n enableMaximize: boolean;\n /** Allow users to rearrange panels */\n enableDragDrop: boolean;\n /** Allow users to resize panels */\n enableResize: boolean;\n}\n\n/**\n * Default dashboard settings\n */\nexport const DEFAULT_DASHBOARD_SETTINGS: DashboardSettings = {\n theme: 'light',\n showHeaders: true,\n enablePopout: false,\n enableMaximize: true,\n enableDragDrop: true,\n enableResize: true\n};\n\n// ========================================\n// Panel Configuration (stored in componentState)\n// ========================================\n\n/**\n * Complete panel data stored in Golden Layout's componentState.\n * This is the ONLY place panel configuration lives.\n */\nexport interface DashboardPanel {\n /** Unique panel identifier */\n id: string;\n /** Display title */\n title: string;\n /** Optional icon class (Font Awesome) */\n icon?: string;\n /** Reference to DashboardPartType.ID */\n partTypeId: string;\n /** Type-specific configuration */\n config: PanelConfig;\n /** Persisted panel state (e.g., scroll position, selections) */\n state?: Record<string, unknown>;\n}\n\n/**\n * Generic panel configuration interface.\n * Each panel type (View, Query, Artifact, WebURL, etc.) defines its own config shape.\n * The `type` field must match the DashboardPartType.Name from metadata.\n *\n * This is intentionally generic to support pluggable panel types - new types can be\n * added via metadata without requiring code changes to this interface.\n */\nexport interface PanelConfig {\n /** Type discriminator - must match DashboardPartType.Name */\n type: string;\n /** Any additional configuration properties specific to the panel type */\n [key: string]: unknown;\n}\n\n// ========================================\n// Events\n// ========================================\n\n/**\n * Event emitted when a panel interacts with content\n */\nexport interface PanelInteractionEvent {\n /** Panel that emitted the event */\n panelId: string;\n /** Type of interaction */\n interactionType: 'record-select' | 'record-open' | 'entity-link' | 'query-execute' | 'custom';\n /** Interaction payload */\n payload: Record<string, unknown>;\n}\n\n/**\n * Event emitted when dashboard configuration changes\n */\nexport interface DashboardConfigChangedEvent {\n /** Updated configuration */\n config: DashboardConfig;\n /** What changed */\n changeType: 'panel-added' | 'panel-removed' | 'panel-config' | 'layout' | 'settings';\n}\n\n/**\n * Event emitted when layout changes (resize, move, etc.)\n */\nexport interface LayoutChangedEvent {\n /** Updated layout - Golden Layout's native format */\n layout: ResolvedLayoutConfig;\n /** What changed */\n changeType: 'resize' | 'move' | 'stack' | 'close' | 'maximize';\n}\n\n// ========================================\n// Navigation Request Events\n// ========================================\n\n/**\n * Union type for all navigation requests from dashboard parts.\n * These are high-level abstractions - the parent component handles routing.\n */\nexport type DashboardNavRequest =\n | OpenEntityRecordNavRequest\n | OpenDashboardNavRequest\n | OpenQueryNavRequest\n | OpenApplicationNavRequest\n | OpenNavItemNavRequest;\n\n/**\n * Base interface for navigation requests\n */\nexport interface BaseNavRequest {\n /** Type discriminator for the navigation request */\n type: string;\n /** Source panel ID that initiated the request */\n sourcePanelId: string;\n /** Whether to open in a new tab/window */\n openInNewTab?: boolean;\n}\n\n/**\n * Request to open a specific entity record by entity name and ID\n */\nexport interface OpenEntityRecordNavRequest extends BaseNavRequest {\n type: 'OpenEntityRecord';\n /** Entity name */\n entityName: string;\n /** Record primary key value (URL segment format) */\n recordId: string;\n /** Optional: Open in edit or view mode */\n mode?: 'view' | 'edit';\n}\n\n/**\n * Request to navigate to another dashboard\n */\nexport interface OpenDashboardNavRequest extends BaseNavRequest {\n type: 'OpenDashboard';\n /** Dashboard ID */\n dashboardId: string;\n /** Optional: Dashboard category to navigate to first */\n categoryId?: string;\n}\n\n/**\n * Request to navigate to a query\n */\nexport interface OpenQueryNavRequest extends BaseNavRequest {\n type: 'OpenQuery';\n /** Query ID */\n queryId: string;\n /** Optional: Pre-filled parameter values */\n parameters?: Record<string, unknown>;\n /** Optional: Auto-execute on open */\n autoExecute?: boolean;\n}\n\n/**\n * Request to navigate to another application\n */\nexport interface OpenApplicationNavRequest extends BaseNavRequest {\n type: 'OpenApplication';\n /** Application name or ID */\n applicationId: string;\n /** Optional: Specific resource/tab within the app */\n resourceName?: string;\n}\n\n/**\n * Request to navigate to a specific nav item within an application.\n * Supports setting URL query parameters after navigation.\n */\nexport interface OpenNavItemNavRequest extends BaseNavRequest {\n type: 'OpenNavItem';\n /** Application name (e.g., 'Data Explorer'). If omitted, stays in current app. */\n appName?: string;\n /** Navigation item label within the app (e.g., 'Queries') */\n navItemName: string;\n /** URL query parameters to apply after navigation */\n queryParams?: Record<string, string>;\n}\n\n/**\n * Event wrapper for navigation requests emitted from dashboard parts\n */\nexport interface DashboardNavRequestEvent {\n /** The navigation request */\n request: DashboardNavRequest;\n /** Panel data at time of request (for context) */\n panel: DashboardPanel;\n}\n\n// ========================================\n// Validation\n// ========================================\n\n/**\n * Result of configuration validation\n */\nexport interface ValidationResult {\n /** Whether the configuration is valid */\n valid: boolean;\n /** Validation errors */\n errors: ValidationError[];\n /** Validation warnings */\n warnings: ValidationWarning[];\n}\n\nexport interface ValidationError {\n field: string;\n message: string;\n}\n\nexport interface ValidationWarning {\n field: string;\n message: string;\n}\n\n// ========================================\n// Utility Functions\n// ========================================\n\n/**\n * Creates a default dashboard configuration with empty layout\n */\nexport function CreateDefaultDashboardConfig(): DashboardConfig {\n return {\n layout: null,\n settings: { ...DEFAULT_DASHBOARD_SETTINGS }\n };\n}\n\n/** @deprecated Use {@link CreateDefaultDashboardConfig}. */\nexport function createDefaultDashboardConfig(): DashboardConfig {\n return CreateDefaultDashboardConfig();\n}\n\n/**\n * Generates a unique panel ID\n */\nexport function GeneratePanelId(): string {\n return `panel-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/** @deprecated Use {@link GeneratePanelId}. */\nexport function generatePanelId(): string {\n return GeneratePanelId();\n}\n\n/**\n * Extract all panels from a Golden Layout config.\n * Walks the layout tree and extracts DashboardPanel from each component's componentState.\n */\nexport function ExtractPanelsFromLayout(layout: ResolvedLayoutConfig | null): DashboardPanel[] {\n if (!layout?.root) {\n return [];\n }\n\n const panels: DashboardPanel[] = [];\n\n const extractFromNode = (node: ResolvedLayoutConfig['root']): void => {\n if (!node) return;\n\n // If this is a component, extract the panel from componentState\n if (node.type === 'component') {\n const componentNode = node as unknown as { componentState?: DashboardPanel };\n if (componentNode.componentState?.id) {\n panels.push(componentNode.componentState);\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 extractFromNode(child);\n }\n }\n };\n\n extractFromNode(layout.root);\n return panels;\n}\n\n/** @deprecated Use {@link ExtractPanelsFromLayout}. */\nexport function extractPanelsFromLayout(layout: ResolvedLayoutConfig | null): DashboardPanel[] {\n return ExtractPanelsFromLayout(layout);\n}\n\n/**\n * Find a panel in the layout by ID\n */\nexport function FindPanelInLayout(layout: ResolvedLayoutConfig | null, panelId: string): DashboardPanel | null {\n const panels = ExtractPanelsFromLayout(layout);\n return panels.find(p => p.id === panelId) || null;\n}\n\n/** @deprecated Use {@link FindPanelInLayout}. */\nexport function findPanelInLayout(layout: ResolvedLayoutConfig | null, panelId: string): DashboardPanel | null {\n return FindPanelInLayout(layout, panelId);\n}\n\n"]}
@@ -20,17 +20,51 @@ export declare class ArtifactPartComponent extends BaseDashboardPart implements
20
20
  * Should be provided by the dashboard host.
21
21
  */
22
22
  EnvironmentId: string;
23
- hasArtifact: boolean;
23
+ HasArtifact: boolean;
24
+ /** @deprecated Use {@link HasArtifact}. */
25
+ get hasArtifact(): boolean;
26
+ /** @deprecated Use {@link HasArtifact}. */
27
+ set hasArtifact(value: boolean);
24
28
  artifactId: string | null;
25
- versionNumber: number | undefined;
26
- showHeader: boolean;
27
- showTabs: boolean;
28
- showCloseButton: boolean;
29
- showMaximizeButton: boolean;
30
- refreshTrigger: Subject<{
29
+ VersionNumber: number | undefined;
30
+ /** @deprecated Use {@link VersionNumber}. */
31
+ get versionNumber(): number | undefined;
32
+ /** @deprecated Use {@link VersionNumber}. */
33
+ set versionNumber(value: number | undefined);
34
+ ShowHeader: boolean;
35
+ /** @deprecated Use {@link ShowHeader}. */
36
+ get showHeader(): boolean;
37
+ /** @deprecated Use {@link ShowHeader}. */
38
+ set showHeader(value: boolean);
39
+ ShowTabs: boolean;
40
+ /** @deprecated Use {@link ShowTabs}. */
41
+ get showTabs(): boolean;
42
+ /** @deprecated Use {@link ShowTabs}. */
43
+ set showTabs(value: boolean);
44
+ ShowCloseButton: boolean;
45
+ /** @deprecated Use {@link ShowCloseButton}. */
46
+ get showCloseButton(): boolean;
47
+ /** @deprecated Use {@link ShowCloseButton}. */
48
+ set showCloseButton(value: boolean);
49
+ ShowMaximizeButton: boolean;
50
+ /** @deprecated Use {@link ShowMaximizeButton}. */
51
+ get showMaximizeButton(): boolean;
52
+ /** @deprecated Use {@link ShowMaximizeButton}. */
53
+ set showMaximizeButton(value: boolean);
54
+ RefreshTrigger: Subject<{
31
55
  artifactId: string;
32
56
  versionNumber: number;
33
57
  }>;
58
+ /** @deprecated Use {@link RefreshTrigger}. */
59
+ get refreshTrigger(): Subject<{
60
+ artifactId: string;
61
+ versionNumber: number;
62
+ }>;
63
+ /** @deprecated Use {@link RefreshTrigger}. */
64
+ set refreshTrigger(value: Subject<{
65
+ artifactId: string;
66
+ versionNumber: number;
67
+ }>);
34
68
  get currentUser(): UserInfo;
35
69
  get environmentId(): string;
36
70
  constructor(cdr: ChangeDetectorRef, analyzeService: AnalyzeArtifactService);
@@ -39,10 +73,20 @@ export declare class ArtifactPartComponent extends BaseDashboardPart implements
39
73
  /**
40
74
  * Refresh the artifact display
41
75
  */
76
+ Refresh(): void;
77
+ /** @deprecated Use {@link Refresh}. */
42
78
  refresh(): void;
43
79
  /**
44
80
  * Handle navigation link events from artifact viewer (conversation/collection links)
45
81
  */
82
+ OnNavigateToLink(event: {
83
+ type: 'conversation' | 'collection';
84
+ id: string;
85
+ artifactId?: string;
86
+ versionNumber?: number;
87
+ versionId?: string;
88
+ }): void;
89
+ /** @deprecated Use {@link OnNavigateToLink}. */
46
90
  onNavigateToLink(event: {
47
91
  type: 'conversation' | 'collection';
48
92
  id: string;
@@ -53,6 +97,11 @@ export declare class ArtifactPartComponent extends BaseDashboardPart implements
53
97
  /**
54
98
  * Handle entity record navigation events from artifact viewer
55
99
  */
100
+ OnOpenEntityRecord(event: {
101
+ entityName: string;
102
+ compositeKey: CompositeKey;
103
+ }): void;
104
+ /** @deprecated Use {@link OnOpenEntityRecord}. */
56
105
  onOpenEntityRecord(event: {
57
106
  entityName: string;
58
107
  compositeKey: CompositeKey;
@@ -60,6 +109,8 @@ export declare class ArtifactPartComponent extends BaseDashboardPart implements
60
109
  /**
61
110
  * Handle general navigation request events from artifact viewer plugins
62
111
  */
112
+ OnNavigationRequest(event: NavigationRequest): void;
113
+ /** @deprecated Use {@link OnNavigationRequest}. */
63
114
  onNavigationRequest(event: NavigationRequest): void;
64
115
  /**
65
116
  * Handler for the Analyze button on the embedded artifact viewer.
@@ -67,6 +118,11 @@ export declare class ArtifactPartComponent extends BaseDashboardPart implements
67
118
  * the snapshot attached as input, and emits a navigation request to open
68
119
  * the new conversation in the host application.
69
120
  */
121
+ OnAnalyzeRequested(event: {
122
+ artifactId: string;
123
+ snapshot: DataSnapshot;
124
+ }): Promise<void>;
125
+ /** @deprecated Use {@link OnAnalyzeRequested}. */
70
126
  onAnalyzeRequested(event: {
71
127
  artifactId: string;
72
128
  snapshot: DataSnapshot;
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-part.component.d.ts","sourceRoot":"","sources":["../../../src/lib/parts/artifact-part.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,iBAAiB,EAAE,aAAa,EAAE,SAAS,EAAS,MAAM,eAAe,CAAC;AAE9F,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACzF,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;;AAE/B;;;GAGG;AACH,qBA+Fa,qBAAsB,SAAQ,iBAAkB,YAAW,aAAa,EAAE,SAAS;IAqCxD,OAAO,CAAC,cAAc;IApC1D;;;OAGG;IACM,WAAW,EAAE,QAAQ,GAAG,IAAI,CAAQ;IAE7C;;;OAGG;IACM,aAAa,EAAE,MAAM,CAAM;IAE7B,WAAW,UAAS;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAQ;IACjC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,UAAU,EAAE,OAAO,CAAS;IAC5B,QAAQ,EAAE,OAAO,CAAQ;IACzB,eAAe,EAAE,OAAO,CAAS;IACjC,kBAAkB,EAAE,OAAO,CAAS;IACpC,cAAc;oBAA6B,MAAM;uBAAiB,MAAM;OAAM;IAGrF,IAAW,WAAW,IAAI,QAAQ,CAQjC;IAED,IAAW,aAAa,IAAI,MAAM,CAEjC;gBAEW,GAAG,EAAE,iBAAiB,EAAU,cAAc,EAAE,sBAAsB;IAUlF,eAAe,IAAI,IAAI;IAMV,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IA2BzC;;OAEG;IACI,OAAO,IAAI,IAAI;IAStB;;OAEG;IACI,gBAAgB,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,cAAc,GAAG,YAAY,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAe1J;;OAEG;IACI,kBAAkB,CAAC,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,YAAY,CAAA;KAAE,GAAG,IAAI;IAmB1F;;OAEG;IACI,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAS1D;;;;;OAKG;IACU,kBAAkB,CAAC,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;cAmBlF,OAAO,IAAI,IAAI;yCAzKzB,qBAAqB;2CAArB,qBAAqB;CA8KjC"}
1
+ {"version":3,"file":"artifact-part.component.d.ts","sourceRoot":"","sources":["../../../src/lib/parts/artifact-part.component.ts"],"names":[],"mappings":"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"}