@memberjunction/ng-artifacts 6.2.0-edge.0 → 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 +107 -29
- 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
|
@@ -50,9 +50,25 @@ let DocxArtifactViewerComponent = class DocxArtifactViewerComponent extends Base
|
|
|
50
50
|
sanitizer;
|
|
51
51
|
cdr;
|
|
52
52
|
isLoading = true;
|
|
53
|
-
|
|
53
|
+
IsDownloading = false;
|
|
54
|
+
/** @deprecated Use {@link IsDownloading}. */
|
|
55
|
+
get isDownloading() {
|
|
56
|
+
return this.IsDownloading;
|
|
57
|
+
}
|
|
58
|
+
/** @deprecated Use {@link IsDownloading}. */
|
|
59
|
+
set isDownloading(value) {
|
|
60
|
+
this.IsDownloading = value;
|
|
61
|
+
}
|
|
54
62
|
errorMessage = '';
|
|
55
|
-
|
|
63
|
+
SafeHtml = '';
|
|
64
|
+
/** @deprecated Use {@link SafeHtml}. */
|
|
65
|
+
get safeHtml() {
|
|
66
|
+
return this.SafeHtml;
|
|
67
|
+
}
|
|
68
|
+
/** @deprecated Use {@link SafeHtml}. */
|
|
69
|
+
set safeHtml(value) {
|
|
70
|
+
this.SafeHtml = value;
|
|
71
|
+
}
|
|
56
72
|
/** Raw HTML produced by mammoth — kept for print. */
|
|
57
73
|
rawHtml = '';
|
|
58
74
|
downloadUrl = '';
|
|
@@ -68,26 +84,34 @@ let DocxArtifactViewerComponent = class DocxArtifactViewerComponent extends Base
|
|
|
68
84
|
async ngOnInit() {
|
|
69
85
|
await this.loadDocument();
|
|
70
86
|
}
|
|
71
|
-
async
|
|
72
|
-
if (!this.downloadUrl || this.
|
|
87
|
+
async OnDownload() {
|
|
88
|
+
if (!this.downloadUrl || this.IsDownloading) {
|
|
73
89
|
return;
|
|
74
90
|
}
|
|
75
|
-
this.
|
|
91
|
+
this.IsDownloading = true;
|
|
76
92
|
this.cdr.markForCheck();
|
|
77
93
|
try {
|
|
78
94
|
await this.triggerBrowserDownload(this.downloadUrl, this.artifactVersion?.FileName || 'document.docx');
|
|
79
95
|
}
|
|
80
96
|
finally {
|
|
81
|
-
this.
|
|
97
|
+
this.IsDownloading = false;
|
|
82
98
|
this.cdr.markForCheck();
|
|
83
99
|
}
|
|
84
100
|
}
|
|
85
|
-
|
|
101
|
+
/** @deprecated Use {@link OnDownload}. */
|
|
102
|
+
async onDownload() {
|
|
103
|
+
return this.OnDownload();
|
|
104
|
+
}
|
|
105
|
+
OnPrint() {
|
|
86
106
|
if (!this.rawHtml) {
|
|
87
107
|
return;
|
|
88
108
|
}
|
|
89
109
|
this.openPrintWindow(this.rawHtml);
|
|
90
110
|
}
|
|
111
|
+
/** @deprecated Use {@link OnPrint}. */
|
|
112
|
+
onPrint() {
|
|
113
|
+
return this.OnPrint();
|
|
114
|
+
}
|
|
91
115
|
// ─── Private helpers ────────────────────────────────────────────────────────
|
|
92
116
|
async loadDocument() {
|
|
93
117
|
if (!this.artifactVersion?.ID) {
|
|
@@ -115,7 +139,7 @@ let DocxArtifactViewerComponent = class DocxArtifactViewerComponent extends Base
|
|
|
115
139
|
const html = await this.convertDocxToHtml(arrayBuffer);
|
|
116
140
|
this.rawHtml = html;
|
|
117
141
|
const sanitized = this.sanitizer.sanitize(SecurityContext.HTML, html) ?? '';
|
|
118
|
-
this.
|
|
142
|
+
this.SafeHtml = sanitized;
|
|
119
143
|
this.isLoading = false;
|
|
120
144
|
this.cdr.markForCheck();
|
|
121
145
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docx-artifact-viewer.component.js","sourceRoot":"","sources":["../../../../src/lib/components/plugins/docx-artifact-viewer.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, ChangeDetectorRef, SecurityContext } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { RegisterClass } from '@memberjunction/global';\nimport { DataSnapshot } from '@memberjunction/core';\nimport { BaseArtifactViewerPluginComponent } from '../base-artifact-viewer.component';\nimport { ArtifactFileService } from '../../services/artifact-file.service';\n\n/**\n * Viewer plugin for Word (DOCX) artifact versions stored in MJStorage.\n *\n * Downloads the binary file, converts it to HTML using mammoth.js, then\n * sanitizes the HTML before binding it with [innerHTML].\n *\n * Printing opens the sanitized content in a child window so the browser's\n * native print dialog renders the Word document faithfully.\n */\n@Component({\n standalone: false,\n selector: 'mj-docx-artifact-viewer',\n template: `\n <div class=\"docx-viewer\">\n <mj-file-artifact-toolbar\n [fileName]=\"artifactVersion.FileName || 'document.docx'\"\n [isDownloading]=\"isDownloading\"\n [showPrint]=\"true\"\n (download)=\"onDownload()\"\n (print)=\"onPrint()\"\n >\n </mj-file-artifact-toolbar>\n\n <div class=\"docx-viewer__body\">\n @if (isLoading) {\n <div class=\"docx-viewer__state\">\n <i class=\"fas fa-spinner fa-spin\"></i>\n <span>Loading document…</span>\n </div>\n } @else if (errorMessage) {\n <div class=\"docx-viewer__state docx-viewer__state--error\">\n <i class=\"fas fa-exclamation-triangle\"></i>\n <span>{{ errorMessage }}</span>\n </div>\n } @else {\n <div class=\"docx-viewer__content\" [innerHTML]=\"safeHtml\"></div>\n }\n </div>\n </div>\n `,\n styles: [\n `\n .docx-viewer {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface);\n }\n\n .docx-viewer__body {\n flex: 1;\n min-height: 0;\n overflow: auto;\n }\n\n .docx-viewer__state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n height: 100%;\n color: var(--mj-text-muted);\n font-size: 14px;\n }\n\n .docx-viewer__state--error {\n color: var(--mj-status-error-text);\n }\n\n .docx-viewer__content {\n padding: 32px 48px;\n max-width: 900px;\n margin: 0 auto;\n color: var(--mj-text-primary);\n font-size: 14px;\n line-height: 1.7;\n }\n\n /* Normalize headings produced by mammoth */\n .docx-viewer__content :is(h1, h2, h3, h4, h5, h6) {\n color: var(--mj-text-primary);\n margin-top: 1.5em;\n margin-bottom: 0.5em;\n }\n\n .docx-viewer__content table {\n border-collapse: collapse;\n width: 100%;\n margin: 1em 0;\n }\n\n .docx-viewer__content :is(td, th) {\n border: 1px solid var(--mj-border-default);\n padding: 6px 10px;\n }\n\n .docx-viewer__content th {\n background: var(--mj-bg-surface-card);\n font-weight: 600;\n }\n\n .docx-viewer__content a {\n color: var(--mj-text-link);\n }\n\n .docx-viewer__content img {\n max-width: 100%;\n height: auto;\n }\n `,\n ],\n})\n@RegisterClass(BaseArtifactViewerPluginComponent, 'DocxArtifactViewerPlugin')\nexport class DocxArtifactViewerComponent extends BaseArtifactViewerPluginComponent implements OnInit {\n public isLoading = true;\n public isDownloading = false;\n public errorMessage = '';\n public safeHtml: SafeHtml = '';\n\n /** Raw HTML produced by mammoth — kept for print. */\n private rawHtml = '';\n private downloadUrl = '';\n\n constructor(\n private fileService: ArtifactFileService,\n private sanitizer: DomSanitizer,\n private cdr: ChangeDetectorRef,\n ) {\n super();\n }\n\n public override get hasDisplayContent(): boolean {\n return true;\n }\n\n async ngOnInit(): Promise<void> {\n await this.loadDocument();\n }\n\n public async onDownload(): Promise<void> {\n if (!this.downloadUrl || this.isDownloading) {\n return;\n }\n this.isDownloading = true;\n this.cdr.markForCheck();\n try {\n await this.triggerBrowserDownload(this.downloadUrl, this.artifactVersion?.FileName || 'document.docx');\n } finally {\n this.isDownloading = false;\n this.cdr.markForCheck();\n }\n }\n\n public onPrint(): void {\n if (!this.rawHtml) {\n return;\n }\n this.openPrintWindow(this.rawHtml);\n }\n\n // ─── Private helpers ────────────────────────────────────────────────────────\n\n private async loadDocument(): Promise<void> {\n if (!this.artifactVersion?.ID) {\n this.showError('No artifact version provided.');\n return;\n }\n\n try {\n let arrayBuffer: ArrayBuffer;\n\n if (this.artifactVersion.ContentMode === 'File') {\n // File-backed: download from storage via pre-auth URL\n this.downloadUrl = await this.fileService.getDownloadUrl(this.artifactVersion.ID);\n arrayBuffer = await this.fetchAsArrayBuffer(this.downloadUrl);\n } else {\n // Inline: content is a base64 data URL stored in the artifact version\n const content = this.artifactVersion.Content;\n if (!content) {\n this.showError('Artifact has no content.');\n return;\n }\n arrayBuffer = this.fileService.dataUrlToArrayBuffer(content);\n // Create an object URL for download support\n this.downloadUrl = this.fileService.dataUrlToObjectUrl(\n content,\n this.artifactVersion.MimeType || 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n );\n }\n\n const html = await this.convertDocxToHtml(arrayBuffer);\n this.rawHtml = html;\n const sanitized = this.sanitizer.sanitize(SecurityContext.HTML, html) ?? '';\n this.safeHtml = sanitized;\n this.isLoading = false;\n this.cdr.markForCheck();\n } catch (err) {\n this.showError(`Could not load document: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n private async convertDocxToHtml(arrayBuffer: ArrayBuffer): Promise<string> {\n const mammoth = await import('mammoth');\n const result = await mammoth.convertToHtml({ arrayBuffer });\n if (result.messages?.length) {\n // Log warnings from mammoth (e.g. unsupported features) without breaking display\n result.messages.forEach((m) => console.warn('[DocxViewer] mammoth:', m.message));\n }\n return result.value;\n }\n\n private async fetchAsArrayBuffer(url: string): Promise<ArrayBuffer> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status} fetching file`);\n }\n return response.arrayBuffer();\n }\n\n /** Open a minimal print window containing only the document HTML. */\n private openPrintWindow(html: string): void {\n const printWindow = window.open('', '_blank', 'width=900,height=700');\n if (!printWindow) {\n console.warn('[DocxViewer] Popup was blocked — cannot print');\n return;\n }\n printWindow.document.write(`\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <title>${this.artifactVersion?.FileName ?? 'Document'}</title>\n <style>\n body { font-family: Georgia, serif; font-size: 13pt; line-height: 1.6; margin: 2cm; color: #000; }\n table { border-collapse: collapse; width: 100%; }\n td, th { border: 1px solid #999; padding: 4px 8px; }\n th { background: #eee; font-weight: bold; }\n img { max-width: 100%; }\n </style>\n </head>\n <body>${html}</body>\n </html>\n `);\n printWindow.document.close();\n printWindow.focus();\n printWindow.print();\n printWindow.close();\n }\n\n private showError(message: string): void {\n this.isLoading = false;\n this.errorMessage = message;\n this.cdr.markForCheck();\n }\n\n public override GetCurrentStateSnapshot(): DataSnapshot | null {\n const snap = new DataSnapshot();\n snap.title = this.getDisplayTitle() ?? undefined;\n snap.interpretation = 'Word document (.docx).';\n snap.custom = {\n fileName: this.artifactVersion.FileName ?? undefined,\n mimeType: this.artifactVersion.MimeType ?? 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n contentMode: this.artifactVersion.ContentMode,\n };\n return snap;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"docx-artifact-viewer.component.js","sourceRoot":"","sources":["../../../../src/lib/components/plugins/docx-artifact-viewer.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, ChangeDetectorRef, SecurityContext } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { RegisterClass } from '@memberjunction/global';\nimport { DataSnapshot } from '@memberjunction/core';\nimport { BaseArtifactViewerPluginComponent } from '../base-artifact-viewer.component';\nimport { ArtifactFileService } from '../../services/artifact-file.service';\n\n/**\n * Viewer plugin for Word (DOCX) artifact versions stored in MJStorage.\n *\n * Downloads the binary file, converts it to HTML using mammoth.js, then\n * sanitizes the HTML before binding it with [innerHTML].\n *\n * Printing opens the sanitized content in a child window so the browser's\n * native print dialog renders the Word document faithfully.\n */\n@Component({\n standalone: false,\n selector: 'mj-docx-artifact-viewer',\n template: `\n <div class=\"docx-viewer\">\n <mj-file-artifact-toolbar\n [fileName]=\"artifactVersion.FileName || 'document.docx'\"\n [isDownloading]=\"isDownloading\"\n [showPrint]=\"true\"\n (download)=\"onDownload()\"\n (print)=\"onPrint()\"\n >\n </mj-file-artifact-toolbar>\n\n <div class=\"docx-viewer__body\">\n @if (isLoading) {\n <div class=\"docx-viewer__state\">\n <i class=\"fas fa-spinner fa-spin\"></i>\n <span>Loading document…</span>\n </div>\n } @else if (errorMessage) {\n <div class=\"docx-viewer__state docx-viewer__state--error\">\n <i class=\"fas fa-exclamation-triangle\"></i>\n <span>{{ errorMessage }}</span>\n </div>\n } @else {\n <div class=\"docx-viewer__content\" [innerHTML]=\"safeHtml\"></div>\n }\n </div>\n </div>\n `,\n styles: [\n `\n .docx-viewer {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface);\n }\n\n .docx-viewer__body {\n flex: 1;\n min-height: 0;\n overflow: auto;\n }\n\n .docx-viewer__state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n height: 100%;\n color: var(--mj-text-muted);\n font-size: 14px;\n }\n\n .docx-viewer__state--error {\n color: var(--mj-status-error-text);\n }\n\n .docx-viewer__content {\n padding: 32px 48px;\n max-width: 900px;\n margin: 0 auto;\n color: var(--mj-text-primary);\n font-size: 14px;\n line-height: 1.7;\n }\n\n /* Normalize headings produced by mammoth */\n .docx-viewer__content :is(h1, h2, h3, h4, h5, h6) {\n color: var(--mj-text-primary);\n margin-top: 1.5em;\n margin-bottom: 0.5em;\n }\n\n .docx-viewer__content table {\n border-collapse: collapse;\n width: 100%;\n margin: 1em 0;\n }\n\n .docx-viewer__content :is(td, th) {\n border: 1px solid var(--mj-border-default);\n padding: 6px 10px;\n }\n\n .docx-viewer__content th {\n background: var(--mj-bg-surface-card);\n font-weight: 600;\n }\n\n .docx-viewer__content a {\n color: var(--mj-text-link);\n }\n\n .docx-viewer__content img {\n max-width: 100%;\n height: auto;\n }\n `,\n ],\n})\n@RegisterClass(BaseArtifactViewerPluginComponent, 'DocxArtifactViewerPlugin')\nexport class DocxArtifactViewerComponent extends BaseArtifactViewerPluginComponent implements OnInit {\n public isLoading = true;\n public IsDownloading = false;\n\n /** @deprecated Use {@link IsDownloading}. */\n public get isDownloading() {\n return this.IsDownloading;\n }\n /** @deprecated Use {@link IsDownloading}. */\n public set isDownloading(value) {\n this.IsDownloading = value;\n }\n public errorMessage = '';\n public SafeHtml: SafeHtml = '';\n\n /** @deprecated Use {@link SafeHtml}. */\n public get safeHtml(): SafeHtml {\n return this.SafeHtml;\n }\n /** @deprecated Use {@link SafeHtml}. */\n public set safeHtml(value: SafeHtml) {\n this.SafeHtml = value;\n }\n\n /** Raw HTML produced by mammoth — kept for print. */\n private rawHtml = '';\n private downloadUrl = '';\n\n constructor(\n private fileService: ArtifactFileService,\n private sanitizer: DomSanitizer,\n private cdr: ChangeDetectorRef,\n ) {\n super();\n }\n\n public override get hasDisplayContent(): boolean {\n return true;\n }\n\n async ngOnInit(): Promise<void> {\n await this.loadDocument();\n }\n\n public async OnDownload(): Promise<void> {\n if (!this.downloadUrl || this.IsDownloading) {\n return;\n }\n this.IsDownloading = true;\n this.cdr.markForCheck();\n try {\n await this.triggerBrowserDownload(this.downloadUrl, this.artifactVersion?.FileName || 'document.docx');\n } finally {\n this.IsDownloading = false;\n this.cdr.markForCheck();\n }\n }\n\n /** @deprecated Use {@link OnDownload}. */\n public async onDownload(): Promise<void> {\n return this.OnDownload();\n }\n\n public OnPrint(): void {\n if (!this.rawHtml) {\n return;\n }\n this.openPrintWindow(this.rawHtml);\n }\n\n /** @deprecated Use {@link OnPrint}. */\n public onPrint(): void {\n return this.OnPrint();\n }\n\n // ─── Private helpers ────────────────────────────────────────────────────────\n\n private async loadDocument(): Promise<void> {\n if (!this.artifactVersion?.ID) {\n this.showError('No artifact version provided.');\n return;\n }\n\n try {\n let arrayBuffer: ArrayBuffer;\n\n if (this.artifactVersion.ContentMode === 'File') {\n // File-backed: download from storage via pre-auth URL\n this.downloadUrl = await this.fileService.getDownloadUrl(this.artifactVersion.ID);\n arrayBuffer = await this.fetchAsArrayBuffer(this.downloadUrl);\n } else {\n // Inline: content is a base64 data URL stored in the artifact version\n const content = this.artifactVersion.Content;\n if (!content) {\n this.showError('Artifact has no content.');\n return;\n }\n arrayBuffer = this.fileService.dataUrlToArrayBuffer(content);\n // Create an object URL for download support\n this.downloadUrl = this.fileService.dataUrlToObjectUrl(\n content,\n this.artifactVersion.MimeType || 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n );\n }\n\n const html = await this.convertDocxToHtml(arrayBuffer);\n this.rawHtml = html;\n const sanitized = this.sanitizer.sanitize(SecurityContext.HTML, html) ?? '';\n this.SafeHtml = sanitized;\n this.isLoading = false;\n this.cdr.markForCheck();\n } catch (err) {\n this.showError(`Could not load document: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n private async convertDocxToHtml(arrayBuffer: ArrayBuffer): Promise<string> {\n const mammoth = await import('mammoth');\n const result = await mammoth.convertToHtml({ arrayBuffer });\n if (result.messages?.length) {\n // Log warnings from mammoth (e.g. unsupported features) without breaking display\n result.messages.forEach((m) => console.warn('[DocxViewer] mammoth:', m.message));\n }\n return result.value;\n }\n\n private async fetchAsArrayBuffer(url: string): Promise<ArrayBuffer> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status} fetching file`);\n }\n return response.arrayBuffer();\n }\n\n /** Open a minimal print window containing only the document HTML. */\n private openPrintWindow(html: string): void {\n const printWindow = window.open('', '_blank', 'width=900,height=700');\n if (!printWindow) {\n console.warn('[DocxViewer] Popup was blocked — cannot print');\n return;\n }\n printWindow.document.write(`\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <title>${this.artifactVersion?.FileName ?? 'Document'}</title>\n <style>\n body { font-family: Georgia, serif; font-size: 13pt; line-height: 1.6; margin: 2cm; color: #000; }\n table { border-collapse: collapse; width: 100%; }\n td, th { border: 1px solid #999; padding: 4px 8px; }\n th { background: #eee; font-weight: bold; }\n img { max-width: 100%; }\n </style>\n </head>\n <body>${html}</body>\n </html>\n `);\n printWindow.document.close();\n printWindow.focus();\n printWindow.print();\n printWindow.close();\n }\n\n private showError(message: string): void {\n this.isLoading = false;\n this.errorMessage = message;\n this.cdr.markForCheck();\n }\n\n public override GetCurrentStateSnapshot(): DataSnapshot | null {\n const snap = new DataSnapshot();\n snap.title = this.getDisplayTitle() ?? undefined;\n snap.interpretation = 'Word document (.docx).';\n snap.custom = {\n fileName: this.artifactVersion.FileName ?? undefined,\n mimeType: this.artifactVersion.MimeType ?? 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n contentMode: this.artifactVersion.ContentMode,\n };\n return snap;\n }\n}\n"]}
|
|
@@ -7,9 +7,21 @@ import * as i0 from "@angular/core";
|
|
|
7
7
|
*/
|
|
8
8
|
export declare class HtmlArtifactViewerComponent extends BaseArtifactViewerPluginComponent {
|
|
9
9
|
private sanitizer;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
HtmlContent: string;
|
|
11
|
+
/** @deprecated Use {@link HtmlContent}. */
|
|
12
|
+
get htmlContent(): string;
|
|
13
|
+
/** @deprecated Use {@link HtmlContent}. */
|
|
14
|
+
set htmlContent(value: string);
|
|
15
|
+
SafeHtmlContent: SafeHtml;
|
|
16
|
+
/** @deprecated Use {@link SafeHtmlContent}. */
|
|
17
|
+
get safeHtmlContent(): SafeHtml;
|
|
18
|
+
/** @deprecated Use {@link SafeHtmlContent}. */
|
|
19
|
+
set safeHtmlContent(value: SafeHtml);
|
|
20
|
+
ViewMode: 'preview' | 'source';
|
|
21
|
+
/** @deprecated Use {@link ViewMode}. */
|
|
22
|
+
get viewMode(): 'preview' | 'source';
|
|
23
|
+
/** @deprecated Use {@link ViewMode}. */
|
|
24
|
+
set viewMode(value: 'preview' | 'source');
|
|
13
25
|
/**
|
|
14
26
|
* HTML artifacts always have content to display
|
|
15
27
|
*/
|
|
@@ -17,6 +29,8 @@ export declare class HtmlArtifactViewerComponent extends BaseArtifactViewerPlugi
|
|
|
17
29
|
constructor(sanitizer: DomSanitizer);
|
|
18
30
|
ngOnInit(): void;
|
|
19
31
|
GetCurrentStateSnapshot(): DataSnapshot | null;
|
|
32
|
+
OnCopy(): void;
|
|
33
|
+
/** @deprecated Use {@link OnCopy}. */
|
|
20
34
|
onCopy(): void;
|
|
21
35
|
static ɵfac: i0.ɵɵFactoryDeclaration<HtmlArtifactViewerComponent, never>;
|
|
22
36
|
static ɵcmp: i0.ɵɵComponentDeclaration<HtmlArtifactViewerComponent, "mj-html-artifact-viewer", never, {}, {}, never, never, false, never>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-artifact-viewer.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/plugins/html-artifact-viewer.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,iCAAiC,EAAE,MAAM,mCAAmC,CAAC;;AAEtF;;GAEG;AACH,qBAwFa,2BAA4B,SAAQ,iCAAiC;
|
|
1
|
+
{"version":3,"file":"html-artifact-viewer.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/plugins/html-artifact-viewer.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,iCAAiC,EAAE,MAAM,mCAAmC,CAAC;;AAEtF;;GAEG;AACH,qBAwFa,2BAA4B,SAAQ,iCAAiC;IAuCpE,OAAO,CAAC,SAAS;IAtCtB,WAAW,SAAM;IAExB,2CAA2C;IAC3C,IAAW,WAAW,WAErB;IACD,2CAA2C;IAC3C,IAAW,WAAW,CAAC,KAAK,QAAA,EAE3B;IACM,eAAe,EAAE,QAAQ,CAAM;IAEtC,+CAA+C;IAC/C,IAAW,eAAe,IAAI,QAAQ,CAErC;IACD,+CAA+C;IAC/C,IAAW,eAAe,CAAC,KAAK,EAAE,QAAQ,EAEzC;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;gBAEmB,SAAS,EAAE,YAAY;IAI3C,QAAQ,IAAI,IAAI;IAqBA,uBAAuB,IAAI,YAAY,GAAG,IAAI;IAS9D,MAAM,IAAI,IAAI;IAUd,sCAAsC;IACtC,MAAM,IAAI,IAAI;yCApFH,2BAA2B;2CAA3B,2BAA2B;CAuFvC"}
|
|
@@ -37,9 +37,33 @@ function HtmlArtifactViewerComponent_Conditional_13_Template(rf, ctx) { if (rf &
|
|
|
37
37
|
*/
|
|
38
38
|
let HtmlArtifactViewerComponent = class HtmlArtifactViewerComponent extends BaseArtifactViewerPluginComponent {
|
|
39
39
|
sanitizer;
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
HtmlContent = '';
|
|
41
|
+
/** @deprecated Use {@link HtmlContent}. */
|
|
42
|
+
get htmlContent() {
|
|
43
|
+
return this.HtmlContent;
|
|
44
|
+
}
|
|
45
|
+
/** @deprecated Use {@link HtmlContent}. */
|
|
46
|
+
set htmlContent(value) {
|
|
47
|
+
this.HtmlContent = value;
|
|
48
|
+
}
|
|
49
|
+
SafeHtmlContent = '';
|
|
50
|
+
/** @deprecated Use {@link SafeHtmlContent}. */
|
|
51
|
+
get safeHtmlContent() {
|
|
52
|
+
return this.SafeHtmlContent;
|
|
53
|
+
}
|
|
54
|
+
/** @deprecated Use {@link SafeHtmlContent}. */
|
|
55
|
+
set safeHtmlContent(value) {
|
|
56
|
+
this.SafeHtmlContent = value;
|
|
57
|
+
}
|
|
58
|
+
ViewMode = 'preview';
|
|
59
|
+
/** @deprecated Use {@link ViewMode}. */
|
|
60
|
+
get viewMode() {
|
|
61
|
+
return this.ViewMode;
|
|
62
|
+
}
|
|
63
|
+
/** @deprecated Use {@link ViewMode}. */
|
|
64
|
+
set viewMode(value) {
|
|
65
|
+
this.ViewMode = value;
|
|
66
|
+
}
|
|
43
67
|
/**
|
|
44
68
|
* HTML artifacts always have content to display
|
|
45
69
|
*/
|
|
@@ -63,8 +87,8 @@ let HtmlArtifactViewerComponent = class HtmlArtifactViewerComponent extends Base
|
|
|
63
87
|
// Also remove double-escaped tabs if present
|
|
64
88
|
content = content.replace(/\\t/g, '');
|
|
65
89
|
content = content.replace(/\\\\t/g, '');
|
|
66
|
-
this.
|
|
67
|
-
this.
|
|
90
|
+
this.HtmlContent = content;
|
|
91
|
+
this.SafeHtmlContent = this.sanitizer.sanitize(1, this.HtmlContent) || '';
|
|
68
92
|
}
|
|
69
93
|
GetCurrentStateSnapshot() {
|
|
70
94
|
const content = this.getRawContent();
|
|
@@ -75,15 +99,19 @@ let HtmlArtifactViewerComponent = class HtmlArtifactViewerComponent extends Base
|
|
|
75
99
|
snap.custom = { content };
|
|
76
100
|
return snap;
|
|
77
101
|
}
|
|
78
|
-
|
|
79
|
-
if (this.
|
|
80
|
-
navigator.clipboard.writeText(this.
|
|
102
|
+
OnCopy() {
|
|
103
|
+
if (this.HtmlContent) {
|
|
104
|
+
navigator.clipboard.writeText(this.HtmlContent).then(() => {
|
|
81
105
|
console.log('✅ Copied HTML to clipboard');
|
|
82
106
|
}).catch(err => {
|
|
83
107
|
console.error('Failed to copy to clipboard:', err);
|
|
84
108
|
});
|
|
85
109
|
}
|
|
86
110
|
}
|
|
111
|
+
/** @deprecated Use {@link OnCopy}. */
|
|
112
|
+
onCopy() {
|
|
113
|
+
return this.OnCopy();
|
|
114
|
+
}
|
|
87
115
|
static ɵfac = function HtmlArtifactViewerComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || HtmlArtifactViewerComponent)(i0.ɵɵdirectiveInject(i1.DomSanitizer)); };
|
|
88
116
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: HtmlArtifactViewerComponent, selectors: [["mj-html-artifact-viewer"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 14, vars: 6, consts: [[1, "html-artifact-viewer", 3, "ngClass"], [1, "html-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 HTML", 1, "btn-icon", 3, "click"], [1, "fas", "fa-copy"], [1, "html-content-container"], [1, "html-preview"], [2, "width", "100%", "height", "100%", 3, "ngModel", "language", "readonly"], [3, "innerHTML"], [2, "width", "100%", "height", "100%", 3, "ngModelChange", "ngModel", "language", "readonly"]], template: function HtmlArtifactViewerComponent_Template(rf, ctx) { if (rf & 1) {
|
|
89
117
|
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "button", 2);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-artifact-viewer.component.js","sourceRoot":"","sources":["../../../../src/lib/components/plugins/html-artifact-viewer.component.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,iCAAiC,EAAE,MAAM,mCAAmC,CAAC;;;;;;;IAyB5E,8BAA0B;IACxB,0BAAyC;IAC3C,iBAAM;;;IADC,cAA6B;IAA7B,qEAA6B;;;;IAGpC,0CAIqC;IAHnC,mUAAyB;IAI3B,iBAAiB;;;IAJf,kDAAyB;IAEzB,AADA,iCAAmB,6BACE;;AA9BjC;;GAEG;AAyFI,IAAM,2BAA2B,GAAjC,MAAM,2BAA4B,SAAQ,iCAAiC;
|
|
1
|
+
{"version":3,"file":"html-artifact-viewer.component.js","sourceRoot":"","sources":["../../../../src/lib/components/plugins/html-artifact-viewer.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { DataSnapshot } from '@memberjunction/core';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseArtifactViewerPluginComponent } from '../base-artifact-viewer.component';\n\n/**\n * Viewer component for HTML artifacts\n */\n@Component({\n standalone: false,\n selector: 'mj-html-artifact-viewer',\n template: `\n <div class=\"html-artifact-viewer\" [ngClass]=\"cssClass\">\n <div class=\"html-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 HTML\" (click)=\"onCopy()\">\n <i class=\"fas fa-copy\"></i> Copy\n </button>\n </div>\n <div class=\"html-content-container\">\n @if (viewMode === 'preview') {\n <div class=\"html-preview\">\n <div [innerHTML]=\"safeHtmlContent\"></div>\n </div>\n } @else {\n <mj-code-editor\n [(ngModel)]=\"htmlContent\"\n [language]=\"'html'\"\n [readonly]=\"readonly\"\n style=\"width: 100%; height: 100%;\">\n </mj-code-editor>\n }\n </div>\n </div>\n `,\n styles: [`\n .html-artifact-viewer {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .html-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 .html-content-container {\n flex: 1;\n overflow: auto;\n }\n\n .html-preview {\n padding: 20px;\n background: white;\n height: 100%;\n overflow: auto;\n }\n `]\n})\n@RegisterClass(BaseArtifactViewerPluginComponent, 'HtmlArtifactViewerPlugin')\nexport class HtmlArtifactViewerComponent extends BaseArtifactViewerPluginComponent {\n public HtmlContent = '';\n\n /** @deprecated Use {@link HtmlContent}. */\n public get htmlContent() {\n return this.HtmlContent;\n }\n /** @deprecated Use {@link HtmlContent}. */\n public set htmlContent(value) {\n this.HtmlContent = value;\n }\n public SafeHtmlContent: SafeHtml = '';\n\n /** @deprecated Use {@link SafeHtmlContent}. */\n public get safeHtmlContent(): SafeHtml {\n return this.SafeHtmlContent;\n }\n /** @deprecated Use {@link SafeHtmlContent}. */\n public set safeHtmlContent(value: SafeHtml) {\n this.SafeHtmlContent = 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 * HTML artifacts always have content to display\n */\n public override get hasDisplayContent(): boolean {\n return true;\n }\n\n constructor(private sanitizer: DomSanitizer) {\n super();\n }\n\n ngOnInit(): void {\n // Get content and clean up double-escaped characters that can appear in LLM-generated HTML\n // These appear as literal \"\\\\n\", \"\\\\t\", \"\\\\\\\"\" in the string and cause rendering issues\n let content = this.getContent();\n\n // Remove escaped quotes (\\\" becomes \")\n content = content.replace(/\\\\\"/g, '\"');\n\n // Remove double-escaped newlines (\\\\n becomes nothing)\n // HTML doesn't need whitespace for formatting, and these cause display issues\n content = content.replace(/\\\\n/g, '');\n content = content.replace(/\\\\\\\\n/g, '');\n\n // Also remove double-escaped tabs if present\n content = content.replace(/\\\\t/g, '');\n content = content.replace(/\\\\\\\\t/g, '');\n\n this.HtmlContent = content;\n this.SafeHtmlContent = this.sanitizer.sanitize(1, this.HtmlContent) || '';\n }\n\n public override GetCurrentStateSnapshot(): DataSnapshot | null {\n const content = this.getRawContent();\n if (!content) return null;\n const snap = new DataSnapshot();\n snap.title = this.getDisplayTitle() ?? undefined;\n snap.custom = { content };\n return snap;\n }\n\n OnCopy(): void {\n if (this.HtmlContent) {\n navigator.clipboard.writeText(this.HtmlContent).then(() => {\n console.log('✅ Copied HTML 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"]}
|
|
@@ -28,6 +28,8 @@ export declare const IMAGE_MIME_EXTENSION_MAP: Readonly<Record<string, string>>;
|
|
|
28
28
|
* @param mime MIME type from the artifact version (e.g. `"image/jpeg"`). Optional.
|
|
29
29
|
* @returns Sanitized filename with extension (e.g. `"Generated_image_1.jpg"`).
|
|
30
30
|
*/
|
|
31
|
+
export declare function BuildImageDownloadFileName(name: string | null | undefined, mime: string | null | undefined): string;
|
|
32
|
+
/** @deprecated Use {@link BuildImageDownloadFileName}. */
|
|
31
33
|
export declare function buildImageDownloadFileName(name: string | null | undefined, mime: string | null | undefined): string;
|
|
32
34
|
/**
|
|
33
35
|
* Viewer plugin for raster image artifact versions (`image/png`, `image/jpeg`,
|
|
@@ -61,18 +63,38 @@ export declare class ImageArtifactViewerComponent extends BaseArtifactViewerPlug
|
|
|
61
63
|
private fileService;
|
|
62
64
|
private cdr;
|
|
63
65
|
/** Current resolved URL to bind to the `<img src>` — either a data URI (inline) or a pre-auth URL (file). */
|
|
64
|
-
|
|
66
|
+
ImageUrl: string;
|
|
67
|
+
/** @deprecated Use {@link ImageUrl}. */
|
|
68
|
+
get imageUrl(): string;
|
|
69
|
+
/** @deprecated Use {@link ImageUrl}. */
|
|
70
|
+
set imageUrl(value: string);
|
|
65
71
|
/** True from `ngOnInit` until the `<img>` `(load)` event fires (or an error happens). */
|
|
66
72
|
isLoading: boolean;
|
|
67
73
|
/** Set while the download is in flight, to drive the toolbar spinner. */
|
|
68
|
-
|
|
74
|
+
IsDownloading: boolean;
|
|
75
|
+
/** @deprecated Use {@link IsDownloading}. */
|
|
76
|
+
get isDownloading(): boolean;
|
|
77
|
+
/** @deprecated Use {@link IsDownloading}. */
|
|
78
|
+
set isDownloading(value: boolean);
|
|
69
79
|
/** User-facing error message; non-empty hides the image and shows the error block. */
|
|
70
80
|
errorMessage: string;
|
|
71
81
|
/** Click-to-toggle display mode. `'fit'` = contained in the panel, `'actual'` = 1:1 with scroll. */
|
|
72
|
-
|
|
82
|
+
DisplayMode: 'fit' | 'actual';
|
|
83
|
+
/** @deprecated Use {@link DisplayMode}. */
|
|
84
|
+
get displayMode(): 'fit' | 'actual';
|
|
85
|
+
/** @deprecated Use {@link DisplayMode}. */
|
|
86
|
+
set displayMode(value: 'fit' | 'actual');
|
|
73
87
|
/** Native image dimensions, populated by the `(load)` event. Null until then. */
|
|
74
|
-
|
|
75
|
-
|
|
88
|
+
NaturalWidth: number | null;
|
|
89
|
+
/** @deprecated Use {@link NaturalWidth}. */
|
|
90
|
+
get naturalWidth(): number | null;
|
|
91
|
+
/** @deprecated Use {@link NaturalWidth}. */
|
|
92
|
+
set naturalWidth(value: number | null);
|
|
93
|
+
NaturalHeight: number | null;
|
|
94
|
+
/** @deprecated Use {@link NaturalHeight}. */
|
|
95
|
+
get naturalHeight(): number | null;
|
|
96
|
+
/** @deprecated Use {@link NaturalHeight}. */
|
|
97
|
+
set naturalHeight(value: number | null);
|
|
76
98
|
/**
|
|
77
99
|
* Object URL we lazily build from inline data so Download / Print have a real
|
|
78
100
|
* URL to anchor on. Tracked here so `ngOnDestroy` can release it via
|
|
@@ -92,8 +114,12 @@ export declare class ImageArtifactViewerComponent extends BaseArtifactViewerPlug
|
|
|
92
114
|
/** Opt in to the wrapper's "Display" tab — without this the panel only shows Details/JSON. */
|
|
93
115
|
get hasDisplayContent(): boolean;
|
|
94
116
|
/** Filename surfaced by the toolbar in the center of the bar. */
|
|
117
|
+
get ToolbarFileName(): string;
|
|
118
|
+
/** @deprecated Use {@link ToolbarFileName}. */
|
|
95
119
|
get toolbarFileName(): string;
|
|
96
120
|
/** Accessible alt text — prefers a descriptive name over a raw filename. */
|
|
121
|
+
get ImageAltText(): string;
|
|
122
|
+
/** @deprecated Use {@link ImageAltText}. */
|
|
97
123
|
get imageAltText(): string;
|
|
98
124
|
ngOnInit(): Promise<void>;
|
|
99
125
|
ngOnDestroy(): void;
|
|
@@ -103,21 +129,31 @@ export declare class ImageArtifactViewerComponent extends BaseArtifactViewerPlug
|
|
|
103
129
|
* Loading state remains `true` until the browser fires `(load)` on the `<img>`.
|
|
104
130
|
*/
|
|
105
131
|
private resolveImageUrl;
|
|
132
|
+
OnImageLoad(event: Event): void;
|
|
133
|
+
/** @deprecated Use {@link OnImageLoad}. */
|
|
106
134
|
onImageLoad(event: Event): void;
|
|
135
|
+
OnImageError(): void;
|
|
136
|
+
/** @deprecated Use {@link OnImageError}. */
|
|
107
137
|
onImageError(): void;
|
|
108
138
|
private showError;
|
|
139
|
+
ToggleDisplayMode(): void;
|
|
140
|
+
/** @deprecated Use {@link ToggleDisplayMode}. */
|
|
109
141
|
toggleDisplayMode(): void;
|
|
110
142
|
/**
|
|
111
143
|
* Download the image to disk. Uses the inherited `triggerBrowserDownload`
|
|
112
144
|
* helper so the fetch → blob → object-URL → anchor pattern is shared across
|
|
113
145
|
* every file-backed viewer (PDF, XLSX, DOCX, and now Image).
|
|
114
146
|
*/
|
|
147
|
+
OnDownload(): Promise<void>;
|
|
148
|
+
/** @deprecated Use {@link OnDownload}. */
|
|
115
149
|
onDownload(): Promise<void>;
|
|
116
150
|
/**
|
|
117
151
|
* Open the image in a new browser tab so the user can use the browser's
|
|
118
152
|
* native print dialog. We deliberately don't manage a print pipeline
|
|
119
153
|
* ourselves — same approach as `PdfArtifactViewerComponent.onPrint()`.
|
|
120
154
|
*/
|
|
155
|
+
OnPrint(): void;
|
|
156
|
+
/** @deprecated Use {@link OnPrint}. */
|
|
121
157
|
onPrint(): void;
|
|
122
158
|
/**
|
|
123
159
|
* Returns a URL suitable for `<a download>` / `window.open` use.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-artifact-viewer.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/plugins/image-artifact-viewer.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAa,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,iCAAiC,EAAE,MAAM,mCAAmC,CAAC;AACtF,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,yBAAyB,EAAE,MAAM,mDAAmD,CAAC;;AAG9F;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAWpE,CAAC;AAEH;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAWnH;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBA0Ja,4BAA6B,SAAQ,iCAAkC,YAAW,MAAM,EAAE,SAAS;
|
|
1
|
+
{"version":3,"file":"image-artifact-viewer.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/plugins/image-artifact-viewer.component.ts"],"names":[],"mappings":"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"}
|