| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-25 12:03:26 +01:00
										 |  |  |   export let accept: string | undefined | 
					
						
							| 
									
										
										
										
											2023-09-28 23:50:27 +02:00
										 |  |  |   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 | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-02-20 13:33:38 +01:00
										 |  |  |     if ( | 
					
						
							|  |  |  |       formElement.contains(e.target) || | 
					
						
							|  |  |  |       document.getElementsByClassName("selected-element-view")[0]?.contains(e.target) | 
					
						
							|  |  |  |     ) { | 
					
						
							| 
									
										
										
										
											2024-01-10 23:21:17 +01:00
										 |  |  |       e.preventDefault() | 
					
						
							| 
									
										
										
										
											2024-02-20 13:33:38 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       if (e.type === "drop") { | 
					
						
							| 
									
										
										
										
											2024-01-10 23:21:17 +01:00
										 |  |  |         console.log("Got a 'drop'", e) | 
					
						
							|  |  |  |         drawAttention = false | 
					
						
							|  |  |  |         dispatcher("submit", e.dataTransfer.files) | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2024-02-20 13:33:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-10 23:21:17 +01:00
										 |  |  |       drawAttention = true | 
					
						
							|  |  |  |       e.dataTransfer.dropEffect = "copy" | 
					
						
							| 
									
										
										
										
											2024-02-20 13:33:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-10 23:21:17 +01:00
										 |  |  |       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} | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2024-06-17 04:27:08 +02:00
										 |  |  |     class:focus={drawAttention} | 
					
						
							|  |  |  |     class={cls} | 
					
						
							| 
									
										
										
										
											2024-01-10 23:21:17 +01:00
										 |  |  |     for={id} | 
					
						
							| 
									
										
										
										
											2024-02-13 01:17:27 +01:00
										 |  |  |     on:click|preventDefault={() => { | 
					
						
							| 
									
										
										
										
											2023-12-19 22:08:00 +01:00
										 |  |  |       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> |