Skip to content

Commit 34c35cc

Browse files
authored
Merge pull request #2400 from umbraco/v15/hotfix/fallback-preview
V15 Hotfix: Media previews are not shown for anything other than images
2 parents 8182b60 + 3a9dca4 commit 34c35cc

File tree

1 file changed

+45
-28
lines changed

1 file changed

+45
-28
lines changed

src/packages/media/media/components/input-upload-field/input-upload-field.element.ts

Lines changed: 45 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,31 @@ import {
1313
property,
1414
query,
1515
state,
16+
type PropertyValueMap,
1617
} from '@umbraco-cms/backoffice/external/lit';
1718
import type { UUIFileDropzoneElement, UUIFileDropzoneEvent } from '@umbraco-cms/backoffice/external/uui';
1819
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
1920
import { UmbChangeEvent } from '@umbraco-cms/backoffice/event';
2021

2122
import { UmbExtensionsManifestInitializer } from '@umbraco-cms/backoffice/extension-api';
2223
import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
24+
import { stringOrStringArrayContains } from '@umbraco-cms/backoffice/utils';
2325

2426
@customElement('umb-input-upload-field')
2527
export 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

Comments
 (0)