@@ -13,25 +13,31 @@ import {
13
13
property ,
14
14
query ,
15
15
state ,
16
+ type PropertyValueMap ,
16
17
} from '@umbraco-cms/backoffice/external/lit' ;
17
18
import type { UUIFileDropzoneElement , UUIFileDropzoneEvent } from '@umbraco-cms/backoffice/external/uui' ;
18
19
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element' ;
19
20
import { UmbChangeEvent } from '@umbraco-cms/backoffice/event' ;
20
21
21
22
import { UmbExtensionsManifestInitializer } from '@umbraco-cms/backoffice/extension-api' ;
22
23
import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry' ;
24
+ import { stringOrStringArrayContains } from '@umbraco-cms/backoffice/utils' ;
23
25
24
26
@customElement ( 'umb-input-upload-field' )
25
27
export class UmbInputUploadFieldElement extends UmbLitElement {
26
28
@property ( { type : Object } )
27
29
set value ( value : MediaValueType ) {
28
- if ( ! value ?. src ) return ;
29
- this . src = value . src ;
30
+ this . #src = value ?. src ?? '' ;
30
31
}
31
32
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
+ } ;
33
37
}
34
38
39
+ #src = '' ;
40
+
35
41
/**
36
42
* @description Allowed file extensions. Allow all if empty.
37
43
* @type {Array<string> }
@@ -48,17 +54,6 @@ export class UmbInputUploadFieldElement extends UmbLitElement {
48
54
@state ( )
49
55
public temporaryFile ?: UmbTemporaryFileModel ;
50
56
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
-
62
57
@state ( )
63
58
private _extensions ?: string [ ] ;
64
59
@@ -74,9 +69,23 @@ export class UmbInputUploadFieldElement extends UmbLitElement {
74
69
75
70
constructor ( ) {
76
71
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;
80
89
}
81
90
82
91
#setExtensions( extensions : Array < string > ) {
@@ -88,20 +97,28 @@ export class UmbInputUploadFieldElement extends UmbLitElement {
88
97
this . _extensions = extensions ?. map ( ( extension ) => `.${ extension } ` ) ;
89
98
}
90
99
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 ;
93
110
94
- const mimeType = this . #getMimeTypeFromPath( this . _src ) ;
111
+ const mimeType = this . #getMimeTypeFromPath( this . value . src ) ;
95
112
if ( ! mimeType ) return fallbackAlias ;
96
113
97
114
// 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 ) ;
100
117
} ) ;
101
118
if ( exactMatch ) return exactMatch . alias ;
102
119
103
120
// Check for wildcard match (e.g. image/*)
104
- const wildcardMatch = this . # manifests. find ( ( manifest ) => {
121
+ const wildcardMatch = manifests . find ( ( manifest ) => {
105
122
const forMimeTypes = Array . isArray ( manifest . forMimeTypes ) ? manifest . forMimeTypes : [ manifest . forMimeTypes ] ;
106
123
return forMimeTypes . find ( ( type ) => {
107
124
const snippet = type . replace ( / \* / g, '' ) ;
@@ -140,7 +157,7 @@ export class UmbInputUploadFieldElement extends UmbLitElement {
140
157
141
158
const reader = new FileReader ( ) ;
142
159
reader . onload = ( ) => {
143
- this . src = reader . result as string ;
160
+ this . value = { src : reader . result as string } ;
144
161
} ;
145
162
reader . readAsDataURL ( item . file ) ;
146
163
@@ -158,8 +175,8 @@ export class UmbInputUploadFieldElement extends UmbLitElement {
158
175
}
159
176
160
177
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 ) ;
163
180
} else {
164
181
return this . #renderDropzone( ) ;
165
182
}
@@ -178,7 +195,7 @@ export class UmbInputUploadFieldElement extends UmbLitElement {
178
195
` ;
179
196
}
180
197
181
- #renderFile( src : string , previewAlias ? : string , file ?: File ) {
198
+ #renderFile( src : string , previewAlias : string , file ?: File ) {
182
199
if ( ! previewAlias ) return 'An error occurred. No previewer found for the file type.' ;
183
200
return html `
184
201
<div id= "wrapper" >
@@ -204,7 +221,7 @@ export class UmbInputUploadFieldElement extends UmbLitElement {
204
221
}
205
222
206
223
#handleRemove( ) {
207
- this . src = '' ;
224
+ this . value = { src : undefined } ;
208
225
this . temporaryFile = undefined ;
209
226
this . dispatchEvent ( new UmbChangeEvent ( ) ) ;
210
227
}
0 commit comments