MapComplete/src/UI/Base/FileSelector.svelte

100 lines
2.5 KiB
Svelte
Raw Normal View History

<script lang="ts">
import { createEventDispatcher, onDestroy } from "svelte"
2023-09-28 23:50:27 +02:00
import { twMerge } from "tailwind-merge"
2023-09-28 23:50:27 +02:00
export let accept: string
export let multiple: boolean = true
2023-09-28 23:50:27 +02:00
const dispatcher = createEventDispatcher<{ submit: FileList }>()
export let cls: string = ""
let drawAttention = false
let inputElement: HTMLInputElement
let formElement: HTMLFormElement
let id = "fileinput_" + Math.round(Math.random() * 1000000000000)
function handleDragEvent(e: DragEvent) {
if (e.target["id"] == id) {
return
}
if(formElement.contains(e.target) || document.getElementsByClassName("selected-element-view")[0]?.contains(e.target)){
e.preventDefault()
if(e.type === "drop"){
console.log("Got a 'drop'", e)
drawAttention = false
dispatcher("submit", e.dataTransfer.files)
return
}
drawAttention = true
e.dataTransfer.dropEffect = "copy"
return
/*
drawAttention = false
dispatcher("submit", e.dataTransfer.files)
console.log("Committing")*/
}
drawAttention = false
e.preventDefault()
e.dataTransfer.effectAllowed = "none"
e.dataTransfer.dropEffect = "none"
}
window.addEventListener("dragenter", handleDragEvent)
window.addEventListener("dragover", handleDragEvent)
window.addEventListener("drop", handleDragEvent)
onDestroy(() => {
window.removeEventListener("dragenter", handleDragEvent)
window.removeEventListener("dragover", handleDragEvent)
window.removeEventListener("drop", handleDragEvent)
})
</script>
2023-10-16 14:27:05 +02:00
<form
bind:this={formElement}
2024-01-15 01:46:22 +01:00
on:change|preventDefault={() => {
drawAttention = false
dispatcher("submit", inputElement.files)
}}
on:dragend={() => {
console.log("Drag end")
drawAttention = false
}}
on:dragenter|preventDefault|stopPropagation={(e) => {
console.log("Dragging enter")
drawAttention = true
e.dataTransfer.dropEffect = "copy"
}}
on:dragstart={() => {
drawAttention = false
}}
on:drop|preventDefault|stopPropagation={(e) => {
drawAttention = false
dispatcher("submit", e.dataTransfer.files)
}}
2023-10-16 14:27:05 +02:00
>
2023-12-19 22:08:00 +01:00
<label
class={twMerge(cls, drawAttention ? "glowing-shadow" : "")}
for={id}
2023-12-19 22:08:00 +01:00
on:click={() => {
inputElement.click()
}}
style="margin-left:0"
tabindex="0"
2023-12-19 22:08:00 +01:00
>
2023-10-09 01:53:27 +02:00
<slot />
</label>
<input
{accept}
bind:this={inputElement}
class="hidden"
{id}
2023-10-09 01:53:27 +02:00
{multiple}
name="file-input"
2023-09-28 23:50:27 +02:00
type="file"
/>
</form>