@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.
Files changed (125) hide show
  1. package/dist/lib/components/artifact-message-card.component.d.ts +60 -8
  2. package/dist/lib/components/artifact-message-card.component.d.ts.map +1 -1
  3. package/dist/lib/components/artifact-message-card.component.js +135 -39
  4. package/dist/lib/components/artifact-message-card.component.js.map +1 -1
  5. package/dist/lib/components/artifact-type-plugin-viewer.component.d.ts +58 -6
  6. package/dist/lib/components/artifact-type-plugin-viewer.component.d.ts.map +1 -1
  7. package/dist/lib/components/artifact-type-plugin-viewer.component.js +113 -35
  8. package/dist/lib/components/artifact-type-plugin-viewer.component.js.map +1 -1
  9. package/dist/lib/components/artifact-version-download.d.ts +5 -3
  10. package/dist/lib/components/artifact-version-download.d.ts.map +1 -1
  11. package/dist/lib/components/artifact-version-download.js +11 -7
  12. package/dist/lib/components/artifact-version-download.js.map +1 -1
  13. package/dist/lib/components/artifact-version-history.component.d.ts +74 -8
  14. package/dist/lib/components/artifact-version-history.component.d.ts.map +1 -1
  15. package/dist/lib/components/artifact-version-history.component.js +152 -34
  16. package/dist/lib/components/artifact-version-history.component.js.map +1 -1
  17. package/dist/lib/components/artifact-viewer-panel.component.d.ts +328 -35
  18. package/dist/lib/components/artifact-viewer-panel.component.d.ts.map +1 -1
  19. package/dist/lib/components/artifact-viewer-panel.component.js +701 -213
  20. package/dist/lib/components/artifact-viewer-panel.component.js.map +1 -1
  21. package/dist/lib/components/file-artifact-toolbar.component.d.ts +112 -10
  22. package/dist/lib/components/file-artifact-toolbar.component.d.ts.map +1 -1
  23. package/dist/lib/components/file-artifact-toolbar.component.js +197 -23
  24. package/dist/lib/components/file-artifact-toolbar.component.js.map +1 -1
  25. package/dist/lib/components/plugins/audio-artifact-viewer.component.d.ts +9 -1
  26. package/dist/lib/components/plugins/audio-artifact-viewer.component.d.ts.map +1 -1
  27. package/dist/lib/components/plugins/audio-artifact-viewer.component.js +20 -4
  28. package/dist/lib/components/plugins/audio-artifact-viewer.component.js.map +1 -1
  29. package/dist/lib/components/plugins/code-artifact-viewer.component.d.ts +23 -5
  30. package/dist/lib/components/plugins/code-artifact-viewer.component.d.ts.map +1 -1
  31. package/dist/lib/components/plugins/code-artifact-viewer.component.js +69 -31
  32. package/dist/lib/components/plugins/code-artifact-viewer.component.js.map +1 -1
  33. package/dist/lib/components/plugins/component-artifact-viewer.component.d.ts +136 -18
  34. package/dist/lib/components/plugins/component-artifact-viewer.component.d.ts.map +1 -1
  35. package/dist/lib/components/plugins/component-artifact-viewer.component.js +285 -97
  36. package/dist/lib/components/plugins/component-artifact-viewer.component.js.map +1 -1
  37. package/dist/lib/components/plugins/component-feedback-panel/component-feedback-panel.component.d.ts +2 -2
  38. package/dist/lib/components/plugins/component-feedback-panel/component-feedback-panel.component.js +7 -7
  39. package/dist/lib/components/plugins/component-feedback-panel/component-feedback-panel.component.js.map +1 -1
  40. package/dist/lib/components/plugins/component-permission-evaluation.d.ts +2 -0
  41. package/dist/lib/components/plugins/component-permission-evaluation.d.ts.map +1 -1
  42. package/dist/lib/components/plugins/component-permission-evaluation.js +6 -2
  43. package/dist/lib/components/plugins/component-permission-evaluation.js.map +1 -1
  44. package/dist/lib/components/plugins/data-artifact-viewer.component.d.ts +17 -6
  45. package/dist/lib/components/plugins/data-artifact-viewer.component.d.ts.map +1 -1
  46. package/dist/lib/components/plugins/data-artifact-viewer.component.js +32 -22
  47. package/dist/lib/components/plugins/data-artifact-viewer.component.js.map +1 -1
  48. package/dist/lib/components/plugins/data-requirements-viewer/data-requirements-viewer.component.d.ts +56 -4
  49. package/dist/lib/components/plugins/data-requirements-viewer/data-requirements-viewer.component.d.ts.map +1 -1
  50. package/dist/lib/components/plugins/data-requirements-viewer/data-requirements-viewer.component.js +142 -36
  51. package/dist/lib/components/plugins/data-requirements-viewer/data-requirements-viewer.component.js.map +1 -1
  52. package/dist/lib/components/plugins/docx-artifact-viewer.component.d.ts +14 -2
  53. package/dist/lib/components/plugins/docx-artifact-viewer.component.d.ts.map +1 -1
  54. package/dist/lib/components/plugins/docx-artifact-viewer.component.js +32 -8
  55. package/dist/lib/components/plugins/docx-artifact-viewer.component.js.map +1 -1
  56. package/dist/lib/components/plugins/html-artifact-viewer.component.d.ts +17 -3
  57. package/dist/lib/components/plugins/html-artifact-viewer.component.d.ts.map +1 -1
  58. package/dist/lib/components/plugins/html-artifact-viewer.component.js +36 -8
  59. package/dist/lib/components/plugins/html-artifact-viewer.component.js.map +1 -1
  60. package/dist/lib/components/plugins/image-artifact-viewer.component.d.ts +41 -5
  61. package/dist/lib/components/plugins/image-artifact-viewer.component.d.ts.map +1 -1
  62. package/dist/lib/components/plugins/image-artifact-viewer.component.js +102 -30
  63. package/dist/lib/components/plugins/image-artifact-viewer.component.js.map +1 -1
  64. package/dist/lib/components/plugins/json-artifact-viewer.component.d.ts +33 -5
  65. package/dist/lib/components/plugins/json-artifact-viewer.component.d.ts.map +1 -1
  66. package/dist/lib/components/plugins/json-artifact-viewer.component.js +89 -33
  67. package/dist/lib/components/plugins/json-artifact-viewer.component.js.map +1 -1
  68. package/dist/lib/components/plugins/markdown-artifact-viewer.component.d.ts +12 -2
  69. package/dist/lib/components/plugins/markdown-artifact-viewer.component.d.ts.map +1 -1
  70. package/dist/lib/components/plugins/markdown-artifact-viewer.component.js +28 -8
  71. package/dist/lib/components/plugins/markdown-artifact-viewer.component.js.map +1 -1
  72. package/dist/lib/components/plugins/ml-experiment-results-viewer.component.d.ts +4 -0
  73. package/dist/lib/components/plugins/ml-experiment-results-viewer.component.d.ts.map +1 -1
  74. package/dist/lib/components/plugins/ml-experiment-results-viewer.component.js +14 -6
  75. package/dist/lib/components/plugins/ml-experiment-results-viewer.component.js.map +1 -1
  76. package/dist/lib/components/plugins/pdf-artifact-viewer.component.d.ts +47 -5
  77. package/dist/lib/components/plugins/pdf-artifact-viewer.component.d.ts.map +1 -1
  78. package/dist/lib/components/plugins/pdf-artifact-viewer.component.js +129 -45
  79. package/dist/lib/components/plugins/pdf-artifact-viewer.component.js.map +1 -1
  80. package/dist/lib/components/plugins/save-query-dialog.component.d.ts +5 -1
  81. package/dist/lib/components/plugins/save-query-dialog.component.d.ts.map +1 -1
  82. package/dist/lib/components/plugins/save-query-dialog.component.js +12 -4
  83. package/dist/lib/components/plugins/save-query-dialog.component.js.map +1 -1
  84. package/dist/lib/components/plugins/svg-artifact-viewer.component.d.ts +17 -3
  85. package/dist/lib/components/plugins/svg-artifact-viewer.component.d.ts.map +1 -1
  86. package/dist/lib/components/plugins/svg-artifact-viewer.component.js +36 -8
  87. package/dist/lib/components/plugins/svg-artifact-viewer.component.js.map +1 -1
  88. package/dist/lib/components/plugins/video-artifact-viewer.component.d.ts +9 -1
  89. package/dist/lib/components/plugins/video-artifact-viewer.component.d.ts.map +1 -1
  90. package/dist/lib/components/plugins/video-artifact-viewer.component.js +20 -4
  91. package/dist/lib/components/plugins/video-artifact-viewer.component.js.map +1 -1
  92. package/dist/lib/components/plugins/xlsx-artifact-viewer.component.d.ts +28 -4
  93. package/dist/lib/components/plugins/xlsx-artifact-viewer.component.d.ts.map +1 -1
  94. package/dist/lib/components/plugins/xlsx-artifact-viewer.component.js +64 -16
  95. package/dist/lib/components/plugins/xlsx-artifact-viewer.component.js.map +1 -1
  96. package/dist/lib/components/previews/audio-artifact-preview.component.d.ts +9 -1
  97. package/dist/lib/components/previews/audio-artifact-preview.component.d.ts.map +1 -1
  98. package/dist/lib/components/previews/audio-artifact-preview.component.js +20 -4
  99. package/dist/lib/components/previews/audio-artifact-preview.component.js.map +1 -1
  100. package/dist/lib/components/previews/image-artifact-preview.component.d.ts +16 -2
  101. package/dist/lib/components/previews/image-artifact-preview.component.d.ts.map +1 -1
  102. package/dist/lib/components/previews/image-artifact-preview.component.js +35 -7
  103. package/dist/lib/components/previews/image-artifact-preview.component.js.map +1 -1
  104. package/dist/lib/components/previews/video-artifact-preview.component.d.ts +9 -1
  105. package/dist/lib/components/previews/video-artifact-preview.component.d.ts.map +1 -1
  106. package/dist/lib/components/previews/video-artifact-preview.component.js +20 -4
  107. package/dist/lib/components/previews/video-artifact-preview.component.js.map +1 -1
  108. package/dist/lib/interfaces/artifact-viewer-plugin.interface.js.map +1 -1
  109. package/dist/lib/services/artifact-file.service.d.ts +8 -0
  110. package/dist/lib/services/artifact-file.service.d.ts.map +1 -1
  111. package/dist/lib/services/artifact-file.service.js +22 -6
  112. package/dist/lib/services/artifact-file.service.js.map +1 -1
  113. package/dist/lib/services/artifact-icon.service.d.ts +2 -0
  114. package/dist/lib/services/artifact-icon.service.d.ts.map +1 -1
  115. package/dist/lib/services/artifact-icon.service.js +5 -1
  116. package/dist/lib/services/artifact-icon.service.js.map +1 -1
  117. package/dist/lib/services/artifact-preview-resolver.service.d.ts +2 -0
  118. package/dist/lib/services/artifact-preview-resolver.service.d.ts.map +1 -1
  119. package/dist/lib/services/artifact-preview-resolver.service.js +5 -1
  120. package/dist/lib/services/artifact-preview-resolver.service.js.map +1 -1
  121. package/dist/lib/snapshot-helpers.d.ts +10 -0
  122. package/dist/lib/snapshot-helpers.d.ts.map +1 -1
  123. package/dist/lib/snapshot-helpers.js +25 -5
  124. package/dist/lib/snapshot-helpers.js.map +1 -1
  125. package/package.json +21 -21
