load file shortcut

This commit is contained in:
vcoppe
2024-04-18 10:52:45 +02:00
parent 685c2bb541
commit 395164033d
4 changed files with 71 additions and 31 deletions

View File

@@ -0,0 +1,16 @@
<script lang="ts">
import { files } from '$lib/stores';
import { ScrollArea } from '$lib/components/ui/scroll-area/index.js';
import { Button } from '$lib/components/ui/button';
</script>
<ScrollArea class="w-full h-full">
<div class="flex flex-col">
{#each $files as file}
<Button variant="outline" class="w-full">
{file.metadata.name}
</Button>
{/each}
</div>
</ScrollArea>

View File

@@ -1,38 +1,10 @@
<script lang="ts">
import { parseGPX } from 'gpx';
import * as Menubar from '$lib/components/ui/menubar/index.js';
import { Upload } from 'lucide-svelte';
import { files } from '$lib/stores';
let input: HTMLInputElement;
$: if (input) {
input.onchange = () => {
if (input.files) {
for (let i = 0; i < input.files.length; i++) {
const file = input.files[i];
const reader = new FileReader();
reader.onload = () => {
$files = [...$files, parseGPX(reader.result?.toString() ?? '')];
};
reader.readAsText(file);
}
}
};
}
import { triggerFileInput } from '$lib/components/tools/tools';
</script>
<Menubar.Item
on:click={() => {
if (input) {
input.click();
}
}}
>
<Menubar.Item on:click={triggerFileInput}>
<Upload size="16" class="mr-1" /> Load from desktop... <Menubar.Shortcut>⌘O</Menubar.Shortcut>
</Menubar.Item>
<input bind:this={input} type="file" accept=".gpx" multiple class="hidden" />

View File

@@ -0,0 +1,38 @@
import { files } from '$lib/stores';
import { parseGPX } from 'gpx';
export function triggerFileInput() {
const input = document.createElement('input');
input.type = 'file';
input.accept = '.gpx';
input.multiple = true;
input.className = 'hidden';
input.onchange = () => {
if (input.files) {
loadFiles(input.files);
}
};
input.click();
}
export function loadFiles(files: FileList) {
for (let i = 0; i < files.length; i++) {
loadFile(files[i]);
}
}
export function loadFile(file: File) {
const reader = new FileReader();
reader.onload = () => {
let data = reader.result?.toString() ?? null;
if (data) {
let gpx = parseGPX(data);
if (gpx.metadata.name === undefined) {
gpx.metadata['name'] = file.name.split('.').slice(0, -1).join('.');
}
files.update($files => [...$files, gpx]);
}
};
reader.readAsText(file);
}