Skip to content

Commit 896b677

Browse files
loivseniOvergaard
authored andcommitted
property editor upload field loading previews
1 parent 940c2fd commit 896b677

File tree

1 file changed

+46
-1
lines changed

1 file changed

+46
-1
lines changed

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

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
1717
import { UmbChangeEvent } from '@umbraco-cms/backoffice/event';
1818

1919
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';
2023

2124
@customElement('umb-input-upload-field')
2225
export class UmbInputUploadFieldElement extends UmbLitElement {
@@ -56,6 +59,17 @@ export class UmbInputUploadFieldElement extends UmbLitElement {
5659

5760
#manager = new UmbTemporaryFileManager(this);
5861

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+
5973
#setExtensions(extensions: Array<string>) {
6074
if (!extensions?.length) {
6175
this._extensions = undefined;
@@ -71,6 +85,7 @@ export class UmbInputUploadFieldElement extends UmbLitElement {
7185
temporaryUnique: UmbId.new(),
7286
file: e.detail.files[0],
7387
};
88+
7489
const upload = this.#manager.uploadOne(item);
7590

7691
const reader = new FileReader();
@@ -111,6 +126,8 @@ export class UmbInputUploadFieldElement extends UmbLitElement {
111126

112127
#renderFile(src: string, file?: File) {
113128
const extension = this.#getFileExtensionFromPath(src);
129+
const element = this.#getElementFromFilePath(src);
130+
console.log('element', element);
114131

115132
return html`
116133
<div id="wrapper">
@@ -125,7 +142,7 @@ export class UmbInputUploadFieldElement extends UmbLitElement {
125142
`;
126143

127144
/**
128-
*
145+
* @returns {string} The template for the file extension.
129146
*/
130147
function getElementTemplate() {
131148
switch (extension) {
@@ -143,6 +160,34 @@ export class UmbInputUploadFieldElement extends UmbLitElement {
143160
}
144161
}
145162

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+
146191
#getFileExtensionFromPath(path: string): 'audio' | 'video' | 'image' | 'svg' | 'file' {
147192
// Extract the MIME type from the data URL
148193
if (path.startsWith('data:')) {

0 commit comments

Comments
 (0)