@memberjunction/ng-artifacts 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/components/artifact-message-card.component.d.ts +60 -8
- package/dist/lib/components/artifact-message-card.component.d.ts.map +1 -1
- package/dist/lib/components/artifact-message-card.component.js +135 -39
- package/dist/lib/components/artifact-message-card.component.js.map +1 -1
- package/dist/lib/components/artifact-type-plugin-viewer.component.d.ts +58 -6
- package/dist/lib/components/artifact-type-plugin-viewer.component.d.ts.map +1 -1
- package/dist/lib/components/artifact-type-plugin-viewer.component.js +113 -35
- package/dist/lib/components/artifact-type-plugin-viewer.component.js.map +1 -1
- package/dist/lib/components/artifact-version-download.d.ts +5 -3
- package/dist/lib/components/artifact-version-download.d.ts.map +1 -1
- package/dist/lib/components/artifact-version-download.js +11 -7
- package/dist/lib/components/artifact-version-download.js.map +1 -1
- package/dist/lib/components/artifact-version-history.component.d.ts +74 -8
- package/dist/lib/components/artifact-version-history.component.d.ts.map +1 -1
- package/dist/lib/components/artifact-version-history.component.js +152 -34
- package/dist/lib/components/artifact-version-history.component.js.map +1 -1
- package/dist/lib/components/artifact-viewer-panel.component.d.ts +328 -35
- package/dist/lib/components/artifact-viewer-panel.component.d.ts.map +1 -1
- package/dist/lib/components/artifact-viewer-panel.component.js +701 -213
- package/dist/lib/components/artifact-viewer-panel.component.js.map +1 -1
- package/dist/lib/components/file-artifact-toolbar.component.d.ts +112 -10
- package/dist/lib/components/file-artifact-toolbar.component.d.ts.map +1 -1
- package/dist/lib/components/file-artifact-toolbar.component.js +197 -23
- package/dist/lib/components/file-artifact-toolbar.component.js.map +1 -1
- package/dist/lib/components/plugins/audio-artifact-viewer.component.d.ts +9 -1
- package/dist/lib/components/plugins/audio-artifact-viewer.component.d.ts.map +1 -1
- package/dist/lib/components/plugins/audio-artifact-viewer.component.js +20 -4
- package/dist/lib/components/plugins/audio-artifact-viewer.component.js.map +1 -1
- package/dist/lib/components/plugins/code-artifact-viewer.component.d.ts +23 -5
- package/dist/lib/components/plugins/code-artifact-viewer.component.d.ts.map +1 -1
- package/dist/lib/components/plugins/code-artifact-viewer.component.js +69 -31
- package/dist/lib/components/plugins/code-artifact-viewer.component.js.map +1 -1
- package/dist/lib/components/plugins/component-artifact-viewer.component.d.ts +136 -18
- package/dist/lib/components/plugins/component-artifact-viewer.component.d.ts.map +1 -1
- package/dist/lib/components/plugins/component-artifact-viewer.component.js +285 -97
- package/dist/lib/components/plugins/component-artifact-viewer.component.js.map +1 -1
- package/dist/lib/components/plugins/component-feedback-panel/component-feedback-panel.component.d.ts +2 -2
- package/dist/lib/components/plugins/component-feedback-panel/component-feedback-panel.component.js +7 -7
- package/dist/lib/components/plugins/component-feedback-panel/component-feedback-panel.component.js.map +1 -1
- package/dist/lib/components/plugins/component-permission-evaluation.d.ts +2 -0
- package/dist/lib/components/plugins/component-permission-evaluation.d.ts.map +1 -1
- package/dist/lib/components/plugins/component-permission-evaluation.js +6 -2
- package/dist/lib/components/plugins/component-permission-evaluation.js.map +1 -1
- package/dist/lib/components/plugins/data-artifact-viewer.component.d.ts +17 -6
- package/dist/lib/components/plugins/data-artifact-viewer.component.d.ts.map +1 -1
- package/dist/lib/components/plugins/data-artifact-viewer.component.js +32 -22
- package/dist/lib/components/plugins/data-artifact-viewer.component.js.map +1 -1
- package/dist/lib/components/plugins/data-requirements-viewer/data-requirements-viewer.component.d.ts +56 -4
- package/dist/lib/components/plugins/data-requirements-viewer/data-requirements-viewer.component.d.ts.map +1 -1
- package/dist/lib/components/plugins/data-requirements-viewer/data-requirements-viewer.component.js +142 -36
- package/dist/lib/components/plugins/data-requirements-viewer/data-requirements-viewer.component.js.map +1 -1
- package/dist/lib/components/plugins/docx-artifact-viewer.component.d.ts +14 -2
- package/dist/lib/components/plugins/docx-artifact-viewer.component.d.ts.map +1 -1
- package/dist/lib/components/plugins/docx-artifact-viewer.component.js +32 -8
- package/dist/lib/components/plugins/docx-artifact-viewer.component.js.map +1 -1
- package/dist/lib/components/plugins/html-artifact-viewer.component.d.ts +17 -3
- package/dist/lib/components/plugins/html-artifact-viewer.component.d.ts.map +1 -1
- package/dist/lib/components/plugins/html-artifact-viewer.component.js +36 -8
- package/dist/lib/components/plugins/html-artifact-viewer.component.js.map +1 -1
- package/dist/lib/components/plugins/image-artifact-viewer.component.d.ts +41 -5
- package/dist/lib/components/plugins/image-artifact-viewer.component.d.ts.map +1 -1
- package/dist/lib/components/plugins/image-artifact-viewer.component.js +102 -30
- package/dist/lib/components/plugins/image-artifact-viewer.component.js.map +1 -1
- package/dist/lib/components/plugins/json-artifact-viewer.component.d.ts +33 -5
- package/dist/lib/components/plugins/json-artifact-viewer.component.d.ts.map +1 -1
- package/dist/lib/components/plugins/json-artifact-viewer.component.js +89 -33
- package/dist/lib/components/plugins/json-artifact-viewer.component.js.map +1 -1
- package/dist/lib/components/plugins/markdown-artifact-viewer.component.d.ts +12 -2
- package/dist/lib/components/plugins/markdown-artifact-viewer.component.d.ts.map +1 -1
- package/dist/lib/components/plugins/markdown-artifact-viewer.component.js +28 -8
- package/dist/lib/components/plugins/markdown-artifact-viewer.component.js.map +1 -1
- package/dist/lib/components/plugins/ml-experiment-results-viewer.component.d.ts +4 -0
- package/dist/lib/components/plugins/ml-experiment-results-viewer.component.d.ts.map +1 -1
- package/dist/lib/components/plugins/ml-experiment-results-viewer.component.js +14 -6
- package/dist/lib/components/plugins/ml-experiment-results-viewer.component.js.map +1 -1
- package/dist/lib/components/plugins/pdf-artifact-viewer.component.d.ts +47 -5
- package/dist/lib/components/plugins/pdf-artifact-viewer.component.d.ts.map +1 -1
- package/dist/lib/components/plugins/pdf-artifact-viewer.component.js +129 -45
- package/dist/lib/components/plugins/pdf-artifact-viewer.component.js.map +1 -1
- package/dist/lib/components/plugins/save-query-dialog.component.d.ts +5 -1
- package/dist/lib/components/plugins/save-query-dialog.component.d.ts.map +1 -1
- package/dist/lib/components/plugins/save-query-dialog.component.js +12 -4
- package/dist/lib/components/plugins/save-query-dialog.component.js.map +1 -1
- package/dist/lib/components/plugins/svg-artifact-viewer.component.d.ts +17 -3
- package/dist/lib/components/plugins/svg-artifact-viewer.component.d.ts.map +1 -1
- package/dist/lib/components/plugins/svg-artifact-viewer.component.js +36 -8
- package/dist/lib/components/plugins/svg-artifact-viewer.component.js.map +1 -1
- package/dist/lib/components/plugins/video-artifact-viewer.component.d.ts +9 -1
- package/dist/lib/components/plugins/video-artifact-viewer.component.d.ts.map +1 -1
- package/dist/lib/components/plugins/video-artifact-viewer.component.js +20 -4
- package/dist/lib/components/plugins/video-artifact-viewer.component.js.map +1 -1
- package/dist/lib/components/plugins/xlsx-artifact-viewer.component.d.ts +28 -4
- package/dist/lib/components/plugins/xlsx-artifact-viewer.component.d.ts.map +1 -1
- package/dist/lib/components/plugins/xlsx-artifact-viewer.component.js +64 -16
- package/dist/lib/components/plugins/xlsx-artifact-viewer.component.js.map +1 -1
- package/dist/lib/components/previews/audio-artifact-preview.component.d.ts +9 -1
- package/dist/lib/components/previews/audio-artifact-preview.component.d.ts.map +1 -1
- package/dist/lib/components/previews/audio-artifact-preview.component.js +20 -4
- package/dist/lib/components/previews/audio-artifact-preview.component.js.map +1 -1
- package/dist/lib/components/previews/image-artifact-preview.component.d.ts +16 -2
- package/dist/lib/components/previews/image-artifact-preview.component.d.ts.map +1 -1
- package/dist/lib/components/previews/image-artifact-preview.component.js +35 -7
- package/dist/lib/components/previews/image-artifact-preview.component.js.map +1 -1
- package/dist/lib/components/previews/video-artifact-preview.component.d.ts +9 -1
- package/dist/lib/components/previews/video-artifact-preview.component.d.ts.map +1 -1
- package/dist/lib/components/previews/video-artifact-preview.component.js +20 -4
- package/dist/lib/components/previews/video-artifact-preview.component.js.map +1 -1
- package/dist/lib/interfaces/artifact-viewer-plugin.interface.js.map +1 -1
- package/dist/lib/services/artifact-file.service.d.ts +8 -0
- package/dist/lib/services/artifact-file.service.d.ts.map +1 -1
- package/dist/lib/services/artifact-file.service.js +22 -6
- package/dist/lib/services/artifact-file.service.js.map +1 -1
- package/dist/lib/services/artifact-icon.service.d.ts +2 -0
- package/dist/lib/services/artifact-icon.service.d.ts.map +1 -1
- package/dist/lib/services/artifact-icon.service.js +5 -1
- package/dist/lib/services/artifact-icon.service.js.map +1 -1
- package/dist/lib/services/artifact-preview-resolver.service.d.ts +2 -0
- package/dist/lib/services/artifact-preview-resolver.service.d.ts.map +1 -1
- package/dist/lib/services/artifact-preview-resolver.service.js +5 -1
- package/dist/lib/services/artifact-preview-resolver.service.js.map +1 -1
- package/dist/lib/snapshot-helpers.d.ts +10 -0
- package/dist/lib/snapshot-helpers.d.ts.map +1 -1
- package/dist/lib/snapshot-helpers.js +25 -5
- package/dist/lib/snapshot-helpers.js.map +1 -1
- package/package.json +21 -21
|
@@ -8,7 +8,7 @@ import { Component, ViewChild } from '@angular/core';
|
|
|
8
8
|
import { RegisterClass } from '@memberjunction/global';
|
|
9
9
|
import { BaseArtifactViewerPluginComponent } from '../base-artifact-viewer.component';
|
|
10
10
|
import { RunView } from '@memberjunction/core';
|
|
11
|
-
import {
|
|
11
|
+
import { CreateJsonSnapshot } from '../../snapshot-helpers';
|
|
12
12
|
import * as i0 from "@angular/core";
|
|
13
13
|
import * as i1 from "@angular/platform-browser";
|
|
14
14
|
import * as i2 from "@angular/common";
|
|
@@ -66,11 +66,51 @@ function JsonArtifactViewerComponent_Conditional_9_Template(rf, ctx) { if (rf &
|
|
|
66
66
|
let JsonArtifactViewerComponent = class JsonArtifactViewerComponent extends BaseArtifactViewerPluginComponent {
|
|
67
67
|
cdr;
|
|
68
68
|
sanitizer;
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
69
|
+
HtmlFrame;
|
|
70
|
+
/** @deprecated Use {@link HtmlFrame}. */
|
|
71
|
+
get htmlFrame() {
|
|
72
|
+
return this.HtmlFrame;
|
|
73
|
+
}
|
|
74
|
+
/** @deprecated Use {@link HtmlFrame}. */
|
|
75
|
+
set htmlFrame(value) {
|
|
76
|
+
this.HtmlFrame = value;
|
|
77
|
+
}
|
|
78
|
+
JsonContent = '';
|
|
79
|
+
/** @deprecated Use {@link JsonContent}. */
|
|
80
|
+
get jsonContent() {
|
|
81
|
+
return this.JsonContent;
|
|
82
|
+
}
|
|
83
|
+
/** @deprecated Use {@link JsonContent}. */
|
|
84
|
+
set jsonContent(value) {
|
|
85
|
+
this.JsonContent = value;
|
|
86
|
+
}
|
|
87
|
+
DisplayMarkdown = null;
|
|
88
|
+
/** @deprecated Use {@link DisplayMarkdown}. */
|
|
89
|
+
get displayMarkdown() {
|
|
90
|
+
return this.DisplayMarkdown;
|
|
91
|
+
}
|
|
92
|
+
/** @deprecated Use {@link DisplayMarkdown}. */
|
|
93
|
+
set displayMarkdown(value) {
|
|
94
|
+
this.DisplayMarkdown = value;
|
|
95
|
+
}
|
|
96
|
+
DisplayHtml = null;
|
|
97
|
+
/** @deprecated Use {@link DisplayHtml}. */
|
|
98
|
+
get displayHtml() {
|
|
99
|
+
return this.DisplayHtml;
|
|
100
|
+
}
|
|
101
|
+
/** @deprecated Use {@link DisplayHtml}. */
|
|
102
|
+
set displayHtml(value) {
|
|
103
|
+
this.DisplayHtml = value;
|
|
104
|
+
}
|
|
105
|
+
HtmlBlobUrl = null;
|
|
106
|
+
/** @deprecated Use {@link HtmlBlobUrl}. */
|
|
107
|
+
get htmlBlobUrl() {
|
|
108
|
+
return this.HtmlBlobUrl;
|
|
109
|
+
}
|
|
110
|
+
/** @deprecated Use {@link HtmlBlobUrl}. */
|
|
111
|
+
set htmlBlobUrl(value) {
|
|
112
|
+
this.HtmlBlobUrl = value;
|
|
113
|
+
}
|
|
74
114
|
versionAttributes = [];
|
|
75
115
|
unsafeBlobUrl = null; // Keep unsafe URL for cleanup
|
|
76
116
|
/**
|
|
@@ -89,11 +129,11 @@ let JsonArtifactViewerComponent = class JsonArtifactViewerComponent extends Base
|
|
|
89
129
|
if (this.unsafeBlobUrl) {
|
|
90
130
|
URL.revokeObjectURL(this.unsafeBlobUrl);
|
|
91
131
|
this.unsafeBlobUrl = null;
|
|
92
|
-
this.
|
|
132
|
+
this.HtmlBlobUrl = null;
|
|
93
133
|
}
|
|
94
134
|
}
|
|
95
135
|
async ngOnInit() {
|
|
96
|
-
this.
|
|
136
|
+
this.JsonContent = this.getContent();
|
|
97
137
|
// Load version attributes to check for extract rules
|
|
98
138
|
await this.loadVersionAttributes();
|
|
99
139
|
// Trigger change detection after async load
|
|
@@ -104,7 +144,7 @@ let JsonArtifactViewerComponent = class JsonArtifactViewerComponent extends Base
|
|
|
104
144
|
* Returns false when showing raw JSON editor (no extract rules available).
|
|
105
145
|
*/
|
|
106
146
|
get isShowingElevatedDisplay() {
|
|
107
|
-
return !!(this.
|
|
147
|
+
return !!(this.DisplayHtml || this.DisplayMarkdown);
|
|
108
148
|
}
|
|
109
149
|
/**
|
|
110
150
|
* Override to tell parent whether to show raw JSON tab.
|
|
@@ -139,21 +179,21 @@ let JsonArtifactViewerComponent = class JsonArtifactViewerComponent extends Base
|
|
|
139
179
|
console.log(`📦 displayHtmlAttr:`, displayHtmlAttr ? { name: displayHtmlAttr.Name, valueLength: displayHtmlAttr.Value?.length } : 'not found');
|
|
140
180
|
console.log(`📦 displayMarkdownAttr:`, displayMarkdownAttr ? { name: displayMarkdownAttr.Name, valueLength: displayMarkdownAttr.Value?.length } : 'not found');
|
|
141
181
|
// Parse attribute values - fix "null" string bug
|
|
142
|
-
this.
|
|
143
|
-
this.
|
|
182
|
+
this.DisplayHtml = this.parseAttributeValue(displayHtmlAttr?.Value);
|
|
183
|
+
this.DisplayMarkdown = this.parseAttributeValue(displayMarkdownAttr?.Value);
|
|
144
184
|
// Clean up double-escaped characters in HTML (from LLM generation)
|
|
145
|
-
if (this.
|
|
146
|
-
this.
|
|
185
|
+
if (this.DisplayHtml) {
|
|
186
|
+
this.DisplayHtml = this.cleanEscapedCharacters(this.DisplayHtml);
|
|
147
187
|
}
|
|
148
188
|
// Create blob URL for HTML to avoid srcdoc sanitization issues
|
|
149
|
-
if (this.
|
|
150
|
-
const blob = new Blob([this.
|
|
189
|
+
if (this.DisplayHtml) {
|
|
190
|
+
const blob = new Blob([this.DisplayHtml], { type: 'text/html' });
|
|
151
191
|
this.unsafeBlobUrl = URL.createObjectURL(blob);
|
|
152
192
|
// Sanitize the blob URL so Angular trusts it in the iframe
|
|
153
|
-
this.
|
|
193
|
+
this.HtmlBlobUrl = this.sanitizer.bypassSecurityTrustResourceUrl(this.unsafeBlobUrl);
|
|
154
194
|
}
|
|
155
195
|
// Note: Markdown rendering is now handled by <mj-markdown> component in template
|
|
156
|
-
console.log(`📦 JSON Plugin: displayHtml=${!!this.
|
|
196
|
+
console.log(`📦 JSON Plugin: displayHtml=${!!this.DisplayHtml} (${this.DisplayHtml?.length || 0} chars), displayMarkdown=${!!this.DisplayMarkdown} (${this.DisplayMarkdown?.length || 0} chars)`);
|
|
157
197
|
console.log(`📦 isShowingElevatedDisplay=${this.isShowingElevatedDisplay}`);
|
|
158
198
|
}
|
|
159
199
|
else {
|
|
@@ -197,7 +237,7 @@ let JsonArtifactViewerComponent = class JsonArtifactViewerComponent extends Base
|
|
|
197
237
|
*/
|
|
198
238
|
getIframeDocument() {
|
|
199
239
|
try {
|
|
200
|
-
const iframe = this.
|
|
240
|
+
const iframe = this.HtmlFrame?.nativeElement;
|
|
201
241
|
if (!iframe)
|
|
202
242
|
return null;
|
|
203
243
|
return iframe.contentDocument || iframe.contentWindow?.document || null;
|
|
@@ -206,9 +246,9 @@ let JsonArtifactViewerComponent = class JsonArtifactViewerComponent extends Base
|
|
|
206
246
|
return null;
|
|
207
247
|
}
|
|
208
248
|
}
|
|
209
|
-
|
|
249
|
+
OnIframeLoad() {
|
|
210
250
|
// Inject base styles if HTML doesn't have them
|
|
211
|
-
if (this.
|
|
251
|
+
if (this.HtmlFrame) {
|
|
212
252
|
const iframeDoc = this.getIframeDocument();
|
|
213
253
|
if (iframeDoc) {
|
|
214
254
|
// Check if HTML already has styles
|
|
@@ -258,9 +298,13 @@ let JsonArtifactViewerComponent = class JsonArtifactViewerComponent extends Base
|
|
|
258
298
|
}
|
|
259
299
|
}
|
|
260
300
|
}
|
|
301
|
+
/** @deprecated Use {@link OnIframeLoad}. */
|
|
302
|
+
onIframeLoad() {
|
|
303
|
+
return this.OnIframeLoad();
|
|
304
|
+
}
|
|
261
305
|
resizeIframeToContent() {
|
|
262
|
-
if (this.
|
|
263
|
-
const iframe = this.
|
|
306
|
+
if (this.HtmlFrame) {
|
|
307
|
+
const iframe = this.HtmlFrame.nativeElement;
|
|
264
308
|
// Cross-origin (sandboxed) frames yield no document — the CSS flex sizing on
|
|
265
309
|
// .html-iframe is the fallback in that case.
|
|
266
310
|
const iframeDoc = this.getIframeDocument();
|
|
@@ -273,19 +317,23 @@ let JsonArtifactViewerComponent = class JsonArtifactViewerComponent extends Base
|
|
|
273
317
|
}
|
|
274
318
|
}
|
|
275
319
|
}
|
|
276
|
-
|
|
277
|
-
if (this.
|
|
320
|
+
OpenInNewWindow() {
|
|
321
|
+
if (this.DisplayHtml) {
|
|
278
322
|
const newWindow = window.open('', '_blank');
|
|
279
323
|
if (newWindow) {
|
|
280
|
-
newWindow.document.write(this.
|
|
324
|
+
newWindow.document.write(this.DisplayHtml);
|
|
281
325
|
newWindow.document.close();
|
|
282
326
|
}
|
|
283
327
|
}
|
|
284
328
|
}
|
|
285
|
-
|
|
286
|
-
|
|
329
|
+
/** @deprecated Use {@link OpenInNewWindow}. */
|
|
330
|
+
openInNewWindow() {
|
|
331
|
+
return this.OpenInNewWindow();
|
|
332
|
+
}
|
|
333
|
+
PrintHtml() {
|
|
334
|
+
if (this.HtmlFrame) {
|
|
287
335
|
try {
|
|
288
|
-
const iframe = this.
|
|
336
|
+
const iframe = this.HtmlFrame.nativeElement;
|
|
289
337
|
const iframeWindow = iframe.contentWindow;
|
|
290
338
|
if (iframeWindow) {
|
|
291
339
|
iframeWindow.focus();
|
|
@@ -300,9 +348,13 @@ let JsonArtifactViewerComponent = class JsonArtifactViewerComponent extends Base
|
|
|
300
348
|
}
|
|
301
349
|
}
|
|
302
350
|
}
|
|
303
|
-
|
|
351
|
+
/** @deprecated Use {@link PrintHtml}. */
|
|
352
|
+
printHtml() {
|
|
353
|
+
return this.PrintHtml();
|
|
354
|
+
}
|
|
355
|
+
OnCopy() {
|
|
304
356
|
// Copy based on what's being displayed - prioritize displayHtml
|
|
305
|
-
const content = this.
|
|
357
|
+
const content = this.DisplayHtml || this.DisplayMarkdown || this.JsonContent;
|
|
306
358
|
if (content) {
|
|
307
359
|
navigator.clipboard.writeText(content).then(() => {
|
|
308
360
|
console.log('✅ Copied content to clipboard');
|
|
@@ -311,8 +363,12 @@ let JsonArtifactViewerComponent = class JsonArtifactViewerComponent extends Base
|
|
|
311
363
|
});
|
|
312
364
|
}
|
|
313
365
|
}
|
|
366
|
+
/** @deprecated Use {@link OnCopy}. */
|
|
367
|
+
onCopy() {
|
|
368
|
+
return this.OnCopy();
|
|
369
|
+
}
|
|
314
370
|
GetCurrentStateSnapshot() {
|
|
315
|
-
return
|
|
371
|
+
return CreateJsonSnapshot(this.getRawContent(), this.getDisplayTitle());
|
|
316
372
|
}
|
|
317
373
|
/**
|
|
318
374
|
* Clean up double-escaped characters that appear in LLM-generated HTML
|
|
@@ -337,7 +393,7 @@ let JsonArtifactViewerComponent = class JsonArtifactViewerComponent extends Base
|
|
|
337
393
|
i0.ɵɵviewQuery(_c0, 5);
|
|
338
394
|
} if (rf & 2) {
|
|
339
395
|
let _t;
|
|
340
|
-
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.
|
|
396
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.HtmlFrame = _t.first);
|
|
341
397
|
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 10, vars: 3, consts: [["htmlFrame", ""], [1, "json-artifact-viewer", 3, "ngClass"], [1, "display-toolbar"], ["title", "Copy Content", 1, "btn-icon", 3, "click"], [1, "fas", "fa-copy"], [1, "display-content"], ["sandbox", "allow-scripts allow-popups allow-popups-to-escape-sandbox allow-modals", 1, "html-iframe", 3, "src"], [1, "markdown-content"], [1, "json-editor-container"], ["title", "Open in New Window", 1, "btn-icon", 3, "click"], [1, "fas", "fa-external-link-alt"], ["title", "Print", 1, "btn-icon", 3, "click"], [1, "fas", "fa-print"], ["sandbox", "allow-scripts allow-popups allow-popups-to-escape-sandbox allow-modals", 1, "html-iframe", 3, "load", "src"], [3, "data", "enableCollapsibleHeadings", "enableLineNumbers", "enableSmartypants", "enableHtml"], [2, "width", "100%", "height", "100%", 3, "ngModelChange", "ngModel", "language", "readonly"]], template: function JsonArtifactViewerComponent_Template(rf, ctx) { if (rf & 1) {
|
|
342
398
|
i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "button", 3);
|
|
343
399
|
i0.ɵɵlistener("click", function JsonArtifactViewerComponent_Template_button_click_2_listener() { return ctx.onCopy(); });
|
|
@@ -416,7 +472,7 @@ export { JsonArtifactViewerComponent };
|
|
|
416
472
|
</div>
|
|
417
473
|
</div>
|
|
418
474
|
`, styles: ["\n .json-artifact-viewer {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .display-toolbar {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 8px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .btn-icon {\n padding: 6px 12px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong);\n border-radius: 4px;\n cursor: pointer;\n font-size: 12px;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.2s;\n }\n\n .btn-icon:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-text-disabled);\n }\n\n .display-content {\n flex: 1;\n overflow: auto;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n\n .html-iframe {\n width: 100%;\n border: none;\n background: var(--mj-bg-surface);\n display: block;\n /* The frame is cross-origin (sandbox without allow-same-origin), so script-driven\n auto-resize is unavailable \u2014 fill the container instead. */\n flex: 1;\n min-height: 0;\n }\n\n .markdown-content {\n flex: 1;\n padding: 20px;\n overflow: auto;\n min-height: 0;\n background: var(--mj-bg-surface);\n }\n\n .json-editor-container {\n flex: 1;\n overflow: auto;\n min-height: 0;\n }\n "] }]
|
|
419
|
-
}], () => [{ type: i0.ChangeDetectorRef }, { type: i1.DomSanitizer }], {
|
|
475
|
+
}], () => [{ type: i0.ChangeDetectorRef }, { type: i1.DomSanitizer }], { HtmlFrame: [{
|
|
420
476
|
type: ViewChild,
|
|
421
477
|
args: ['htmlFrame']
|
|
422
478
|
}] }); })();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-artifact-viewer.component.js","sourceRoot":"","sources":["../../../../src/lib/components/plugins/json-artifact-viewer.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ViewChild, ElementRef } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseArtifactViewerPluginComponent } from '../base-artifact-viewer.component';\nimport { DataSnapshot, RunView } from '@memberjunction/core';\nimport { MJArtifactVersionAttributeEntity } from '@memberjunction/core-entities';\nimport { createJsonSnapshot } from '../../snapshot-helpers';\n\n/**\n * Viewer component for JSON artifacts.\n * Supports extract rules - shows displayMarkdown, displayHtml, or raw JSON editor (in that priority order).\n * All content is displayed in the parent's Display tab.\n */\n@Component({\n standalone: false,\n selector: 'mj-json-artifact-viewer',\n template: `\n <div class=\"json-artifact-viewer\" [ngClass]=\"cssClass\">\n <!-- Display toolbar -->\n <div class=\"display-toolbar\">\n <button class=\"btn-icon\" title=\"Copy Content\" (click)=\"onCopy()\">\n <i class=\"fas fa-copy\"></i> Copy\n </button>\n @if (displayHtml) {\n <button class=\"btn-icon\" title=\"Open in New Window\" (click)=\"openInNewWindow()\">\n <i class=\"fas fa-external-link-alt\"></i> New Window\n </button>\n <button class=\"btn-icon\" title=\"Print\" (click)=\"printHtml()\">\n <i class=\"fas fa-print\"></i> Print\n </button>\n }\n </div>\n\n <!-- Display content: priority order = displayHtml > displayMarkdown > JSON editor -->\n <div class=\"display-content\">\n @if (displayHtml && htmlBlobUrl) {\n <!-- Sandboxed iframe for rich HTML using blob URL.\n SECURITY: never add allow-same-origin here — a blob: URL inherits the app origin,\n so allow-same-origin + allow-scripts on LLM-produced HTML is in-origin XSS\n (script in the artifact could read the app's storage/cookies and DOM).\n Same pattern as whiteboard-srcdoc.pipe.ts. -->\n <iframe\n #htmlFrame\n [src]=\"htmlBlobUrl\"\n sandbox=\"allow-scripts allow-popups allow-popups-to-escape-sandbox allow-modals\"\n class=\"html-iframe\"\n (load)=\"onIframeLoad()\">\n </iframe>\n } @else if (displayMarkdown) {\n <div class=\"markdown-content\">\n <mj-markdown [data]=\"displayMarkdown\"\n [enableCollapsibleHeadings]=\"true\"\n [enableLineNumbers]=\"true\"\n [enableSmartypants]=\"true\"\n [enableHtml]=\"true\"></mj-markdown>\n </div>\n } @else {\n <div class=\"json-editor-container\">\n <mj-code-editor\n [(ngModel)]=\"jsonContent\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"width: 100%; height: 100%;\">\n </mj-code-editor>\n </div>\n }\n </div>\n </div>\n `,\n styles: [`\n .json-artifact-viewer {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .display-toolbar {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 8px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .btn-icon {\n padding: 6px 12px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong);\n border-radius: 4px;\n cursor: pointer;\n font-size: 12px;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.2s;\n }\n\n .btn-icon:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-text-disabled);\n }\n\n .display-content {\n flex: 1;\n overflow: auto;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n\n .html-iframe {\n width: 100%;\n border: none;\n background: var(--mj-bg-surface);\n display: block;\n /* The frame is cross-origin (sandbox without allow-same-origin), so script-driven\n auto-resize is unavailable — fill the container instead. */\n flex: 1;\n min-height: 0;\n }\n\n .markdown-content {\n flex: 1;\n padding: 20px;\n overflow: auto;\n min-height: 0;\n background: var(--mj-bg-surface);\n }\n\n .json-editor-container {\n flex: 1;\n overflow: auto;\n min-height: 0;\n }\n `]\n})\n@RegisterClass(BaseArtifactViewerPluginComponent, 'JsonArtifactViewerPlugin')\nexport class JsonArtifactViewerComponent extends BaseArtifactViewerPluginComponent implements OnInit, OnDestroy {\n @ViewChild('htmlFrame') htmlFrame?: ElementRef<HTMLIFrameElement>;\n\n public jsonContent = '';\n public displayMarkdown: string | null = null;\n public displayHtml: string | null = null;\n public htmlBlobUrl: SafeResourceUrl | null = null;\n private versionAttributes: MJArtifactVersionAttributeEntity[] = [];\n private unsafeBlobUrl: string | null = null; // Keep unsafe URL for cleanup\n\n /**\n * JSON artifacts always have content to display (JSON editor, displayHtml, or displayMarkdown)\n */\n public override get hasDisplayContent(): boolean {\n return true;\n }\n\n constructor(\n private cdr: ChangeDetectorRef,\n private sanitizer: DomSanitizer\n ) {\n super();\n }\n\n ngOnDestroy(): void {\n // Clean up blob URL to prevent memory leaks\n if (this.unsafeBlobUrl) {\n URL.revokeObjectURL(this.unsafeBlobUrl);\n this.unsafeBlobUrl = null;\n this.htmlBlobUrl = null;\n }\n }\n\n async ngOnInit(): Promise<void> {\n this.jsonContent = this.getContent();\n\n // Load version attributes to check for extract rules\n await this.loadVersionAttributes();\n\n // Trigger change detection after async load\n this.cdr.detectChanges();\n }\n\n /**\n * Override to return true when showing extracted displayHtml or displayMarkdown.\n * Returns false when showing raw JSON editor (no extract rules available).\n */\n public override get isShowingElevatedDisplay(): boolean {\n return !!(this.displayHtml || this.displayMarkdown);\n }\n\n /**\n * Override to tell parent whether to show raw JSON tab.\n * When showing elevated display (markdown/HTML), return true so parent shows JSON tab.\n * When showing raw JSON editor, return false (no need for duplicate JSON tab).\n */\n public override get parentShouldShowRawContent(): boolean {\n return this.isShowingElevatedDisplay;\n }\n\n private async loadVersionAttributes(): Promise<void> {\n if (!this.artifactVersion?.ID) {\n console.log('📦 JSON Plugin: No artifactVersion.ID, skipping attribute load');\n return;\n }\n\n console.log(`📦 JSON Plugin: Loading attributes for version ID: ${this.artifactVersion.ID}`);\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJArtifactVersionAttributeEntity>({\n EntityName: 'MJ: Artifact Version Attributes',\n ExtraFilter: `ArtifactVersionID='${this.artifactVersion.ID}'`,\n ResultType: 'entity_object'\n });\n\n console.log(`📦 JSON Plugin: RunView completed. Success=${result.Success}, Results count=${result.Results?.length || 0}`);\n\n if (result.Success && result.Results) {\n this.versionAttributes = result.Results;\n\n console.log(`📦 JSON Plugin: Loaded ${this.versionAttributes.length} attributes for version ${this.artifactVersion.ID}`);\n console.log(`📦 Attributes:`, this.versionAttributes.map(a => ({ name: a.Name, hasValue: !!a.Value })));\n\n // Check for displayHtml and displayMarkdown attributes (from extract rules)\n // Priority: displayHtml > displayMarkdown\n const displayHtmlAttr = this.versionAttributes.find(a => a.Name?.toLowerCase() === 'displayhtml');\n const displayMarkdownAttr = this.versionAttributes.find(a => a.Name?.toLowerCase() === 'displaymarkdown');\n\n console.log(`📦 displayHtmlAttr:`, displayHtmlAttr ? { name: displayHtmlAttr.Name, valueLength: displayHtmlAttr.Value?.length } : 'not found');\n console.log(`📦 displayMarkdownAttr:`, displayMarkdownAttr ? { name: displayMarkdownAttr.Name, valueLength: displayMarkdownAttr.Value?.length } : 'not found');\n\n // Parse attribute values - fix \"null\" string bug\n this.displayHtml = this.parseAttributeValue(displayHtmlAttr?.Value);\n this.displayMarkdown = this.parseAttributeValue(displayMarkdownAttr?.Value);\n\n // Clean up double-escaped characters in HTML (from LLM generation)\n if (this.displayHtml) {\n this.displayHtml = this.cleanEscapedCharacters(this.displayHtml);\n }\n\n // Create blob URL for HTML to avoid srcdoc sanitization issues\n if (this.displayHtml) {\n const blob = new Blob([this.displayHtml], { type: 'text/html' });\n this.unsafeBlobUrl = URL.createObjectURL(blob);\n // Sanitize the blob URL so Angular trusts it in the iframe\n this.htmlBlobUrl = this.sanitizer.bypassSecurityTrustResourceUrl(this.unsafeBlobUrl);\n }\n\n // Note: Markdown rendering is now handled by <mj-markdown> component in template\n\n console.log(`📦 JSON Plugin: displayHtml=${!!this.displayHtml} (${this.displayHtml?.length || 0} chars), displayMarkdown=${!!this.displayMarkdown} (${this.displayMarkdown?.length || 0} chars)`);\n console.log(`📦 isShowingElevatedDisplay=${this.isShowingElevatedDisplay}`);\n } else {\n console.log(`📦 JSON Plugin: No attributes found or query failed. Success=${result.Success}, ResultsLength=${result.Results?.length}`);\n }\n } catch (err) {\n console.error('📦 JSON Plugin: Error loading version attributes:', err);\n }\n }\n\n private parseAttributeValue(value: string | null | undefined): string | null {\n if (!value) return null;\n\n // Fix bug: Some extractors return string \"null\" instead of actual null\n if (value === 'null' || value.trim() === '') {\n return null;\n }\n\n try {\n // Try to parse as JSON first\n const parsed = JSON.parse(value);\n if (typeof parsed === 'string') {\n // Check if parsed string is also \"null\"\n if (parsed === 'null' || parsed.trim() === '') {\n return null;\n }\n return parsed;\n }\n return JSON.stringify(parsed, null, 2);\n } catch {\n // If not valid JSON, return as-is (unless it's \"null\")\n return value === 'null' ? null : value;\n }\n }\n\n /**\n * Returns the iframe's document when accessible, or null.\n * With allow-same-origin removed from the sandbox (see template), the frame is\n * cross-origin to the app: contentDocument returns null or the access throws a\n * SecurityError depending on the browser. Both outcomes are tolerated — the\n * style/resize enhancements below are optional niceties, not requirements.\n */\n private getIframeDocument(): Document | null {\n try {\n const iframe = this.htmlFrame?.nativeElement;\n if (!iframe) return null;\n return iframe.contentDocument || iframe.contentWindow?.document || null;\n } catch {\n return null;\n }\n }\n\n onIframeLoad(): void {\n // Inject base styles if HTML doesn't have them\n if (this.htmlFrame) {\n const iframeDoc = this.getIframeDocument();\n\n if (iframeDoc) {\n // Check if HTML already has styles\n const hasStyles = iframeDoc.querySelector('style') || iframeDoc.querySelector('link[rel=\"stylesheet\"]');\n\n if (!hasStyles) {\n // Inject minimal base styles for better defaults\n const style = iframeDoc.createElement('style');\n style.textContent = `\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n line-height: 1.6;\n color: #333;\n margin: 20px;\n padding: 0;\n }\n h1, h2, h3 { color: #2c3e50; margin-top: 1.5em; margin-bottom: 0.5em; }\n h1 { font-size: 2em; border-bottom: 2px solid #3498db; padding-bottom: 0.3em; }\n h2 { font-size: 1.5em; }\n table { border-collapse: collapse; width: 100%; margin: 1em 0; }\n th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }\n th { background-color: #f8f9fa; font-weight: 600; }\n pre { background: #f6f8fa; padding: 16px; border-radius: 6px; overflow-x: auto; }\n code { background: #f6f8fa; padding: 2px 6px; border-radius: 3px; font-family: monospace; }\n `;\n iframeDoc.head.appendChild(style);\n }\n\n // Inject width guardrails to prevent iframe content from causing horizontal overflow\n const widthOverride = iframeDoc.createElement('style');\n widthOverride.textContent = `\n html, body {\n max-width: 100% !important;\n overflow-x: hidden !important;\n }\n body {\n margin: 20px 10px 5px 20px !important; /* top right bottom left */\n padding: 0 !important;\n box-sizing: border-box !important;\n }\n img, svg, table, pre {\n max-width: 100% !important;\n }\n `;\n iframeDoc.head.appendChild(widthOverride);\n\n console.log('📦 Iframe loaded, hasStyles:', !!hasStyles);\n\n // Auto-resize iframe to fit content\n this.resizeIframeToContent();\n }\n }\n }\n\n private resizeIframeToContent(): void {\n if (this.htmlFrame) {\n const iframe = this.htmlFrame.nativeElement;\n // Cross-origin (sandboxed) frames yield no document — the CSS flex sizing on\n // .html-iframe is the fallback in that case.\n const iframeDoc = this.getIframeDocument();\n\n if (iframeDoc && iframeDoc.body) {\n // Get the actual content height\n const contentHeight = Math.max(\n iframeDoc.body.scrollHeight,\n iframeDoc.body.offsetHeight,\n iframeDoc.documentElement.scrollHeight,\n iframeDoc.documentElement.offsetHeight\n );\n\n // Set iframe height to match content (with a bit of padding)\n iframe.style.height = `${contentHeight + 20}px`;\n\n console.log('📦 Iframe resized - Height:', contentHeight + 20, 'px');\n }\n }\n }\n\n openInNewWindow(): void {\n if (this.displayHtml) {\n const newWindow = window.open('', '_blank');\n if (newWindow) {\n newWindow.document.write(this.displayHtml);\n newWindow.document.close();\n }\n }\n }\n\n printHtml(): void {\n if (this.htmlFrame) {\n try {\n const iframe = this.htmlFrame.nativeElement;\n const iframeWindow = iframe.contentWindow;\n if (iframeWindow) {\n iframeWindow.focus();\n iframeWindow.print();\n }\n } catch {\n // The sandboxed frame is cross-origin, so scripting into it can throw a\n // SecurityError in some browsers. Fall back to printing the host page,\n // which includes the rendered iframe content.\n window.print();\n }\n }\n }\n\n onCopy(): void {\n // Copy based on what's being displayed - prioritize displayHtml\n const content = this.displayHtml || this.displayMarkdown || this.jsonContent;\n if (content) {\n navigator.clipboard.writeText(content).then(() => {\n console.log('✅ Copied content to clipboard');\n }).catch(err => {\n console.error('Failed to copy to clipboard:', err);\n });\n }\n }\n\n public override GetCurrentStateSnapshot(): DataSnapshot | null {\n return createJsonSnapshot(this.getRawContent(), this.getDisplayTitle());\n }\n\n /**\n * Clean up double-escaped characters that appear in LLM-generated HTML\n * Removes literal \"\\\\n\", \"\\\\t\", and \"\\\\\\\"\" which cause rendering issues\n */\n private cleanEscapedCharacters(html: string): string {\n // Remove escaped quotes (\\\" becomes \")\n let cleaned = html.replace(/\\\\\"/g, '\"');\n\n // Remove escaped newlines (\\\\n becomes nothing)\n // HTML doesn't need whitespace for formatting, and these cause display issues\n cleaned = cleaned.replace(/\\\\n/g, '');\n\n // Remove escaped tabs\n cleaned = cleaned.replace(/\\\\t/g, '');\n\n // Remove double-escaped tabs\n cleaned = cleaned.replace(/\\\\\\\\t/g, '');\n\n // Remove double-escaped newlines\n cleaned = cleaned.replace(/\\\\\\\\n/g, '');\n\n return cleaned;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"json-artifact-viewer.component.js","sourceRoot":"","sources":["../../../../src/lib/components/plugins/json-artifact-viewer.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ViewChild, ElementRef } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseArtifactViewerPluginComponent } from '../base-artifact-viewer.component';\nimport { DataSnapshot, RunView } from '@memberjunction/core';\nimport { MJArtifactVersionAttributeEntity } from '@memberjunction/core-entities';\nimport { CreateJsonSnapshot } from '../../snapshot-helpers';\n\n/**\n * Viewer component for JSON artifacts.\n * Supports extract rules - shows displayMarkdown, displayHtml, or raw JSON editor (in that priority order).\n * All content is displayed in the parent's Display tab.\n */\n@Component({\n standalone: false,\n selector: 'mj-json-artifact-viewer',\n template: `\n <div class=\"json-artifact-viewer\" [ngClass]=\"cssClass\">\n <!-- Display toolbar -->\n <div class=\"display-toolbar\">\n <button class=\"btn-icon\" title=\"Copy Content\" (click)=\"onCopy()\">\n <i class=\"fas fa-copy\"></i> Copy\n </button>\n @if (displayHtml) {\n <button class=\"btn-icon\" title=\"Open in New Window\" (click)=\"openInNewWindow()\">\n <i class=\"fas fa-external-link-alt\"></i> New Window\n </button>\n <button class=\"btn-icon\" title=\"Print\" (click)=\"printHtml()\">\n <i class=\"fas fa-print\"></i> Print\n </button>\n }\n </div>\n\n <!-- Display content: priority order = displayHtml > displayMarkdown > JSON editor -->\n <div class=\"display-content\">\n @if (displayHtml && htmlBlobUrl) {\n <!-- Sandboxed iframe for rich HTML using blob URL.\n SECURITY: never add allow-same-origin here — a blob: URL inherits the app origin,\n so allow-same-origin + allow-scripts on LLM-produced HTML is in-origin XSS\n (script in the artifact could read the app's storage/cookies and DOM).\n Same pattern as whiteboard-srcdoc.pipe.ts. -->\n <iframe\n #htmlFrame\n [src]=\"htmlBlobUrl\"\n sandbox=\"allow-scripts allow-popups allow-popups-to-escape-sandbox allow-modals\"\n class=\"html-iframe\"\n (load)=\"onIframeLoad()\">\n </iframe>\n } @else if (displayMarkdown) {\n <div class=\"markdown-content\">\n <mj-markdown [data]=\"displayMarkdown\"\n [enableCollapsibleHeadings]=\"true\"\n [enableLineNumbers]=\"true\"\n [enableSmartypants]=\"true\"\n [enableHtml]=\"true\"></mj-markdown>\n </div>\n } @else {\n <div class=\"json-editor-container\">\n <mj-code-editor\n [(ngModel)]=\"jsonContent\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"width: 100%; height: 100%;\">\n </mj-code-editor>\n </div>\n }\n </div>\n </div>\n `,\n styles: [`\n .json-artifact-viewer {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .display-toolbar {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 8px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .btn-icon {\n padding: 6px 12px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong);\n border-radius: 4px;\n cursor: pointer;\n font-size: 12px;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.2s;\n }\n\n .btn-icon:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-text-disabled);\n }\n\n .display-content {\n flex: 1;\n overflow: auto;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n\n .html-iframe {\n width: 100%;\n border: none;\n background: var(--mj-bg-surface);\n display: block;\n /* The frame is cross-origin (sandbox without allow-same-origin), so script-driven\n auto-resize is unavailable — fill the container instead. */\n flex: 1;\n min-height: 0;\n }\n\n .markdown-content {\n flex: 1;\n padding: 20px;\n overflow: auto;\n min-height: 0;\n background: var(--mj-bg-surface);\n }\n\n .json-editor-container {\n flex: 1;\n overflow: auto;\n min-height: 0;\n }\n `]\n})\n@RegisterClass(BaseArtifactViewerPluginComponent, 'JsonArtifactViewerPlugin')\nexport class JsonArtifactViewerComponent extends BaseArtifactViewerPluginComponent implements OnInit, OnDestroy {\n @ViewChild('htmlFrame') HtmlFrame?: ElementRef<HTMLIFrameElement>;\n\n /** @deprecated Use {@link HtmlFrame}. */\n get htmlFrame(): ElementRef<HTMLIFrameElement> | undefined {\n return this.HtmlFrame;\n }\n /** @deprecated Use {@link HtmlFrame}. */\n set htmlFrame(value: ElementRef<HTMLIFrameElement> | undefined) {\n this.HtmlFrame = value;\n }\n\n public JsonContent = '';\n\n /** @deprecated Use {@link JsonContent}. */\n public get jsonContent() {\n return this.JsonContent;\n }\n /** @deprecated Use {@link JsonContent}. */\n public set jsonContent(value) {\n this.JsonContent = value;\n }\n public DisplayMarkdown: string | null = null;\n\n /** @deprecated Use {@link DisplayMarkdown}. */\n public get displayMarkdown(): string | null {\n return this.DisplayMarkdown;\n }\n /** @deprecated Use {@link DisplayMarkdown}. */\n public set displayMarkdown(value: string | null) {\n this.DisplayMarkdown = value;\n }\n public DisplayHtml: string | null = null;\n\n /** @deprecated Use {@link DisplayHtml}. */\n public get displayHtml(): string | null {\n return this.DisplayHtml;\n }\n /** @deprecated Use {@link DisplayHtml}. */\n public set displayHtml(value: string | null) {\n this.DisplayHtml = value;\n }\n public HtmlBlobUrl: SafeResourceUrl | null = null;\n\n /** @deprecated Use {@link HtmlBlobUrl}. */\n public get htmlBlobUrl(): SafeResourceUrl | null {\n return this.HtmlBlobUrl;\n }\n /** @deprecated Use {@link HtmlBlobUrl}. */\n public set htmlBlobUrl(value: SafeResourceUrl | null) {\n this.HtmlBlobUrl = value;\n }\n private versionAttributes: MJArtifactVersionAttributeEntity[] = [];\n private unsafeBlobUrl: string | null = null; // Keep unsafe URL for cleanup\n\n /**\n * JSON artifacts always have content to display (JSON editor, displayHtml, or displayMarkdown)\n */\n public override get hasDisplayContent(): boolean {\n return true;\n }\n\n constructor(\n private cdr: ChangeDetectorRef,\n private sanitizer: DomSanitizer\n ) {\n super();\n }\n\n ngOnDestroy(): void {\n // Clean up blob URL to prevent memory leaks\n if (this.unsafeBlobUrl) {\n URL.revokeObjectURL(this.unsafeBlobUrl);\n this.unsafeBlobUrl = null;\n this.HtmlBlobUrl = null;\n }\n }\n\n async ngOnInit(): Promise<void> {\n this.JsonContent = this.getContent();\n\n // Load version attributes to check for extract rules\n await this.loadVersionAttributes();\n\n // Trigger change detection after async load\n this.cdr.detectChanges();\n }\n\n /**\n * Override to return true when showing extracted displayHtml or displayMarkdown.\n * Returns false when showing raw JSON editor (no extract rules available).\n */\n public override get isShowingElevatedDisplay(): boolean {\n return !!(this.DisplayHtml || this.DisplayMarkdown);\n }\n\n /**\n * Override to tell parent whether to show raw JSON tab.\n * When showing elevated display (markdown/HTML), return true so parent shows JSON tab.\n * When showing raw JSON editor, return false (no need for duplicate JSON tab).\n */\n public override get parentShouldShowRawContent(): boolean {\n return this.isShowingElevatedDisplay;\n }\n\n private async loadVersionAttributes(): Promise<void> {\n if (!this.artifactVersion?.ID) {\n console.log('📦 JSON Plugin: No artifactVersion.ID, skipping attribute load');\n return;\n }\n\n console.log(`📦 JSON Plugin: Loading attributes for version ID: ${this.artifactVersion.ID}`);\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJArtifactVersionAttributeEntity>({\n EntityName: 'MJ: Artifact Version Attributes',\n ExtraFilter: `ArtifactVersionID='${this.artifactVersion.ID}'`,\n ResultType: 'entity_object'\n });\n\n console.log(`📦 JSON Plugin: RunView completed. Success=${result.Success}, Results count=${result.Results?.length || 0}`);\n\n if (result.Success && result.Results) {\n this.versionAttributes = result.Results;\n\n console.log(`📦 JSON Plugin: Loaded ${this.versionAttributes.length} attributes for version ${this.artifactVersion.ID}`);\n console.log(`📦 Attributes:`, this.versionAttributes.map(a => ({ name: a.Name, hasValue: !!a.Value })));\n\n // Check for displayHtml and displayMarkdown attributes (from extract rules)\n // Priority: displayHtml > displayMarkdown\n const displayHtmlAttr = this.versionAttributes.find(a => a.Name?.toLowerCase() === 'displayhtml');\n const displayMarkdownAttr = this.versionAttributes.find(a => a.Name?.toLowerCase() === 'displaymarkdown');\n\n console.log(`📦 displayHtmlAttr:`, displayHtmlAttr ? { name: displayHtmlAttr.Name, valueLength: displayHtmlAttr.Value?.length } : 'not found');\n console.log(`📦 displayMarkdownAttr:`, displayMarkdownAttr ? { name: displayMarkdownAttr.Name, valueLength: displayMarkdownAttr.Value?.length } : 'not found');\n\n // Parse attribute values - fix \"null\" string bug\n this.DisplayHtml = this.parseAttributeValue(displayHtmlAttr?.Value);\n this.DisplayMarkdown = this.parseAttributeValue(displayMarkdownAttr?.Value);\n\n // Clean up double-escaped characters in HTML (from LLM generation)\n if (this.DisplayHtml) {\n this.DisplayHtml = this.cleanEscapedCharacters(this.DisplayHtml);\n }\n\n // Create blob URL for HTML to avoid srcdoc sanitization issues\n if (this.DisplayHtml) {\n const blob = new Blob([this.DisplayHtml], { type: 'text/html' });\n this.unsafeBlobUrl = URL.createObjectURL(blob);\n // Sanitize the blob URL so Angular trusts it in the iframe\n this.HtmlBlobUrl = this.sanitizer.bypassSecurityTrustResourceUrl(this.unsafeBlobUrl);\n }\n\n // Note: Markdown rendering is now handled by <mj-markdown> component in template\n\n console.log(`📦 JSON Plugin: displayHtml=${!!this.DisplayHtml} (${this.DisplayHtml?.length || 0} chars), displayMarkdown=${!!this.DisplayMarkdown} (${this.DisplayMarkdown?.length || 0} chars)`);\n console.log(`📦 isShowingElevatedDisplay=${this.isShowingElevatedDisplay}`);\n } else {\n console.log(`📦 JSON Plugin: No attributes found or query failed. Success=${result.Success}, ResultsLength=${result.Results?.length}`);\n }\n } catch (err) {\n console.error('📦 JSON Plugin: Error loading version attributes:', err);\n }\n }\n\n private parseAttributeValue(value: string | null | undefined): string | null {\n if (!value) return null;\n\n // Fix bug: Some extractors return string \"null\" instead of actual null\n if (value === 'null' || value.trim() === '') {\n return null;\n }\n\n try {\n // Try to parse as JSON first\n const parsed = JSON.parse(value);\n if (typeof parsed === 'string') {\n // Check if parsed string is also \"null\"\n if (parsed === 'null' || parsed.trim() === '') {\n return null;\n }\n return parsed;\n }\n return JSON.stringify(parsed, null, 2);\n } catch {\n // If not valid JSON, return as-is (unless it's \"null\")\n return value === 'null' ? null : value;\n }\n }\n\n /**\n * Returns the iframe's document when accessible, or null.\n * With allow-same-origin removed from the sandbox (see template), the frame is\n * cross-origin to the app: contentDocument returns null or the access throws a\n * SecurityError depending on the browser. Both outcomes are tolerated — the\n * style/resize enhancements below are optional niceties, not requirements.\n */\n private getIframeDocument(): Document | null {\n try {\n const iframe = this.HtmlFrame?.nativeElement;\n if (!iframe) return null;\n return iframe.contentDocument || iframe.contentWindow?.document || null;\n } catch {\n return null;\n }\n }\n\n OnIframeLoad(): void {\n // Inject base styles if HTML doesn't have them\n if (this.HtmlFrame) {\n const iframeDoc = this.getIframeDocument();\n\n if (iframeDoc) {\n // Check if HTML already has styles\n const hasStyles = iframeDoc.querySelector('style') || iframeDoc.querySelector('link[rel=\"stylesheet\"]');\n\n if (!hasStyles) {\n // Inject minimal base styles for better defaults\n const style = iframeDoc.createElement('style');\n style.textContent = `\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n line-height: 1.6;\n color: #333;\n margin: 20px;\n padding: 0;\n }\n h1, h2, h3 { color: #2c3e50; margin-top: 1.5em; margin-bottom: 0.5em; }\n h1 { font-size: 2em; border-bottom: 2px solid #3498db; padding-bottom: 0.3em; }\n h2 { font-size: 1.5em; }\n table { border-collapse: collapse; width: 100%; margin: 1em 0; }\n th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }\n th { background-color: #f8f9fa; font-weight: 600; }\n pre { background: #f6f8fa; padding: 16px; border-radius: 6px; overflow-x: auto; }\n code { background: #f6f8fa; padding: 2px 6px; border-radius: 3px; font-family: monospace; }\n `;\n iframeDoc.head.appendChild(style);\n }\n\n // Inject width guardrails to prevent iframe content from causing horizontal overflow\n const widthOverride = iframeDoc.createElement('style');\n widthOverride.textContent = `\n html, body {\n max-width: 100% !important;\n overflow-x: hidden !important;\n }\n body {\n margin: 20px 10px 5px 20px !important; /* top right bottom left */\n padding: 0 !important;\n box-sizing: border-box !important;\n }\n img, svg, table, pre {\n max-width: 100% !important;\n }\n `;\n iframeDoc.head.appendChild(widthOverride);\n\n console.log('📦 Iframe loaded, hasStyles:', !!hasStyles);\n\n // Auto-resize iframe to fit content\n this.resizeIframeToContent();\n }\n }\n }\n\n /** @deprecated Use {@link OnIframeLoad}. */\n onIframeLoad(): void {\n return this.OnIframeLoad();\n }\n\n private resizeIframeToContent(): void {\n if (this.HtmlFrame) {\n const iframe = this.HtmlFrame.nativeElement;\n // Cross-origin (sandboxed) frames yield no document — the CSS flex sizing on\n // .html-iframe is the fallback in that case.\n const iframeDoc = this.getIframeDocument();\n\n if (iframeDoc && iframeDoc.body) {\n // Get the actual content height\n const contentHeight = Math.max(\n iframeDoc.body.scrollHeight,\n iframeDoc.body.offsetHeight,\n iframeDoc.documentElement.scrollHeight,\n iframeDoc.documentElement.offsetHeight\n );\n\n // Set iframe height to match content (with a bit of padding)\n iframe.style.height = `${contentHeight + 20}px`;\n\n console.log('📦 Iframe resized - Height:', contentHeight + 20, 'px');\n }\n }\n }\n\n OpenInNewWindow(): void {\n if (this.DisplayHtml) {\n const newWindow = window.open('', '_blank');\n if (newWindow) {\n newWindow.document.write(this.DisplayHtml);\n newWindow.document.close();\n }\n }\n }\n\n /** @deprecated Use {@link OpenInNewWindow}. */\n openInNewWindow(): void {\n return this.OpenInNewWindow();\n }\n\n PrintHtml(): void {\n if (this.HtmlFrame) {\n try {\n const iframe = this.HtmlFrame.nativeElement;\n const iframeWindow = iframe.contentWindow;\n if (iframeWindow) {\n iframeWindow.focus();\n iframeWindow.print();\n }\n } catch {\n // The sandboxed frame is cross-origin, so scripting into it can throw a\n // SecurityError in some browsers. Fall back to printing the host page,\n // which includes the rendered iframe content.\n window.print();\n }\n }\n }\n\n /** @deprecated Use {@link PrintHtml}. */\n printHtml(): void {\n return this.PrintHtml();\n }\n\n OnCopy(): void {\n // Copy based on what's being displayed - prioritize displayHtml\n const content = this.DisplayHtml || this.DisplayMarkdown || this.JsonContent;\n if (content) {\n navigator.clipboard.writeText(content).then(() => {\n console.log('✅ Copied content to clipboard');\n }).catch(err => {\n console.error('Failed to copy to clipboard:', err);\n });\n }\n }\n\n /** @deprecated Use {@link OnCopy}. */\n onCopy(): void {\n return this.OnCopy();\n }\n\n public override GetCurrentStateSnapshot(): DataSnapshot | null {\n return CreateJsonSnapshot(this.getRawContent(), this.getDisplayTitle());\n }\n\n /**\n * Clean up double-escaped characters that appear in LLM-generated HTML\n * Removes literal \"\\\\n\", \"\\\\t\", and \"\\\\\\\"\" which cause rendering issues\n */\n private cleanEscapedCharacters(html: string): string {\n // Remove escaped quotes (\\\" becomes \")\n let cleaned = html.replace(/\\\\\"/g, '\"');\n\n // Remove escaped newlines (\\\\n becomes nothing)\n // HTML doesn't need whitespace for formatting, and these cause display issues\n cleaned = cleaned.replace(/\\\\n/g, '');\n\n // Remove escaped tabs\n cleaned = cleaned.replace(/\\\\t/g, '');\n\n // Remove double-escaped tabs\n cleaned = cleaned.replace(/\\\\\\\\t/g, '');\n\n // Remove double-escaped newlines\n cleaned = cleaned.replace(/\\\\\\\\n/g, '');\n\n return cleaned;\n }\n}\n"]}
|
|
@@ -5,14 +5,24 @@ import * as i0 from "@angular/core";
|
|
|
5
5
|
* Viewer component for Markdown artifacts
|
|
6
6
|
*/
|
|
7
7
|
export declare class MarkdownArtifactViewerComponent extends BaseArtifactViewerPluginComponent {
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
MarkdownContent: string;
|
|
9
|
+
/** @deprecated Use {@link MarkdownContent}. */
|
|
10
|
+
get markdownContent(): string;
|
|
11
|
+
/** @deprecated Use {@link MarkdownContent}. */
|
|
12
|
+
set markdownContent(value: string);
|
|
13
|
+
ViewMode: 'preview' | 'source';
|
|
14
|
+
/** @deprecated Use {@link ViewMode}. */
|
|
15
|
+
get viewMode(): 'preview' | 'source';
|
|
16
|
+
/** @deprecated Use {@link ViewMode}. */
|
|
17
|
+
set viewMode(value: 'preview' | 'source');
|
|
10
18
|
/**
|
|
11
19
|
* Markdown artifacts always have content to display
|
|
12
20
|
*/
|
|
13
21
|
get hasDisplayContent(): boolean;
|
|
14
22
|
ngOnInit(): void;
|
|
15
23
|
GetCurrentStateSnapshot(): DataSnapshot | null;
|
|
24
|
+
OnCopy(): void;
|
|
25
|
+
/** @deprecated Use {@link OnCopy}. */
|
|
16
26
|
onCopy(): void;
|
|
17
27
|
static ɵfac: i0.ɵɵFactoryDeclaration<MarkdownArtifactViewerComponent, never>;
|
|
18
28
|
static ɵcmp: i0.ɵɵComponentDeclaration<MarkdownArtifactViewerComponent, "mj-markdown-artifact-viewer", never, {}, {}, never, never, false, never>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-artifact-viewer.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/plugins/markdown-artifact-viewer.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,iCAAiC,EAAE,MAAM,mCAAmC,CAAC;;AAGtF;;GAEG;AACH,qBAkJa,+BAAgC,SAAQ,iCAAiC;IAC7E,eAAe,SAAM;
|
|
1
|
+
{"version":3,"file":"markdown-artifact-viewer.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/plugins/markdown-artifact-viewer.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,iCAAiC,EAAE,MAAM,mCAAmC,CAAC;;AAGtF;;GAEG;AACH,qBAkJa,+BAAgC,SAAQ,iCAAiC;IAC7E,eAAe,SAAM;IAE5B,+CAA+C;IAC/C,IAAW,eAAe,WAEzB;IACD,+CAA+C;IAC/C,IAAW,eAAe,CAAC,KAAK,QAAA,EAE/B;IACM,QAAQ,EAAE,SAAS,GAAG,QAAQ,CAAa;IAElD,wCAAwC;IACxC,IAAW,QAAQ,IAAI,SAAS,GAAG,QAAQ,CAE1C;IACD,wCAAwC;IACxC,IAAW,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,QAAQ,EAE9C;IAED;;OAEG;IACH,IAAoB,iBAAiB,IAAI,OAAO,CAE/C;IAED,QAAQ,IAAI,IAAI;IAIA,uBAAuB,IAAI,YAAY,GAAG,IAAI;IAI9D,MAAM,IAAI,IAAI;IAUd,sCAAsC;IACtC,MAAM,IAAI,IAAI;yCAhDH,+BAA+B;2CAA/B,+BAA+B;CAmD3C"}
|
|
@@ -7,7 +7,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
7
7
|
import { Component } from '@angular/core';
|
|
8
8
|
import { RegisterClass } from '@memberjunction/global';
|
|
9
9
|
import { BaseArtifactViewerPluginComponent } from '../base-artifact-viewer.component';
|
|
10
|
-
import {
|
|
10
|
+
import { CreateMarkdownSnapshot } from '../../snapshot-helpers';
|
|
11
11
|
import * as i0 from "@angular/core";
|
|
12
12
|
import * as i1 from "@angular/common";
|
|
13
13
|
import * as i2 from "@angular/forms";
|
|
@@ -36,8 +36,24 @@ function MarkdownArtifactViewerComponent_Conditional_13_Template(rf, ctx) { if (
|
|
|
36
36
|
* Viewer component for Markdown artifacts
|
|
37
37
|
*/
|
|
38
38
|
let MarkdownArtifactViewerComponent = class MarkdownArtifactViewerComponent extends BaseArtifactViewerPluginComponent {
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
MarkdownContent = '';
|
|
40
|
+
/** @deprecated Use {@link MarkdownContent}. */
|
|
41
|
+
get markdownContent() {
|
|
42
|
+
return this.MarkdownContent;
|
|
43
|
+
}
|
|
44
|
+
/** @deprecated Use {@link MarkdownContent}. */
|
|
45
|
+
set markdownContent(value) {
|
|
46
|
+
this.MarkdownContent = value;
|
|
47
|
+
}
|
|
48
|
+
ViewMode = 'preview';
|
|
49
|
+
/** @deprecated Use {@link ViewMode}. */
|
|
50
|
+
get viewMode() {
|
|
51
|
+
return this.ViewMode;
|
|
52
|
+
}
|
|
53
|
+
/** @deprecated Use {@link ViewMode}. */
|
|
54
|
+
set viewMode(value) {
|
|
55
|
+
this.ViewMode = value;
|
|
56
|
+
}
|
|
41
57
|
/**
|
|
42
58
|
* Markdown artifacts always have content to display
|
|
43
59
|
*/
|
|
@@ -45,20 +61,24 @@ let MarkdownArtifactViewerComponent = class MarkdownArtifactViewerComponent exte
|
|
|
45
61
|
return true;
|
|
46
62
|
}
|
|
47
63
|
ngOnInit() {
|
|
48
|
-
this.
|
|
64
|
+
this.MarkdownContent = this.getContent();
|
|
49
65
|
}
|
|
50
66
|
GetCurrentStateSnapshot() {
|
|
51
|
-
return
|
|
67
|
+
return CreateMarkdownSnapshot(this.getRawContent(), this.getDisplayTitle());
|
|
52
68
|
}
|
|
53
|
-
|
|
54
|
-
if (this.
|
|
55
|
-
navigator.clipboard.writeText(this.
|
|
69
|
+
OnCopy() {
|
|
70
|
+
if (this.MarkdownContent) {
|
|
71
|
+
navigator.clipboard.writeText(this.MarkdownContent).then(() => {
|
|
56
72
|
console.log('✅ Copied markdown to clipboard');
|
|
57
73
|
}).catch(err => {
|
|
58
74
|
console.error('Failed to copy to clipboard:', err);
|
|
59
75
|
});
|
|
60
76
|
}
|
|
61
77
|
}
|
|
78
|
+
/** @deprecated Use {@link OnCopy}. */
|
|
79
|
+
onCopy() {
|
|
80
|
+
return this.OnCopy();
|
|
81
|
+
}
|
|
62
82
|
static ɵfac = /*@__PURE__*/ (() => { let ɵMarkdownArtifactViewerComponent_BaseFactory; return function MarkdownArtifactViewerComponent_Factory(__ngFactoryType__) { return (ɵMarkdownArtifactViewerComponent_BaseFactory || (ɵMarkdownArtifactViewerComponent_BaseFactory = i0.ɵɵgetInheritedFactory(MarkdownArtifactViewerComponent)))(__ngFactoryType__ || MarkdownArtifactViewerComponent); }; })();
|
|
63
83
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MarkdownArtifactViewerComponent, selectors: [["mj-markdown-artifact-viewer"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 14, vars: 6, consts: [[1, "markdown-artifact-viewer", 3, "ngClass"], [1, "markdown-toolbar"], ["title", "Preview", 1, "btn-icon", 3, "click"], [1, "fas", "fa-eye"], ["title", "Source", 1, "btn-icon", 3, "click"], [1, "fas", "fa-code"], ["title", "Copy Markdown", 1, "btn-icon", 3, "click"], [1, "fas", "fa-copy"], [1, "markdown-content-container"], [1, "markdown-preview"], [2, "width", "100%", "height", "100%", 3, "ngModel", "language", "readonly"], [3, "data", "enableCollapsibleHeadings", "enableLineNumbers", "enableSmartypants", "enableHtml"], [2, "width", "100%", "height", "100%", 3, "ngModelChange", "ngModel", "language", "readonly"]], template: function MarkdownArtifactViewerComponent_Template(rf, ctx) { if (rf & 1) {
|
|
64
84
|
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "button", 2);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-artifact-viewer.component.js","sourceRoot":"","sources":["../../../../src/lib/components/plugins/markdown-artifact-viewer.component.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,iCAAiC,EAAE,MAAM,mCAAmC,CAAC;AACtF,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;;;;;;;IAyBtD,8BAA8B;IAC5B,kCAI+C;IACjD,iBAAM;;;IALS,cAAwB;IAIxB,AADA,AADA,AADA,AADA,6CAAwB,mCACU,2BACR,2BACA,oBACP;;;;IAGlC,0CAIqC;IAHnC,+UAA6B;IAI/B,iBAAiB;;;IAJf,sDAA6B;IAE7B,AADA,qCAAuB,6BACF;;AAlCjC;;GAEG;AAmJI,IAAM,+BAA+B,GAArC,MAAM,+BAAgC,SAAQ,iCAAiC;IAC7E,eAAe,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"markdown-artifact-viewer.component.js","sourceRoot":"","sources":["../../../../src/lib/components/plugins/markdown-artifact-viewer.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component } from '@angular/core';\nimport { DataSnapshot } from '@memberjunction/core';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseArtifactViewerPluginComponent } from '../base-artifact-viewer.component';\nimport { CreateMarkdownSnapshot } from '../../snapshot-helpers';\n\n/**\n * Viewer component for Markdown artifacts\n */\n@Component({\n standalone: false,\n selector: 'mj-markdown-artifact-viewer',\n template: `\n <div class=\"markdown-artifact-viewer\" [ngClass]=\"cssClass\">\n <div class=\"markdown-toolbar\">\n <button class=\"btn-icon\" [class.active]=\"viewMode === 'preview'\"\n title=\"Preview\" (click)=\"viewMode = 'preview'\">\n <i class=\"fas fa-eye\"></i> Preview\n </button>\n <button class=\"btn-icon\" [class.active]=\"viewMode === 'source'\"\n title=\"Source\" (click)=\"viewMode = 'source'\">\n <i class=\"fas fa-code\"></i> Source\n </button>\n <button class=\"btn-icon\" title=\"Copy Markdown\" (click)=\"onCopy()\">\n <i class=\"fas fa-copy\"></i> Copy\n </button>\n </div>\n <div class=\"markdown-content-container\">\n @if (viewMode === 'preview') {\n <div class=\"markdown-preview\">\n <mj-markdown [data]=\"markdownContent\"\n [enableCollapsibleHeadings]=\"true\"\n [enableLineNumbers]=\"true\"\n [enableSmartypants]=\"true\"\n [enableHtml]=\"true\"></mj-markdown>\n </div>\n } @else {\n <mj-code-editor\n [(ngModel)]=\"markdownContent\"\n [language]=\"'markdown'\"\n [readonly]=\"readonly\"\n style=\"width: 100%; height: 100%;\">\n </mj-code-editor>\n }\n </div>\n </div>\n `,\n styles: [`\n .markdown-artifact-viewer {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .markdown-toolbar {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n gap: 8px;\n padding: 8px;\n background: #f5f5f5;\n border-bottom: 1px solid #ddd;\n }\n\n .btn-icon {\n padding: 6px 12px;\n background: white;\n border: 1px solid #ccc;\n border-radius: 4px;\n cursor: pointer;\n font-size: 12px;\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .btn-icon:hover {\n background: #e9ecef;\n border-color: #999;\n }\n\n .btn-icon.active {\n background: #007acc;\n color: white;\n border-color: #007acc;\n }\n\n .markdown-content-container {\n flex: 1;\n overflow: auto;\n }\n\n .markdown-preview {\n padding: 20px;\n background: white;\n height: 100%;\n overflow: auto;\n }\n\n .markdown-preview ::ng-deep h1 {\n font-size: 2em;\n margin-top: 0.67em;\n margin-bottom: 0.67em;\n border-bottom: 1px solid #eaecef;\n padding-bottom: 0.3em;\n }\n\n .markdown-preview ::ng-deep h2 {\n font-size: 1.5em;\n margin-top: 0.83em;\n margin-bottom: 0.83em;\n border-bottom: 1px solid #eaecef;\n padding-bottom: 0.3em;\n }\n\n .markdown-preview ::ng-deep code {\n background: #f6f8fa;\n padding: 2px 6px;\n border-radius: 3px;\n font-family: monospace;\n }\n\n .markdown-preview ::ng-deep pre {\n background: #f6f8fa;\n padding: 16px;\n border-radius: 6px;\n overflow: auto;\n }\n\n .markdown-preview ::ng-deep blockquote {\n border-left: 4px solid #dfe2e5;\n padding-left: 16px;\n color: #6a737d;\n margin: 0;\n }\n\n .markdown-preview ::ng-deep table {\n border-collapse: collapse;\n width: 100%;\n margin: 16px 0;\n }\n\n .markdown-preview ::ng-deep th,\n .markdown-preview ::ng-deep td {\n border: 1px solid #dfe2e5;\n padding: 8px 16px;\n }\n\n .markdown-preview ::ng-deep th {\n background: #f6f8fa;\n font-weight: 600;\n }\n `]\n})\n@RegisterClass(BaseArtifactViewerPluginComponent, 'MarkdownArtifactViewerPlugin')\nexport class MarkdownArtifactViewerComponent extends BaseArtifactViewerPluginComponent {\n public MarkdownContent = '';\n\n /** @deprecated Use {@link MarkdownContent}. */\n public get markdownContent() {\n return this.MarkdownContent;\n }\n /** @deprecated Use {@link MarkdownContent}. */\n public set markdownContent(value) {\n this.MarkdownContent = value;\n }\n public ViewMode: 'preview' | 'source' = 'preview';\n\n /** @deprecated Use {@link ViewMode}. */\n public get viewMode(): 'preview' | 'source' {\n return this.ViewMode;\n }\n /** @deprecated Use {@link ViewMode}. */\n public set viewMode(value: 'preview' | 'source') {\n this.ViewMode = value;\n }\n\n /**\n * Markdown artifacts always have content to display\n */\n public override get hasDisplayContent(): boolean {\n return true;\n }\n\n ngOnInit(): void {\n this.MarkdownContent = this.getContent();\n }\n\n public override GetCurrentStateSnapshot(): DataSnapshot | null {\n return CreateMarkdownSnapshot(this.getRawContent(), this.getDisplayTitle());\n }\n\n OnCopy(): void {\n if (this.MarkdownContent) {\n navigator.clipboard.writeText(this.MarkdownContent).then(() => {\n console.log('✅ Copied markdown to clipboard');\n }).catch(err => {\n console.error('Failed to copy to clipboard:', err);\n });\n }\n }\n\n /** @deprecated Use {@link OnCopy}. */\n onCopy(): void {\n return this.OnCopy();\n }\n}\n"]}
|
|
@@ -217,8 +217,12 @@ export declare class MLExperimentResultsViewerComponent extends BaseArtifactView
|
|
|
217
217
|
/** Return the value if it's a finite number, else null. */
|
|
218
218
|
private firstDefined;
|
|
219
219
|
/** Format a numeric score for display (3 decimals, trimmed). */
|
|
220
|
+
FormatScore(value: number | null): string;
|
|
221
|
+
/** @deprecated Use {@link FormatScore}. */
|
|
220
222
|
formatScore(value: number | null): string;
|
|
221
223
|
/** Format an importance weight for the small bar label. */
|
|
224
|
+
FormatImportance(value: number): string;
|
|
225
|
+
/** @deprecated Use {@link FormatImportance}. */
|
|
222
226
|
formatImportance(value: number): string;
|
|
223
227
|
static ɵfac: i0.ɵɵFactoryDeclaration<MLExperimentResultsViewerComponent, never>;
|
|
224
228
|
static ɵcmp: i0.ɵɵComponentDeclaration<MLExperimentResultsViewerComponent, "mj-ml-experiment-results-viewer", never, {}, { "navigationRequest": "navigationRequest"; }, never, never, false, never>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ml-experiment-results-viewer.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/plugins/ml-experiment-results-viewer.component.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ml-experiment-results-viewer.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/plugins/ml-experiment-results-viewer.component.ts"],"names":[],"mappings":"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"}
|