@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
|
@@ -51,14 +51,70 @@ let ArtifactPartComponent = class ArtifactPartComponent extends BaseDashboardPar
|
|
|
51
51
|
* Should be provided by the dashboard host.
|
|
52
52
|
*/
|
|
53
53
|
EnvironmentId = '';
|
|
54
|
-
|
|
54
|
+
HasArtifact = false;
|
|
55
|
+
/** @deprecated Use {@link HasArtifact}. */
|
|
56
|
+
get hasArtifact() {
|
|
57
|
+
return this.HasArtifact;
|
|
58
|
+
}
|
|
59
|
+
/** @deprecated Use {@link HasArtifact}. */
|
|
60
|
+
set hasArtifact(value) {
|
|
61
|
+
this.HasArtifact = value;
|
|
62
|
+
}
|
|
55
63
|
artifactId = null;
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
64
|
+
VersionNumber;
|
|
65
|
+
/** @deprecated Use {@link VersionNumber}. */
|
|
66
|
+
get versionNumber() {
|
|
67
|
+
return this.VersionNumber;
|
|
68
|
+
}
|
|
69
|
+
/** @deprecated Use {@link VersionNumber}. */
|
|
70
|
+
set versionNumber(value) {
|
|
71
|
+
this.VersionNumber = value;
|
|
72
|
+
}
|
|
73
|
+
ShowHeader = false;
|
|
74
|
+
/** @deprecated Use {@link ShowHeader}. */
|
|
75
|
+
get showHeader() {
|
|
76
|
+
return this.ShowHeader;
|
|
77
|
+
}
|
|
78
|
+
/** @deprecated Use {@link ShowHeader}. */
|
|
79
|
+
set showHeader(value) {
|
|
80
|
+
this.ShowHeader = value;
|
|
81
|
+
} // Default to false for dashboard embedding
|
|
82
|
+
ShowTabs = true;
|
|
83
|
+
/** @deprecated Use {@link ShowTabs}. */
|
|
84
|
+
get showTabs() {
|
|
85
|
+
return this.ShowTabs;
|
|
86
|
+
}
|
|
87
|
+
/** @deprecated Use {@link ShowTabs}. */
|
|
88
|
+
set showTabs(value) {
|
|
89
|
+
this.ShowTabs = value;
|
|
90
|
+
}
|
|
91
|
+
ShowCloseButton = false;
|
|
92
|
+
/** @deprecated Use {@link ShowCloseButton}. */
|
|
93
|
+
get showCloseButton() {
|
|
94
|
+
return this.ShowCloseButton;
|
|
95
|
+
}
|
|
96
|
+
/** @deprecated Use {@link ShowCloseButton}. */
|
|
97
|
+
set showCloseButton(value) {
|
|
98
|
+
this.ShowCloseButton = value;
|
|
99
|
+
} // Always false in dashboard context - close handled by dashboard
|
|
100
|
+
ShowMaximizeButton = false;
|
|
101
|
+
/** @deprecated Use {@link ShowMaximizeButton}. */
|
|
102
|
+
get showMaximizeButton() {
|
|
103
|
+
return this.ShowMaximizeButton;
|
|
104
|
+
}
|
|
105
|
+
/** @deprecated Use {@link ShowMaximizeButton}. */
|
|
106
|
+
set showMaximizeButton(value) {
|
|
107
|
+
this.ShowMaximizeButton = value;
|
|
108
|
+
} // Always false in dashboard context - maximize handled by dashboard
|
|
109
|
+
RefreshTrigger = new Subject();
|
|
110
|
+
/** @deprecated Use {@link RefreshTrigger}. */
|
|
111
|
+
get refreshTrigger() {
|
|
112
|
+
return this.RefreshTrigger;
|
|
113
|
+
}
|
|
114
|
+
/** @deprecated Use {@link RefreshTrigger}. */
|
|
115
|
+
set refreshTrigger(value) {
|
|
116
|
+
this.RefreshTrigger = value;
|
|
117
|
+
}
|
|
62
118
|
// Expose for template
|
|
63
119
|
get currentUser() {
|
|
64
120
|
// Use provided CurrentUser, or fall back to Metadata.CurrentUser
|
|
@@ -91,7 +147,7 @@ let ArtifactPartComponent = class ArtifactPartComponent extends BaseDashboardPar
|
|
|
91
147
|
const config = this.getConfig();
|
|
92
148
|
const artifactId = config?.['artifactId'];
|
|
93
149
|
if (!artifactId) {
|
|
94
|
-
this.
|
|
150
|
+
this.HasArtifact = false;
|
|
95
151
|
this.cdr.detectChanges();
|
|
96
152
|
return;
|
|
97
153
|
}
|
|
@@ -99,11 +155,11 @@ let ArtifactPartComponent = class ArtifactPartComponent extends BaseDashboardPar
|
|
|
99
155
|
try {
|
|
100
156
|
// Set artifact ID and version from config
|
|
101
157
|
this.artifactId = artifactId;
|
|
102
|
-
this.
|
|
158
|
+
this.VersionNumber = config?.['versionNumber'];
|
|
103
159
|
// Display options - showHeader defaults to false for clean dashboard embedding
|
|
104
|
-
this.
|
|
105
|
-
this.
|
|
106
|
-
this.
|
|
160
|
+
this.ShowHeader = config?.['showHeader'] ?? false;
|
|
161
|
+
this.ShowTabs = config?.['showTabs'] ?? true;
|
|
162
|
+
this.HasArtifact = true;
|
|
107
163
|
this.setLoading(false);
|
|
108
164
|
}
|
|
109
165
|
catch (error) {
|
|
@@ -113,18 +169,22 @@ let ArtifactPartComponent = class ArtifactPartComponent extends BaseDashboardPar
|
|
|
113
169
|
/**
|
|
114
170
|
* Refresh the artifact display
|
|
115
171
|
*/
|
|
116
|
-
|
|
117
|
-
if (this.artifactId && this.
|
|
118
|
-
this.
|
|
172
|
+
Refresh() {
|
|
173
|
+
if (this.artifactId && this.VersionNumber) {
|
|
174
|
+
this.RefreshTrigger.next({
|
|
119
175
|
artifactId: this.artifactId,
|
|
120
|
-
versionNumber: this.
|
|
176
|
+
versionNumber: this.VersionNumber
|
|
121
177
|
});
|
|
122
178
|
}
|
|
123
179
|
}
|
|
180
|
+
/** @deprecated Use {@link Refresh}. */
|
|
181
|
+
refresh() {
|
|
182
|
+
return this.Refresh();
|
|
183
|
+
}
|
|
124
184
|
/**
|
|
125
185
|
* Handle navigation link events from artifact viewer (conversation/collection links)
|
|
126
186
|
*/
|
|
127
|
-
|
|
187
|
+
OnNavigateToLink(event) {
|
|
128
188
|
// Emit data change event for navigation link (for listeners)
|
|
129
189
|
this.emitDataChanged({
|
|
130
190
|
type: 'navigate-to-link',
|
|
@@ -137,10 +197,14 @@ let ArtifactPartComponent = class ArtifactPartComponent extends BaseDashboardPar
|
|
|
137
197
|
// TODO: Add navigation request methods for conversation/collection when needed
|
|
138
198
|
// For now, these are emitted as data change events for parent components to handle
|
|
139
199
|
}
|
|
200
|
+
/** @deprecated Use {@link OnNavigateToLink}. */
|
|
201
|
+
onNavigateToLink(event) {
|
|
202
|
+
return this.OnNavigateToLink(event);
|
|
203
|
+
}
|
|
140
204
|
/**
|
|
141
205
|
* Handle entity record navigation events from artifact viewer
|
|
142
206
|
*/
|
|
143
|
-
|
|
207
|
+
OnOpenEntityRecord(event) {
|
|
144
208
|
// Emit data change event for listeners
|
|
145
209
|
this.emitDataChanged({
|
|
146
210
|
type: 'open-entity-record',
|
|
@@ -152,19 +216,27 @@ let ArtifactPartComponent = class ArtifactPartComponent extends BaseDashboardPar
|
|
|
152
216
|
this.RequestOpenEntityRecord(event.entityName, event.compositeKey.ToURLSegment(), 'view', false);
|
|
153
217
|
}
|
|
154
218
|
}
|
|
219
|
+
/** @deprecated Use {@link OnOpenEntityRecord}. */
|
|
220
|
+
onOpenEntityRecord(event) {
|
|
221
|
+
return this.OnOpenEntityRecord(event);
|
|
222
|
+
}
|
|
155
223
|
/**
|
|
156
224
|
* Handle general navigation request events from artifact viewer plugins
|
|
157
225
|
*/
|
|
158
|
-
|
|
226
|
+
OnNavigationRequest(event) {
|
|
159
227
|
this.RequestOpenNavItem(event.navItemName, event.appName, event.queryParams, false);
|
|
160
228
|
}
|
|
229
|
+
/** @deprecated Use {@link OnNavigationRequest}. */
|
|
230
|
+
onNavigationRequest(event) {
|
|
231
|
+
return this.OnNavigationRequest(event);
|
|
232
|
+
}
|
|
161
233
|
/**
|
|
162
234
|
* Handler for the Analyze button on the embedded artifact viewer.
|
|
163
235
|
* Captures the live DataSnapshot, creates an analysis conversation with
|
|
164
236
|
* the snapshot attached as input, and emits a navigation request to open
|
|
165
237
|
* the new conversation in the host application.
|
|
166
238
|
*/
|
|
167
|
-
async
|
|
239
|
+
async OnAnalyzeRequested(event) {
|
|
168
240
|
try {
|
|
169
241
|
const result = await this.analyzeService.StartAnalysisConversation({
|
|
170
242
|
snapshot: event.snapshot,
|
|
@@ -177,10 +249,14 @@ let ArtifactPartComponent = class ArtifactPartComponent extends BaseDashboardPar
|
|
|
177
249
|
this.setError(error instanceof Error ? error.message : 'Failed to start analysis conversation');
|
|
178
250
|
}
|
|
179
251
|
}
|
|
252
|
+
/** @deprecated Use {@link OnAnalyzeRequested}. */
|
|
253
|
+
async onAnalyzeRequested(event) {
|
|
254
|
+
return this.OnAnalyzeRequested(event);
|
|
255
|
+
}
|
|
180
256
|
cleanup() {
|
|
181
|
-
this.
|
|
257
|
+
this.RefreshTrigger.complete();
|
|
182
258
|
this.artifactId = null;
|
|
183
|
-
this.
|
|
259
|
+
this.VersionNumber = undefined;
|
|
184
260
|
}
|
|
185
261
|
static ɵfac = function ArtifactPartComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ArtifactPartComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.AnalyzeArtifactService)); };
|
|
186
262
|
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"], ["Variant", "error", "Icon", "fa-solid fa-triangle-exclamation", "Title", "Couldn't load artifact", "Size", "compact", 1, "part-placeholder", 3, "Message"], ["Icon", "fa-solid fa-palette", "Title", "No Artifact Selected", "Message", "Click the configure button to select an artifact for this part.", "Size", "compact", 1, "part-placeholder"], [3, "artifactId", "currentUser", "environmentId", "versionNumber", "showSaveToCollection", "showHeader", "showTabs", "showCloseButton", "showMaximizeButton", "viewContext", "canShare", "canEdit", "isMaximized", "refreshTrigger"], ["text", "Loading artifact..."], [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) {
|
|
@@ -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;AAI1D,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;;;;;;IAcnB,8BAA2B;IACzB,gCAAoD;IACtD,iBAAM;;;IAKN,oCAMmB;;;IADjB,6CAAwB;;;IAM1B,oCAKmB;;;;IAKnB,mDAkBkD;IAAhD,AADA,AADA,AADA,mOAAkB,+BAAwB,KAAC,0NACvB,iCAA0B,KAAC,4NAC1B,kCAA2B,KAAC,0NAC7B,iCAA0B,KAAC;IACjD,iBAA2B;;;IALzB,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;;AAtD/C;;;GAGG;AAgGI,IAAM,qBAAqB,GAA3B,MAAM,qBAAsB,SAAQ,iBAAiB;IAqCZ;IApC5C;;;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,CAAC,aAAa,CAAC,WAAW,CAAC;QAChE,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,EAAU,cAAsC;QAC9E,sEAAsE;QACtE,oEAAoE;QACpE,wEAAwE;QACxE,uEAAuE;QACvE,uEAAuE;QACvE,iEAAiE;QACjE,KAAK,CAAC,GAAG,CAAC,CAAC;QAP6B,mBAAc,GAAd,cAAc,CAAwB;IAQlF,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;IAED;;;;;OAKG;IACI,KAAK,CAAC,kBAAkB,CAAC,KAAqD;QACjF,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,yBAAyB,CAAC;gBAC/D,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,aAAa,EAAE,IAAI,CAAC,aAAa;aACpC,CAAC,CAAC;YAEH,IAAI,CAAC,kBAAkB,CACnB,eAAe,EACf,SAAS,EACT,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,EACzC,KAAK,CACR,CAAC;QACN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,QAAQ,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,uCAAuC,CAAC,CAAC;QACpG,CAAC;IACL,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;+GA7KQ,qBAAqB;6DAArB,qBAAqB;YA1F1B,8BAAoF;YAElF,uFAAiB;YAOjB,kGAAkC;YAWlC,kGAAmD;YAUnD,6GAAgE;YAsBlE,iBAAM;;YApDiD,AAA5B,wCAA2B,2BAA6B;YAEjF,cAIC;YAJD,wCAIC;YAGD,cAQC;YARD,6DAQC;YAGD,cAOC;YAPD,kFAOC;YAGD,cAqBC;YArBD,mGAqBC;;;AAuCE,qBAAqB;IA/FjC,aAAa,CAAC,iBAAiB,EAAE,uBAAuB,CAAC;GA+F7C,qBAAqB,CA8KjC;;iFA9KY,qBAAqB;cA9FjC,SAAS;6BACI,KAAK,YACL,kBAAkB,YAClB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAsDL;;kBA0CJ,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 { AnalyzeArtifactService, NavigationRequest } from '@memberjunction/ng-artifacts';\nimport { DataSnapshot, UserInfo, 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 <mj-empty-state\n class=\"part-placeholder\"\n Variant=\"error\"\n Icon=\"fa-solid fa-triangle-exclamation\"\n Title=\"Couldn't load artifact\"\n [Message]=\"ErrorMessage\"\n Size=\"compact\" />\n }\n\n <!-- No artifact configured -->\n @if (!IsLoading && !ErrorMessage && !hasArtifact) {\n <mj-empty-state\n class=\"part-placeholder\"\n Icon=\"fa-solid fa-palette\"\n Title=\"No Artifact Selected\"\n Message=\"Click the configure button to select an artifact for this part.\"\n Size=\"compact\" />\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 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 .part-placeholder {\n height: 100%;\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 || this.ProviderToUse.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"]}
|
|
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, 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 <mj-empty-state\n class=\"part-placeholder\"\n Variant=\"error\"\n Icon=\"fa-solid fa-triangle-exclamation\"\n Title=\"Couldn't load artifact\"\n [Message]=\"ErrorMessage\"\n Size=\"compact\" />\n }\n\n <!-- No artifact configured -->\n @if (!IsLoading && !ErrorMessage && !hasArtifact) {\n <mj-empty-state\n class=\"part-placeholder\"\n Icon=\"fa-solid fa-palette\"\n Title=\"No Artifact Selected\"\n Message=\"Click the configure button to select an artifact for this part.\"\n Size=\"compact\" />\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 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 .part-placeholder {\n height: 100%;\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\n /** @deprecated Use {@link HasArtifact}. */\n public get hasArtifact() {\n return this.HasArtifact;\n }\n /** @deprecated Use {@link HasArtifact}. */\n public set hasArtifact(value) {\n this.HasArtifact = value;\n }\n public artifactId: string | null = null;\n public VersionNumber: number | undefined;\n\n /** @deprecated Use {@link VersionNumber}. */\n public get versionNumber(): number | undefined {\n return this.VersionNumber;\n }\n /** @deprecated Use {@link VersionNumber}. */\n public set versionNumber(value: number | undefined) {\n this.VersionNumber = value;\n }\n public ShowHeader: boolean = false;\n\n /** @deprecated Use {@link ShowHeader}. */\n public get showHeader(): boolean {\n return this.ShowHeader;\n }\n /** @deprecated Use {@link ShowHeader}. */\n public set showHeader(value: boolean) {\n this.ShowHeader = value;\n } // Default to false for dashboard embedding\n public ShowTabs: boolean = true;\n\n /** @deprecated Use {@link ShowTabs}. */\n public get showTabs(): boolean {\n return this.ShowTabs;\n }\n /** @deprecated Use {@link ShowTabs}. */\n public set showTabs(value: boolean) {\n this.ShowTabs = value;\n }\n public ShowCloseButton: boolean = false;\n\n /** @deprecated Use {@link ShowCloseButton}. */\n public get showCloseButton(): boolean {\n return this.ShowCloseButton;\n }\n /** @deprecated Use {@link ShowCloseButton}. */\n public set showCloseButton(value: boolean) {\n this.ShowCloseButton = value;\n } // Always false in dashboard context - close handled by dashboard\n public ShowMaximizeButton: boolean = false;\n\n /** @deprecated Use {@link ShowMaximizeButton}. */\n public get showMaximizeButton(): boolean {\n return this.ShowMaximizeButton;\n }\n /** @deprecated Use {@link ShowMaximizeButton}. */\n public set showMaximizeButton(value: boolean) {\n this.ShowMaximizeButton = value;\n } // Always false in dashboard context - maximize handled by dashboard\n public RefreshTrigger = new Subject<{ artifactId: string; versionNumber: number }>();\n\n /** @deprecated Use {@link RefreshTrigger}. */\n public get refreshTrigger() {\n return this.RefreshTrigger;\n }\n /** @deprecated Use {@link RefreshTrigger}. */\n public set refreshTrigger(value) {\n this.RefreshTrigger = value;\n }\n\n // Expose for template\n public get currentUser(): UserInfo { // case-violation-ok-legacy-back-compat: the PascalCase name is already taken in this scope\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 || this.ProviderToUse.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 { // case-violation-ok-legacy-back-compat: the PascalCase name is already taken in this scope\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 /** @deprecated Use {@link Refresh}. */\n public refresh(): void {\n return this.Refresh();\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 /** @deprecated Use {@link OnNavigateToLink}. */\n public onNavigateToLink(event: { type: 'conversation' | 'collection'; id: string; artifactId?: string; versionNumber?: number; versionId?: string }): void {\n return this.OnNavigateToLink(event);\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 /** @deprecated Use {@link OnOpenEntityRecord}. */\n public onOpenEntityRecord(event: { entityName: string; compositeKey: CompositeKey }): void {\n return this.OnOpenEntityRecord(event);\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 /** @deprecated Use {@link OnNavigationRequest}. */\n public onNavigationRequest(event: NavigationRequest): void {\n return this.OnNavigationRequest(event);\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 /** @deprecated Use {@link OnAnalyzeRequested}. */\n public async onAnalyzeRequested(event: { artifactId: string; snapshot: DataSnapshot }): Promise<void> {\n return this.OnAnalyzeRequested(event);\n }\n\n protected override cleanup(): void {\n this.RefreshTrigger.complete();\n this.artifactId = null;\n this.VersionNumber = undefined;\n }\n}\n"]}
|
|
@@ -7,17 +7,39 @@ import * as i0 from "@angular/core";
|
|
|
7
7
|
* Displays query results using mj-query-viewer with parameter controls and auto-refresh support.
|
|
8
8
|
*/
|
|
9
9
|
export declare class QueryPartComponent extends BaseDashboardPart implements AfterViewInit, OnDestroy {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
QueryViewer: QueryViewerComponent;
|
|
11
|
+
/** @deprecated Use {@link QueryViewer}. */
|
|
12
|
+
get queryViewer(): QueryViewerComponent;
|
|
13
|
+
/** @deprecated Use {@link QueryViewer}. */
|
|
14
|
+
set queryViewer(value: QueryViewerComponent);
|
|
15
|
+
HasQuery: boolean;
|
|
16
|
+
/** @deprecated Use {@link HasQuery}. */
|
|
17
|
+
get hasQuery(): boolean;
|
|
18
|
+
/** @deprecated Use {@link HasQuery}. */
|
|
19
|
+
set hasQuery(value: boolean);
|
|
20
|
+
QueryId: string | null;
|
|
21
|
+
/** @deprecated Use {@link QueryId}. */
|
|
22
|
+
get queryId(): string | null;
|
|
23
|
+
/** @deprecated Use {@link QueryId}. */
|
|
24
|
+
set queryId(value: string | null);
|
|
25
|
+
ShowToolbar: boolean;
|
|
26
|
+
/** @deprecated Use {@link ShowToolbar}. */
|
|
27
|
+
get showToolbar(): boolean;
|
|
28
|
+
/** @deprecated Use {@link ShowToolbar}. */
|
|
29
|
+
set showToolbar(value: boolean);
|
|
14
30
|
private queryEntity;
|
|
15
31
|
private autoRefreshTimer;
|
|
16
32
|
constructor(cdr: ChangeDetectorRef);
|
|
17
33
|
ngAfterViewInit(): void;
|
|
18
34
|
loadContent(): Promise<void>;
|
|
35
|
+
OnEntityLinkClick(event: QueryEntityLinkClickEvent): void;
|
|
36
|
+
/** @deprecated Use {@link OnEntityLinkClick}. */
|
|
19
37
|
onEntityLinkClick(event: QueryEntityLinkClickEvent): void;
|
|
38
|
+
OnQueryError(error: Error): void;
|
|
39
|
+
/** @deprecated Use {@link OnQueryError}. */
|
|
20
40
|
onQueryError(error: Error): void;
|
|
41
|
+
RefreshQuery(): void;
|
|
42
|
+
/** @deprecated Use {@link RefreshQuery}. */
|
|
21
43
|
refreshQuery(): void;
|
|
22
44
|
private startAutoRefresh;
|
|
23
45
|
private stopAutoRefresh;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-part.component.d.ts","sourceRoot":"","sources":["../../../src/lib/parts/query-part.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,iBAAiB,EAAa,aAAa,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAElG,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG1D,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;;AAElG;;;GAGG;AACH,qBA8Fa,kBAAmB,SAAQ,iBAAkB,YAAW,aAAa,EAAE,SAAS;IAC/D,WAAW,EAAG,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"query-part.component.d.ts","sourceRoot":"","sources":["../../../src/lib/parts/query-part.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,iBAAiB,EAAa,aAAa,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAElG,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG1D,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;;AAElG;;;GAGG;AACH,qBA8Fa,kBAAmB,SAAQ,iBAAkB,YAAW,aAAa,EAAE,SAAS;IAC/D,WAAW,EAAG,oBAAoB,CAAC;IAE7D,2CAA2C;IAC3C,IAAI,WAAW,IAAI,oBAAoB,CAEtC;IACD,2CAA2C;IAC3C,IAAI,WAAW,CAAC,KAAK,EAAE,oBAAoB,EAE1C;IAEM,QAAQ,UAAS;IAExB,wCAAwC;IACxC,IAAW,QAAQ,YAElB;IACD,wCAAwC;IACxC,IAAW,QAAQ,CAAC,KAAK,SAAA,EAExB;IACM,OAAO,EAAE,MAAM,GAAG,IAAI,CAAQ;IAErC,uCAAuC;IACvC,IAAW,OAAO,IAAI,MAAM,GAAG,IAAI,CAElC;IACD,uCAAuC;IACvC,IAAW,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAEtC;IACM,WAAW,UAAQ;IAE1B,2CAA2C;IAC3C,IAAW,WAAW,YAErB;IACD,2CAA2C;IAC3C,IAAW,WAAW,CAAC,KAAK,SAAA,EAE3B;IAED,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,gBAAgB,CAA+C;gBAE3D,GAAG,EAAE,iBAAiB;IAIlC,eAAe,IAAI,IAAI;IAMV,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAoDlC,iBAAiB,CAAC,KAAK,EAAE,yBAAyB,GAAG,IAAI;IAmBhE,iDAAiD;IAC1C,iBAAiB,CAAC,KAAK,EAAE,yBAAyB,GAAG,IAAI;IAIzD,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAIvC,4CAA4C;IACrC,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAIhC,YAAY,IAAI,IAAI;IAM3B,4CAA4C;IACrC,YAAY,IAAI,IAAI;IAI3B,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,eAAe;cAOJ,OAAO,IAAI,IAAI;yCAxKzB,kBAAkB;2CAAlB,kBAAkB;CA6K9B"}
|
|
@@ -41,10 +41,42 @@ function QueryPartComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
|
41
41
|
* Displays query results using mj-query-viewer with parameter controls and auto-refresh support.
|
|
42
42
|
*/
|
|
43
43
|
let QueryPartComponent = class QueryPartComponent extends BaseDashboardPart {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
44
|
+
QueryViewer;
|
|
45
|
+
/** @deprecated Use {@link QueryViewer}. */
|
|
46
|
+
get queryViewer() {
|
|
47
|
+
return this.QueryViewer;
|
|
48
|
+
}
|
|
49
|
+
/** @deprecated Use {@link QueryViewer}. */
|
|
50
|
+
set queryViewer(value) {
|
|
51
|
+
this.QueryViewer = value;
|
|
52
|
+
}
|
|
53
|
+
HasQuery = false;
|
|
54
|
+
/** @deprecated Use {@link HasQuery}. */
|
|
55
|
+
get hasQuery() {
|
|
56
|
+
return this.HasQuery;
|
|
57
|
+
}
|
|
58
|
+
/** @deprecated Use {@link HasQuery}. */
|
|
59
|
+
set hasQuery(value) {
|
|
60
|
+
this.HasQuery = value;
|
|
61
|
+
}
|
|
62
|
+
QueryId = null;
|
|
63
|
+
/** @deprecated Use {@link QueryId}. */
|
|
64
|
+
get queryId() {
|
|
65
|
+
return this.QueryId;
|
|
66
|
+
}
|
|
67
|
+
/** @deprecated Use {@link QueryId}. */
|
|
68
|
+
set queryId(value) {
|
|
69
|
+
this.QueryId = value;
|
|
70
|
+
}
|
|
71
|
+
ShowToolbar = true;
|
|
72
|
+
/** @deprecated Use {@link ShowToolbar}. */
|
|
73
|
+
get showToolbar() {
|
|
74
|
+
return this.ShowToolbar;
|
|
75
|
+
}
|
|
76
|
+
/** @deprecated Use {@link ShowToolbar}. */
|
|
77
|
+
set showToolbar(value) {
|
|
78
|
+
this.ShowToolbar = value;
|
|
79
|
+
}
|
|
48
80
|
queryEntity = null;
|
|
49
81
|
autoRefreshTimer = null;
|
|
50
82
|
constructor(cdr) {
|
|
@@ -60,7 +92,7 @@ let QueryPartComponent = class QueryPartComponent extends BaseDashboardPart {
|
|
|
60
92
|
const queryId = config?.['queryId'];
|
|
61
93
|
const queryName = config?.['queryName'];
|
|
62
94
|
if (!queryId && !queryName) {
|
|
63
|
-
this.
|
|
95
|
+
this.HasQuery = false;
|
|
64
96
|
this.cdr.detectChanges();
|
|
65
97
|
return;
|
|
66
98
|
}
|
|
@@ -75,20 +107,20 @@ let QueryPartComponent = class QueryPartComponent extends BaseDashboardPart {
|
|
|
75
107
|
if (!loaded) {
|
|
76
108
|
throw new Error('Query not found');
|
|
77
109
|
}
|
|
78
|
-
this.
|
|
110
|
+
this.QueryId = queryId;
|
|
79
111
|
}
|
|
80
112
|
else if (queryName) {
|
|
81
113
|
// Query by name - find the query ID from metadata
|
|
82
114
|
const queryInfo = p.Queries.find(q => q.Name === queryName);
|
|
83
115
|
if (queryInfo) {
|
|
84
|
-
this.
|
|
116
|
+
this.QueryId = queryInfo.ID;
|
|
85
117
|
}
|
|
86
118
|
else {
|
|
87
119
|
throw new Error(`Query "${queryName}" not found`);
|
|
88
120
|
}
|
|
89
121
|
}
|
|
90
|
-
this.
|
|
91
|
-
this.
|
|
122
|
+
this.HasQuery = true;
|
|
123
|
+
this.ShowToolbar = config?.['showParameterControls'] !== false;
|
|
92
124
|
// Set auto-refresh if configured
|
|
93
125
|
const autoRefreshSeconds = config?.['autoRefreshSeconds'] || 0;
|
|
94
126
|
if (autoRefreshSeconds > 0) {
|
|
@@ -100,7 +132,7 @@ let QueryPartComponent = class QueryPartComponent extends BaseDashboardPart {
|
|
|
100
132
|
this.setError(error instanceof Error ? error.message : 'Failed to load query');
|
|
101
133
|
}
|
|
102
134
|
}
|
|
103
|
-
|
|
135
|
+
OnEntityLinkClick(event) {
|
|
104
136
|
// Emit data change event with clicked entity info (for any listeners that need it)
|
|
105
137
|
this.emitDataChanged({
|
|
106
138
|
type: 'entity-link-click',
|
|
@@ -112,19 +144,31 @@ let QueryPartComponent = class QueryPartComponent extends BaseDashboardPart {
|
|
|
112
144
|
this.RequestOpenEntityRecord(event.entityName, event.recordId, 'view', false);
|
|
113
145
|
}
|
|
114
146
|
}
|
|
115
|
-
|
|
147
|
+
/** @deprecated Use {@link OnEntityLinkClick}. */
|
|
148
|
+
onEntityLinkClick(event) {
|
|
149
|
+
return this.OnEntityLinkClick(event);
|
|
150
|
+
}
|
|
151
|
+
OnQueryError(error) {
|
|
116
152
|
console.error('[QueryPart] Query error:', error.message);
|
|
117
153
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
154
|
+
/** @deprecated Use {@link OnQueryError}. */
|
|
155
|
+
onQueryError(error) {
|
|
156
|
+
return this.OnQueryError(error);
|
|
157
|
+
}
|
|
158
|
+
RefreshQuery() {
|
|
159
|
+
if (this.QueryViewer) {
|
|
160
|
+
this.QueryViewer.Refresh();
|
|
121
161
|
}
|
|
122
162
|
}
|
|
163
|
+
/** @deprecated Use {@link RefreshQuery}. */
|
|
164
|
+
refreshQuery() {
|
|
165
|
+
return this.RefreshQuery();
|
|
166
|
+
}
|
|
123
167
|
startAutoRefresh(seconds) {
|
|
124
168
|
this.stopAutoRefresh();
|
|
125
169
|
if (seconds > 0) {
|
|
126
170
|
this.autoRefreshTimer = setInterval(() => {
|
|
127
|
-
this.
|
|
171
|
+
this.RefreshQuery();
|
|
128
172
|
}, seconds * 1000);
|
|
129
173
|
}
|
|
130
174
|
}
|
|
@@ -137,14 +181,14 @@ let QueryPartComponent = class QueryPartComponent extends BaseDashboardPart {
|
|
|
137
181
|
cleanup() {
|
|
138
182
|
this.stopAutoRefresh();
|
|
139
183
|
this.queryEntity = null;
|
|
140
|
-
this.
|
|
184
|
+
this.QueryId = null;
|
|
141
185
|
}
|
|
142
186
|
static ɵfac = function QueryPartComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || QueryPartComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
143
187
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: QueryPartComponent, selectors: [["mj-query-part"]], viewQuery: function QueryPartComponent_Query(rf, ctx) { if (rf & 1) {
|
|
144
188
|
i0.ɵɵviewQuery(_c0, 5);
|
|
145
189
|
} if (rf & 2) {
|
|
146
190
|
let _t;
|
|
147
|
-
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.
|
|
191
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.QueryViewer = _t.first);
|
|
148
192
|
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 5, vars: 8, consts: [["queryViewer", ""], [1, "query-part"], [1, "loading-state"], ["Variant", "error", "Icon", "fa-solid fa-triangle-exclamation", "Title", "Couldn't load query", "Size", "compact", 1, "part-placeholder", 3, "Message"], ["Icon", "fa-solid fa-flask", "Title", "No Query Selected", "Message", "Click the configure button to select a query for this part.", "Size", "compact", 1, "part-placeholder"], [1, "query-content"], ["text", "Loading query..."], [3, "EntityLinkClick", "QueryError", "QueryId", "AutoRun", "ShowToolbar", "PersistState", "PersistParameters"]], template: function QueryPartComponent_Template(rf, ctx) { if (rf & 1) {
|
|
149
193
|
i0.ɵɵelementStart(0, "div", 1);
|
|
150
194
|
i0.ɵɵconditionalCreate(1, QueryPartComponent_Conditional_1_Template, 2, 0, "div", 2);
|
|
@@ -217,7 +261,7 @@ export { QueryPartComponent };
|
|
|
217
261
|
}
|
|
218
262
|
</div>
|
|
219
263
|
`, styles: ["\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .query-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 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 .part-placeholder {\n height: 100%;\n }\n\n .query-content {\n flex: 1;\n min-height: 0;\n overflow: hidden;\n }\n\n mj-query-viewer {\n display: block;\n width: 100%;\n height: 100%;\n }\n "] }]
|
|
220
|
-
}], () => [{ type: i0.ChangeDetectorRef }], {
|
|
264
|
+
}], () => [{ type: i0.ChangeDetectorRef }], { QueryViewer: [{
|
|
221
265
|
type: ViewChild,
|
|
222
266
|
args: ['queryViewer']
|
|
223
267
|
}] }); })();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-part.component.js","sourceRoot":"","sources":["../../../src/lib/parts/query-part.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ChangeDetectorRef, ViewChild, AfterViewInit, OnDestroy } from '@angular/core';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseDashboardPart } from './base-dashboard-part';\nimport { PanelConfig } from '../models/dashboard-types';\nimport { MJQueryEntity } from '@memberjunction/core-entities';\nimport { QueryViewerComponent, QueryEntityLinkClickEvent } from '@memberjunction/ng-query-viewer';\n\n/**\n * Runtime renderer for Query dashboard parts.\n * Displays query results using mj-query-viewer with parameter controls and auto-refresh support.\n */\n@RegisterClass(BaseDashboardPart, 'QueryPanelRenderer')\n@Component({\n standalone: false,\n selector: 'mj-query-part',\n template: `\n <div class=\"query-part\" [class.loading]=\"IsLoading\" [class.error]=\"ErrorMessage\">\n <!-- Loading state -->\n @if (IsLoading) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading query...\"></mj-loading>\n </div>\n }\n \n <!-- Error state -->\n @if (ErrorMessage && !IsLoading) {\n <mj-empty-state\n class=\"part-placeholder\"\n Variant=\"error\"\n Icon=\"fa-solid fa-triangle-exclamation\"\n Title=\"Couldn't load query\"\n [Message]=\"ErrorMessage\"\n Size=\"compact\" />\n }\n\n <!-- No query configured -->\n @if (!IsLoading && !ErrorMessage && !hasQuery) {\n <mj-empty-state\n class=\"part-placeholder\"\n Icon=\"fa-solid fa-flask\"\n Title=\"No Query Selected\"\n Message=\"Click the configure button to select a query for this part.\"\n Size=\"compact\" />\n }\n \n <!-- Query Viewer -->\n @if (!IsLoading && !ErrorMessage && hasQuery && queryId) {\n <div class=\"query-content\">\n <mj-query-viewer\n #queryViewer\n [QueryId]=\"queryId\"\n [AutoRun]=\"true\"\n [ShowToolbar]=\"showToolbar\"\n [PersistState]=\"true\"\n [PersistParameters]=\"true\"\n (EntityLinkClick)=\"onEntityLinkClick($event)\"\n (QueryError)=\"onQueryError($event)\">\n </mj-query-viewer>\n </div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .query-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 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 .part-placeholder {\n height: 100%;\n }\n\n .query-content {\n flex: 1;\n min-height: 0;\n overflow: hidden;\n }\n\n mj-query-viewer {\n display: block;\n width: 100%;\n height: 100%;\n }\n `]\n})\nexport class QueryPartComponent extends BaseDashboardPart implements AfterViewInit, OnDestroy {\n @ViewChild('queryViewer') queryViewer!: QueryViewerComponent;\n\n public hasQuery = false;\n public queryId: string | null = null;\n public showToolbar = true;\n\n private queryEntity: MJQueryEntity | null = null;\n private autoRefreshTimer: ReturnType<typeof setInterval> | null = null;\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 queryId = config?.['queryId'] as string | undefined;\n const queryName = config?.['queryName'] as string | undefined;\n\n if (!queryId && !queryName) {\n this.hasQuery = false;\n this.cdr.detectChanges();\n return;\n }\n\n this.setLoading(true);\n this.stopAutoRefresh();\n\n try {\n const p = this.ProviderToUse;\n\n if (queryId) {\n // Load query by ID to verify it exists\n this.queryEntity = await p.GetEntityObject<MJQueryEntity>('MJ: Queries', p.CurrentUser);\n const loaded = await this.queryEntity.Load(queryId);\n\n if (!loaded) {\n throw new Error('Query not found');\n }\n\n this.queryId = queryId;\n } else if (queryName) {\n // Query by name - find the query ID from metadata\n const queryInfo = p.Queries.find(q => q.Name === queryName);\n if (queryInfo) {\n this.queryId = queryInfo.ID;\n } else {\n throw new Error(`Query \"${queryName}\" not found`);\n }\n }\n\n this.hasQuery = true;\n this.showToolbar = (config?.['showParameterControls'] as boolean) !== false;\n\n // Set auto-refresh if configured\n const autoRefreshSeconds = (config?.['autoRefreshSeconds'] as number) || 0;\n if (autoRefreshSeconds > 0) {\n this.startAutoRefresh(autoRefreshSeconds);\n }\n\n this.setLoading(false);\n } catch (error) {\n this.setError(error instanceof Error ? error.message : 'Failed to load query');\n }\n }\n\n public onEntityLinkClick(event: QueryEntityLinkClickEvent): void {\n // Emit data change event with clicked entity info (for any listeners that need it)\n this.emitDataChanged({\n type: 'entity-link-click',\n entityName: event.entityName,\n recordId: event.recordId\n });\n\n // Request navigation to open the record\n if (event.entityName && event.recordId) {\n this.RequestOpenEntityRecord(\n event.entityName,\n event.recordId,\n 'view',\n false\n );\n }\n }\n\n public onQueryError(error: Error): void {\n console.error('[QueryPart] Query error:', error.message);\n }\n\n public refreshQuery(): void {\n if (this.queryViewer) {\n this.queryViewer.Refresh();\n }\n }\n\n private startAutoRefresh(seconds: number): void {\n this.stopAutoRefresh();\n if (seconds > 0) {\n this.autoRefreshTimer = setInterval(() => {\n this.refreshQuery();\n }, seconds * 1000);\n }\n }\n\n private stopAutoRefresh(): void {\n if (this.autoRefreshTimer) {\n clearInterval(this.autoRefreshTimer);\n this.autoRefreshTimer = null;\n }\n }\n\n protected override cleanup(): void {\n this.stopAutoRefresh();\n this.queryEntity = null;\n this.queryId = null;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"query-part.component.js","sourceRoot":"","sources":["../../../src/lib/parts/query-part.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ChangeDetectorRef, ViewChild, AfterViewInit, OnDestroy } from '@angular/core';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseDashboardPart } from './base-dashboard-part';\nimport { PanelConfig } from '../models/dashboard-types';\nimport { MJQueryEntity } from '@memberjunction/core-entities';\nimport { QueryViewerComponent, QueryEntityLinkClickEvent } from '@memberjunction/ng-query-viewer';\n\n/**\n * Runtime renderer for Query dashboard parts.\n * Displays query results using mj-query-viewer with parameter controls and auto-refresh support.\n */\n@RegisterClass(BaseDashboardPart, 'QueryPanelRenderer')\n@Component({\n standalone: false,\n selector: 'mj-query-part',\n template: `\n <div class=\"query-part\" [class.loading]=\"IsLoading\" [class.error]=\"ErrorMessage\">\n <!-- Loading state -->\n @if (IsLoading) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading query...\"></mj-loading>\n </div>\n }\n \n <!-- Error state -->\n @if (ErrorMessage && !IsLoading) {\n <mj-empty-state\n class=\"part-placeholder\"\n Variant=\"error\"\n Icon=\"fa-solid fa-triangle-exclamation\"\n Title=\"Couldn't load query\"\n [Message]=\"ErrorMessage\"\n Size=\"compact\" />\n }\n\n <!-- No query configured -->\n @if (!IsLoading && !ErrorMessage && !hasQuery) {\n <mj-empty-state\n class=\"part-placeholder\"\n Icon=\"fa-solid fa-flask\"\n Title=\"No Query Selected\"\n Message=\"Click the configure button to select a query for this part.\"\n Size=\"compact\" />\n }\n \n <!-- Query Viewer -->\n @if (!IsLoading && !ErrorMessage && hasQuery && queryId) {\n <div class=\"query-content\">\n <mj-query-viewer\n #queryViewer\n [QueryId]=\"queryId\"\n [AutoRun]=\"true\"\n [ShowToolbar]=\"showToolbar\"\n [PersistState]=\"true\"\n [PersistParameters]=\"true\"\n (EntityLinkClick)=\"onEntityLinkClick($event)\"\n (QueryError)=\"onQueryError($event)\">\n </mj-query-viewer>\n </div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .query-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 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 .part-placeholder {\n height: 100%;\n }\n\n .query-content {\n flex: 1;\n min-height: 0;\n overflow: hidden;\n }\n\n mj-query-viewer {\n display: block;\n width: 100%;\n height: 100%;\n }\n `]\n})\nexport class QueryPartComponent extends BaseDashboardPart implements AfterViewInit, OnDestroy {\n @ViewChild('queryViewer') QueryViewer!: QueryViewerComponent;\n\n /** @deprecated Use {@link QueryViewer}. */\n get queryViewer(): QueryViewerComponent {\n return this.QueryViewer;\n }\n /** @deprecated Use {@link QueryViewer}. */\n set queryViewer(value: QueryViewerComponent) {\n this.QueryViewer = value;\n }\n\n public HasQuery = false;\n\n /** @deprecated Use {@link HasQuery}. */\n public get hasQuery() {\n return this.HasQuery;\n }\n /** @deprecated Use {@link HasQuery}. */\n public set hasQuery(value) {\n this.HasQuery = value;\n }\n public QueryId: string | null = null;\n\n /** @deprecated Use {@link QueryId}. */\n public get queryId(): string | null {\n return this.QueryId;\n }\n /** @deprecated Use {@link QueryId}. */\n public set queryId(value: string | null) {\n this.QueryId = value;\n }\n public ShowToolbar = true;\n\n /** @deprecated Use {@link ShowToolbar}. */\n public get showToolbar() {\n return this.ShowToolbar;\n }\n /** @deprecated Use {@link ShowToolbar}. */\n public set showToolbar(value) {\n this.ShowToolbar = value;\n }\n\n private queryEntity: MJQueryEntity | null = null;\n private autoRefreshTimer: ReturnType<typeof setInterval> | null = null;\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 queryId = config?.['queryId'] as string | undefined;\n const queryName = config?.['queryName'] as string | undefined;\n\n if (!queryId && !queryName) {\n this.HasQuery = false;\n this.cdr.detectChanges();\n return;\n }\n\n this.setLoading(true);\n this.stopAutoRefresh();\n\n try {\n const p = this.ProviderToUse;\n\n if (queryId) {\n // Load query by ID to verify it exists\n this.queryEntity = await p.GetEntityObject<MJQueryEntity>('MJ: Queries', p.CurrentUser);\n const loaded = await this.queryEntity.Load(queryId);\n\n if (!loaded) {\n throw new Error('Query not found');\n }\n\n this.QueryId = queryId;\n } else if (queryName) {\n // Query by name - find the query ID from metadata\n const queryInfo = p.Queries.find(q => q.Name === queryName);\n if (queryInfo) {\n this.QueryId = queryInfo.ID;\n } else {\n throw new Error(`Query \"${queryName}\" not found`);\n }\n }\n\n this.HasQuery = true;\n this.ShowToolbar = (config?.['showParameterControls'] as boolean) !== false;\n\n // Set auto-refresh if configured\n const autoRefreshSeconds = (config?.['autoRefreshSeconds'] as number) || 0;\n if (autoRefreshSeconds > 0) {\n this.startAutoRefresh(autoRefreshSeconds);\n }\n\n this.setLoading(false);\n } catch (error) {\n this.setError(error instanceof Error ? error.message : 'Failed to load query');\n }\n }\n\n public OnEntityLinkClick(event: QueryEntityLinkClickEvent): void {\n // Emit data change event with clicked entity info (for any listeners that need it)\n this.emitDataChanged({\n type: 'entity-link-click',\n entityName: event.entityName,\n recordId: event.recordId\n });\n\n // Request navigation to open the record\n if (event.entityName && event.recordId) {\n this.RequestOpenEntityRecord(\n event.entityName,\n event.recordId,\n 'view',\n false\n );\n }\n }\n\n /** @deprecated Use {@link OnEntityLinkClick}. */\n public onEntityLinkClick(event: QueryEntityLinkClickEvent): void {\n return this.OnEntityLinkClick(event);\n }\n\n public OnQueryError(error: Error): void {\n console.error('[QueryPart] Query error:', error.message);\n }\n\n /** @deprecated Use {@link OnQueryError}. */\n public onQueryError(error: Error): void {\n return this.OnQueryError(error);\n }\n\n public RefreshQuery(): void {\n if (this.QueryViewer) {\n this.QueryViewer.Refresh();\n }\n }\n\n /** @deprecated Use {@link RefreshQuery}. */\n public refreshQuery(): void {\n return this.RefreshQuery();\n }\n\n private startAutoRefresh(seconds: number): void {\n this.stopAutoRefresh();\n if (seconds > 0) {\n this.autoRefreshTimer = setInterval(() => {\n this.RefreshQuery();\n }, seconds * 1000);\n }\n }\n\n private stopAutoRefresh(): void {\n if (this.autoRefreshTimer) {\n clearInterval(this.autoRefreshTimer);\n this.autoRefreshTimer = null;\n }\n }\n\n protected override cleanup(): void {\n this.stopAutoRefresh();\n this.queryEntity = null;\n this.QueryId = null;\n }\n}\n"]}
|
|
@@ -9,13 +9,29 @@ import * as i0 from "@angular/core";
|
|
|
9
9
|
* Displays entity data using mj-entity-viewer with grid, cards, or timeline layout.
|
|
10
10
|
*/
|
|
11
11
|
export declare class ViewPartComponent extends BaseDashboardPart implements AfterViewInit, OnDestroy {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
HasView: boolean;
|
|
13
|
+
/** @deprecated Use {@link HasView}. */
|
|
14
|
+
get hasView(): boolean;
|
|
15
|
+
/** @deprecated Use {@link HasView}. */
|
|
16
|
+
set hasView(value: boolean);
|
|
17
|
+
ViewEntity: MJUserViewEntityExtended | null;
|
|
18
|
+
/** @deprecated Use {@link ViewEntity}. */
|
|
19
|
+
get viewEntity(): MJUserViewEntityExtended | null;
|
|
20
|
+
/** @deprecated Use {@link ViewEntity}. */
|
|
21
|
+
set viewEntity(value: MJUserViewEntityExtended | null);
|
|
22
|
+
EntityInfo: EntityInfo | null;
|
|
23
|
+
/** @deprecated Use {@link EntityInfo}. */
|
|
24
|
+
get entityInfo(): EntityInfo | null;
|
|
25
|
+
/** @deprecated Use {@link EntityInfo}. */
|
|
26
|
+
set entityInfo(value: EntityInfo | null);
|
|
15
27
|
constructor(cdr: ChangeDetectorRef);
|
|
16
28
|
ngAfterViewInit(): void;
|
|
17
29
|
loadContent(): Promise<void>;
|
|
30
|
+
OnRecordSelected(event: RecordSelectedEvent): void;
|
|
31
|
+
/** @deprecated Use {@link OnRecordSelected}. */
|
|
18
32
|
onRecordSelected(event: RecordSelectedEvent): void;
|
|
33
|
+
OnRecordOpened(event: RecordOpenedEvent): void;
|
|
34
|
+
/** @deprecated Use {@link OnRecordOpened}. */
|
|
19
35
|
onRecordOpened(event: RecordOpenedEvent): void;
|
|
20
36
|
/**
|
|
21
37
|
* Handle a plug-in renderer's request (bubbled up via the inner entity-viewer) to open a
|
|
@@ -24,6 +40,8 @@ export declare class ViewPartComponent extends BaseDashboardPart implements Afte
|
|
|
24
40
|
*
|
|
25
41
|
* @param nav the related-record navigation payload: the target entity name and the record's key.
|
|
26
42
|
*/
|
|
43
|
+
OnOpenRelatedRecordRequested(nav: ViewRelatedRecordNavigation): void;
|
|
44
|
+
/** @deprecated Use {@link OnOpenRelatedRecordRequested}. */
|
|
27
45
|
onOpenRelatedRecordRequested(nav: ViewRelatedRecordNavigation): void;
|
|
28
46
|
protected cleanup(): void;
|
|
29
47
|
static ɵfac: i0.ɵɵFactoryDeclaration<ViewPartComponent, never>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view-part.component.d.ts","sourceRoot":"","sources":["../../../src/lib/parts/view-part.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,iBAAiB,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAEvF,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;;AAEvH;;;GAGG;AACH,qBAkFa,iBAAkB,SAAQ,iBAAkB,YAAW,aAAa,EAAE,SAAS;IACjF,OAAO,UAAS;
|
|
1
|
+
{"version":3,"file":"view-part.component.d.ts","sourceRoot":"","sources":["../../../src/lib/parts/view-part.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,iBAAiB,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAEvF,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;;AAEvH;;;GAGG;AACH,qBAkFa,iBAAkB,SAAQ,iBAAkB,YAAW,aAAa,EAAE,SAAS;IACjF,OAAO,UAAS;IAEvB,uCAAuC;IACvC,IAAW,OAAO,YAEjB;IACD,uCAAuC;IACvC,IAAW,OAAO,CAAC,KAAK,SAAA,EAEvB;IACM,UAAU,EAAE,wBAAwB,GAAG,IAAI,CAAQ;IAE1D,0CAA0C;IAC1C,IAAW,UAAU,IAAI,wBAAwB,GAAG,IAAI,CAEvD;IACD,0CAA0C;IAC1C,IAAW,UAAU,CAAC,KAAK,EAAE,wBAAwB,GAAG,IAAI,EAE3D;IACM,UAAU,EAAE,UAAU,GAAG,IAAI,CAAQ;IAE5C,0CAA0C;IAC1C,IAAW,UAAU,IAAI,UAAU,GAAG,IAAI,CAEzC;IACD,0CAA0C;IAC1C,IAAW,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,EAE7C;gBAEW,GAAG,EAAE,iBAAiB;IAIlC,eAAe,IAAI,IAAI;IAMV,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IA2DlC,gBAAgB,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI;IASzD,gDAAgD;IACzC,gBAAgB,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI;IAIlD,cAAc,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAmBrD,8CAA8C;IACvC,cAAc,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAIrD;;;;;;OAMG;IACI,4BAA4B,CAAC,GAAG,EAAE,2BAA2B,GAAG,IAAI;IAW3E,4DAA4D;IACrD,4BAA4B,CAAC,GAAG,EAAE,2BAA2B,GAAG,IAAI;cAIxD,OAAO,IAAI,IAAI;yCAlKzB,iBAAiB;2CAAjB,iBAAiB;CAuK7B"}
|