@@ -77,11 +77,43 @@ let XlsxArtifactViewerComponent = class XlsxArtifactViewerComponent extends Base
77
77
  fileService;
78
78
  cdr;
79
79
  isLoading = true;
80
- isDownloading = false;
80
+ IsDownloading = false;
81
+ /** @deprecated Use {@link IsDownloading}. */
82
+ get isDownloading() {
83
+ return this.IsDownloading;
84
+ }
85
+ /** @deprecated Use {@link IsDownloading}. */
86
+ set isDownloading(value) {
87
+ this.IsDownloading = value;
88
+ }
81
89
  errorMessage = '';
82
- sheets = [];
83
- activeSheetIndex = 0;
84
- defaultColDef = { resizable: true, sortable: true, filter: true, minWidth: 80 };
90
+ Sheets = [];
91
+ /** @deprecated Use {@link Sheets}. */
92
+ get sheets() {
93
+ return this.Sheets;
94
+ }
95
+ /** @deprecated Use {@link Sheets}. */
96
+ set sheets(value) {
97
+ this.Sheets = value;
98
+ }
99
+ ActiveSheetIndex = 0;
100
+ /** @deprecated Use {@link ActiveSheetIndex}. */
101
+ get activeSheetIndex() {
102
+ return this.ActiveSheetIndex;
103
+ }
104
+ /** @deprecated Use {@link ActiveSheetIndex}. */
105
+ set activeSheetIndex(value) {
106
+ this.ActiveSheetIndex = value;
107
+ }
108
+ DefaultColDef = { resizable: true, sortable: true, filter: true, minWidth: 80 };
109
+ /** @deprecated Use {@link DefaultColDef}. */
110
+ get defaultColDef() {
111
+ return this.DefaultColDef;
112
+ }
113
+ /** @deprecated Use {@link DefaultColDef}. */
114
+ set defaultColDef(value) {
115
+ this.DefaultColDef = value;
116
+ }
85
117
  gridApi = null;
86
118
  downloadUrl = '';
