From 698ddda4aeacc9bfb3148d3a0d364d7d3f21ea6c Mon Sep 17 00:00:00 2001 From: SpliiT Date: Tue, 24 Mar 2026 17:09:07 +0100 Subject: [PATCH 1/8] fix(DragAndDrop): Improve DragAndDrop style and logic --- app/components/DragAndDrop.vue | 183 ++++++++++-------- .../DragAndDrop/DragAndDropInline.vue | 89 +++++++++ .../DragAndDrop/DragAndDropOverlay.vue | 177 +++++++++++++++++ app/components/FileSelector.vue | 4 +- app/components/FileUploader.vue | 114 ++++++++++- 5 files changed, 472 insertions(+), 95 deletions(-) create mode 100644 app/components/DragAndDrop/DragAndDropInline.vue create mode 100644 app/components/DragAndDrop/DragAndDropOverlay.vue diff --git a/app/components/DragAndDrop.vue b/app/components/DragAndDrop.vue index c56e5517..9599c43a 100644 --- a/app/components/DragAndDrop.vue +++ b/app/components/DragAndDrop.vue @@ -1,116 +1,127 @@ + - diff --git a/app/components/DragAndDrop/DragAndDropInline.vue b/app/components/DragAndDrop/DragAndDropInline.vue new file mode 100644 index 00000000..897e0911 --- /dev/null +++ b/app/components/DragAndDrop/DragAndDropInline.vue @@ -0,0 +1,89 @@ + + + + + diff --git a/app/components/DragAndDrop/DragAndDropOverlay.vue b/app/components/DragAndDrop/DragAndDropOverlay.vue new file mode 100644 index 00000000..6e54f04e --- /dev/null +++ b/app/components/DragAndDrop/DragAndDropOverlay.vue @@ -0,0 +1,177 @@ + + + + + diff --git a/app/components/FileSelector.vue b/app/components/FileSelector.vue index cfbfe039..bbbf593a 100644 --- a/app/components/FileSelector.vue +++ b/app/components/FileSelector.vue @@ -9,10 +9,11 @@ const schema = schemas.opengeodeweb_back.allowed_files; const emit = defineEmits(["update_values", "increment_step", "decrement_step"]); -const { multiple, files, auto_upload } = defineProps({ +const { multiple, files, auto_upload, show_overlay } = defineProps({ multiple: { type: Boolean, required: true }, files: { type: Array, default: () => [] }, auto_upload: { type: Boolean, default: true }, + show_overlay: { type: Boolean, default: true }, }); const internal_files = ref(files); @@ -63,6 +64,7 @@ await get_allowed_files(); accept, files: internal_files, auto_upload: internal_auto_upload, + show_overlay, }" @files_uploaded="files_uploaded_event" /> diff --git a/app/components/FileUploader.vue b/app/components/FileUploader.vue index 6438e574..24ca21ef 100644 --- a/app/components/FileUploader.vue +++ b/app/components/FileUploader.vue @@ -1,15 +1,17 @@ diff --git a/app/components/DragAndDrop/DragAndDropOverlay.vue b/app/components/DragAndDrop/DragAndDropOverlay.vue index 6e54f04e..ebfcc7d1 100644 --- a/app/components/DragAndDrop/DragAndDropOverlay.vue +++ b/app/components/DragAndDrop/DragAndDropOverlay.vue @@ -48,11 +48,7 @@ const { :width="fullscreen ? 140 : 120" :height="fullscreen ? 140 : 120" > - + {{ - loading - ? loadingText - : fullscreen - ? "Drop your files here" - : "Drop your files" + loading ? loadingText : fullscreen ? "Drop your files here" : "Drop your files" }} @@ -102,11 +94,7 @@ const { - + diff --git a/app/components/FileUploader.vue b/app/components/FileUploader.vue index 24ca21ef..ec641fec 100644 --- a/app/components/FileUploader.vue +++ b/app/components/FileUploader.vue @@ -41,9 +41,7 @@ function removeFile(index) { async function upload_files() { toggle_loading(); - const promise_array = internal_files.value.map((file) => - geodeStore.upload(file), - ); + const promise_array = internal_files.value.map((file) => geodeStore.upload(file)); await Promise.all(promise_array); files_uploaded.value = true; emit("files_uploaded", internal_files.value); @@ -86,10 +84,7 @@ watch(internal_files, (value) => { @files-selected="processSelectedFiles" /> - + { - - Selected files - - + Selected files + {{ internal_files.length }} @@ -162,18 +150,13 @@ watch(internal_files, (value) => { mdi-file-outline {{ file.name }} - + { @click="upload_files" > mdi-cloud-upload - Upload {{ internal_files.length }} files + Upload {{ internal_files.length }} files From a80f8ae7d2f224696b898d204dcc24d5f1026728 Mon Sep 17 00:00:00 2001 From: SpliiT Date: Tue, 24 Mar 2026 17:31:30 +0100 Subject: [PATCH 3/8] oxc --- app/components/DragAndDrop.vue | 63 ++++++++++++------- .../DragAndDrop/DragAndDropInline.vue | 17 ++--- .../DragAndDrop/DragAndDropOverlay.vue | 15 +++-- 3 files changed, 59 insertions(+), 36 deletions(-) diff --git a/app/components/DragAndDrop.vue b/app/components/DragAndDrop.vue index 9599c43a..8f28b5ce 100644 --- a/app/components/DragAndDrop.vue +++ b/app/components/DragAndDrop.vue @@ -3,7 +3,20 @@ import { onMounted, onUnmounted, ref } from "vue"; import DragAndDropInline from "./DragAndDrop/DragAndDropInline.vue"; import DragAndDropOverlay from "./DragAndDrop/DragAndDropOverlay.vue"; -const props = defineProps({ +const { + multiple, + accept, + loading, + showExtensions, + fullscreen, + inline, + showOverlay, + texts = { + idle: "Click or drag and drop", + drop: "Drop files here", + loading: "Loading...", + }, +} = defineProps({ multiple: { type: Boolean, default: false }, accept: { type: String, default: "" }, loading: { type: Boolean, default: false }, @@ -11,9 +24,7 @@ const props = defineProps({ fullscreen: { type: Boolean, default: false }, inline: { type: Boolean, default: true }, showOverlay: { type: Boolean, default: true }, - idleText: { type: String, default: "Click or drag and drop" }, - dropText: { type: String, default: "Drop files here" }, - loadingText: { type: String, default: "Loading..." }, + texts: { type: Object, default: undefined }, }); const emit = defineEmits(["files-selected"]); @@ -29,13 +40,13 @@ function triggerFileDialog() { function onDragEnter(event) { if (!isInternalDrag.value && event.dataTransfer.types.includes("Files")) { - dragCounter.value++; + dragCounter.value += 1; isDragging.value = true; } } function onDragLeave() { - dragCounter.value--; + dragCounter.value -= 1; if (dragCounter.value <= 0) { isDragging.value = false; dragCounter.value = 0; @@ -53,7 +64,9 @@ function onDrop(event) { dragCounter.value = 0; isDragging.value = false; const files = [...event.dataTransfer.files]; - if (files.length > 0) emit("files-selected", files); + if (files.length > 0) { + emit("files-selected", files); + } } function onKeyDown(event) { @@ -67,7 +80,9 @@ function onKeyDown(event) { function handleFileSelect(event) { const files = [...event.target.files]; - if (files.length > 0) emit("files-selected", files); + if (files.length > 0) { + emit("files-selected", files); + } event.target.value = ""; } @@ -80,23 +95,23 @@ function onInternalDragEnd() { } onMounted(() => { - window.addEventListener("dragstart", onInternalDragStart); - window.addEventListener("dragend", onInternalDragEnd); - window.addEventListener("dragenter", onDragEnter); - window.addEventListener("dragover", onDragOver); - window.addEventListener("dragleave", onDragLeave); - window.addEventListener("drop", onDrop); - window.addEventListener("keydown", onKeyDown); + globalThis.addEventListener("dragstart", onInternalDragStart); + globalThis.addEventListener("dragend", onInternalDragEnd); + globalThis.addEventListener("dragenter", onDragEnter); + globalThis.addEventListener("dragover", onDragOver); + globalThis.addEventListener("dragleave", onDragLeave); + globalThis.addEventListener("drop", onDrop); + globalThis.addEventListener("keydown", onKeyDown); }); onUnmounted(() => { - window.removeEventListener("dragstart", onInternalDragStart); - window.removeEventListener("dragend", onInternalDragEnd); - window.removeEventListener("dragenter", onDragEnter); - window.removeEventListener("dragover", onDragOver); - window.removeEventListener("dragleave", onDragLeave); - window.removeEventListener("drop", onDrop); - window.removeEventListener("keydown", onKeyDown); + globalThis.removeEventListener("dragstart", onInternalDragStart); + globalThis.removeEventListener("dragend", onInternalDragEnd); + globalThis.removeEventListener("dragenter", onDragEnter); + globalThis.removeEventListener("dragover", onDragOver); + globalThis.removeEventListener("dragleave", onDragLeave); + globalThis.removeEventListener("drop", onDrop); + globalThis.removeEventListener("keydown", onKeyDown); }); defineExpose({ triggerFileDialog }); @@ -105,13 +120,13 @@ defineExpose({ triggerFileDialog }); From ed7215b0b2da545df07ab7bacb59ef2ba06aa4a3 Mon Sep 17 00:00:00 2001 From: SpliiT Date: Thu, 26 Mar 2026 10:59:21 +0100 Subject: [PATCH 7/8] drag and drop style refacto --- app/components/DragAndDrop.vue | 32 +++++++++- .../DragAndDrop/DragAndDropInline.vue | 12 ---- app/components/FileUploader.vue | 61 ++++++------------- 3 files changed, 48 insertions(+), 57 deletions(-) diff --git a/app/components/DragAndDrop.vue b/app/components/DragAndDrop.vue index c5a367cf..b91004f7 100644 --- a/app/components/DragAndDrop.vue +++ b/app/components/DragAndDrop.vue @@ -120,12 +120,25 @@ defineExpose({ triggerFileDialog }); + + diff --git a/app/components/DragAndDrop/DragAndDropInline.vue b/app/components/DragAndDrop/DragAndDropInline.vue index 62454de3..21546259 100644 --- a/app/components/DragAndDrop/DragAndDropInline.vue +++ b/app/components/DragAndDrop/DragAndDropInline.vue @@ -71,16 +71,4 @@ const emit = defineEmits(["click"]); background: rgba(var(--v-theme-primary), 0.05) !important; } -.rotating { - animation: rotate 1s linear infinite; -} - -@keyframes rotate { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} diff --git a/app/components/FileUploader.vue b/app/components/FileUploader.vue index d4a8efa0..9c46ccdc 100644 --- a/app/components/FileUploader.vue +++ b/app/components/FileUploader.vue @@ -74,45 +74,33 @@ watch(internal_files, (value) => {