From 60d730a68342eb4b6c81d35d0f2e59fd773e985a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Gremaud?= Date: Fri, 16 Oct 2026 02:24:41 +0200 Subject: [PATCH] feat(submissions): add small file preview before submitting --- polylan_submitter/src/Submissions.vue | 42 ++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/polylan_submitter/src/Submissions.vue b/polylan_submitter/src/Submissions.vue index 204c1cb..34fd65a 100644 --- a/polylan_submitter/src/Submissions.vue +++ b/polylan_submitter/src/Submissions.vue @@ -415,6 +415,26 @@ const removeFile = (index: number) => { uploadedFiles.value.splice(index, 1); }; +// Thumbnails of the selected images, revoked once the file is removed/submitted +const thumbnailUrls = new Map(); +const thumbnails = computed(() => + uploadedFiles.value.map((file) => { + if (!file.type.startsWith("image/")) return null; + if (!thumbnailUrls.has(file)) thumbnailUrls.set(file, URL.createObjectURL(file)); + return thumbnailUrls.get(file)!; + }), +); + +const revokeThumbnails = (keep: File[] = []) => { + thumbnailUrls.forEach((url, file) => { + if (keep.includes(file)) return; + URL.revokeObjectURL(url); + thumbnailUrls.delete(file); + }); +}; + +watch(uploadedFiles, (files) => revokeThumbnails(files), { deep: true }); + const submitSubmission = async () => { if (uploadedFiles.value.length === 0) return; @@ -561,6 +581,7 @@ onMounted(async () => { onUnmounted(() => { window.removeEventListener('paste', handlePasteOnUploadArea); + revokeThumbnails(); }); @@ -629,17 +650,24 @@ onUnmounted(() => {

{{ t("common.selectedFiles") }}

-
+
- -
-

{{ file.name }}

-

{{ formatFileSize(file.size) }}

+
+ + +
+
+ +
+

{{ file.name }}

+

{{ formatFileSize(file.size) }}

+