diff --git a/client/src/components/FileBrowser.svelte b/client/src/components/FileBrowser.svelte index c19bef0..ae22bf8 100644 --- a/client/src/components/FileBrowser.svelte +++ b/client/src/components/FileBrowser.svelte @@ -7,6 +7,7 @@ } from "$lib/stores"; let selectedRoot = $state(""); + let currentFolder = $state(""); onMount(async () => { $roots = await getRoots(); @@ -30,11 +31,44 @@ $hiddenFiles = new Set(hidden); } + // Derive subfolders and files at current folder level + let subfolders = $derived.by(() => { + const prefix = currentFolder ? currentFolder + "/" : ""; + const folderSet = new Set(); + for (const f of $visibleFiles) { + if (!f.path.startsWith(prefix)) continue; + const rest = f.path.slice(prefix.length); + const slashIdx = rest.indexOf("/"); + if (slashIdx !== -1) { + folderSet.add(rest.slice(0, slashIdx)); + } + } + return [...folderSet].sort(); + }); + + let currentFiles = $derived.by(() => { + const prefix = currentFolder ? currentFolder + "/" : ""; + return $visibleFiles.filter(f => { + if (!f.path.startsWith(prefix)) return false; + const rest = f.path.slice(prefix.length); + return !rest.includes("/"); // only direct children + }); + }); + async function selectFile(file: typeof $files[0]) { $currentFile = file; $markers = await getMarkers(file.name, $profile); } + function navigateToFolder(name: string) { + currentFolder = currentFolder ? currentFolder + "/" + name : name; + } + + function navigateUp() { + const idx = currentFolder.lastIndexOf("/"); + currentFolder = idx === -1 ? "" : currentFolder.slice(0, idx); + } + function formatSize(bytes: number): string { if (bytes > 1e9) return (bytes / 1e9).toFixed(1) + " GB"; if (bytes > 1e6) return (bytes / 1e6).toFixed(0) + " MB"; @@ -53,15 +87,24 @@
- { currentFolder = ""; loadFiles(); }}> {#each $roots as root} {/each}
+ {#if currentFolder} + + {/if}