2023-09-25 02:13:24 +02:00
|
|
|
<script lang="ts">
|
2024-01-10 23:21:17 +01:00
|
|
|
import { createEventDispatcher, onDestroy } from "svelte"
|
2023-09-28 23:50:27 +02:00
|
|
|
import { twMerge } from "tailwind-merge"
|
2023-09-25 02:13:24 +02:00
|
|
|
|
2023-09-28 23:50:27 +02:00
|
|
|
export let accept: string
|
|
|
|
export let multiple: boolean = true
|
2023-09-25 02:13:24 +02:00
|
|
|
|
2023-09-28 23:50:27 +02:00
|
|
|
const dispatcher = createEventDispatcher<{ submit: FileList }>()
|
|
|
|
export let cls: string = ""
|
|
|
|
let drawAttention = false
|
|
|
|
let inputElement: HTMLInputElement
|
2024-01-10 23:21:17 +01:00
|
|
|
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)
|
|
|
|
})
|
|
|
|
|
|
|
|
|
2023-09-25 02:13:24 +02:00
|
|
|
</script>
|
|
|
|
|
2023-10-16 14:27:05 +02:00
|
|
|
<form
|
2024-01-10 23:21:17 +01:00
|
|
|
bind:this={formElement}
|
2023-10-16 14:27:05 +02:00
|
|
|
>
|
2023-12-19 22:08:00 +01:00
|
|
|
<label
|
|
|
|
class={twMerge(cls, drawAttention ? "glowing-shadow" : "")}
|
2024-01-10 23:21:17 +01:00
|
|
|
for={id}
|
2023-12-19 22:08:00 +01:00
|
|
|
on:click={() => {
|
|
|
|
inputElement.click()
|
|
|
|
}}
|
2024-01-10 23:21:17 +01:00
|
|
|
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"
|
2024-01-10 23:21:17 +01:00
|
|
|
{id}
|
2023-10-09 01:53:27 +02:00
|
|
|
{multiple}
|
|
|
|
name="file-input"
|
2023-09-28 23:50:27 +02:00
|
|
|
type="file"
|
|
|
|
/>
|
2023-09-25 02:13:24 +02:00
|
|
|
</form>
|