87
119
  constructor(fileService, cdr) {
@@ -92,36 +124,52 @@ let XlsxArtifactViewerComponent = class XlsxArtifactViewerComponent extends Base
92
124
  get hasDisplayContent() {
93
125
  return true;
94
126
  }
127
+ get ActiveSheet() {
128
+ return this.Sheets[this.ActiveSheetIndex] ?? null;
129
+ }
130
+ /** @deprecated Use {@link ActiveSheet}. */
95
131
  get activeSheet() {
96
- return this.sheets[this.activeSheetIndex] ?? null;
132
+ return this.ActiveSheet;
97
133
  }
98
134
  async ngOnInit() {
99
135
  await this.loadWorkbook();
100
136
  }
101
- onGridReady(event) {
137
+ OnGridReady(event) {
102
138
  this.gridApi = event.api;
103
139
  this.gridApi.sizeColumnsToFit();
104
140
  }
105
- selectSheet(index) {
106
- this.activeSheetIndex = index;
141
+ /** @deprecated Use {@link OnGridReady}. */
142
+ onGridReady(event) {
143
+ return this.OnGridReady(event);
144
+ }
145
+ SelectSheet(index) {
146
+ this.ActiveSheetIndex = index;
107
147
  this.cdr.markForCheck();
108
148
  // Let Angular render the new rowData/columnDefs before re-sizing
109
149
  setTimeout(() => this.gridApi?.sizeColumnsToFit(), 0);
110
150
  }
111
- async onDownload() {
112
- if (!this.downloadUrl || this.isDownloading) {
151
+ /** @deprecated Use {@link SelectSheet}. */
152
+ selectSheet(index) {
153
+ return this.SelectSheet(index);
154
+ }
155
+ async OnDownload() {
156
+ if (!this.downloadUrl || this.IsDownloading) {
113
157
  return;
114
158
  }
115
- this.isDownloading = true;
159
+ this.IsDownloading = true;
116
160
  this.cdr.markForCheck();
117
161
  try {
118
162
  await this.triggerBrowserDownload(this.downloadUrl, this.artifactVersion?.FileName || 'workbook.xlsx');
119
163
  }
120
164
  finally {
121
- this.isDownloading = false;
165
+ this.IsDownloading = false;
122
166
  this.cdr.markForCheck();
123
167
  }
124
168
  }
169
+ /** @deprecated Use {@link OnDownload}. */
170
+ async onDownload() {
171
+ return this.OnDownload();
172
+ }
125
173
  // ─── Private helpers ────────────────────────────────────────────────────────
126
174
  async loadWorkbook() {
127
175
  if (!this.artifactVersion?.ID) {
@@ -148,7 +196,7 @@ let XlsxArtifactViewerComponent = class XlsxArtifactViewerComponent extends Base
148
196
  }
149
197
  const XLSX = (await import('xlsx'));
150
198
  const workbook = XLSX.read(arrayBuffer, { type: 'array' });
151
- this.sheets = this.parseWorkbook(workbook, XLSX);
199
+ this.Sheets = this.parseWorkbook(workbook, XLSX);
152
200
  this.isLoading = false;
153
201
  this.cdr.markForCheck();
154
202
  }
@@ -185,10 +233,10 @@ let XlsxArtifactViewerComponent = class XlsxArtifactViewerComponent extends Base
185
233
  this.cdr.markForCheck();
186
234
  }
187
235
  GetCurrentStateSnapshot() {
188
- if (this.sheets.length === 0)
236
+ if (this.Sheets.length === 0)
189
237
  return null;
190
238
  // Convert parsed sheets into DataTables for structured snapshot
191
- const tables = this.sheets.map((sheet) => {
239
+ const tables = this.Sheets.map((sheet) => {
192
240
  const table = new DataTable();
193
241
  table.name = sheet.name;
194
242
  table.source = 'static';
@@ -205,7 +253,7 @@ let XlsxArtifactViewerComponent = class XlsxArtifactViewerComponent extends Base
205
253
  return table;
206
254
  });
207
255
  const snap = DataSnapshot.FromTables(tables, this.getDisplayTitle() ?? undefined);
208
- snap.activeTab = this.sheets[this.activeSheetIndex]?.name;
256
+ snap.activeTab = this.Sheets[this.ActiveSheetIndex]?.name;
209
257
  return snap;
210
258
  }
211
259
  static ɵfac = function XlsxArtifactViewerComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || XlsxArtifactViewerComponent)(i0.ɵɵdirectiveInject(i1.ArtifactFileService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
@@ -1 +1 @@
1
- {"version":3,"file":"xlsx-artifact-viewer.component.js","sourceRoot":"","sources":["../../../../src/lib/components/plugins/xlsx-artifact-viewer.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, ChangeDetectorRef } from '@angular/core';\nimport { RegisterClass } from '@memberjunction/global';\nimport { DataSnapshot, DataTable, MJColumnDescriptor } from '@memberjunction/core';\nimport { BaseArtifactViewerPluginComponent } from '../base-artifact-viewer.component';\nimport { ArtifactFileService } from '../../services/artifact-file.service';\nimport { ColDef, GridReadyEvent, GridApi } from 'ag-grid-community';\n\n/** A parsed sheet ready for display in AG Grid. */\ninterface SheetData {\n name: string;\n rowData: Record<string, string | number | boolean | null>[];\n columnDefs: ColDef[];\n}\n\n/**\n * Viewer plugin for Excel (XLSX/XLS) artifact versions stored in MJStorage.\n *\n * Downloads the file, parses all sheets with SheetJS, then renders the active\n * sheet in an AG Grid. Sheet tabs let the user switch between sheets.\n */\n@Component({\n standalone: false,\n selector: 'mj-xlsx-artifact-viewer',\n template: `\n <div class=\"xlsx-viewer\">\n <mj-file-artifact-toolbar\n [fileName]=\"artifactVersion.FileName || 'workbook.xlsx'\"\n [isDownloading]=\"isDownloading\"\n [showPrint]=\"false\"\n (download)=\"onDownload()\"\n >\n </mj-file-artifact-toolbar>\n\n @if (isLoading) {\n <div class=\"xlsx-viewer__state\">\n <i class=\"fas fa-spinner fa-spin\"></i>\n <span>Loading workbook…</span>\n </div>\n } @else if (errorMessage) {\n <div class=\"xlsx-viewer__state xlsx-viewer__state--error\">\n <i class=\"fas fa-exclamation-triangle\"></i>\n <span>{{ errorMessage }}</span>\n </div>\n } @else {\n @if (sheets.length > 1) {\n <div class=\"xlsx-viewer__tabs\">\n @for (sheet of sheets; track sheet.name; let i = $index) {\n <button class=\"xlsx-viewer__tab\" [class.xlsx-viewer__tab--active]=\"i === activeSheetIndex\" (click)=\"selectSheet(i)\">\n <i class=\"fas fa-table\"></i>\n {{ sheet.name }}\n </button>\n }\n </div>\n }\n\n <div class=\"xlsx-viewer__grid\">\n <ag-grid-angular\n class=\"ag-theme-quartz\"\n [rowData]=\"activeSheet?.rowData\"\n [columnDefs]=\"activeSheet?.columnDefs\"\n [defaultColDef]=\"defaultColDef\"\n [animateRows]=\"false\"\n [suppressMovableColumns]=\"false\"\n [enableCellTextSelection]=\"true\"\n (gridReady)=\"onGridReady($event)\"\n >\n </ag-grid-angular>\n </div>\n }\n </div>\n `,\n styles: [\n `\n .xlsx-viewer {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface);\n }\n\n .xlsx-viewer__state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n flex: 1;\n color: var(--mj-text-muted);\n font-size: 14px;\n }\n\n .xlsx-viewer__state--error {\n color: var(--mj-status-error-text);\n }\n\n .xlsx-viewer__tabs {\n display: flex;\n gap: 2px;\n padding: 4px 8px 0;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n overflow-x: auto;\n flex-shrink: 0;\n }\n\n .xlsx-viewer__tab {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 6px 14px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-bottom: none;\n border-radius: 4px 4px 0 0;\n color: var(--mj-text-secondary);\n font-size: 12px;\n cursor: pointer;\n white-space: nowrap;\n transition:\n background 0.1s,\n color 0.1s;\n }\n\n .xlsx-viewer__tab:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n }\n\n .xlsx-viewer__tab--active {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n border-color: var(--mj-border-default);\n font-weight: 600;\n position: relative;\n }\n\n .xlsx-viewer__tab--active::after {\n content: '';\n position: absolute;\n bottom: -1px;\n left: 0;\n right: 0;\n height: 1px;\n background: var(--mj-bg-surface);\n }\n\n .xlsx-viewer__grid {\n flex: 1;\n min-height: 0;\n overflow: hidden;\n }\n\n .xlsx-viewer__grid ag-grid-angular {\n height: 100%;\n width: 100%;\n display: block;\n }\n `,\n ],\n})\n@RegisterClass(BaseArtifactViewerPluginComponent, 'XlsxArtifactViewerPlugin')\nexport class XlsxArtifactViewerComponent extends BaseArtifactViewerPluginComponent implements OnInit {\n public isLoading = true;\n public isDownloading = false;\n public errorMessage = '';\n public sheets: SheetData[] = [];\n public activeSheetIndex = 0;\n public defaultColDef: ColDef = { resizable: true, sortable: true, filter: true, minWidth: 80 };\n\n private gridApi: GridApi | null = null;\n private downloadUrl = '';\n\n constructor(\n private fileService: ArtifactFileService,\n private cdr: ChangeDetectorRef,\n ) {\n super();\n }\n\n public override get hasDisplayContent(): boolean {\n return true;\n }\n\n public get activeSheet(): SheetData | null {\n return this.sheets[this.activeSheetIndex] ?? null;\n }\n\n async ngOnInit(): Promise<void> {\n await this.loadWorkbook();\n }\n\n public onGridReady(event: GridReadyEvent): void {\n this.gridApi = event.api;\n this.gridApi.sizeColumnsToFit();\n }\n\n public selectSheet(index: number): void {\n this.activeSheetIndex = index;\n this.cdr.markForCheck();\n // Let Angular render the new rowData/columnDefs before re-sizing\n setTimeout(() => this.gridApi?.sizeColumnsToFit(), 0);\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 || 'workbook.xlsx');\n } finally {\n this.isDownloading = false;\n this.cdr.markForCheck();\n }\n }\n\n // ─── Private helpers ────────────────────────────────────────────────────────\n\n private async loadWorkbook(): 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.spreadsheetml.sheet',\n );\n }\n\n const XLSX = (await import('xlsx')) as unknown as XlsxModuleShim;\n const workbook = XLSX.read(arrayBuffer, { type: 'array' });\n this.sheets = this.parseWorkbook(workbook, XLSX);\n this.isLoading = false;\n this.cdr.markForCheck();\n } catch (err) {\n this.showError(`Could not load workbook: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n private parseWorkbook(workbook: WorkbookType, XLSX: XlsxModuleShim): SheetData[] {\n return workbook.SheetNames.map((name) => {\n const sheet = workbook.Sheets[name];\n const rows = XLSX.utils.sheet_to_json<Record<string, string | number | boolean | null>>(sheet, {\n defval: null,\n raw: false, // Format dates/numbers as strings so AG Grid can display them\n });\n\n const headers = rows.length > 0 ? Object.keys(rows[0]) : [];\n const columnDefs: ColDef[] = headers.map((h) => ({\n field: h,\n headerName: h,\n tooltipField: h,\n }));\n\n return { name, rowData: rows, columnDefs };\n });\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 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 if (this.sheets.length === 0) return null;\n\n // Convert parsed sheets into DataTables for structured snapshot\n const tables: DataTable[] = this.sheets.map((sheet) => {\n const table = new DataTable();\n table.name = sheet.name;\n table.source = 'static';\n table.columns = sheet.columnDefs\n .filter((col) => col.field)\n .map((col) => {\n const desc = new MJColumnDescriptor(col.field as string);\n desc.displayName = (col.headerName as string | undefined) ?? (col.field as string);\n desc.sqlBaseType = 'nvarchar';\n return desc;\n });\n table.rows = sheet.rowData;\n table.metadata = { rowCount: sheet.rowData.length };\n return table;\n });\n\n const snap = DataSnapshot.FromTables(tables, this.getDisplayTitle() ?? undefined);\n snap.activeTab = this.sheets[this.activeSheetIndex]?.name;\n return snap;\n }\n}\n\n// ─── Minimal type shims for xlsx dynamic import ────────────────────────────────\n\ninterface WorkbookType {\n SheetNames: string[];\n Sheets: Record<string, unknown>;\n}\n\ninterface XlsxModuleShim {\n read(data: ArrayBuffer, opts: { type: 'array' | 'buffer' | 'binary' | 'base64' | 'string' }): WorkbookType;\n utils: {\n sheet_to_json<T>(sheet: unknown, opts: { defval: null; raw: boolean }): T[];\n };\n}\n"]}
1
+ {"version":3,"file":"xlsx-artifact-viewer.component.js","sourceRoot":"","sources":["../../../../src/lib/components/plugins/xlsx-artifact-viewer.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, ChangeDetectorRef } from '@angular/core';\nimport { RegisterClass } from '@memberjunction/global';\nimport { DataSnapshot, DataTable, MJColumnDescriptor } from '@memberjunction/core';\nimport { BaseArtifactViewerPluginComponent } from '../base-artifact-viewer.component';\nimport { ArtifactFileService } from '../../services/artifact-file.service';\nimport { ColDef, GridReadyEvent, GridApi } from 'ag-grid-community';\n\n/** A parsed sheet ready for display in AG Grid. */\ninterface SheetData {\n name: string;\n rowData: Record<string, string | number | boolean | null>[];\n columnDefs: ColDef[];\n}\n\n/**\n * Viewer plugin for Excel (XLSX/XLS) artifact versions stored in MJStorage.\n *\n * Downloads the file, parses all sheets with SheetJS, then renders the active\n * sheet in an AG Grid. Sheet tabs let the user switch between sheets.\n */\n@Component({\n standalone: false,\n selector: 'mj-xlsx-artifact-viewer',\n template: `\n <div class=\"xlsx-viewer\">\n <mj-file-artifact-toolbar\n [fileName]=\"artifactVersion.FileName || 'workbook.xlsx'\"\n [isDownloading]=\"isDownloading\"\n [showPrint]=\"false\"\n (download)=\"onDownload()\"\n >\n </mj-file-artifact-toolbar>\n\n @if (isLoading) {\n <div class=\"xlsx-viewer__state\">\n <i class=\"fas fa-spinner fa-spin\"></i>\n <span>Loading workbook…</span>\n </div>\n } @else if (errorMessage) {\n <div class=\"xlsx-viewer__state xlsx-viewer__state--error\">\n <i class=\"fas fa-exclamation-triangle\"></i>\n <span>{{ errorMessage }}</span>\n </div>\n } @else {\n @if (sheets.length > 1) {\n <div class=\"xlsx-viewer__tabs\">\n @for (sheet of sheets; track sheet.name; let i = $index) {\n <button class=\"xlsx-viewer__tab\" [class.xlsx-viewer__tab--active]=\"i === activeSheetIndex\" (click)=\"selectSheet(i)\">\n <i class=\"fas fa-table\"></i>\n {{ sheet.name }}\n </button>\n }\n </div>\n }\n\n <div class=\"xlsx-viewer__grid\">\n <ag-grid-angular\n class=\"ag-theme-quartz\"\n [rowData]=\"activeSheet?.rowData\"\n [columnDefs]=\"activeSheet?.columnDefs\"\n [defaultColDef]=\"defaultColDef\"\n [animateRows]=\"false\"\n [suppressMovableColumns]=\"false\"\n [enableCellTextSelection]=\"true\"\n (gridReady)=\"onGridReady($event)\"\n >\n </ag-grid-angular>\n </div>\n }\n </div>\n `,\n styles: [\n `\n .xlsx-viewer {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface);\n }\n\n .xlsx-viewer__state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n flex: 1;\n color: var(--mj-text-muted);\n font-size: 14px;\n }\n\n .xlsx-viewer__state--error {\n color: var(--mj-status-error-text);\n }\n\n .xlsx-viewer__tabs {\n display: flex;\n gap: 2px;\n padding: 4px 8px 0;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n overflow-x: auto;\n flex-shrink: 0;\n }\n\n .xlsx-viewer__tab {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 6px 14px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-bottom: none;\n border-radius: 4px 4px 0 0;\n color: var(--mj-text-secondary);\n font-size: 12px;\n cursor: pointer;\n white-space: nowrap;\n transition:\n background 0.1s,\n color 0.1s;\n }\n\n .xlsx-viewer__tab:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n }\n\n .xlsx-viewer__tab--active {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n border-color: var(--mj-border-default);\n font-weight: 600;\n position: relative;\n }\n\n .xlsx-viewer__tab--active::after {\n content: '';\n position: absolute;\n bottom: -1px;\n left: 0;\n right: 0;\n height: 1px;\n background: var(--mj-bg-surface);\n }\n\n .xlsx-viewer__grid {\n flex: 1;\n min-height: 0;\n overflow: hidden;\n }\n\n .xlsx-viewer__grid ag-grid-angular {\n height: 100%;\n width: 100%;\n display: block;\n }\n `,\n ],\n})\n@RegisterClass(BaseArtifactViewerPluginComponent, 'XlsxArtifactViewerPlugin')\nexport class XlsxArtifactViewerComponent 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 Sheets: SheetData[] = [];\n\n /** @deprecated Use {@link Sheets}. */\n public get sheets(): SheetData[] {\n return this.Sheets;\n }\n /** @deprecated Use {@link Sheets}. */\n public set sheets(value: SheetData[]) {\n this.Sheets = value;\n }\n public ActiveSheetIndex = 0;\n\n /** @deprecated Use {@link ActiveSheetIndex}. */\n public get activeSheetIndex() {\n return this.ActiveSheetIndex;\n }\n /** @deprecated Use {@link ActiveSheetIndex}. */\n public set activeSheetIndex(value) {\n this.ActiveSheetIndex = value;\n }\n public DefaultColDef: ColDef = { resizable: true, sortable: true, filter: true, minWidth: 80 };\n\n /** @deprecated Use {@link DefaultColDef}. */\n public get defaultColDef(): ColDef {\n return this.DefaultColDef;\n }\n /** @deprecated Use {@link DefaultColDef}. */\n public set defaultColDef(value: ColDef) {\n this.DefaultColDef = value;\n }\n\n private gridApi: GridApi | null = null;\n private downloadUrl = '';\n\n constructor(\n private fileService: ArtifactFileService,\n private cdr: ChangeDetectorRef,\n ) {\n super();\n }\n\n public override get hasDisplayContent(): boolean {\n return true;\n }\n\n public get ActiveSheet(): SheetData | null {\n return this.Sheets[this.ActiveSheetIndex] ?? null;\n }\n\n /** @deprecated Use {@link ActiveSheet}. */\n public get activeSheet(): SheetData | null {\n return this.ActiveSheet;\n }\n\n async ngOnInit(): Promise<void> {\n await this.loadWorkbook();\n }\n\n public OnGridReady(event: GridReadyEvent): void {\n this.gridApi = event.api;\n this.gridApi.sizeColumnsToFit();\n }\n\n /** @deprecated Use {@link OnGridReady}. */\n public onGridReady(event: GridReadyEvent): void {\n return this.OnGridReady(event);\n }\n\n public SelectSheet(index: number): void {\n this.ActiveSheetIndex = index;\n this.cdr.markForCheck();\n // Let Angular render the new rowData/columnDefs before re-sizing\n setTimeout(() => this.gridApi?.sizeColumnsToFit(), 0);\n }\n\n /** @deprecated Use {@link SelectSheet}. */\n public selectSheet(index: number): void {\n return this.SelectSheet(index);\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 || 'workbook.xlsx');\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 // ─── Private helpers ────────────────────────────────────────────────────────\n\n private async loadWorkbook(): 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.spreadsheetml.sheet',\n );\n }\n\n const XLSX = (await import('xlsx')) as unknown as XlsxModuleShim;\n const workbook = XLSX.read(arrayBuffer, { type: 'array' });\n this.Sheets = this.parseWorkbook(workbook, XLSX);\n this.isLoading = false;\n this.cdr.markForCheck();\n } catch (err) {\n this.showError(`Could not load workbook: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n private parseWorkbook(workbook: WorkbookType, XLSX: XlsxModuleShim): SheetData[] {\n return workbook.SheetNames.map((name) => {\n const sheet = workbook.Sheets[name];\n const rows = XLSX.utils.sheet_to_json<Record<string, string | number | boolean | null>>(sheet, {\n defval: null,\n raw: false, // Format dates/numbers as strings so AG Grid can display them\n });\n\n const headers = rows.length > 0 ? Object.keys(rows[0]) : [];\n const columnDefs: ColDef[] = headers.map((h) => ({\n field: h,\n headerName: h,\n tooltipField: h,\n }));\n\n return { name, rowData: rows, columnDefs };\n });\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 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 if (this.Sheets.length === 0) return null;\n\n // Convert parsed sheets into DataTables for structured snapshot\n const tables: DataTable[] = this.Sheets.map((sheet) => {\n const table = new DataTable();\n table.name = sheet.name;\n table.source = 'static';\n table.columns = sheet.columnDefs\n .filter((col) => col.field)\n .map((col) => {\n const desc = new MJColumnDescriptor(col.field as string);\n desc.displayName = (col.headerName as string | undefined) ?? (col.field as string);\n desc.sqlBaseType = 'nvarchar';\n return desc;\n });\n table.rows = sheet.rowData;\n table.metadata = { rowCount: sheet.rowData.length };\n return table;\n });\n\n const snap = DataSnapshot.FromTables(tables, this.getDisplayTitle() ?? undefined);\n snap.activeTab = this.Sheets[this.ActiveSheetIndex]?.name;\n return snap;\n }\n}\n\n// ─── Minimal type shims for xlsx dynamic import ────────────────────────────────\n\ninterface WorkbookType {\n SheetNames: string[];\n Sheets: Record<string, unknown>;\n}\n\ninterface XlsxModuleShim {\n read(data: ArrayBuffer, opts: { type: 'array' | 'buffer' | 'binary' | 'base64' | 'string' }): WorkbookType;\n utils: {\n sheet_to_json<T>(sheet: unknown, opts: { defval: null; raw: boolean }): T[];\n };\n}\n"]}
@@ -14,7 +14,11 @@ import * as i0 from "@angular/core";
14
14
  export declare class AudioArtifactPreviewComponent extends BaseArtifactPreviewComponent implements OnInit {
15
15
  private readonly cdr;
16
16
  /** Resolved URL — data URI (inline) or pre-auth URL (file). Funneled through {@link setAudioUrl}. */
17
- audioUrl: string;
17
+ AudioUrl: string;
18
+ /** @deprecated Use {@link AudioUrl}. */
19
+ get audioUrl(): string;
20
+ /** @deprecated Use {@link AudioUrl}. */
21
+ set audioUrl(value: string);
18
22
  /** Non-empty hides the player and shows a compact error line. */
19
23
  errorMessage: string;
20
24
  /**
@@ -25,8 +29,12 @@ export declare class AudioArtifactPreviewComponent extends BaseArtifactPreviewCo
25
29
  /** Set the resolved URL and recompute the single-element {@link MediaTracks} array in lockstep. */
26
30
  private setAudioUrl;
27
31
  ngOnInit(): Promise<void>;
32
+ OnMediaError(): void;
33
+ /** @deprecated Use {@link OnMediaError}. */
28
34
  onMediaError(): void;
29
35
  /** Fired when the generic player reaches the end of the track. No-op affordance hook. */
36
+ OnMediaEnded(): void;
37
+ /** @deprecated Use {@link OnMediaEnded}. */
30
38
  onMediaEnded(): void;
31
39
  static ɵfac: i0.ɵɵFactoryDeclaration<AudioArtifactPreviewComponent, never>;
32
40
  static ɵcmp: i0.ɵɵComponentDeclaration<AudioArtifactPreviewComponent, "mj-audio-artifact-preview", never, {}, {}, never, never, false, never>;
@@ -1 +1 @@
1
- {"version":3,"file":"audio-artifact-preview.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/previews/audio-artifact-preview.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwC,MAAM,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;;AAEjF;;;;;;;;GAQG;AACH,qBAkDa,6BAA8B,SAAQ,4BAA6B,YAAW,MAAM;IAC7F,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IAEjD,qGAAqG;IAC9F,QAAQ,SAAM;IAGrB,iEAAiE;IAC1D,YAAY,SAAM;IAEzB;;;OAGG;IACI,WAAW,EAAE,UAAU,EAAE,CAAM;IAEtC,mGAAmG;IACnG,OAAO,CAAC,WAAW;IAcb,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAcxB,YAAY,IAAI,IAAI;IAM3B,yFAAyF;IAClF,YAAY,IAAI,IAAI;yCApDlB,6BAA6B;2CAA7B,6BAA6B;CAuDzC"}
1
+ {"version":3,"file":"audio-artifact-preview.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/previews/audio-artifact-preview.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwC,MAAM,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;;AAEjF;;;;;;;;GAQG;AACH,qBAkDa,6BAA8B,SAAQ,4BAA6B,YAAW,MAAM;IAC7F,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IAEjD,qGAAqG;IAC9F,QAAQ,SAAM;IAErB,wCAAwC;IACxC,IAAW,QAAQ,WAElB;IACD,wCAAwC;IACxC,IAAW,QAAQ,CAAC,KAAK,QAAA,EAExB;IAGD,iEAAiE;IAC1D,YAAY,SAAM;IAEzB;;;OAGG;IACI,WAAW,EAAE,UAAU,EAAE,CAAM;IAEtC,mGAAmG;IACnG,OAAO,CAAC,WAAW;IAcb,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAcxB,YAAY,IAAI,IAAI;IAM3B,4CAA4C;IACrC,YAAY,IAAI,IAAI;IAI3B,yFAAyF;IAClF,YAAY,IAAI,IAAI;IAI3B,4CAA4C;IACrC,YAAY,IAAI,IAAI;yCAvElB,6BAA6B;2CAA7B,6BAA6B;CA0EzC"}
@@ -38,7 +38,15 @@ function AudioArtifactPreviewComponent_Conditional_2_Template(rf, ctx) { if (rf
38
38
  export class AudioArtifactPreviewComponent extends BaseArtifactPreviewComponent {
39
39
  cdr = inject(ChangeDetectorRef);
40
40
  /** Resolved URL — data URI (inline) or pre-auth URL (file). Funneled through {@link setAudioUrl}. */
41
- audioUrl = '';
41
+ AudioUrl = '';
42
+ /** @deprecated Use {@link AudioUrl}. */
43
+ get audioUrl() {
44
+ return this.AudioUrl;
45
+ }
46
+ /** @deprecated Use {@link AudioUrl}. */
47
+ set audioUrl(value) {
48
+ this.AudioUrl = value;
49
+ }
42
50
  /** Non-empty hides the player and shows a compact error line. */
43
51
  errorMessage = '';
44
52
  /**
@@ -48,7 +56,7 @@ export class AudioArtifactPreviewComponent extends BaseArtifactPreviewComponent
48
56
  MediaTracks = [];
49
57
  /** Set the resolved URL and recompute the single-element {@link MediaTracks} array in lockstep. */
50
58
  setAudioUrl(url) {
51
- this.audioUrl = url;
59
+ this.AudioUrl = url;
52
60
  this.MediaTracks = url
53
61
  ? [
54
62
  {
@@ -75,15 +83,23 @@ export class AudioArtifactPreviewComponent extends BaseArtifactPreviewComponent
75
83
  }
76
84
  this.cdr.markForCheck();
77
85
  }
78
- onMediaError() {
86
+ OnMediaError() {
79
87
  this.errorMessage = 'Audio could not be played.';
80
88
  this.setAudioUrl('');
81
89
  this.cdr.markForCheck();
82
90
  }
91
+ /** @deprecated Use {@link OnMediaError}. */
92
+ onMediaError() {
93
+ return this.OnMediaError();
94
+ }
83
95
  /** Fired when the generic player reaches the end of the track. No-op affordance hook. */
84
- onMediaEnded() {
96
+ OnMediaEnded() {
85
97
  // Playback finished — nothing to persist for an inline preview.
86
98
  }
99
+ /** @deprecated Use {@link OnMediaEnded}. */
100
+ onMediaEnded() {
101
+ return this.OnMediaEnded();
102
+ }
87
103
  static ɵfac = /*@__PURE__*/ (() => { let ɵAudioArtifactPreviewComponent_BaseFactory; return function AudioArtifactPreviewComponent_Factory(__ngFactoryType__) { return (ɵAudioArtifactPreviewComponent_BaseFactory || (ɵAudioArtifactPreviewComponent_BaseFactory = i0.ɵɵgetInheritedFactory(AudioArtifactPreviewComponent)))(__ngFactoryType__ || AudioArtifactPreviewComponent); }; })();
88
104
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AudioArtifactPreviewComponent, selectors: [["mj-audio-artifact-preview"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 1, consts: [[1, "audio-preview", "audio-preview--error"], ["text", "Loading audio...", "size", "small"], [1, "audio-preview__player", 3, "Tracks", "ShowTranscript", "ShowTranscriptToggle", "ShowWaveform", "ShowSpeedControl", "ShowSkipControls", "ShowVolume", "ShowFullscreen"], [1, "fa-solid", "fa-music"], [1, "audio-preview__player", 3, "click", "Ended", "Tracks", "ShowTranscript", "ShowTranscriptToggle", "ShowWaveform", "ShowSpeedControl", "ShowSkipControls", "ShowVolume", "ShowFullscreen"]], template: function AudioArtifactPreviewComponent_Template(rf, ctx) { if (rf & 1) {
89
105
  i0.ɵɵconditionalCreate(0, AudioArtifactPreviewComponent_Conditional_0_Template, 4, 1, "div", 0)(1, AudioArtifactPreviewComponent_Conditional_1_Template, 1, 0, "mj-loading", 1)(2, AudioArtifactPreviewComponent_Conditional_2_Template, 1, 8, "mj-media-player", 2);
@@ -1 +1 @@
1
- {"version":3,"file":"audio-artifact-preview.component.js","sourceRoot":"","sources":["../../../../src/lib/components/previews/audio-artifact-preview.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,EAAU,MAAM,eAAe,CAAC;AAE7E,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;;;;;IAgBrE,8BAAgD;IAC5C,uBAAiC;IACjC,4BAAM;IAAA,YAAkB;IAC5B,AAD4B,iBAAO,EAC7B;;;IADI,eAAkB;IAAlB,yCAAkB;;;IAG5B,gCAA8D;;;;IAE9D,0CAYC;IADG,AADA,uIAAS,wBAAwB,IAAC,6LACzB,qBAAc,KAAC;IAC3B,iBAAkB;;;IAHf,AADA,AADA,AADA,AADA,AADA,AADA,AADA,2CAAsB,yBACE,+BACM,uBACR,2BACI,2BACA,qBACN,yBACI;;AA9BxC;;;;;;;;GAQG;AAmDH,MAAM,OAAO,6BAA8B,SAAQ,4BAA4B;IAC1D,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAEjD,qGAAqG;IAC9F,QAAQ,GAAG,EAAE,CAAC;IAGrB,iEAAiE;IAC1D,YAAY,GAAG,EAAE,CAAC;IAEzB;;;OAGG;IACI,WAAW,GAAiB,EAAE,CAAC;IAEtC,mGAAmG;IAC3F,WAAW,CAAC,GAAW;QAC3B,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;QACpB,IAAI,CAAC,WAAW,GAAG,GAAG;YAClB,CAAC,CAAC;gBACI;oBACI,EAAE,EAAE,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,OAAO;oBACvC,IAAI,EAAE,OAAO;oBACb,GAAG,EAAE,GAAG;oBACR,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,QAAQ,IAAI,SAAS;iBACxD;aACJ;YACH,CAAC,CAAC,EAAE,CAAC;IACb,CAAC;IAED,KAAK,CAAC,QAAQ;QACV,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3C,IAAI,GAAG,EAAE,CAAC;gBACN,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,YAAY,GAAG,mBAAmB,CAAC;YAC5C,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,IAAI,CAAC,YAAY,GAAG,uBAAuB,CAAC;QAChD,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAEM,YAAY;QACf,IAAI,CAAC,YAAY,GAAG,4BAA4B,CAAC;QACjD,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAED,yFAAyF;IAClF,YAAY;QACf,gEAAgE;IACpE,CAAC;iSAtDQ,6BAA6B,yBAA7B,6BAA6B;6DAA7B,6BAA6B;YAvChC,AAFA,AALF,+FAAoB,gFAKI,qFAED;;YAPvB,kFAqBC;;;iFAyBI,6BAA6B;cAlDzC,SAAS;6BACM,KAAK,YACP,2BAA2B,YAC3B;;;;;;;;;;;;;;;;;;;;;;;KAuBT;;kFAwBQ,6BAA6B","sourcesContent":["import { ChangeDetectorRef, Component, inject, OnInit } from '@angular/core';\nimport { MediaTrack } from '@memberjunction/ng-media-player';\nimport { BaseArtifactPreviewComponent } from './base-artifact-preview.component';\n\n/**\n * Inline preview for audio artifacts. Embeds the generic {@link MJMediaPlayerComponent}\n * (`mj-media-player`) in a compact, thumbnail-sized configuration inside the conversation message\n * card. Click events are stopped from propagating so using the transport controls does NOT open\n * the full-size viewer.\n *\n * Compact gating: only play/pause + scrubber + time are shown. Transcript, waveform, speed,\n * skip, volume and fullscreen chrome are turned OFF so the player reads cleanly at preview size.\n */\n@Component({\n standalone: false,\n selector: 'mj-audio-artifact-preview',\n template: `\n @if (errorMessage) {\n <div class=\"audio-preview audio-preview--error\">\n <i class=\"fa-solid fa-music\"></i>\n <span>{{ errorMessage }}</span>\n </div>\n } @else if (isLoading) {\n <mj-loading text=\"Loading audio...\" size=\"small\"></mj-loading>\n } @else if (audioUrl) {\n <mj-media-player\n class=\"audio-preview__player\"\n [Tracks]=\"MediaTracks\"\n [ShowTranscript]=\"false\"\n [ShowTranscriptToggle]=\"false\"\n [ShowWaveform]=\"false\"\n [ShowSpeedControl]=\"false\"\n [ShowSkipControls]=\"false\"\n [ShowVolume]=\"false\"\n [ShowFullscreen]=\"false\"\n (click)=\"$event.stopPropagation()\"\n (Ended)=\"onMediaEnded()\"\n ></mj-media-player>\n }\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n .audio-preview__player {\n display: block;\n width: 100%;\n max-width: 100%;\n }\n\n .audio-preview--error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n color: var(--mj-text-muted);\n font-size: 13px;\n }\n `,\n ],\n})\nexport class AudioArtifactPreviewComponent extends BaseArtifactPreviewComponent implements OnInit {\n private readonly cdr = inject(ChangeDetectorRef);\n\n /** Resolved URL — data URI (inline) or pre-auth URL (file). Funneled through {@link setAudioUrl}. */\n public audioUrl = '';\n\n\n /** Non-empty hides the player and shows a compact error line. */\n public errorMessage = '';\n\n /**\n * Single-track input for the generic {@link MJMediaPlayerComponent}. Rebuilt in lockstep with\n * {@link audioUrl} via {@link setAudioUrl}; `[]` until a URL exists so the player shows its empty state.\n */\n public MediaTracks: MediaTrack[] = [];\n\n /** Set the resolved URL and recompute the single-element {@link MediaTracks} array in lockstep. */\n private setAudioUrl(url: string): void {\n this.audioUrl = url;\n this.MediaTracks = url\n ? [\n {\n Id: this.artifactVersion?.ID ?? 'audio',\n Kind: 'audio',\n Url: url,\n MimeType: this.artifactVersion?.MimeType ?? undefined,\n },\n ]\n : [];\n }\n\n async ngOnInit(): Promise<void> {\n try {\n const url = await this.resolveContentUrl();\n if (url) {\n this.setAudioUrl(url);\n } else {\n this.errorMessage = 'No audio content.';\n }\n } catch {\n this.errorMessage = 'Could not load audio.';\n }\n this.cdr.markForCheck();\n }\n\n public onMediaError(): void {\n this.errorMessage = 'Audio could not be played.';\n this.setAudioUrl('');\n this.cdr.markForCheck();\n }\n\n /** Fired when the generic player reaches the end of the track. No-op affordance hook. */\n public onMediaEnded(): void {\n // Playback finished — nothing to persist for an inline preview.\n }\n}\n"]}
1
+ {"version":3,"file":"audio-artifact-preview.component.js","sourceRoot":"","sources":["../../../../src/lib/components/previews/audio-artifact-preview.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,EAAU,MAAM,eAAe,CAAC;AAE7E,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;;;;;IAgBrE,8BAAgD;IAC5C,uBAAiC;IACjC,4BAAM;IAAA,YAAkB;IAC5B,AAD4B,iBAAO,EAC7B;;;IADI,eAAkB;IAAlB,yCAAkB;;;IAG5B,gCAA8D;;;;IAE9D,0CAYC;IADG,AADA,uIAAS,wBAAwB,IAAC,6LACzB,qBAAc,KAAC;IAC3B,iBAAkB;;;IAHf,AADA,AADA,AADA,AADA,AADA,AADA,AADA,2CAAsB,yBACE,+BACM,uBACR,2BACI,2BACA,qBACN,yBACI;;AA9BxC;;;;;;;;GAQG;AAmDH,MAAM,OAAO,6BAA8B,SAAQ,4BAA4B;IAC1D,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAEjD,qGAAqG;IAC9F,QAAQ,GAAG,EAAE,CAAC;IAErB,wCAAwC;IACxC,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IACD,wCAAwC;IACxC,IAAW,QAAQ,CAAC,KAAK;QACrB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IAC1B,CAAC;IAGD,iEAAiE;IAC1D,YAAY,GAAG,EAAE,CAAC;IAEzB;;;OAGG;IACI,WAAW,GAAiB,EAAE,CAAC;IAEtC,mGAAmG;IAC3F,WAAW,CAAC,GAAW;QAC3B,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;QACpB,IAAI,CAAC,WAAW,GAAG,GAAG;YAClB,CAAC,CAAC;gBACI;oBACI,EAAE,EAAE,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,OAAO;oBACvC,IAAI,EAAE,OAAO;oBACb,GAAG,EAAE,GAAG;oBACR,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,QAAQ,IAAI,SAAS;iBACxD;aACJ;YACH,CAAC,CAAC,EAAE,CAAC;IACb,CAAC;IAED,KAAK,CAAC,QAAQ;QACV,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3C,IAAI,GAAG,EAAE,CAAC;gBACN,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,YAAY,GAAG,mBAAmB,CAAC;YAC5C,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,IAAI,CAAC,YAAY,GAAG,uBAAuB,CAAC;QAChD,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAEM,YAAY;QACf,IAAI,CAAC,YAAY,GAAG,4BAA4B,CAAC;QACjD,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAED,4CAA4C;IACrC,YAAY;QACf,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;IAC/B,CAAC;IAED,yFAAyF;IAClF,YAAY;QACf,gEAAgE;IACpE,CAAC;IAED,4CAA4C;IACrC,YAAY;QACf,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;IAC/B,CAAC;iSAzEQ,6BAA6B,yBAA7B,6BAA6B;6DAA7B,6BAA6B;YAvChC,AAFA,AALF,+FAAoB,gFAKI,qFAED;;YAPvB,kFAqBC;;;iFAyBI,6BAA6B;cAlDzC,SAAS;6BACM,KAAK,YACP,2BAA2B,YAC3B;;;;;;;;;;;;;;;;;;;;;;;KAuBT;;kFAwBQ,6BAA6B","sourcesContent":["import { ChangeDetectorRef, Component, inject, OnInit } from '@angular/core';\nimport { MediaTrack } from '@memberjunction/ng-media-player';\nimport { BaseArtifactPreviewComponent } from './base-artifact-preview.component';\n\n/**\n * Inline preview for audio artifacts. Embeds the generic {@link MJMediaPlayerComponent}\n * (`mj-media-player`) in a compact, thumbnail-sized configuration inside the conversation message\n * card. Click events are stopped from propagating so using the transport controls does NOT open\n * the full-size viewer.\n *\n * Compact gating: only play/pause + scrubber + time are shown. Transcript, waveform, speed,\n * skip, volume and fullscreen chrome are turned OFF so the player reads cleanly at preview size.\n */\n@Component({\n standalone: false,\n selector: 'mj-audio-artifact-preview',\n template: `\n @if (errorMessage) {\n <div class=\"audio-preview audio-preview--error\">\n <i class=\"fa-solid fa-music\"></i>\n <span>{{ errorMessage }}</span>\n </div>\n } @else if (isLoading) {\n <mj-loading text=\"Loading audio...\" size=\"small\"></mj-loading>\n } @else if (audioUrl) {\n <mj-media-player\n class=\"audio-preview__player\"\n [Tracks]=\"MediaTracks\"\n [ShowTranscript]=\"false\"\n [ShowTranscriptToggle]=\"false\"\n [ShowWaveform]=\"false\"\n [ShowSpeedControl]=\"false\"\n [ShowSkipControls]=\"false\"\n [ShowVolume]=\"false\"\n [ShowFullscreen]=\"false\"\n (click)=\"$event.stopPropagation()\"\n (Ended)=\"onMediaEnded()\"\n ></mj-media-player>\n }\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n .audio-preview__player {\n display: block;\n width: 100%;\n max-width: 100%;\n }\n\n .audio-preview--error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n color: var(--mj-text-muted);\n font-size: 13px;\n }\n `,\n ],\n})\nexport class AudioArtifactPreviewComponent extends BaseArtifactPreviewComponent implements OnInit {\n private readonly cdr = inject(ChangeDetectorRef);\n\n /** Resolved URL — data URI (inline) or pre-auth URL (file). Funneled through {@link setAudioUrl}. */\n public AudioUrl = '';\n\n /** @deprecated Use {@link AudioUrl}. */\n public get audioUrl() {\n return this.AudioUrl;\n }\n /** @deprecated Use {@link AudioUrl}. */\n public set audioUrl(value) {\n this.AudioUrl = value;\n }\n\n\n /** Non-empty hides the player and shows a compact error line. */\n public errorMessage = '';\n\n /**\n * Single-track input for the generic {@link MJMediaPlayerComponent}. Rebuilt in lockstep with\n * {@link audioUrl} via {@link setAudioUrl}; `[]` until a URL exists so the player shows its empty state.\n */\n public MediaTracks: MediaTrack[] = [];\n\n /** Set the resolved URL and recompute the single-element {@link MediaTracks} array in lockstep. */\n private setAudioUrl(url: string): void {\n this.AudioUrl = url;\n this.MediaTracks = url\n ? [\n {\n Id: this.artifactVersion?.ID ?? 'audio',\n Kind: 'audio',\n Url: url,\n MimeType: this.artifactVersion?.MimeType ?? undefined,\n },\n ]\n : [];\n }\n\n async ngOnInit(): Promise<void> {\n try {\n const url = await this.resolveContentUrl();\n if (url) {\n this.setAudioUrl(url);\n } else {\n this.errorMessage = 'No audio content.';\n }\n } catch {\n this.errorMessage = 'Could not load audio.';\n }\n this.cdr.markForCheck();\n }\n\n public OnMediaError(): void {\n this.errorMessage = 'Audio could not be played.';\n this.setAudioUrl('');\n this.cdr.markForCheck();\n }\n\n /** @deprecated Use {@link OnMediaError}. */\n public onMediaError(): void {\n return this.OnMediaError();\n }\n\n /** Fired when the generic player reaches the end of the track. No-op affordance hook. */\n public OnMediaEnded(): void {\n // Playback finished — nothing to persist for an inline preview.\n }\n\n /** @deprecated Use {@link OnMediaEnded}. */\n public onMediaEnded(): void {\n return this.OnMediaEnded();\n }\n}\n"]}
@@ -21,7 +21,11 @@ import * as i0 from "@angular/core";
21
21
  export declare class ImageArtifactPreviewComponent extends BaseArtifactPreviewComponent implements OnInit {
22
22
  private readonly cdr;
23
23
  /** Resolved URL bound to `<img src>` — data URI (inline) or pre-auth URL (file). */
24
- imageUrl: string;
24
+ ImageUrl: string;
25
+ /** @deprecated Use {@link ImageUrl}. */
26
+ get imageUrl(): string;
27
+ /** @deprecated Use {@link ImageUrl}. */
28
+ set imageUrl(value: string);
25
29
  /** Non-empty hides the image and shows a compact error line. */
26
30
  errorMessage: string;
27
31
  /**
@@ -29,11 +33,21 @@ export declare class ImageArtifactPreviewComponent extends BaseArtifactPreviewCo
29
33
  * covers URL resolution: for a multi-megabyte inline `data:` URI the decode after `src` is
30
34
  * assigned is what the user actually waits on, so the indicator holds until the `load` event.
31
35
  */
32
- imagePainted: boolean;
36
+ ImagePainted: boolean;
37
+ /** @deprecated Use {@link ImagePainted}. */
38
+ get imagePainted(): boolean;
39
+ /** @deprecated Use {@link ImagePainted}. */
40
+ set imagePainted(value: boolean);
33
41
  /** Accessible alt text — prefers a descriptive name over a raw filename. */
42
+ get AltText(): string;
43
+ /** @deprecated Use {@link AltText}. */
34
44
  get altText(): string;
35
45
  ngOnInit(): Promise<void>;
46
+ OnImageLoaded(): void;
47
+ /** @deprecated Use {@link OnImageLoaded}. */
36
48
  onImageLoaded(): void;
49
+ OnImageError(): void;
50
+ /** @deprecated Use {@link OnImageError}. */
37
51
  onImageError(): void;
38
52
  static ɵfac: i0.ɵɵFactoryDeclaration<ImageArtifactPreviewComponent, never>;
39
53
  static ɵcmp: i0.ɵɵComponentDeclaration<ImageArtifactPreviewComponent, "mj-image-artifact-preview", never, {}, {}, never, never, false, never>;
@@ -1 +1 @@
1
- {"version":3,"file":"image-artifact-preview.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/previews/image-artifact-preview.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwC,MAAM,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;;AAEjF;;;;;;;;;;;;;;;;GAgBG;AACH,qBAmEa,6BAA8B,SAAQ,4BAA6B,YAAW,MAAM;IAC7F,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IAEjD,oFAAoF;IAC7E,QAAQ,SAAM;IAErB,gEAAgE;IACzD,YAAY,SAAM;IAEzB;;;;OAIG;IACI,YAAY,UAAS;IAE5B,4EAA4E;IAC5E,IAAW,OAAO,IAAI,MAAM,CAE3B;IAEK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAcxB,aAAa,IAAI,IAAI;IAKrB,YAAY,IAAI,IAAI;yCAxClB,6BAA6B;2CAA7B,6BAA6B;CA4CzC"}
1
+ {"version":3,"file":"image-artifact-preview.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/previews/image-artifact-preview.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwC,MAAM,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;;AAEjF;;;;;;;;;;;;;;;;GAgBG;AACH,qBAmEa,6BAA8B,SAAQ,4BAA6B,YAAW,MAAM;IAC7F,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IAEjD,oFAAoF;IAC7E,QAAQ,SAAM;IAErB,wCAAwC;IACxC,IAAW,QAAQ,WAElB;IACD,wCAAwC;IACxC,IAAW,QAAQ,CAAC,KAAK,QAAA,EAExB;IAED,gEAAgE;IACzD,YAAY,SAAM;IAEzB;;;;OAIG;IACI,YAAY,UAAS;IAE5B,4CAA4C;IAC5C,IAAW,YAAY,YAEtB;IACD,4CAA4C;IAC5C,IAAW,YAAY,CAAC,KAAK,SAAA,EAE5B;IAED,4EAA4E;IAC5E,IAAW,OAAO,IAAI,MAAM,CAE3B;IAED,uCAAuC;IACvC,IAAW,OAAO,IAAI,MAAM,CAE3B;IAEK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAcxB,aAAa,IAAI,IAAI;IAK5B,6CAA6C;IACtC,aAAa,IAAI,IAAI;IAIrB,YAAY,IAAI,IAAI;IAK3B,4CAA4C;IACrC,YAAY,IAAI,IAAI;yCA1ElB,6BAA6B;2CAA7B,6BAA6B;CA6EzC"}
@@ -55,7 +55,15 @@ function ImageArtifactPreviewComponent_Conditional_1_Template(rf, ctx) { if (rf
55
55
  export class ImageArtifactPreviewComponent extends BaseArtifactPreviewComponent {
56
56
  cdr = inject(ChangeDetectorRef);
57
57
  /** Resolved URL bound to `<img src>` — data URI (inline) or pre-auth URL (file). */
58
- imageUrl = '';
58
+ ImageUrl = '';
59
+ /** @deprecated Use {@link ImageUrl}. */
60
+ get imageUrl() {
61
+ return this.ImageUrl;
62
+ }
63
+ /** @deprecated Use {@link ImageUrl}. */
64
+ set imageUrl(value) {
65
+ this.ImageUrl = value;
66
+ }
59
67
  /** Non-empty hides the image and shows a compact error line. */
60
68
  errorMessage = '';
61
69
  /**
@@ -63,16 +71,28 @@ export class ImageArtifactPreviewComponent extends BaseArtifactPreviewComponent
63
71
  * covers URL resolution: for a multi-megabyte inline `data:` URI the decode after `src` is
64
72
  * assigned is what the user actually waits on, so the indicator holds until the `load` event.
65
73
  */
66
- imagePainted = false;
74
+ ImagePainted = false;
75
+ /** @deprecated Use {@link ImagePainted}. */
76
+ get imagePainted() {
77
+ return this.ImagePainted;
78
+ }
79
+ /** @deprecated Use {@link ImagePainted}. */
80
+ set imagePainted(value) {
81
+ this.ImagePainted = value;
82
+ }
67
83
  /** Accessible alt text — prefers a descriptive name over a raw filename. */
68
- get altText() {
84
+ get AltText() {
69
85
  return this.artifactVersion?.Name || this.artifactVersion?.FileName || 'Image artifact';
70
86
  }
87
+ /** @deprecated Use {@link AltText}. */
88
+ get altText() {
89
+ return this.AltText;
90
+ }
71
91
  async ngOnInit() {
72
92
  try {
73
93
  const url = await this.resolveContentUrl();
74
94
  if (url) {
75
- this.imageUrl = url;
95
+ this.ImageUrl = url;
76
96
  }
77
97
  else {
78
98
  this.errorMessage = 'No image content.';
@@ -83,14 +103,22 @@ export class ImageArtifactPreviewComponent extends BaseArtifactPreviewComponent
83
103
  }
84
104
  this.cdr.markForCheck();
85
105
  }
86
- onImageLoaded() {
87
- this.imagePainted = true;
106
+ OnImageLoaded() {
107
+ this.ImagePainted = true;
88
108
  this.cdr.markForCheck();
89
109
  }
90
- onImageError() {
110
+ /** @deprecated Use {@link OnImageLoaded}. */
111
+ onImageLoaded() {
112
+ return this.OnImageLoaded();
113
+ }
114
+ OnImageError() {
91
115
  this.errorMessage = 'Image could not be displayed.';
92
116
  this.cdr.markForCheck();
93
117
  }
118
+ /** @deprecated Use {@link OnImageError}. */
119
+ onImageError() {
120
+ return this.OnImageError();
121
+ }
94
122
  static ɵfac = /*@__PURE__*/ (() => { let ɵImageArtifactPreviewComponent_BaseFactory; return function ImageArtifactPreviewComponent_Factory(__ngFactoryType__) { return (ɵImageArtifactPreviewComponent_BaseFactory || (ɵImageArtifactPreviewComponent_BaseFactory = i0.ɵɵgetInheritedFactory(ImageArtifactPreviewComponent)))(__ngFactoryType__ || ImageArtifactPreviewComponent); }; })();
95
123
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ImageArtifactPreviewComponent, selectors: [["mj-image-artifact-preview"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [[1, "image-preview", "image-preview--error"], [1, "fa-solid", "fa-image"], ["text", "Loading image...", "size", "small"], [1, "image-preview__img", 3, "image-preview__img--hidden", "src", "alt"], [1, "image-preview__img", 3, "load", "error", "src", "alt"]], template: function ImageArtifactPreviewComponent_Template(rf, ctx) { if (rf & 1) {
96
124
  i0.ɵɵconditionalCreate(0, ImageArtifactPreviewComponent_Conditional_0_Template, 4, 1, "div", 0)(1, ImageArtifactPreviewComponent_Conditional_1_Template, 2, 2);
@@ -1 +1 @@
1
- {"version":3,"file":"image-artifact-preview.component.js","sourceRoot":"","sources":["../../../../src/lib/components/previews/image-artifact-preview.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,EAAU,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;;;;IAwBrE,8BAAgD;IAC5C,uBAAiC;IACjC,4BAAM;IAAA,YAAkB;IAC5B,AAD4B,iBAAO,EAC7B;;;IADI,eAAkB;IAAlB,yCAAkB;;;IAIxB,gCAA8D;;;;IAG9D,8BAOE;IADE,AADA,2MAAQ,sBAAe,KAAC,gMACf,qBAAc,KAAC;IAN5B,iBAOE;;;IALE,kEAAkD;IAElD,AADA,uDAAgB,uBACD;;;IARvB,oHAAkC;IAGlC,6GAAgB;;;IAHhB,mEAEC;IACD,cASC;IATD,0CASC;;AAvCb;;;;;;;;;;;;;;;;GAgBG;AAoEH,MAAM,OAAO,6BAA8B,SAAQ,4BAA4B;IAC1D,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAEjD,oFAAoF;IAC7E,QAAQ,GAAG,EAAE,CAAC;IAErB,gEAAgE;IACzD,YAAY,GAAG,EAAE,CAAC;IAEzB;;;;OAIG;IACI,YAAY,GAAG,KAAK,CAAC;IAE5B,4EAA4E;IAC5E,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,eAAe,EAAE,IAAI,IAAI,IAAI,CAAC,eAAe,EAAE,QAAQ,IAAI,gBAAgB,CAAC;IAC5F,CAAC;IAED,KAAK,CAAC,QAAQ;QACV,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3C,IAAI,GAAG,EAAE,CAAC;gBACN,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,YAAY,GAAG,mBAAmB,CAAC;YAC5C,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,IAAI,CAAC,YAAY,GAAG,uBAAuB,CAAC;QAChD,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAEM,aAAa;QAChB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAEM,YAAY;QACf,IAAI,CAAC,YAAY,GAAG,+BAA+B,CAAC;QACpD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;iSA3CQ,6BAA6B,yBAA7B,6BAA6B;6DAA7B,6BAA6B;YA1DhC,AALF,+FAAoB,+DAKX;;YALT,0CAmBC;;;iFA4CI,6BAA6B;cAnEzC,SAAS;6BACM,KAAK,YACP,2BAA2B,YAC3B;;;;;;;;;;;;;;;;;;;;;KAqBT;;kFA2CQ,6BAA6B","sourcesContent":["import { ChangeDetectorRef, Component, inject, OnInit } from '@angular/core';\nimport { BaseArtifactPreviewComponent } from './base-artifact-preview.component';\n\n/**\n * Inline preview for image artifacts. Renders a single contained `<img>` (max 140px tall) inside\n * the conversation message card. Read-only — no toolbar, no zoom, no download. Clicking it bubbles\n * up through the card's clickable wrapper to open the full-size image viewer.\n *\n * Height note: this is a *thumbnail*, not the full view — kept deliberately compact (140px) so a\n * message with an image artifact doesn't dominate the conversation. `max-width: 100%` (rather than a\n * fixed width) is the only width constraint, so the aspect ratio is preserved and portrait images\n * aren't distorted; the height cap is the single lever for overall size. Kept in sync with the video\n * preview's cap so both visual media previews stay visually consistent.\n *\n * Loading: the component has THREE states, not two. `resolveContentUrl()` is async, and an inline\n * `data:` URI — what MJ stores whenever no file storage account is configured — can be several MB\n * that the browser still has to decode after the src is assigned. With only `error` and `loaded`\n * branches the element rendered nothing at all through both windows, so a generated image read as\n * \"never arrived\" and then appeared unannounced seconds later.\n */\n@Component({\n standalone: false,\n selector: 'mj-image-artifact-preview',\n template: `\n @if (errorMessage) {\n <div class=\"image-preview image-preview--error\">\n <i class=\"fa-solid fa-image\"></i>\n <span>{{ errorMessage }}</span>\n </div>\n } @else {\n @if (isLoading || !imagePainted) {\n <mj-loading text=\"Loading image...\" size=\"small\"></mj-loading>\n }\n @if (imageUrl) {\n <img\n class=\"image-preview__img\"\n [class.image-preview__img--hidden]=\"!imagePainted\"\n [src]=\"imageUrl\"\n [alt]=\"altText\"\n (load)=\"onImageLoaded()\"\n (error)=\"onImageError()\"\n />\n }\n }\n `,\n styles: [\n `\n :host {\n display: block;\n /* Containing block for the pending <img>, which is position:absolute so it can be\n painted (and therefore decoded) without reserving layout. Without this it\n positions against whatever ancestor happens to be positioned — in the\n conversation, potentially the scroll container. */\n position: relative;\n }\n\n .image-preview__img {\n display: block;\n max-width: 100%;\n max-height: 140px;\n width: auto;\n height: auto;\n object-fit: contain;\n border-radius: 6px;\n background: var(--mj-bg-surface-sunken);\n }\n\n /* Same decode-while-hidden treatment as ImageArtifactViewerComponent's\n .image-viewer__img--hidden, for the same reason: the element must stay in the paint\n tree so the browser decodes it, which display:none would prevent. */\n .image-preview__img--hidden {\n opacity: 0;\n position: absolute;\n pointer-events: none;\n }\n\n .image-preview--error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n color: var(--mj-text-muted);\n font-size: 13px;\n }\n `,\n ],\n})\nexport class ImageArtifactPreviewComponent extends BaseArtifactPreviewComponent implements OnInit {\n private readonly cdr = inject(ChangeDetectorRef);\n\n /** Resolved URL bound to `<img src>` — data URI (inline) or pre-auth URL (file). */\n public imageUrl = '';\n\n /** Non-empty hides the image and shows a compact error line. */\n public errorMessage = '';\n\n /**\n * Has the browser painted the image? Distinct from the base class's {@link isLoading}, which\n * covers URL resolution: for a multi-megabyte inline `data:` URI the decode after `src` is\n * assigned is what the user actually waits on, so the indicator holds until the `load` event.\n */\n public imagePainted = false;\n\n /** Accessible alt text — prefers a descriptive name over a raw filename. */\n public get altText(): string {\n return this.artifactVersion?.Name || this.artifactVersion?.FileName || 'Image artifact';\n }\n\n async ngOnInit(): Promise<void> {\n try {\n const url = await this.resolveContentUrl();\n if (url) {\n this.imageUrl = url;\n } else {\n this.errorMessage = 'No image content.';\n }\n } catch {\n this.errorMessage = 'Could not load image.';\n }\n this.cdr.markForCheck();\n }\n\n public onImageLoaded(): void {\n this.imagePainted = true;\n this.cdr.markForCheck();\n }\n\n public onImageError(): void {\n this.errorMessage = 'Image could not be displayed.';\n this.cdr.markForCheck();\n }\n}\n"]}
1
+ {"version":3,"file":"image-artifact-preview.component.js","sourceRoot":"","sources":["../../../../src/lib/components/previews/image-artifact-preview.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,EAAU,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;;;;IAwBrE,8BAAgD;IAC5C,uBAAiC;IACjC,4BAAM;IAAA,YAAkB;IAC5B,AAD4B,iBAAO,EAC7B;;;IADI,eAAkB;IAAlB,yCAAkB;;;IAIxB,gCAA8D;;;;IAG9D,8BAOE;IADE,AADA,2MAAQ,sBAAe,KAAC,gMACf,qBAAc,KAAC;IAN5B,iBAOE;;;IALE,kEAAkD;IAElD,AADA,uDAAgB,uBACD;;;IARvB,oHAAkC;IAGlC,6GAAgB;;;IAHhB,mEAEC;IACD,cASC;IATD,0CASC;;AAvCb;;;;;;;;;;;;;;;;GAgBG;AAoEH,MAAM,OAAO,6BAA8B,SAAQ,4BAA4B;IAC1D,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAEjD,oFAAoF;IAC7E,QAAQ,GAAG,EAAE,CAAC;IAErB,wCAAwC;IACxC,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IACD,wCAAwC;IACxC,IAAW,QAAQ,CAAC,KAAK;QACrB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,gEAAgE;IACzD,YAAY,GAAG,EAAE,CAAC;IAEzB;;;;OAIG;IACI,YAAY,GAAG,KAAK,CAAC;IAE5B,4CAA4C;IAC5C,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IACD,4CAA4C;IAC5C,IAAW,YAAY,CAAC,KAAK;QACzB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC9B,CAAC;IAED,4EAA4E;IAC5E,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,eAAe,EAAE,IAAI,IAAI,IAAI,CAAC,eAAe,EAAE,QAAQ,IAAI,gBAAgB,CAAC;IAC5F,CAAC;IAED,uCAAuC;IACvC,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,QAAQ;QACV,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3C,IAAI,GAAG,EAAE,CAAC;gBACN,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,YAAY,GAAG,mBAAmB,CAAC;YAC5C,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,IAAI,CAAC,YAAY,GAAG,uBAAuB,CAAC;QAChD,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAEM,aAAa;QAChB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAED,6CAA6C;IACtC,aAAa;QAChB,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;IAChC,CAAC;IAEM,YAAY;QACf,IAAI,CAAC,YAAY,GAAG,+BAA+B,CAAC;QACpD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAED,4CAA4C;IACrC,YAAY;QACf,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;IAC/B,CAAC;iSA5EQ,6BAA6B,yBAA7B,6BAA6B;6DAA7B,6BAA6B;YA1DhC,AALF,+FAAoB,+DAKX;;YALT,0CAmBC;;;iFA4CI,6BAA6B;cAnEzC,SAAS;6BACM,KAAK,YACP,2BAA2B,YAC3B;;;;;;;;;;;;;;;;;;;;;KAqBT;;kFA2CQ,6BAA6B","sourcesContent":["import { ChangeDetectorRef, Component, inject, OnInit } from '@angular/core';\nimport { BaseArtifactPreviewComponent } from './base-artifact-preview.component';\n\n/**\n * Inline preview for image artifacts. Renders a single contained `<img>` (max 140px tall) inside\n * the conversation message card. Read-only — no toolbar, no zoom, no download. Clicking it bubbles\n * up through the card's clickable wrapper to open the full-size image viewer.\n *\n * Height note: this is a *thumbnail*, not the full view — kept deliberately compact (140px) so a\n * message with an image artifact doesn't dominate the conversation. `max-width: 100%` (rather than a\n * fixed width) is the only width constraint, so the aspect ratio is preserved and portrait images\n * aren't distorted; the height cap is the single lever for overall size. Kept in sync with the video\n * preview's cap so both visual media previews stay visually consistent.\n *\n * Loading: the component has THREE states, not two. `resolveContentUrl()` is async, and an inline\n * `data:` URI — what MJ stores whenever no file storage account is configured — can be several MB\n * that the browser still has to decode after the src is assigned. With only `error` and `loaded`\n * branches the element rendered nothing at all through both windows, so a generated image read as\n * \"never arrived\" and then appeared unannounced seconds later.\n */\n@Component({\n standalone: false,\n selector: 'mj-image-artifact-preview',\n template: `\n @if (errorMessage) {\n <div class=\"image-preview image-preview--error\">\n <i class=\"fa-solid fa-image\"></i>\n <span>{{ errorMessage }}</span>\n </div>\n } @else {\n @if (isLoading || !imagePainted) {\n <mj-loading text=\"Loading image...\" size=\"small\"></mj-loading>\n }\n @if (imageUrl) {\n <img\n class=\"image-preview__img\"\n [class.image-preview__img--hidden]=\"!imagePainted\"\n [src]=\"imageUrl\"\n [alt]=\"altText\"\n (load)=\"onImageLoaded()\"\n (error)=\"onImageError()\"\n />\n }\n }\n `,\n styles: [\n `\n :host {\n display: block;\n /* Containing block for the pending <img>, which is position:absolute so it can be\n painted (and therefore decoded) without reserving layout. Without this it\n positions against whatever ancestor happens to be positioned — in the\n conversation, potentially the scroll container. */\n position: relative;\n }\n\n .image-preview__img {\n display: block;\n max-width: 100%;\n max-height: 140px;\n width: auto;\n height: auto;\n object-fit: contain;\n border-radius: 6px;\n background: var(--mj-bg-surface-sunken);\n }\n\n /* Same decode-while-hidden treatment as ImageArtifactViewerComponent's\n .image-viewer__img--hidden, for the same reason: the element must stay in the paint\n tree so the browser decodes it, which display:none would prevent. */\n .image-preview__img--hidden {\n opacity: 0;\n position: absolute;\n pointer-events: none;\n }\n\n .image-preview--error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n color: var(--mj-text-muted);\n font-size: 13px;\n }\n `,\n ],\n})\nexport class ImageArtifactPreviewComponent extends BaseArtifactPreviewComponent implements OnInit {\n private readonly cdr = inject(ChangeDetectorRef);\n\n /** Resolved URL bound to `<img src>` — data URI (inline) or pre-auth URL (file). */\n public ImageUrl = '';\n\n /** @deprecated Use {@link ImageUrl}. */\n public get imageUrl() {\n return this.ImageUrl;\n }\n /** @deprecated Use {@link ImageUrl}. */\n public set imageUrl(value) {\n this.ImageUrl = value;\n }\n\n /** Non-empty hides the image and shows a compact error line. */\n public errorMessage = '';\n\n /**\n * Has the browser painted the image? Distinct from the base class's {@link isLoading}, which\n * covers URL resolution: for a multi-megabyte inline `data:` URI the decode after `src` is\n * assigned is what the user actually waits on, so the indicator holds until the `load` event.\n */\n public ImagePainted = false;\n\n /** @deprecated Use {@link ImagePainted}. */\n public get imagePainted() {\n return this.ImagePainted;\n }\n /** @deprecated Use {@link ImagePainted}. */\n public set imagePainted(value) {\n this.ImagePainted = value;\n }\n\n /** Accessible alt text — prefers a descriptive name over a raw filename. */\n public get AltText(): string {\n return this.artifactVersion?.Name || this.artifactVersion?.FileName || 'Image artifact';\n }\n\n /** @deprecated Use {@link AltText}. */\n public get altText(): string {\n return this.AltText;\n }\n\n async ngOnInit(): Promise<void> {\n try {\n const url = await this.resolveContentUrl();\n if (url) {\n this.ImageUrl = url;\n } else {\n this.errorMessage = 'No image content.';\n }\n } catch {\n this.errorMessage = 'Could not load image.';\n }\n this.cdr.markForCheck();\n }\n\n public OnImageLoaded(): void {\n this.ImagePainted = true;\n this.cdr.markForCheck();\n }\n\n /** @deprecated Use {@link OnImageLoaded}. */\n public onImageLoaded(): void {\n return this.OnImageLoaded();\n }\n\n public OnImageError(): void {\n this.errorMessage = 'Image could not be displayed.';\n this.cdr.markForCheck();\n }\n\n /** @deprecated Use {@link OnImageError}. */\n public onImageError(): void {\n return this.OnImageError();\n }\n}\n"]}
@@ -15,7 +15,11 @@ import * as i0 from "@angular/core";
15
15
  export declare class VideoArtifactPreviewComponent extends BaseArtifactPreviewComponent implements OnInit {
16
16
  private readonly cdr;
17
17
  /** Resolved URL — data URI (inline) or pre-auth URL (file). Funneled through {@link setVideoUrl}. */
18
- videoUrl: string;
18
+ VideoUrl: string;
19
+ /** @deprecated Use {@link VideoUrl}. */
20
+ get videoUrl(): string;
21
+ /** @deprecated Use {@link VideoUrl}. */
22
+ set videoUrl(value: string);
19
23
  /** Non-empty hides the player and shows a compact error line. */
20
24
  errorMessage: string;
21
25
  /**
@@ -26,8 +30,12 @@ export declare class VideoArtifactPreviewComponent extends BaseArtifactPreviewCo
26
30
  /** Set the resolved URL and recompute the single-element {@link MediaTracks} array in lockstep. */
27
31
  private setVideoUrl;
28
32
  ngOnInit(): Promise<void>;
33
+ OnMediaError(): void;
34
+ /** @deprecated Use {@link OnMediaError}. */
29
35
  onMediaError(): void;
30
36
  /** Fired when the generic player reaches the end of the track. No-op affordance hook. */
37
+ OnMediaEnded(): void;
38
+ /** @deprecated Use {@link OnMediaEnded}. */
31
39
  onMediaEnded(): void;
32
40
  static ɵfac: i0.ɵɵFactoryDeclaration<VideoArtifactPreviewComponent, never>;
33
41
  static ɵcmp: i0.ɵɵComponentDeclaration<VideoArtifactPreviewComponent, "mj-video-artifact-preview", never, {}, {}, never, never, false, never>;
@@ -1 +1 @@
1
- {"version":3,"file":"video-artifact-preview.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/previews/video-artifact-preview.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwC,MAAM,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;;AAEjF;;;;;;;;;GASG;AACH,qBAuDa,6BAA8B,SAAQ,4BAA6B,YAAW,MAAM;IAC7F,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IAEjD,qGAAqG;IAC9F,QAAQ,SAAM;IAGrB,iEAAiE;IAC1D,YAAY,SAAM;IAEzB;;;OAGG;IACI,WAAW,EAAE,UAAU,EAAE,CAAM;IAEtC,mGAAmG;IACnG,OAAO,CAAC,WAAW;IAcb,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAcxB,YAAY,IAAI,IAAI;IAM3B,yFAAyF;IAClF,YAAY,IAAI,IAAI;yCApDlB,6BAA6B;2CAA7B,6BAA6B;CAuDzC"}
1
+ {"version":3,"file":"video-artifact-preview.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/previews/video-artifact-preview.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwC,MAAM,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;;AAEjF;;;;;;;;;GASG;AACH,qBAuDa,6BAA8B,SAAQ,4BAA6B,YAAW,MAAM;IAC7F,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IAEjD,qGAAqG;IAC9F,QAAQ,SAAM;IAErB,wCAAwC;IACxC,IAAW,QAAQ,WAElB;IACD,wCAAwC;IACxC,IAAW,QAAQ,CAAC,KAAK,QAAA,EAExB;IAGD,iEAAiE;IAC1D,YAAY,SAAM;IAEzB;;;OAGG;IACI,WAAW,EAAE,UAAU,EAAE,CAAM;IAEtC,mGAAmG;IACnG,OAAO,CAAC,WAAW;IAcb,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAcxB,YAAY,IAAI,IAAI;IAM3B,4CAA4C;IACrC,YAAY,IAAI,IAAI;IAI3B,yFAAyF;IAClF,YAAY,IAAI,IAAI;IAI3B,4CAA4C;IACrC,YAAY,IAAI,IAAI;yCAvElB,6BAA6B;2CAA7B,6BAA6B;CA0EzC"}
@@ -39,7 +39,15 @@ function VideoArtifactPreviewComponent_Conditional_2_Template(rf, ctx) { if (rf
39
39
  export class VideoArtifactPreviewComponent extends BaseArtifactPreviewComponent {
40
40
  cdr = inject(ChangeDetectorRef);
41
41
  /** Resolved URL — data URI (inline) or pre-auth URL (file). Funneled through {@link setVideoUrl}. */
42
- videoUrl = '';
42
+ VideoUrl = '';
43
+ /** @deprecated Use {@link VideoUrl}. */
44
+ get videoUrl() {
45
+ return this.VideoUrl;
46
+ }
47
+ /** @deprecated Use {@link VideoUrl}. */
48
+ set videoUrl(value) {
49
+ this.VideoUrl = value;
50
+ }
43
51
  /** Non-empty hides the player and shows a compact error line. */
44
52
  errorMessage = '';
45
53
  /**
@@ -49,7 +57,7 @@ export class VideoArtifactPreviewComponent extends BaseArtifactPreviewComponent
49
57
  MediaTracks = [];
50
58
  /** Set the resolved URL and recompute the single-element {@link MediaTracks} array in lockstep. */
51
59
  setVideoUrl(url) {
52
- this.videoUrl = url;
60
+ this.VideoUrl = url;
53
61
  this.MediaTracks = url
54
62
  ? [
55
63
  {
@@ -76,15 +84,23 @@ export class VideoArtifactPreviewComponent extends BaseArtifactPreviewComponent
76
84
  }
77
85
  this.cdr.markForCheck();
78
86
  }
79
- onMediaError() {
87
+ OnMediaError() {
80
88
  this.errorMessage = 'Video could not be played.';
81
89
  this.setVideoUrl('');
82
90
  this.cdr.markForCheck();
83
91
  }
92
+ /** @deprecated Use {@link OnMediaError}. */
93
+ onMediaError() {
94
+ return this.OnMediaError();
95
+ }
84
96
  /** Fired when the generic player reaches the end of the track. No-op affordance hook. */
85
- onMediaEnded() {
97
+ OnMediaEnded() {
86
98
  // Playback finished — nothing to persist for an inline preview.
87
99
  }
100
+ /** @deprecated Use {@link OnMediaEnded}. */
101
+ onMediaEnded() {
102
+ return this.OnMediaEnded();
103
+ }
88
104
  static ɵfac = /*@__PURE__*/ (() => { let ɵVideoArtifactPreviewComponent_BaseFactory; return function VideoArtifactPreviewComponent_Factory(__ngFactoryType__) { return (ɵVideoArtifactPreviewComponent_BaseFactory || (ɵVideoArtifactPreviewComponent_BaseFactory = i0.ɵɵgetInheritedFactory(VideoArtifactPreviewComponent)))(__ngFactoryType__ || VideoArtifactPreviewComponent); }; })();
89
105
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: VideoArtifactPreviewComponent, selectors: [["mj-video-artifact-preview"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 1, consts: [[1, "video-preview", "video-preview--error"], ["text", "Loading video...", "size", "small"], [1, "video-preview__player", 3, "Tracks", "ShowTranscript", "ShowTranscriptToggle", "ShowWaveform", "ShowSpeedControl", "ShowSkipControls", "ShowVolume"], [1, "fa-solid", "fa-film"], [1, "video-preview__player", 3, "click", "Ended", "Tracks", "ShowTranscript", "ShowTranscriptToggle", "ShowWaveform", "ShowSpeedControl", "ShowSkipControls", "ShowVolume"]], template: function VideoArtifactPreviewComponent_Template(rf, ctx) { if (rf & 1) {
90
106
  i0.ɵɵconditionalCreate(0, VideoArtifactPreviewComponent_Conditional_0_Template, 4, 1, "div", 0)(1, VideoArtifactPreviewComponent_Conditional_1_Template, 1, 0, "mj-loading", 1)(2, VideoArtifactPreviewComponent_Conditional_2_Template, 1, 7, "mj-media-player", 2);