@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.
- package/dist/lib/config-dialogs/confirm-dialog.component.d.ts +58 -8
- package/dist/lib/config-dialogs/confirm-dialog.component.d.ts.map +1 -1
- package/dist/lib/config-dialogs/confirm-dialog.component.js +119 -17
- package/dist/lib/config-dialogs/confirm-dialog.component.js.map +1 -1
- package/dist/lib/config-panels/artifact-config-panel.component.d.ts +63 -11
- package/dist/lib/config-panels/artifact-config-panel.component.d.ts.map +1 -1
- package/dist/lib/config-panels/artifact-config-panel.component.js +152 -48
- package/dist/lib/config-panels/artifact-config-panel.component.js.map +1 -1
- package/dist/lib/config-panels/query-config-panel.component.d.ts +57 -9
- package/dist/lib/config-panels/query-config-panel.component.d.ts.map +1 -1
- package/dist/lib/config-panels/query-config-panel.component.js +142 -46
- package/dist/lib/config-panels/query-config-panel.component.js.map +1 -1
- package/dist/lib/config-panels/view-config-panel.component.d.ts +69 -11
- package/dist/lib/config-panels/view-config-panel.component.d.ts.map +1 -1
- package/dist/lib/config-panels/view-config-panel.component.js +165 -49
- package/dist/lib/config-panels/view-config-panel.component.js.map +1 -1
- package/dist/lib/config-panels/weburl-config-panel.component.d.ts +42 -6
- package/dist/lib/config-panels/weburl-config-panel.component.d.ts.map +1 -1
- package/dist/lib/config-panels/weburl-config-panel.component.js +113 -41
- package/dist/lib/config-panels/weburl-config-panel.component.js.map +1 -1
- package/dist/lib/dashboard-browser/dashboard-browser.component.d.ts.map +1 -1
- package/dist/lib/dashboard-browser/dashboard-browser.component.js +7 -4
- package/dist/lib/dashboard-browser/dashboard-browser.component.js.map +1 -1
- package/dist/lib/dashboard-viewer/dashboard-viewer.component.d.ts +163 -12
- package/dist/lib/dashboard-viewer/dashboard-viewer.component.d.ts.map +1 -1
- package/dist/lib/dashboard-viewer/dashboard-viewer.component.js +332 -78
- package/dist/lib/dashboard-viewer/dashboard-viewer.component.js.map +1 -1
- package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.d.ts +63 -9
- package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.d.ts.map +1 -1
- package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.js +172 -66
- package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.js.map +1 -1
- package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.d.ts +11 -1
- package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.d.ts.map +1 -1
- package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.js +30 -10
- package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.js.map +1 -1
- package/dist/lib/models/dashboard-types.d.ts +8 -0
- package/dist/lib/models/dashboard-types.d.ts.map +1 -1
- package/dist/lib/models/dashboard-types.js +21 -5
- package/dist/lib/models/dashboard-types.js.map +1 -1
- package/dist/lib/parts/artifact-part.component.d.ts +63 -7
- package/dist/lib/parts/artifact-part.component.d.ts.map +1 -1
- package/dist/lib/parts/artifact-part.component.js +98 -22
- package/dist/lib/parts/artifact-part.component.js.map +1 -1
- package/dist/lib/parts/query-part.component.d.ts +26 -4
- package/dist/lib/parts/query-part.component.d.ts.map +1 -1
- package/dist/lib/parts/query-part.component.js +62 -18
- package/dist/lib/parts/query-part.component.js.map +1 -1
- package/dist/lib/parts/view-part.component.d.ts +21 -3
- package/dist/lib/parts/view-part.component.d.ts.map +1 -1
- package/dist/lib/parts/view-part.component.js +55 -19
- package/dist/lib/parts/view-part.component.js.map +1 -1
- package/dist/lib/parts/weburl-part.component.d.ts +29 -5
- package/dist/lib/parts/weburl-part.component.d.ts.map +1 -1
- package/dist/lib/parts/weburl-part.component.js +63 -15
- package/dist/lib/parts/weburl-part.component.js.map +1 -1
- package/dist/lib/services/golden-layout-wrapper.service.d.ts +65 -5
- package/dist/lib/services/golden-layout-wrapper.service.d.ts.map +1 -1
- package/dist/lib/services/golden-layout-wrapper.service.js +135 -27
- package/dist/lib/services/golden-layout-wrapper.service.js.map +1 -1
- 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
|
-
|
|
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.
|
|
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.
|
|
219
|
-
this.configPanelRef = this.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
}],
|
|
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":"AAAA,OAAO,EACH,SAAS,EACT,KAAK,EACL,MAAM,EACN,YAAY,EAEZ,SAAS,EACT,gBAAgB,EAInB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGlD,OAAO,EAAE,eAAe,EAAqB,MAAM,uCAAuC,CAAC;;;;ICGjF,8BAA2B;IACzB,wBAA2C;IAC3C,4BAAM;IAAA,8CAA8B;IACtC,AADsC,iBAAO,EACvC;;;IAIN,+BAAyB;IACvB,wBAAgD;IAChD,4BAAM;IAAA,YAAe;IACvB,AADuB,iBAAO,EACxB;;;IADE,eAAe;IAAf,sCAAe;;;;IAzB/B,8BAAyD;IAAnB,wLAAS,eAAQ,KAAC;IACtD,8BAAiE;IAAnC,qHAAS,wBAAwB,IAAC;IAG5D,AADF,8BAA2B,aACA;IACvB,oBAA2B;IAC7B,iBAAM;IACN,0BAAI;IAAA,YAAsB;IAAA,iBAAK;IAC/B,iCAAgD;IAAnB,2LAAS,eAAQ,KAAC;IAC7C,uBAAiC;IAErC,AADE,iBAAS,EACL;IAEN,8BAA4B;IAE1B,yGAAiB;IAOjB,0GAA+B;IAO/B,kCAAmD;IACrD,iBAAM;IAGJ,AADF,gCAA2B,kBAIyB;IADhD,4LAAS,aAAM,KAAC;IAEhB,yBAAiC;IACjC,aACF;IAAA,iBAAS;IACT,mCAAiD;IAAnB,4LAAS,eAAQ,KAAC;IAC9C,yBACF;IAGN,AADE,AADE,AADE,iBAAS,EACL,EACF,EACF;;;IAxCK,eAAmB;IAAnB,+BAAmB;IAEpB,eAAsB;IAAtB,6CAAsB;IAQ1B,eAKC;IALD,4CAKC;IAED,cAKC;IALD,iEAKC;IASC,eAA+C;IAA/C,kFAA+C;IAE/C,eACF;IADE,2DACF;;ADZR;;;;;;;;GAQG;AAOH,MAAM,OAAO,uBAAuB;IAkFZ;IAjFpB;;OAEG;IACH,IACI,OAAO,CAAC,KAAc;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;YACrB,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,kEAAkE;YAClE,0EAA0E;YAC1E,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC;YAChD,CAAC;QACL,CAAC;aAAM,IAAI,CAAC,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1B,CAAC;IACL,CAAC;IACD,IAAI,OAAO;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IACO,QAAQ,GAAG,KAAK,CAAC;IAEzB;;OAEG;IACM,QAAQ,GAAqC,IAAI,CAAC;IAE3D;;OAEG;IACM,KAAK,GAA0B,IAAI,CAAC;IAE7C;;OAEG;IACM,MAAM,GAAuB,IAAI,CAAC;IAE3C;;OAEG;IACO,KAAK,GAAG,IAAI,YAAY,EAAwB,CAAC;IAE3D;;OAEG;IACO,SAAS,GAAG,IAAI,YAAY,EAAQ,CAAC;IAE/C;;OAEG;IAEH,oBAAoB,CAAoB;IAExC;;OAEG;IACK,cAAc,GAAyC,IAAI,CAAC;IAEpE;;OAEG;IACI,OAAO,GAAG,KAAK,CAAC;IAEvB;;OAEG;IACK,YAAY,GAA6B,IAAI,CAAC;IAEtD;;OAEG;IACI,SAAS,GAAkB,IAAI,CAAC;IAEvC;;OAEG;IACI,SAAS,GAAG,KAAK,CAAC;IAEjB,eAAe,GAAG,KAAK,CAAC;IAEhC,YAAoB,GAAsB;QAAtB,QAAG,GAAH,GAAG,CAAmB;IAAG,CAAC;IAE9C,eAAe;QACX,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,CAAC,eAAe,EAAE,CAAC;QAC3B,CAAC;IACL,CAAC;IAED,WAAW;QACP,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IACK,cAAc;QAClB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAEtB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,IAAI,CAAC,eAAe,EAAE,CAAC;QAC3B,CAAC;IACL,CAAC;IAED;;OAEG;IACK,cAAc;QAClB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe;QACzB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,2BAA2B;QAElD,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,qCAAqC,EAAE,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;QAErF,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;YACpC,iEAAiE;YACjE,kDAAkD;YAClD,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;YAC9E,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACzB,OAAO;QACX,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC7B,sEAAsE;YACtE,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;YACxD,OAAO;QACX,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAEzB,IAAI,CAAC;YACD,uDAAuD;YACvD,OAAO,CAAC,GAAG,CAAC,kEAAkE,EAAE,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;YACjH,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,mBAAmB,CAC1E,eAAe,EACf,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAClC,CAAC;YAEF,OAAO,CAAC,GAAG,CAAC,yCAAyC,EAAE,aAAa,CAAC,CAAC;YAEtE,IAAI,CAAC,aAAa,EAAE,CAAC;gBACjB,IAAI,CAAC,SAAS,GAAG,kCAAkC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE,CAAC;gBACrF,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;gBAClD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;gBACvB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,mCAAmC;gBACxD,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;gBACzB,OAAO;YACX,CAAC;YAED,4CAA4C;YAC5C,kEAAkE;YAClE,MAAM,cAAc,GAAI,aAAwB,CAAC,WAAqC,CAAC;YACvF,OAAO,CAAC,GAAG,CAAC,mCAAmC,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC;YAEtE,+CAA+C;YAC/C,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC;YAClC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAC,eAAe,CAAC,cAAuB,CAAC,CAAC;YACzF,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;YAE/D,8BAA8B;YAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC;YAC3C,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC/B,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YACzB,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAE3B,8BAA8B;YAC9B,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,MAAyB,EAAE,EAAE;gBACxD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YACjC,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,qCAAqC;YAC5D,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAE7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,SAAS,GAAG,gCAAgC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1G,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YACzD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,mCAAmC;YACxD,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC;IACL,CAAC;IAED;;OAEG;IACK,kBAAkB;QACtB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;YAC9B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC/B,CAAC;IACL,CAAC;IAED;;OAEG;IACI,eAAe,CAAC,MAAyB;QAC5C,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACI,cAAc;QACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,MAAM,CAAC;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,QAAQ,EAAE,CAAC;IACpE,CAAC;IAED;;OAEG;IACI,OAAO;QACV,OAAO,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,0BAA0B,CAAC;IAC7D,CAAC;IAED;;OAEG;IACI,IAAI;QACP,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACtC,OAAO;QACX,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM;YAChC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK;YAC9B,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI;SAC/B,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACI,MAAM;QACT,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACI,iBAAiB;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC;IACpD,CAAC;iHAlQQ,uBAAuB;6DAAvB,uBAAuB;mCAoDW,gBAAgB;;;;;YC/F/D,0FAAe;;YAAf,sCA+CC;;;iFDJY,uBAAuB;cANnC,SAAS;6BACI,KAAK,YACL,qBAAqB;;kBAQ9B,KAAK;;kBAuBL,KAAK;;kBAKL,KAAK;;kBAKL,KAAK;;kBAKL,MAAM;;kBAKN,MAAM;;kBAKN,SAAS;mBAAC,sBAAsB,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,KAAK,EAAE;;kFApDnE,uBAAuB","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
|
|
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
|
|
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
|
|
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
|
|
73
|
-
const panels =
|
|
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
|
-
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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;
|
|
1
|
+
{"version":3,"file":"artifact-part.component.d.ts","sourceRoot":"","sources":["../../../src/lib/parts/artifact-part.component.ts"],"names":[],"mappings":"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"}
|