diff --git a/svelte/src/filesystem/Breadcrumbs.svelte b/svelte/src/filesystem/Breadcrumbs.svelte index c79a233..8b29b78 100644 --- a/svelte/src/filesystem/Breadcrumbs.svelte +++ b/svelte/src/filesystem/Breadcrumbs.svelte @@ -1,6 +1,6 @@ scroll_positions.set(nav.base.path, window.scrollY)} /> +{#snippet nav_buttons()} + + + +{/snippet} + {#snippet toolbar()} - {#if mode === "viewing"} + {#if !$nav.selecting}
- - - + {@render nav_buttons()} {#if $nav.children.some(c => c.name === ".Trash" && c.type === "dir")} {/if}
- {:else if mode === "selecting"} + {:else}
- -
- {:else if mode === "moving"} -
-
+
+ {moving ? "Moving" : "Selected"} {$nav.selection.size} items +
+
+ {#if moving} + + {/if}
-
- Selected {selected_files} files + Selected {$nav.selection.size} files
- - - {#if entries.length !== 0} - - {/if} + + {:else} +
+
+ + + +
+
Trash bin ({formatDataVolume(size, 3)})
+
+ {#if $trash.children.length !== 0} + + + {/if} +
+
+ {/if} {/snippet} -{#if error} -

{error}

-{:else if entries.length > 0} - - - - - - - - - - - - - {#each entries as entry (entry.node.id)} - - - - - - - - - {/each} - -
NameOriginal locationDeleted atSize
- icon - - - {entry.node.name} - - - {entry.original_path ? entry.original_path.slice(0, -entry.node.name.length) : "—"} - - {entry.deletion_date ? formatDate(entry.deletion_date) : "—"} - - {#if entry.node.type === "file"} - {formatDataVolume(entry.node.file_size, 3)} - {/if} - -
- - -
-
-{/if} + diff --git a/svelte/src/lib/Bookmarks.ts b/svelte/src/lib/Bookmarks.ts index 1057c02..83d4de9 100644 --- a/svelte/src/lib/Bookmarks.ts +++ b/svelte/src/lib/Bookmarks.ts @@ -12,13 +12,16 @@ export type Bookmark = { label: string, } +export let bookmarks_failed = writable(false) + export let bookmarks_store = writable( [], (set: (value: Bookmark[]) => void) => { bookmarks_get().then((bm: Bookmark[]) => { set(bm) }).catch((err: any) => { - alert("Could not fetch bookmarks:\n" + JSON.stringify(err)) + console.error("Could not fetch bookmarks", err) + bookmarks_failed.set(true) }) }, ) diff --git a/svelte/src/lib/FilesystemAPI.svelte.ts b/svelte/src/lib/FilesystemAPI.svelte.ts index 44849f1..4c07e21 100644 --- a/svelte/src/lib/FilesystemAPI.svelte.ts +++ b/svelte/src/lib/FilesystemAPI.svelte.ts @@ -52,10 +52,9 @@ export class FSNode { user_permissions?: { [index: string]: FSPermissions } password_permissions?: { [index: string]: FSPermissions } - // Added by us - - // Indicates whether the file is selected in the file manager - fm_selected?: boolean = $state(false) + // Only set on the nodes returned by fs_get_trash + original_path?: string + deletion_date?: string is_shared = (): boolean => { return (this.link_permissions !== undefined && this.link_permissions.read === true) || @@ -251,22 +250,15 @@ export const fs_trash = async (path: string) => { ) as GenericResponse } -export type TrashEntry = { - node: FSNode; - original_path: string; - deletion_date: string; -}; - export const fs_get_trash = async (path: string) => { - let resp = await fs_check_response( + const resp = await fs_check_response( await fetch(fs_path_url(path) + "?trash") - ) as TrashEntry[] - resp.forEach((entry, index) => { - resp[index].node = Object.assign(new FSNode(), entry.node) - }) + ) as { node: FSNode, original_path: string, deletion_date: string }[] - return resp -}; + // The trash metadata is moved into the node, so the trash can be listed + // like the children of a directory + return resp.map(({ node, ...info }) => Object.assign(new FSNode(), node, info)) +} export const fs_search = async (path: string, term: string, limit = 10) => { return await fs_check_response( diff --git a/svelte/src/wrap/Bookmarks.svelte b/svelte/src/wrap/Bookmarks.svelte index 8189c49..47b8184 100644 --- a/svelte/src/wrap/Bookmarks.svelte +++ b/svelte/src/wrap/Bookmarks.svelte @@ -1,6 +1,7 @@