@memberjunction/ng-dashboard-viewer 5.28.0 → 5.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ChangeDetectorRef, AfterViewInit, OnDestroy } from '@angular/core';
|
|
2
2
|
import { BaseDashboardPart } from './base-dashboard-part';
|
|
3
|
-
import { NavigationRequest } from '@memberjunction/ng-artifacts';
|
|
4
|
-
import { UserInfo, CompositeKey } from '@memberjunction/core';
|
|
3
|
+
import { AnalyzeArtifactService, NavigationRequest } from '@memberjunction/ng-artifacts';
|
|
4
|
+
import { DataSnapshot, UserInfo, CompositeKey } from '@memberjunction/core';
|
|
5
5
|
import { Subject } from 'rxjs';
|
|
6
6
|
import * as i0 from "@angular/core";
|
|
7
7
|
/**
|
|
@@ -9,6 +9,7 @@ import * as i0 from "@angular/core";
|
|
|
9
9
|
* Displays artifacts using mj-artifact-viewer-panel including reports, charts, and AI-generated content.
|
|
10
10
|
*/
|
|
11
11
|
export declare class ArtifactPartComponent extends BaseDashboardPart implements AfterViewInit, OnDestroy {
|
|
12
|
+
private analyzeService;
|
|
12
13
|
/**
|
|
13
14
|
* Current user - required by the artifact viewer panel.
|
|
14
15
|
* Should be provided by the dashboard host or retrieved from a service.
|
|
@@ -32,7 +33,7 @@ export declare class ArtifactPartComponent extends BaseDashboardPart implements
|
|
|
32
33
|
}>;
|
|
33
34
|
get currentUser(): UserInfo;
|
|
34
35
|
get environmentId(): string;
|
|
35
|
-
constructor(cdr: ChangeDetectorRef);
|
|
36
|
+
constructor(cdr: ChangeDetectorRef, analyzeService: AnalyzeArtifactService);
|
|
36
37
|
ngAfterViewInit(): void;
|
|
37
38
|
loadContent(): Promise<void>;
|
|
38
39
|
/**
|
|
@@ -60,6 +61,16 @@ export declare class ArtifactPartComponent extends BaseDashboardPart implements
|
|
|
60
61
|
* Handle general navigation request events from artifact viewer plugins
|
|
61
62
|
*/
|
|
62
63
|
onNavigationRequest(event: NavigationRequest): void;
|
|
64
|
+
/**
|
|
65
|
+
* Handler for the Analyze button on the embedded artifact viewer.
|
|
66
|
+
* Captures the live DataSnapshot, creates an analysis conversation with
|
|
67
|
+
* the snapshot attached as input, and emits a navigation request to open
|
|
68
|
+
* the new conversation in the host application.
|
|
69
|
+
*/
|
|
70
|
+
onAnalyzeRequested(event: {
|
|
71
|
+
artifactId: string;
|
|
72
|
+
snapshot: DataSnapshot;
|
|
73
|
+
}): Promise<void>;
|
|
63
74
|
protected cleanup(): void;
|
|
64
75
|
static ɵfac: i0.ɵɵFactoryDeclaration<ArtifactPartComponent, never>;
|
|
65
76
|
static ɵcmp: i0.ɵɵComponentDeclaration<ArtifactPartComponent, "mj-artifact-part", never, { "CurrentUser": { "alias": "CurrentUser"; "required": false; }; "EnvironmentId": { "alias": "EnvironmentId"; "required": false; }; }, {}, never, never, false, never>;
|
|
@@ -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,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;
|
|
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,EAAY,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;;AAE/B;;;GAGG;AACH,qBA8Ga,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"}
|
|
@@ -10,8 +10,8 @@ import { BaseDashboardPart } from './base-dashboard-part';
|
|
|
10
10
|
import { Metadata } from '@memberjunction/core';
|
|
11
11
|
import { Subject } from 'rxjs';
|
|
12
12
|
import * as i0 from "@angular/core";
|
|
13
|
-
import * as i1 from "@memberjunction/ng-
|
|
14
|
-
import * as i2 from "@memberjunction/ng-
|
|
13
|
+
import * as i1 from "@memberjunction/ng-artifacts";
|
|
14
|
+
import * as i2 from "@memberjunction/ng-shared-generic";
|
|
15
15
|
function ArtifactPartComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
16
16
|
i0.ɵɵelementStart(0, "div", 1);
|
|
17
17
|
i0.ɵɵelement(1, "mj-loading", 5);
|
|
@@ -41,7 +41,7 @@ function ArtifactPartComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
|
41
41
|
function ArtifactPartComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
42
42
|
const _r2 = i0.ɵɵgetCurrentView();
|
|
43
43
|
i0.ɵɵelementStart(0, "mj-artifact-viewer-panel", 8);
|
|
44
|
-
i0.ɵɵlistener("navigateToLink", function ArtifactPartComponent_Conditional_4_Template_mj_artifact_viewer_panel_navigateToLink_0_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onNavigateToLink($event)); })("openEntityRecord", function ArtifactPartComponent_Conditional_4_Template_mj_artifact_viewer_panel_openEntityRecord_0_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onOpenEntityRecord($event)); })("navigationRequest", function ArtifactPartComponent_Conditional_4_Template_mj_artifact_viewer_panel_navigationRequest_0_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onNavigationRequest($event)); });
|
|
44
|
+
i0.ɵɵlistener("navigateToLink", function ArtifactPartComponent_Conditional_4_Template_mj_artifact_viewer_panel_navigateToLink_0_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onNavigateToLink($event)); })("openEntityRecord", function ArtifactPartComponent_Conditional_4_Template_mj_artifact_viewer_panel_openEntityRecord_0_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onOpenEntityRecord($event)); })("navigationRequest", function ArtifactPartComponent_Conditional_4_Template_mj_artifact_viewer_panel_navigationRequest_0_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onNavigationRequest($event)); })("analyzeRequested", function ArtifactPartComponent_Conditional_4_Template_mj_artifact_viewer_panel_analyzeRequested_0_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onAnalyzeRequested($event)); });
|
|
45
45
|
i0.ɵɵelementEnd();
|
|
46
46
|
} if (rf & 2) {
|
|
47
47
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
@@ -52,6 +52,7 @@ function ArtifactPartComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
|
52
52
|
* Displays artifacts using mj-artifact-viewer-panel including reports, charts, and AI-generated content.
|
|
53
53
|
*/
|
|
54
54
|
let ArtifactPartComponent = class ArtifactPartComponent extends BaseDashboardPart {
|
|
55
|
+
analyzeService;
|
|
55
56
|
/**
|
|
56
57
|
* Current user - required by the artifact viewer panel.
|
|
57
58
|
* Should be provided by the dashboard host or retrieved from a service.
|
|
@@ -83,8 +84,15 @@ let ArtifactPartComponent = class ArtifactPartComponent extends BaseDashboardPar
|
|
|
83
84
|
get environmentId() {
|
|
84
85
|
return this.EnvironmentId || '';
|
|
85
86
|
}
|
|
86
|
-
constructor(cdr) {
|
|
87
|
+
constructor(cdr, analyzeService) {
|
|
88
|
+
// Note: this component is instantiated twice — once via bare `new` by
|
|
89
|
+
// ClassFactory.CreateInstanceAsync (just to extract the constructor
|
|
90
|
+
// reference), then properly via createComponent() with a full injector.
|
|
91
|
+
// Constructor parameters are undefined on the bare path but Angular DI
|
|
92
|
+
// populates them on the real path. Field initializers calling inject()
|
|
93
|
+
// would throw on the bare path, so we use constructor injection.
|
|
87
94
|
super(cdr);
|
|
95
|
+
this.analyzeService = analyzeService;
|
|
88
96
|
}
|
|
89
97
|
ngAfterViewInit() {
|
|
90
98
|
if (this.Panel) {
|
|
@@ -162,13 +170,32 @@ let ArtifactPartComponent = class ArtifactPartComponent extends BaseDashboardPar
|
|
|
162
170
|
onNavigationRequest(event) {
|
|
163
171
|
this.RequestOpenNavItem(event.navItemName, event.appName, event.queryParams, false);
|
|
164
172
|
}
|
|
173
|
+
/**
|
|
174
|
+
* Handler for the Analyze button on the embedded artifact viewer.
|
|
175
|
+
* Captures the live DataSnapshot, creates an analysis conversation with
|
|
176
|
+
* the snapshot attached as input, and emits a navigation request to open
|
|
177
|
+
* the new conversation in the host application.
|
|
178
|
+
*/
|
|
179
|
+
async onAnalyzeRequested(event) {
|
|
180
|
+
try {
|
|
181
|
+
const result = await this.analyzeService.StartAnalysisConversation({
|
|
182
|
+
snapshot: event.snapshot,
|
|
183
|
+
currentUser: this.currentUser,
|
|
184
|
+
environmentId: this.environmentId,
|
|
185
|
+
});
|
|
186
|
+
this.RequestOpenNavItem('Conversations', undefined, { conversationId: result.conversationId }, false);
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
this.setError(error instanceof Error ? error.message : 'Failed to start analysis conversation');
|
|
190
|
+
}
|
|
191
|
+
}
|
|
165
192
|
cleanup() {
|
|
166
193
|
this.refreshTrigger.complete();
|
|
167
194
|
this.artifactId = null;
|
|
168
195
|
this.versionNumber = undefined;
|
|
169
196
|
}
|
|
170
|
-
static ɵfac = function ArtifactPartComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ArtifactPartComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
171
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ArtifactPartComponent, selectors: [["mj-artifact-part"]], inputs: { CurrentUser: "CurrentUser", EnvironmentId: "EnvironmentId" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 5, vars: 8, consts: [[1, "artifact-part"], [1, "loading-state"], [1, "error-state"], [1, "empty-state"], [3, "artifactId", "currentUser", "environmentId", "versionNumber", "showSaveToCollection", "showHeader", "showTabs", "showCloseButton", "showMaximizeButton", "viewContext", "canShare", "canEdit", "isMaximized", "refreshTrigger"], ["text", "Loading artifact..."], [1, "fa-solid", "fa-exclamation-triangle"], [1, "fa-solid", "fa-palette"], [3, "navigateToLink", "openEntityRecord", "navigationRequest", "artifactId", "currentUser", "environmentId", "versionNumber", "showSaveToCollection", "showHeader", "showTabs", "showCloseButton", "showMaximizeButton", "viewContext", "canShare", "canEdit", "isMaximized", "refreshTrigger"]], template: function ArtifactPartComponent_Template(rf, ctx) { if (rf & 1) {
|
|
197
|
+
static ɵfac = function ArtifactPartComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ArtifactPartComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.AnalyzeArtifactService)); };
|
|
198
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ArtifactPartComponent, selectors: [["mj-artifact-part"]], inputs: { CurrentUser: "CurrentUser", EnvironmentId: "EnvironmentId" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 5, vars: 8, consts: [[1, "artifact-part"], [1, "loading-state"], [1, "error-state"], [1, "empty-state"], [3, "artifactId", "currentUser", "environmentId", "versionNumber", "showSaveToCollection", "showHeader", "showTabs", "showCloseButton", "showMaximizeButton", "viewContext", "canShare", "canEdit", "isMaximized", "refreshTrigger"], ["text", "Loading artifact..."], [1, "fa-solid", "fa-exclamation-triangle"], [1, "fa-solid", "fa-palette"], [3, "navigateToLink", "openEntityRecord", "navigationRequest", "analyzeRequested", "artifactId", "currentUser", "environmentId", "versionNumber", "showSaveToCollection", "showHeader", "showTabs", "showCloseButton", "showMaximizeButton", "viewContext", "canShare", "canEdit", "isMaximized", "refreshTrigger"]], template: function ArtifactPartComponent_Template(rf, ctx) { if (rf & 1) {
|
|
172
199
|
i0.ɵɵelementStart(0, "div", 0);
|
|
173
200
|
i0.ɵɵconditionalCreate(1, ArtifactPartComponent_Conditional_1_Template, 2, 0, "div", 1);
|
|
174
201
|
i0.ɵɵconditionalCreate(2, ArtifactPartComponent_Conditional_2_Template, 4, 1, "div", 2);
|
|
@@ -185,7 +212,7 @@ let ArtifactPartComponent = class ArtifactPartComponent extends BaseDashboardPar
|
|
|
185
212
|
i0.ɵɵconditional(!ctx.IsLoading && !ctx.ErrorMessage && !ctx.hasArtifact ? 3 : -1);
|
|
186
213
|
i0.ɵɵadvance();
|
|
187
214
|
i0.ɵɵconditional(!ctx.IsLoading && !ctx.ErrorMessage && ctx.hasArtifact && ctx.artifactId ? 4 : -1);
|
|
188
|
-
} }, dependencies: [
|
|
215
|
+
} }, dependencies: [i2.LoadingComponent, i1.ArtifactViewerPanelComponent], styles: ["[_nghost-%COMP%] {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .artifact-part[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface);\n }\n\n .loading-state[_ngcontent-%COMP%], \n .error-state[_ngcontent-%COMP%], \n .empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n color: var(--mj-text-secondary);\n text-align: center;\n padding: 24px;\n }\n\n .error-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n .empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n color: var(--mj-text-muted);\n margin-bottom: 16px;\n }\n\n .error-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n }\n\n .empty-state[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n color: var(--mj-text-primary);\n }\n\n .empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n }\n\n mj-artifact-viewer-panel[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n }"] });
|
|
189
216
|
};
|
|
190
217
|
ArtifactPartComponent = __decorate([
|
|
191
218
|
RegisterClass(BaseDashboardPart, 'ArtifactPanelRenderer')
|
|
@@ -238,15 +265,16 @@ export { ArtifactPartComponent };
|
|
|
238
265
|
[refreshTrigger]="refreshTrigger"
|
|
239
266
|
(navigateToLink)="onNavigateToLink($event)"
|
|
240
267
|
(openEntityRecord)="onOpenEntityRecord($event)"
|
|
241
|
-
(navigationRequest)="onNavigationRequest($event)"
|
|
268
|
+
(navigationRequest)="onNavigationRequest($event)"
|
|
269
|
+
(analyzeRequested)="onAnalyzeRequested($event)">
|
|
242
270
|
</mj-artifact-viewer-panel>
|
|
243
271
|
}
|
|
244
272
|
</div>
|
|
245
273
|
`, styles: ["\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .artifact-part {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface);\n }\n\n .loading-state,\n .error-state,\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n color: var(--mj-text-secondary);\n text-align: center;\n padding: 24px;\n }\n\n .error-state i,\n .empty-state i {\n font-size: 48px;\n color: var(--mj-text-muted);\n margin-bottom: 16px;\n }\n\n .error-state i {\n color: var(--mj-status-error);\n }\n\n .empty-state h4 {\n margin: 0 0 8px 0;\n color: var(--mj-text-primary);\n }\n\n .empty-state p {\n margin: 0;\n font-size: 13px;\n }\n\n mj-artifact-viewer-panel {\n flex: 1;\n min-height: 0;\n }\n "] }]
|
|
246
|
-
}], () => [{ type: i0.ChangeDetectorRef }], { CurrentUser: [{
|
|
274
|
+
}], () => [{ type: i0.ChangeDetectorRef }, { type: i1.AnalyzeArtifactService }], { CurrentUser: [{
|
|
247
275
|
type: Input
|
|
248
276
|
}], EnvironmentId: [{
|
|
249
277
|
type: Input
|
|
250
278
|
}] }); })();
|
|
251
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ArtifactPartComponent, { className: "ArtifactPartComponent", filePath: "src/lib/parts/artifact-part.component.ts", lineNumber:
|
|
279
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ArtifactPartComponent, { className: "ArtifactPartComponent", filePath: "src/lib/parts/artifact-part.component.ts", lineNumber: 123 }); })();
|
|
252
280
|
//# sourceMappingURL=artifact-part.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact-part.component.js","sourceRoot":"","sources":["../../../src/lib/parts/artifact-part.component.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAA+C,KAAK,EAAE,MAAM,eAAe,CAAC;AAC9F,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG1D,OAAO,EAAY,QAAQ,EAAgB,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;;;;;IAcnB,8BAA2B;IACzB,gCAAoD;IACtD,iBAAM;;;IAKN,8BAAyB;IACvB,uBAAgD;IAChD,4BAAM;IAAA,YAAkB;IAC1B,AAD0B,iBAAO,EAC3B;;;IADE,eAAkB;IAAlB,yCAAkB;;;IAM1B,8BAAyB;IACvB,uBAAmC;IACnC,0BAAI;IAAA,oCAAoB;IAAA,iBAAK;IAC7B,yBAAG;IAAA,+EAA+D;IACpE,AADoE,iBAAI,EAClE;;;;IAKN,mDAiBoD;IAAlD,AADA,AADA,mOAAkB,+BAAwB,KAAC,0NACvB,iCAA0B,KAAC,4NAC1B,kCAA2B,KAAC;IACnD,iBAA2B;;;IAJzB,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,8CAAyB,mCACE,uCACI,uCACA,+BACD,iCACL,6BACJ,2CACc,iDACM,qBACrB,mBACF,kBACD,sBACI,yCACY;;AAlD/C;;;GAGG;AA8GI,IAAM,qBAAqB,GAA3B,MAAM,qBAAsB,SAAQ,iBAAiB;IACxD;;;OAGG;IACM,WAAW,GAAoB,IAAI,CAAC;IAE7C;;;OAGG;IACM,aAAa,GAAW,EAAE,CAAC;IAE7B,WAAW,GAAG,KAAK,CAAC;IACpB,UAAU,GAAkB,IAAI,CAAC;IACjC,aAAa,CAAqB;IAClC,UAAU,GAAY,KAAK,CAAC,CAAC,2CAA2C;IACxE,QAAQ,GAAY,IAAI,CAAC;IACzB,eAAe,GAAY,KAAK,CAAC,CAAC,iEAAiE;IACnG,kBAAkB,GAAY,KAAK,CAAC,CAAC,oEAAoE;IACzG,cAAc,GAAG,IAAI,OAAO,EAAiD,CAAC;IAErF,sBAAsB;IACtB,IAAW,WAAW;QAClB,iEAAiE;QACjE,kFAAkF;QAClF,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,QAAQ,EAAE,CAAC,WAAW,CAAC;QAC5D,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;QAC5F,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC;IACpC,CAAC;IAED,YAAY,GAAsB;QAC9B,KAAK,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAED,eAAe;QACX,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,WAAW;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAe,CAAC;QAC7C,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,YAAY,CAAuB,CAAC;QAEhE,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACzB,OAAO;QACX,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAEtB,IAAI,CAAC;YACD,0CAA0C;YAC1C,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;YAC7B,IAAI,CAAC,aAAa,GAAG,MAAM,EAAE,CAAC,eAAe,CAAuB,CAAC;YACrE,+EAA+E;YAC/E,IAAI,CAAC,UAAU,GAAI,MAAM,EAAE,CAAC,YAAY,CAAa,IAAI,KAAK,CAAC;YAC/D,IAAI,CAAC,QAAQ,GAAI,MAAM,EAAE,CAAC,UAAU,CAAa,IAAI,IAAI,CAAC;YAC1D,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YAExB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,QAAQ,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC;QACtF,CAAC;IACL,CAAC;IAED;;OAEG;IACI,OAAO;QACV,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACxC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;gBACrB,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,aAAa,EAAE,IAAI,CAAC,aAAa;aACpC,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED;;OAEG;IACI,gBAAgB,CAAC,KAA2H;QAC/I,6DAA6D;QAC7D,IAAI,CAAC,eAAe,CAAC;YACjB,IAAI,EAAE,kBAAkB;YACxB,QAAQ,EAAE,KAAK,CAAC,IAAI;YACpB,MAAM,EAAE,KAAK,CAAC,EAAE;YAChB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,SAAS,EAAE,KAAK,CAAC,SAAS;SAC7B,CAAC,CAAC;QAEH,+EAA+E;QAC/E,mFAAmF;IACvF,CAAC;IAED;;OAEG;IACI,kBAAkB,CAAC,KAAyD;QAC/E,uCAAuC;QACvC,IAAI,CAAC,eAAe,CAAC;YACjB,IAAI,EAAE,oBAAoB;YAC1B,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,YAAY,EAAE,KAAK,CAAC,YAAY;SACnC,CAAC,CAAC;QAEH,+DAA+D;QAC/D,IAAI,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YACzC,IAAI,CAAC,uBAAuB,CACxB,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,EACjC,MAAM,EACN,KAAK,CACR,CAAC;QACN,CAAC;IACL,CAAC;IAED;;OAEG;IACI,mBAAmB,CAAC,KAAwB;QAC/C,IAAI,CAAC,kBAAkB,CACnB,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,WAAW,EACjB,KAAK,CACR,CAAC;IACN,CAAC;IAEkB,OAAO;QACtB,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;IACnC,CAAC;+GA9IQ,qBAAqB;6DAArB,qBAAqB;YAxG1B,8BAAoF;YAElF,uFAAiB;YAOjB,uFAAkC;YAQlC,uFAAmD;YASnD,6GAAgE;YAqBlE,iBAAM;;YA/CiD,AAA5B,wCAA2B,2BAA6B;YAEjF,cAIC;YAJD,wCAIC;YAGD,cAKC;YALD,6DAKC;YAGD,cAMC;YAND,kFAMC;YAGD,cAoBC;YApBD,mGAoBC;;;AA0DE,qBAAqB;IA7GjC,aAAa,CAAC,iBAAiB,EAAE,uBAAuB,CAAC;GA6G7C,qBAAqB,CA+IjC;;iFA/IY,qBAAqB;cA5GjC,SAAS;6BACI,KAAK,YACL,kBAAkB,YAClB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAiDL;;kBA6DJ,KAAK;;kBAML,KAAK;;kFAXG,qBAAqB","sourcesContent":["import { Component, ChangeDetectorRef, AfterViewInit, OnDestroy, Input } from '@angular/core';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseDashboardPart } from './base-dashboard-part';\nimport { PanelConfig } from '../models/dashboard-types';\nimport { NavigationRequest } from '@memberjunction/ng-artifacts';\nimport { UserInfo, Metadata, CompositeKey } from '@memberjunction/core';\nimport { Subject } from 'rxjs';\n\n/**\n * Runtime renderer for Artifact dashboard parts.\n * Displays artifacts using mj-artifact-viewer-panel including reports, charts, and AI-generated content.\n */\n@RegisterClass(BaseDashboardPart, 'ArtifactPanelRenderer')\n@Component({\n standalone: false,\n selector: 'mj-artifact-part',\n template: `\n <div class=\"artifact-part\" [class.loading]=\"IsLoading\" [class.error]=\"ErrorMessage\">\n <!-- Loading state -->\n @if (IsLoading) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading artifact...\"></mj-loading>\n </div>\n }\n \n <!-- Error state -->\n @if (ErrorMessage && !IsLoading) {\n <div class=\"error-state\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <span>{{ ErrorMessage }}</span>\n </div>\n }\n \n <!-- No artifact configured -->\n @if (!IsLoading && !ErrorMessage && !hasArtifact) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-palette\"></i>\n <h4>No Artifact Selected</h4>\n <p>Click the configure button to select an artifact for this part.</p>\n </div>\n }\n \n <!-- Artifact Viewer Panel -->\n @if (!IsLoading && !ErrorMessage && hasArtifact && artifactId) {\n <mj-artifact-viewer-panel\n [artifactId]=\"artifactId\"\n [currentUser]=\"currentUser\"\n [environmentId]=\"environmentId\"\n [versionNumber]=\"versionNumber\"\n [showSaveToCollection]=\"false\"\n [showHeader]=\"showHeader\"\n [showTabs]=\"showTabs\"\n [showCloseButton]=\"showCloseButton\"\n [showMaximizeButton]=\"showMaximizeButton\"\n [viewContext]=\"null\"\n [canShare]=\"false\"\n [canEdit]=\"false\"\n [isMaximized]=\"false\"\n [refreshTrigger]=\"refreshTrigger\"\n (navigateToLink)=\"onNavigateToLink($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (navigationRequest)=\"onNavigationRequest($event)\">\n </mj-artifact-viewer-panel>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .artifact-part {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface);\n }\n\n .loading-state,\n .error-state,\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n color: var(--mj-text-secondary);\n text-align: center;\n padding: 24px;\n }\n\n .error-state i,\n .empty-state i {\n font-size: 48px;\n color: var(--mj-text-muted);\n margin-bottom: 16px;\n }\n\n .error-state i {\n color: var(--mj-status-error);\n }\n\n .empty-state h4 {\n margin: 0 0 8px 0;\n color: var(--mj-text-primary);\n }\n\n .empty-state p {\n margin: 0;\n font-size: 13px;\n }\n\n mj-artifact-viewer-panel {\n flex: 1;\n min-height: 0;\n }\n `]\n})\nexport class ArtifactPartComponent extends BaseDashboardPart implements AfterViewInit, OnDestroy {\n /**\n * Current user - required by the artifact viewer panel.\n * Should be provided by the dashboard host or retrieved from a service.\n */\n @Input() CurrentUser: UserInfo | null = null;\n\n /**\n * Environment ID - required by the artifact viewer panel.\n * Should be provided by the dashboard host.\n */\n @Input() EnvironmentId: string = '';\n\n public hasArtifact = false;\n public artifactId: string | null = null;\n public versionNumber: number | undefined;\n public showHeader: boolean = false; // Default to false for dashboard embedding\n public showTabs: boolean = true;\n public showCloseButton: boolean = false; // Always false in dashboard context - close handled by dashboard\n public showMaximizeButton: boolean = false; // Always false in dashboard context - maximize handled by dashboard\n public refreshTrigger = new Subject<{ artifactId: string; versionNumber: number }>();\n\n // Expose for template\n public get currentUser(): UserInfo {\n // Use provided CurrentUser, or fall back to Metadata.CurrentUser\n // In client-side Angular context, Metadata.CurrentUser should always be available\n const user = this.CurrentUser || new Metadata().CurrentUser;\n if (!user) {\n throw new Error('No current user available - user must be logged in to view artifacts');\n }\n return user;\n }\n\n public get environmentId(): string {\n return this.EnvironmentId || '';\n }\n\n constructor(cdr: ChangeDetectorRef) {\n super(cdr);\n }\n\n ngAfterViewInit(): void {\n if (this.Panel) {\n this.loadContent();\n }\n }\n\n public async loadContent(): Promise<void> {\n const config = this.getConfig<PanelConfig>();\n const artifactId = config?.['artifactId'] as string | undefined;\n\n if (!artifactId) {\n this.hasArtifact = false;\n this.cdr.detectChanges();\n return;\n }\n\n this.setLoading(true);\n\n try {\n // Set artifact ID and version from config\n this.artifactId = artifactId;\n this.versionNumber = config?.['versionNumber'] as number | undefined;\n // Display options - showHeader defaults to false for clean dashboard embedding\n this.showHeader = (config?.['showHeader'] as boolean) ?? false;\n this.showTabs = (config?.['showTabs'] as boolean) ?? true;\n this.hasArtifact = true;\n\n this.setLoading(false);\n } catch (error) {\n this.setError(error instanceof Error ? error.message : 'Failed to load artifact');\n }\n }\n\n /**\n * Refresh the artifact display\n */\n public refresh(): void {\n if (this.artifactId && this.versionNumber) {\n this.refreshTrigger.next({\n artifactId: this.artifactId,\n versionNumber: this.versionNumber\n });\n }\n }\n\n /**\n * Handle navigation link events from artifact viewer (conversation/collection links)\n */\n public onNavigateToLink(event: { type: 'conversation' | 'collection'; id: string; artifactId?: string; versionNumber?: number; versionId?: string }): void {\n // Emit data change event for navigation link (for listeners)\n this.emitDataChanged({\n type: 'navigate-to-link',\n linkType: event.type,\n linkId: event.id,\n artifactId: event.artifactId,\n versionNumber: event.versionNumber,\n versionId: event.versionId\n });\n\n // TODO: Add navigation request methods for conversation/collection when needed\n // For now, these are emitted as data change events for parent components to handle\n }\n\n /**\n * Handle entity record navigation events from artifact viewer\n */\n public onOpenEntityRecord(event: { entityName: string; compositeKey: CompositeKey }): void {\n // Emit data change event for listeners\n this.emitDataChanged({\n type: 'open-entity-record',\n entityName: event.entityName,\n compositeKey: event.compositeKey\n });\n\n // Use proper navigation request to bubble up through the stack\n if (event.entityName && event.compositeKey) {\n this.RequestOpenEntityRecord(\n event.entityName,\n event.compositeKey.ToURLSegment(),\n 'view',\n false\n );\n }\n }\n\n /**\n * Handle general navigation request events from artifact viewer plugins\n */\n public onNavigationRequest(event: NavigationRequest): void {\n this.RequestOpenNavItem(\n event.navItemName,\n event.appName,\n event.queryParams,\n false\n );\n }\n\n protected override cleanup(): void {\n this.refreshTrigger.complete();\n this.artifactId = null;\n this.versionNumber = undefined;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"artifact-part.component.js","sourceRoot":"","sources":["../../../src/lib/parts/artifact-part.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ChangeDetectorRef, AfterViewInit, OnDestroy, Input } from '@angular/core';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseDashboardPart } from './base-dashboard-part';\nimport { PanelConfig } from '../models/dashboard-types';\nimport { AnalyzeArtifactService, NavigationRequest } from '@memberjunction/ng-artifacts';\nimport { DataSnapshot, UserInfo, Metadata, CompositeKey } from '@memberjunction/core';\nimport { Subject } from 'rxjs';\n\n/**\n * Runtime renderer for Artifact dashboard parts.\n * Displays artifacts using mj-artifact-viewer-panel including reports, charts, and AI-generated content.\n */\n@RegisterClass(BaseDashboardPart, 'ArtifactPanelRenderer')\n@Component({\n standalone: false,\n selector: 'mj-artifact-part',\n template: `\n <div class=\"artifact-part\" [class.loading]=\"IsLoading\" [class.error]=\"ErrorMessage\">\n <!-- Loading state -->\n @if (IsLoading) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading artifact...\"></mj-loading>\n </div>\n }\n \n <!-- Error state -->\n @if (ErrorMessage && !IsLoading) {\n <div class=\"error-state\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <span>{{ ErrorMessage }}</span>\n </div>\n }\n \n <!-- No artifact configured -->\n @if (!IsLoading && !ErrorMessage && !hasArtifact) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-palette\"></i>\n <h4>No Artifact Selected</h4>\n <p>Click the configure button to select an artifact for this part.</p>\n </div>\n }\n \n <!-- Artifact Viewer Panel -->\n @if (!IsLoading && !ErrorMessage && hasArtifact && artifactId) {\n <mj-artifact-viewer-panel\n [artifactId]=\"artifactId\"\n [currentUser]=\"currentUser\"\n [environmentId]=\"environmentId\"\n [versionNumber]=\"versionNumber\"\n [showSaveToCollection]=\"false\"\n [showHeader]=\"showHeader\"\n [showTabs]=\"showTabs\"\n [showCloseButton]=\"showCloseButton\"\n [showMaximizeButton]=\"showMaximizeButton\"\n [viewContext]=\"null\"\n [canShare]=\"false\"\n [canEdit]=\"false\"\n [isMaximized]=\"false\"\n [refreshTrigger]=\"refreshTrigger\"\n (navigateToLink)=\"onNavigateToLink($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (navigationRequest)=\"onNavigationRequest($event)\"\n (analyzeRequested)=\"onAnalyzeRequested($event)\">\n </mj-artifact-viewer-panel>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .artifact-part {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface);\n }\n\n .loading-state,\n .error-state,\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n color: var(--mj-text-secondary);\n text-align: center;\n padding: 24px;\n }\n\n .error-state i,\n .empty-state i {\n font-size: 48px;\n color: var(--mj-text-muted);\n margin-bottom: 16px;\n }\n\n .error-state i {\n color: var(--mj-status-error);\n }\n\n .empty-state h4 {\n margin: 0 0 8px 0;\n color: var(--mj-text-primary);\n }\n\n .empty-state p {\n margin: 0;\n font-size: 13px;\n }\n\n mj-artifact-viewer-panel {\n flex: 1;\n min-height: 0;\n }\n `]\n})\nexport class ArtifactPartComponent extends BaseDashboardPart implements AfterViewInit, OnDestroy {\n /**\n * Current user - required by the artifact viewer panel.\n * Should be provided by the dashboard host or retrieved from a service.\n */\n @Input() CurrentUser: UserInfo | null = null;\n\n /**\n * Environment ID - required by the artifact viewer panel.\n * Should be provided by the dashboard host.\n */\n @Input() EnvironmentId: string = '';\n\n public hasArtifact = false;\n public artifactId: string | null = null;\n public versionNumber: number | undefined;\n public showHeader: boolean = false; // Default to false for dashboard embedding\n public showTabs: boolean = true;\n public showCloseButton: boolean = false; // Always false in dashboard context - close handled by dashboard\n public showMaximizeButton: boolean = false; // Always false in dashboard context - maximize handled by dashboard\n public refreshTrigger = new Subject<{ artifactId: string; versionNumber: number }>();\n\n // Expose for template\n public get currentUser(): UserInfo {\n // Use provided CurrentUser, or fall back to Metadata.CurrentUser\n // In client-side Angular context, Metadata.CurrentUser should always be available\n const user = this.CurrentUser || new Metadata().CurrentUser;\n if (!user) {\n throw new Error('No current user available - user must be logged in to view artifacts');\n }\n return user;\n }\n\n public get environmentId(): string {\n return this.EnvironmentId || '';\n }\n\n constructor(cdr: ChangeDetectorRef, private analyzeService: AnalyzeArtifactService) {\n // Note: this component is instantiated twice — once via bare `new` by\n // ClassFactory.CreateInstanceAsync (just to extract the constructor\n // reference), then properly via createComponent() with a full injector.\n // Constructor parameters are undefined on the bare path but Angular DI\n // populates them on the real path. Field initializers calling inject()\n // would throw on the bare path, so we use constructor injection.\n super(cdr);\n }\n\n ngAfterViewInit(): void {\n if (this.Panel) {\n this.loadContent();\n }\n }\n\n public async loadContent(): Promise<void> {\n const config = this.getConfig<PanelConfig>();\n const artifactId = config?.['artifactId'] as string | undefined;\n\n if (!artifactId) {\n this.hasArtifact = false;\n this.cdr.detectChanges();\n return;\n }\n\n this.setLoading(true);\n\n try {\n // Set artifact ID and version from config\n this.artifactId = artifactId;\n this.versionNumber = config?.['versionNumber'] as number | undefined;\n // Display options - showHeader defaults to false for clean dashboard embedding\n this.showHeader = (config?.['showHeader'] as boolean) ?? false;\n this.showTabs = (config?.['showTabs'] as boolean) ?? true;\n this.hasArtifact = true;\n\n this.setLoading(false);\n } catch (error) {\n this.setError(error instanceof Error ? error.message : 'Failed to load artifact');\n }\n }\n\n /**\n * Refresh the artifact display\n */\n public refresh(): void {\n if (this.artifactId && this.versionNumber) {\n this.refreshTrigger.next({\n artifactId: this.artifactId,\n versionNumber: this.versionNumber\n });\n }\n }\n\n /**\n * Handle navigation link events from artifact viewer (conversation/collection links)\n */\n public onNavigateToLink(event: { type: 'conversation' | 'collection'; id: string; artifactId?: string; versionNumber?: number; versionId?: string }): void {\n // Emit data change event for navigation link (for listeners)\n this.emitDataChanged({\n type: 'navigate-to-link',\n linkType: event.type,\n linkId: event.id,\n artifactId: event.artifactId,\n versionNumber: event.versionNumber,\n versionId: event.versionId\n });\n\n // TODO: Add navigation request methods for conversation/collection when needed\n // For now, these are emitted as data change events for parent components to handle\n }\n\n /**\n * Handle entity record navigation events from artifact viewer\n */\n public onOpenEntityRecord(event: { entityName: string; compositeKey: CompositeKey }): void {\n // Emit data change event for listeners\n this.emitDataChanged({\n type: 'open-entity-record',\n entityName: event.entityName,\n compositeKey: event.compositeKey\n });\n\n // Use proper navigation request to bubble up through the stack\n if (event.entityName && event.compositeKey) {\n this.RequestOpenEntityRecord(\n event.entityName,\n event.compositeKey.ToURLSegment(),\n 'view',\n false\n );\n }\n }\n\n /**\n * Handle general navigation request events from artifact viewer plugins\n */\n public onNavigationRequest(event: NavigationRequest): void {\n this.RequestOpenNavItem(\n event.navItemName,\n event.appName,\n event.queryParams,\n false\n );\n }\n\n /**\n * Handler for the Analyze button on the embedded artifact viewer.\n * Captures the live DataSnapshot, creates an analysis conversation with\n * the snapshot attached as input, and emits a navigation request to open\n * the new conversation in the host application.\n */\n public async onAnalyzeRequested(event: { artifactId: string; snapshot: DataSnapshot }): Promise<void> {\n try {\n const result = await this.analyzeService.StartAnalysisConversation({\n snapshot: event.snapshot,\n currentUser: this.currentUser,\n environmentId: this.environmentId,\n });\n\n this.RequestOpenNavItem(\n 'Conversations',\n undefined,\n { conversationId: result.conversationId },\n false,\n );\n } catch (error) {\n this.setError(error instanceof Error ? error.message : 'Failed to start analysis conversation');\n }\n }\n\n protected override cleanup(): void {\n this.refreshTrigger.complete();\n this.artifactId = null;\n this.versionNumber = undefined;\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ng-dashboard-viewer",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.29.0",
|
|
4
4
|
"description": "MemberJunction: Angular components for metadata-driven dashboards with Golden Layout panels, supporting views, queries, artifacts, and custom content",
|
|
5
5
|
"main": "./dist/public-api.js",
|
|
6
6
|
"typings": "./dist/public-api.d.ts",
|
|
@@ -37,15 +37,15 @@
|
|
|
37
37
|
"golden-layout": "^2.6.0"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@memberjunction/core": "5.
|
|
41
|
-
"@memberjunction/core-entities": "5.
|
|
42
|
-
"@memberjunction/global": "5.
|
|
43
|
-
"@memberjunction/ng-artifacts": "5.
|
|
44
|
-
"@memberjunction/ng-entity-viewer": "5.
|
|
45
|
-
"@memberjunction/ng-map-view": "5.
|
|
46
|
-
"@memberjunction/ng-query-viewer": "5.
|
|
47
|
-
"@memberjunction/ng-shared-generic": "5.
|
|
48
|
-
"@memberjunction/ng-trees": "5.
|
|
40
|
+
"@memberjunction/core": "5.29.0",
|
|
41
|
+
"@memberjunction/core-entities": "5.29.0",
|
|
42
|
+
"@memberjunction/global": "5.29.0",
|
|
43
|
+
"@memberjunction/ng-artifacts": "5.29.0",
|
|
44
|
+
"@memberjunction/ng-entity-viewer": "5.29.0",
|
|
45
|
+
"@memberjunction/ng-map-view": "5.29.0",
|
|
46
|
+
"@memberjunction/ng-query-viewer": "5.29.0",
|
|
47
|
+
"@memberjunction/ng-shared-generic": "5.29.0",
|
|
48
|
+
"@memberjunction/ng-trees": "5.29.0",
|
|
49
49
|
"rxjs": "^7.8.2",
|
|
50
50
|
"tslib": "^2.8.1"
|
|
51
51
|
},
|