@@ -17,6 +17,9 @@ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
17
17
import { UmbChangeEvent } from '@umbraco-cms/backoffice/event' ;
18
18
19
19
import './input-upload-field-file.element.js' ;
20
+ import { UmbExtensionsManifestInitializer } from '@umbraco-cms/backoffice/extension-api' ;
21
+ import { type ManifestFileUploadPreview , umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry' ;
22
+ import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api' ;
20
23
21
24
@customElement ( 'umb-input-upload-field' )
22
25
export class UmbInputUploadFieldElement extends UmbLitElement {
@@ -56,6 +59,17 @@ export class UmbInputUploadFieldElement extends UmbLitElement {
56
59
57
60
#manager = new UmbTemporaryFileManager ( this ) ;
58
61
62
+ #previewers = new UmbArrayState ( < Array < ManifestFileUploadPreview > > [ ] , ( x ) => x . alias ) ;
63
+
64
+ constructor ( ) {
65
+ super ( ) ;
66
+ new UmbExtensionsManifestInitializer ( this , umbExtensionsRegistry , 'fileUploadPreview' , null , ( previews ) => {
67
+ previews . forEach ( ( preview ) => {
68
+ this . #previewers. appendOne ( preview . manifest ) ;
69
+ } ) ;
70
+ } ) ;
71
+ }
72
+
59
73
#setExtensions( extensions : Array < string > ) {
60
74
if ( ! extensions ?. length ) {
61
75
this . _extensions = undefined ;
@@ -71,6 +85,7 @@ export class UmbInputUploadFieldElement extends UmbLitElement {
71
85
temporaryUnique : UmbId . new ( ) ,
72
86
file : e . detail . files [ 0 ] ,
73
87
} ;
88
+
74
89
const upload = this . #manager. uploadOne ( item ) ;
75
90
76
91
const reader = new FileReader ( ) ;
@@ -111,6 +126,8 @@ export class UmbInputUploadFieldElement extends UmbLitElement {
111
126
112
127
#renderFile( src : string , file ?: File ) {
113
128
const extension = this . #getFileExtensionFromPath( src ) ;
129
+ const element = this . #getElementFromFilePath( src ) ;
130
+ console . log ( 'element' , element ) ;
114
131
115
132
return html `
116
133
<div id= "wrapper" >
@@ -125,7 +142,7 @@ export class UmbInputUploadFieldElement extends UmbLitElement {
125
142
` ;
126
143
127
144
/**
128
- *
145
+ * @returns { string } The template for the file extension.
129
146
*/
130
147
function getElementTemplate ( ) {
131
148
switch ( extension ) {
@@ -143,6 +160,34 @@ export class UmbInputUploadFieldElement extends UmbLitElement {
143
160
}
144
161
}
145
162
163
+ #getElementFromFilePath( path : string ) {
164
+ const previews = this . #previewers. getValue ( ) ;
165
+ const fallbackElement = previews . find ( ( preview ) => ! preview . forMimeTypes ?. length ) ?. element ;
166
+
167
+ // Extract the the MIME type from the data url and get corresponding previewer.
168
+ if ( path . startsWith ( 'data:' ) ) {
169
+ const mimeType = path . substring ( 5 , path . indexOf ( ';' ) ) ;
170
+
171
+ const manifest = previews . find ( ( preview ) => {
172
+ return preview . forMimeTypes ?. find ( ( type ) => {
173
+ const snippet = type . replace ( '*' , '' ) ;
174
+ if ( mimeType . startsWith ( snippet ) ) return preview ;
175
+ if ( mimeType . endsWith ( snippet ) ) return preview ;
176
+ return undefined ;
177
+ } ) ;
178
+ } ) ;
179
+
180
+ if ( manifest ) return manifest . element ;
181
+ return fallbackElement ;
182
+ }
183
+
184
+ // Extract the file extension from the path
185
+ const extension = path . split ( '.' ) . pop ( ) ?. toLowerCase ( ) ;
186
+ if ( ! extension ) return fallbackElement ;
187
+
188
+ return fallbackElement ;
189
+ }
190
+
146
191
#getFileExtensionFromPath( path : string ) : 'audio' | 'video' | 'image' | 'svg' | 'file' {
147
192
// Extract the MIME type from the data URL
148
193
if ( path . startsWith ( 'data:' ) ) {
0 commit comments