파일 페이지에서 즐겨찾기 설정이 가능하도록 변경 및 즐겨찾기에 추가된 경우 목록에서 즐겨찾기 여부를 아이콘으로 표시하도록 개선

This commit is contained in:
static
2026-01-17 20:11:01 +09:00
parent 420e30f677
commit ff6ea3a0b9
18 changed files with 94 additions and 7 deletions
@@ -2,6 +2,8 @@
import { getFileThumbnail } from "$lib/modules/file";
import type { SummarizedFileInfo } from "$lib/modules/filesystem";
import IconFavorite from "~icons/material-symbols/favorite";
interface Props {
info: SummarizedFileInfo;
onclick?: (file: SummarizedFileInfo) => void;
@@ -14,11 +16,19 @@
<button
onclick={onclick && (() => setTimeout(() => onclick(info), 100))}
class="aspect-square overflow-hidden rounded transition active:scale-95 active:brightness-90"
class="relative aspect-square overflow-hidden rounded transition active:scale-95 active:brightness-90"
>
{#if $thumbnail}
<img src={$thumbnail} alt={info.name} class="h-full w-full object-cover" />
{:else}
<div class="h-full w-full bg-gray-100"></div>
{/if}
{#if info.isFavorite}
<div class={["absolute bottom-0 right-0", !thumbnail && "rounded-full bg-white p-0.5"]}>
<IconFavorite
class="text-sm text-red-500"
style="filter: drop-shadow(0 0 1px white) drop-shadow(0 0 1px white);"
/>
</div>
{/if}
</button>
@@ -5,9 +5,11 @@
import IconFolder from "~icons/material-symbols/folder";
import IconDriveFolderUpload from "~icons/material-symbols/drive-folder-upload";
import IconDraft from "~icons/material-symbols/draft";
import IconFavorite from "~icons/material-symbols/favorite";
interface Props {
class?: ClassValue;
isFavorite?: boolean;
name: string;
subtext?: string;
textClass?: ClassValue;
@@ -17,6 +19,7 @@
let {
class: className,
isFavorite = false,
name,
subtext,
textClass: textClassName,
@@ -26,7 +29,7 @@
</script>
{#snippet iconSnippet()}
<div class="flex h-10 w-10 items-center justify-center text-xl">
<div class="relative flex h-10 w-10 items-center justify-center text-xl">
{#if thumbnail}
<img src={thumbnail} alt={name} loading="lazy" class="aspect-square rounded object-cover" />
{:else if type === "directory"}
@@ -36,6 +39,14 @@
{:else}
<IconDraft class="text-blue-400" />
{/if}
{#if isFavorite}
<div class={["absolute bottom-0 right-0", !thumbnail && "rounded-full bg-white p-0.5"]}>
<IconFavorite
class="text-xs text-red-500"
style="filter: drop-shadow(0 0 1px white) drop-shadow(0 0 1px white);"
/>
</div>
{/if}
</div>
{/snippet}
+2
View File
@@ -4,6 +4,7 @@ interface DirectoryInfo {
id: number;
parentId: DirectoryId;
name: string;
isFavorite?: boolean;
}
interface FileInfo {
@@ -14,6 +15,7 @@ interface FileInfo {
createdAt?: Date;
lastModifiedAt: Date;
categoryIds?: number[];
isFavorite?: boolean;
}
interface CategoryInfo {
+2
View File
@@ -22,6 +22,7 @@ const cache = new FilesystemCache<CategoryId, MaybeCategoryInfo>({
name: fileInfo.name,
createdAt: fileInfo.createdAt,
lastModifiedAt: fileInfo.lastModifiedAt,
isFavorite: fileInfo.isFavorite,
isRecursive: file.isRecursive,
}
: undefined;
@@ -66,6 +67,7 @@ const cache = new FilesystemCache<CategoryId, MaybeCategoryInfo>({
parentId: file.parent,
contentType: file.contentType,
isRecursive: file.isRecursive,
isFavorite: file.isFavorite,
...(await decryptFileMetadata(file, masterKey)),
})),
),
+3
View File
@@ -27,6 +27,7 @@ const cache = new FilesystemCache<number, MaybeFileInfo>({
name: file.name,
createdAt: file.createdAt,
lastModifiedAt: file.lastModifiedAt,
isFavorite: file.isFavorite,
categories: categories?.filter((category) => !!category) ?? [],
};
}
@@ -55,6 +56,7 @@ const cache = new FilesystemCache<number, MaybeFileInfo>({
name: metadata.name,
createdAt: metadata.createdAt,
lastModifiedAt: metadata.lastModifiedAt,
isFavorite: file.isFavorite,
categories,
});
} catch (e) {
@@ -121,6 +123,7 @@ const cache = new FilesystemCache<number, MaybeFileInfo>({
parentId: metadataRaw.parent,
contentType: metadataRaw.contentType,
categories,
isFavorite: metadataRaw.isFavorite,
...metadata,
};
}),
+1
View File
@@ -641,6 +641,7 @@ export const searchFiles = async (
encName: file.encrypted_name,
encCreatedAt: file.encrypted_created_at,
encLastModifiedAt: file.encrypted_last_modified_at,
isFavorite: file.is_favorite,
}));
};