From 576d41da7f8d21fdbc30dcf30b4683ace16a4c66 Mon Sep 17 00:00:00 2001 From: static Date: Sat, 27 Dec 2025 03:04:09 +0900 Subject: [PATCH] =?UTF-8?q?=EB=94=94=EB=A0=89=ED=84=B0=EB=A6=AC=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=EC=97=90=20=EC=83=81=EC=9C=84=20?= =?UTF-8?q?=EB=94=94=EB=A0=89=ED=84=B0=EB=A6=AC=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99=20=EB=B2=84=ED=8A=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../labels/DirectoryEntryLabel.svelte | 5 ++++- src/lib/modules/filesystem.ts | 11 +++++++++- .../(fullscreen)/file/[id]/TopBarMenu.svelte | 5 +++-- .../(main)/directory/[[id]]/+page.svelte | 15 ++++++++++++-- .../DirectoryEntries/DirectoryEntries.svelte | 20 +++++++++++++++++-- 5 files changed, 48 insertions(+), 8 deletions(-) diff --git a/src/lib/components/molecules/labels/DirectoryEntryLabel.svelte b/src/lib/components/molecules/labels/DirectoryEntryLabel.svelte index 319e0df..e85665d 100644 --- a/src/lib/components/molecules/labels/DirectoryEntryLabel.svelte +++ b/src/lib/components/molecules/labels/DirectoryEntryLabel.svelte @@ -3,6 +3,7 @@ import { IconLabel } from "$lib/components/molecules"; import IconFolder from "~icons/material-symbols/folder"; + import IconDriveFolderUpload from "~icons/material-symbols/drive-folder-upload"; import IconDraft from "~icons/material-symbols/draft"; interface Props { @@ -11,7 +12,7 @@ subtext?: string; textClass?: ClassValue; thumbnail?: string; - type: "directory" | "file"; + type: "directory" | "parent-directory" | "file"; } let { @@ -30,6 +31,8 @@ {name} {:else if type === "directory"} + {:else if type === "parent-directory"} + {:else} {/if} diff --git a/src/lib/modules/filesystem.ts b/src/lib/modules/filesystem.ts index 6009b60..9f447bf 100644 --- a/src/lib/modules/filesystem.ts +++ b/src/lib/modules/filesystem.ts @@ -23,6 +23,7 @@ import { trpc } from "$trpc/client"; export type DirectoryInfo = | { id: "root"; + parentId?: undefined; dataKey?: undefined; dataKeyVersion?: undefined; name?: undefined; @@ -31,6 +32,7 @@ export type DirectoryInfo = } | { id: number; + parentId: DirectoryId; dataKey?: CryptoKey; dataKeyVersion?: Date; name: string; @@ -93,7 +95,13 @@ const fetchDirectoryInfoFromIndexedDB = async ( info.set({ id, subDirectoryIds, fileIds }); } else { if (!directory) return; - info.set({ id, name: directory.name, subDirectoryIds, fileIds }); + info.set({ + id, + parentId: directory.parentId, + name: directory.name, + subDirectoryIds, + fileIds, + }); } }; @@ -124,6 +132,7 @@ const fetchDirectoryInfoFromServer = async ( info.set({ id, + parentId: metadata!.parent, dataKey, dataKeyVersion: new Date(metadata!.dekVersion), name, diff --git a/src/routes/(fullscreen)/file/[id]/TopBarMenu.svelte b/src/routes/(fullscreen)/file/[id]/TopBarMenu.svelte index 8c92986..a037b61 100644 --- a/src/routes/(fullscreen)/file/[id]/TopBarMenu.svelte +++ b/src/routes/(fullscreen)/file/[id]/TopBarMenu.svelte @@ -44,12 +44,13 @@ {#if directoryId} {@render menuButton(IconFolderOpen, "폴더에서 보기", () => - goto(directoryId === "root" ? "/directory" : `/directory/${directoryId}`), + goto( + directoryId === "root" ? "/directory?from=file" : `/directory/${directoryId}?from=file`, + ), )} {/if} {#if fileBlob} {@render menuButton(IconCloudDownload, "다운로드", () => { - console.log(filename); FileSaver.saveAs(fileBlob, filename); })} {/if} diff --git a/src/routes/(main)/directory/[[id]]/+page.svelte b/src/routes/(main)/directory/[[id]]/+page.svelte index 98572b3..a4edf30 100644 --- a/src/routes/(main)/directory/[[id]]/+page.svelte +++ b/src/routes/(main)/directory/[[id]]/+page.svelte @@ -2,6 +2,7 @@ import { onMount } from "svelte"; import type { Writable } from "svelte/store"; import { goto } from "$app/navigation"; + import { page } from "$app/state"; import { FloatingButton } from "$lib/components/atoms"; import { TopBar } from "$lib/components/molecules"; import { getDirectoryInfo, type DirectoryInfo } from "$lib/modules/filesystem"; @@ -42,6 +43,9 @@ let isEntryRenameModalOpen = $state(false); let isEntryDeleteModalOpen = $state(false); + let isFromFilePage = $derived(page.url.searchParams.get("from") === "file"); + let showTopBar = $derived(data.id !== "root" || isFromFilePage); + const uploadFile = () => { const files = fileInput?.files; if (!files || files.length === 0) return; @@ -86,11 +90,11 @@
- {#if data.id !== "root"} + {#if showTopBar} {/if} {#if $info} -
+
goto("/file/uploads")} /> goto("/file/downloads")} /> @@ -103,6 +107,13 @@ context.selectedEntry = entry; isEntryMenuBottomSheetOpen = true; }} + showParentEntry={isFromFilePage && $info.parentId !== undefined} + onParentClick={() => + goto( + $info.parentId === "root" + ? "/directory?from=file" + : `/directory/${$info.parentId}?from=file`, + )} /> {/key}
diff --git a/src/routes/(main)/directory/[[id]]/DirectoryEntries/DirectoryEntries.svelte b/src/routes/(main)/directory/[[id]]/DirectoryEntries/DirectoryEntries.svelte index 537a7ce..a3e975e 100644 --- a/src/routes/(main)/directory/[[id]]/DirectoryEntries/DirectoryEntries.svelte +++ b/src/routes/(main)/directory/[[id]]/DirectoryEntries/DirectoryEntries.svelte @@ -1,6 +1,8 @@ -{#if subDirectories.length + files.length > 0} +{#if subDirectories.length + files.length > 0 || showParentEntry}
+ {#if showParentEntry} + + + + {/if} {#each subDirectories as { info }} {/each}