@@ -13,25 +13,31 @@ import {
1313 property ,
1414 query ,
1515 state ,
16+ type PropertyValueMap ,
1617} from '@umbraco-cms/backoffice/external/lit' ;
1718import type { UUIFileDropzoneElement , UUIFileDropzoneEvent } from '@umbraco-cms/backoffice/external/uui' ;
1819import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element' ;
1920import { UmbChangeEvent } from '@umbraco-cms/backoffice/event' ;
2021
2122import { UmbExtensionsManifestInitializer } from '@umbraco-cms/backoffice/extension-api' ;
2223import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry' ;
24+ import { stringOrStringArrayContains } from '@umbraco-cms/backoffice/utils' ;
2325
2426@customElement ( 'umb-input-upload-field' )
2527export class UmbInputUploadFieldElement extends UmbLitElement {
2628 @property ( { type : Object } )
2729 set value ( value : MediaValueType ) {
28- if ( ! value ?. src ) return ;
29- this . src = value . src ;
30+ this . #src = value ?. src ?? '' ;
3031 }
3132 get value ( ) : MediaValueType {
32- return ! this . temporaryFile ? { src : this . _src } : { temporaryFileId : this . temporaryFile . temporaryUnique } ;
33+ return {
34+ src : this . #src,
35+ temporaryFileId : this . temporaryFile ?. temporaryUnique ,
36+ } ;
3337 }
3438
39+ #src = '' ;
40+
3541 /**
3642 * @description Allowed file extensions. Allow all if empty.
3743 * @type {Array<string> }
@@ -48,17 +54,6 @@ export class UmbInputUploadFieldElement extends UmbLitElement {
4854 @state ( )
4955 public temporaryFile ?: UmbTemporaryFileModel ;
5056
51- public set src ( src : string ) {
52- this . _src = src ;
53- this . _previewAlias = this . #getPreviewElementAlias( ) ;
54- }
55- public get src ( ) {
56- return this . _src ;
57- }
58-
59- @state ( )
60- private _src = '' ;
61-
6257 @state ( )
6358 private _extensions ?: string [ ] ;
6459
@@ -74,9 +69,23 @@ export class UmbInputUploadFieldElement extends UmbLitElement {
7469
7570 constructor ( ) {
7671 super ( ) ;
77- new UmbExtensionsManifestInitializer ( this , umbExtensionsRegistry , 'fileUploadPreview' , null , ( manifests ) => {
78- this . #manifests = manifests . map ( ( manifest ) => manifest . manifest ) ;
79- } ) ;
72+ }
73+
74+ override updated ( changedProperties : PropertyValueMap < any > | Map < PropertyKey , unknown > ) {
75+ super . updated ( changedProperties ) ;
76+ if ( changedProperties . has ( 'value' ) && changedProperties . get ( 'value' ) ?. src !== this . value . src ) {
77+ this . #setPreviewAlias( ) ;
78+ }
79+ }
80+
81+ async #getManifests( ) {
82+ if ( this . #manifests. length ) return this . #manifests;
83+
84+ await new UmbExtensionsManifestInitializer ( this , umbExtensionsRegistry , 'fileUploadPreview' , null , ( exts ) => {
85+ this . #manifests = exts . map ( ( exts ) => exts . manifest ) ;
86+ } ) . asPromise ( ) ;
87+
88+ return this . #manifests;
8089 }
8190
8291 #setExtensions( extensions : Array < string > ) {
@@ -88,20 +97,28 @@ export class UmbInputUploadFieldElement extends UmbLitElement {
8897 this . _extensions = extensions ?. map ( ( extension ) => `.${ extension } ` ) ;
8998 }
9099
91- #getPreviewElementAlias( ) {
92- const fallbackAlias = this . #manifests. find ( ( manifest ) => manifest . forMimeTypes . includes ( '*/*' ) ) ?. alias ;
100+ async #setPreviewAlias( ) : Promise < void > {
101+ this . _previewAlias = await this . #getPreviewElementAlias( ) ;
102+ }
103+
104+ async #getPreviewElementAlias( ) {
105+ if ( ! this . value . src ) return ;
106+ const manifests = await this . #getManifests( ) ;
107+ const fallbackAlias = manifests . find ( ( manifest ) =>
108+ stringOrStringArrayContains ( manifest . forMimeTypes , '*/*' ) ,
109+ ) ?. alias ;
93110
94- const mimeType = this . #getMimeTypeFromPath( this . _src ) ;
111+ const mimeType = this . #getMimeTypeFromPath( this . value . src ) ;
95112 if ( ! mimeType ) return fallbackAlias ;
96113
97114 // Check for an exact match
98- const exactMatch = this . # manifests. find ( ( manifest ) => {
99- return manifest . forMimeTypes . includes ( mimeType ) ;
115+ const exactMatch = manifests . find ( ( manifest ) => {
116+ return stringOrStringArrayContains ( manifest . forMimeTypes , mimeType ) ;
100117 } ) ;
101118 if ( exactMatch ) return exactMatch . alias ;
102119
103120 // Check for wildcard match (e.g. image/*)
104- const wildcardMatch = this . # manifests. find ( ( manifest ) => {
121+ const wildcardMatch = manifests . find ( ( manifest ) => {
105122 const forMimeTypes = Array . isArray ( manifest . forMimeTypes ) ? manifest . forMimeTypes : [ manifest . forMimeTypes ] ;
106123 return forMimeTypes . find ( ( type ) => {
107124 const snippet = type . replace ( / \* / g, '' ) ;
@@ -140,7 +157,7 @@ export class UmbInputUploadFieldElement extends UmbLitElement {
140157
141158 const reader = new FileReader ( ) ;
142159 reader . onload = ( ) => {
143- this . src = reader . result as string ;
160+ this . value = { src : reader . result as string } ;
144161 } ;
145162 reader . readAsDataURL ( item . file ) ;
146163
@@ -158,8 +175,8 @@ export class UmbInputUploadFieldElement extends UmbLitElement {
158175 }
159176
160177 override render ( ) {
161- if ( this . src && this . _previewAlias ) {
162- return this . #renderFile( this . src , this . _previewAlias , this . temporaryFile ?. file ) ;
178+ if ( this . value . src && this . _previewAlias ) {
179+ return this . #renderFile( this . value . src , this . _previewAlias , this . temporaryFile ?. file ) ;
163180 } else {
164181 return this . #renderDropzone( ) ;
165182 }
@@ -178,7 +195,7 @@ export class UmbInputUploadFieldElement extends UmbLitElement {
178195 ` ;
179196 }
180197
181- #renderFile( src : string , previewAlias ? : string , file ?: File ) {
198+ #renderFile( src : string , previewAlias : string , file ?: File ) {
182199 if ( ! previewAlias ) return 'An error occurred. No previewer found for the file type.' ;
183200 return html `
184201 <div id= "wrapper" >
@@ -204,7 +221,7 @@ export class UmbInputUploadFieldElement extends UmbLitElement {
204221 }
205222
206223 #handleRemove( ) {
207- this . src = '' ;
224+ this . value = { src : undefined } ;
208225 this . temporaryFile = undefined ;
209226 this . dispatchEvent ( new UmbChangeEvent ( ) ) ;
210227 }
0 commit comments