From 300ae2dc05255f2df9eb35fb37fa51dc62f4697c Mon Sep 17 00:00:00 2001 From: SquidSpirit Date: Wed, 15 Oct 2025 20:42:00 +0800 Subject: [PATCH] feat: add label and post management dashboard pages with CRUD functionality --- .../lib/common/framework/ui/InputError.svelte | 5 ++ .../common/framework/ui/RestoreButton.svelte | 38 +++++++++ ...velte => ImageOverallDashboardPage.svelte} | 0 .../label/adapter/presenter/colorViewModel.ts | 5 ++ .../lib/label/framework/ui/ColorCode.svelte | 10 +++ ...elDialog.svelte => EditLabelDialog.svelte} | 81 +++++++++++-------- .../ui/LabelContentDashboardPage.svelte | 66 +++++++++++++++ ...velte => LabelOverallDashboardPage.svelte} | 33 +++----- .../ui/LabelOverallDashboardTabelRow.svelte | 23 ++++++ ...svelte => PostOverallDashboardPage.svelte} | 0 .../src/routes/dashboard/image/+page.svelte | 4 +- .../src/routes/dashboard/label/+page.svelte | 4 +- .../routes/dashboard/label/[id]/+page.svelte | 7 +- .../src/routes/dashboard/post/+page.svelte | 4 +- frontend/src/routes/post/[id]/+page.svelte | 2 +- 15 files changed, 218 insertions(+), 64 deletions(-) create mode 100644 frontend/src/lib/common/framework/ui/InputError.svelte create mode 100644 frontend/src/lib/common/framework/ui/RestoreButton.svelte rename frontend/src/lib/image/framework/ui/{ImageManagementPage.svelte => ImageOverallDashboardPage.svelte} (100%) create mode 100644 frontend/src/lib/label/framework/ui/ColorCode.svelte rename frontend/src/lib/label/framework/ui/{CreateLabelDialog.svelte => EditLabelDialog.svelte} (66%) create mode 100644 frontend/src/lib/label/framework/ui/LabelContentDashboardPage.svelte rename frontend/src/lib/label/framework/ui/{LabelManagementPage.svelte => LabelOverallDashboardPage.svelte} (70%) create mode 100644 frontend/src/lib/label/framework/ui/LabelOverallDashboardTabelRow.svelte rename frontend/src/lib/post/framework/ui/{PostManagementPage.svelte => PostOverallDashboardPage.svelte} (100%) diff --git a/frontend/src/lib/common/framework/ui/InputError.svelte b/frontend/src/lib/common/framework/ui/InputError.svelte new file mode 100644 index 0000000..f6aae32 --- /dev/null +++ b/frontend/src/lib/common/framework/ui/InputError.svelte @@ -0,0 +1,5 @@ + + + diff --git a/frontend/src/lib/common/framework/ui/RestoreButton.svelte b/frontend/src/lib/common/framework/ui/RestoreButton.svelte new file mode 100644 index 0000000..68c975a --- /dev/null +++ b/frontend/src/lib/common/framework/ui/RestoreButton.svelte @@ -0,0 +1,38 @@ + + + diff --git a/frontend/src/lib/image/framework/ui/ImageManagementPage.svelte b/frontend/src/lib/image/framework/ui/ImageOverallDashboardPage.svelte similarity index 100% rename from frontend/src/lib/image/framework/ui/ImageManagementPage.svelte rename to frontend/src/lib/image/framework/ui/ImageOverallDashboardPage.svelte diff --git a/frontend/src/lib/label/adapter/presenter/colorViewModel.ts b/frontend/src/lib/label/adapter/presenter/colorViewModel.ts index 0dc2014..07178e4 100644 --- a/frontend/src/lib/label/adapter/presenter/colorViewModel.ts +++ b/frontend/src/lib/label/adapter/presenter/colorViewModel.ts @@ -78,6 +78,11 @@ export class ColorViewModel { return `#${toHex(this.red)}${toHex(this.green)}${toHex(this.blue)}${toHex(this.alpha)}`; } + get hexWithoutAlpha(): string { + const hexString = this.hex; + return hexString.slice(0, 7); + } + private toHsl(): Hsl { const r = this.red / 255; const g = this.green / 255; diff --git a/frontend/src/lib/label/framework/ui/ColorCode.svelte b/frontend/src/lib/label/framework/ui/ColorCode.svelte new file mode 100644 index 0000000..448b2bb --- /dev/null +++ b/frontend/src/lib/label/framework/ui/ColorCode.svelte @@ -0,0 +1,10 @@ + + +
+
+ {color.hex} +
diff --git a/frontend/src/lib/label/framework/ui/CreateLabelDialog.svelte b/frontend/src/lib/label/framework/ui/EditLabelDialog.svelte similarity index 66% rename from frontend/src/lib/label/framework/ui/CreateLabelDialog.svelte rename to frontend/src/lib/label/framework/ui/EditLabelDialog.svelte index 735aaed..b375ff1 100644 --- a/frontend/src/lib/label/framework/ui/CreateLabelDialog.svelte +++ b/frontend/src/lib/label/framework/ui/EditLabelDialog.svelte @@ -7,7 +7,7 @@ }); type FormParams = z.infer; - export type CreateLabelDialogFormParams = FormParams; + export type EditLabelDialogFormParams = FormParams; - Create + + {triggerButtonText} + e.preventDefault()} onEscapeKeydown={(e) => e.preventDefault()} > - Create Label + {title}
- - {#if formErrors.name} -

{formErrors.name}

- {/if} +
+ + (formErrors.name = undefined)} + /> +
+
-
+
- - {#if formErrors.color} -

{formErrors.color}

- {/if} +
+ + (formErrors.color = undefined)} + /> +
+
diff --git a/frontend/src/lib/label/framework/ui/LabelContentDashboardPage.svelte b/frontend/src/lib/label/framework/ui/LabelContentDashboardPage.svelte new file mode 100644 index 0000000..b58da60 --- /dev/null +++ b/frontend/src/lib/label/framework/ui/LabelContentDashboardPage.svelte @@ -0,0 +1,66 @@ + + +
+
+

Label Details

+ +
+
+ ID + {label?.id} + + Name + {label?.name} + + Color +
+ {#if label} + + {/if} +
+ + Preview +
+ {#if label} + + {/if} +
+
+
diff --git a/frontend/src/lib/label/framework/ui/LabelManagementPage.svelte b/frontend/src/lib/label/framework/ui/LabelOverallDashboardPage.svelte similarity index 70% rename from frontend/src/lib/label/framework/ui/LabelManagementPage.svelte rename to frontend/src/lib/label/framework/ui/LabelOverallDashboardPage.svelte index 4920a1a..4722e44 100644 --- a/frontend/src/lib/label/framework/ui/LabelManagementPage.svelte +++ b/frontend/src/lib/label/framework/ui/LabelOverallDashboardPage.svelte @@ -1,19 +1,18 @@ + + + + + {label.id} + + + {label.name} + + + + + + + diff --git a/frontend/src/lib/post/framework/ui/PostManagementPage.svelte b/frontend/src/lib/post/framework/ui/PostOverallDashboardPage.svelte similarity index 100% rename from frontend/src/lib/post/framework/ui/PostManagementPage.svelte rename to frontend/src/lib/post/framework/ui/PostOverallDashboardPage.svelte diff --git a/frontend/src/routes/dashboard/image/+page.svelte b/frontend/src/routes/dashboard/image/+page.svelte index 4139c2e..81a6fad 100644 --- a/frontend/src/routes/dashboard/image/+page.svelte +++ b/frontend/src/routes/dashboard/image/+page.svelte @@ -1,7 +1,7 @@ - + diff --git a/frontend/src/routes/dashboard/label/+page.svelte b/frontend/src/routes/dashboard/label/+page.svelte index 87a5c0e..833c103 100644 --- a/frontend/src/routes/dashboard/label/+page.svelte +++ b/frontend/src/routes/dashboard/label/+page.svelte @@ -2,7 +2,7 @@ import { Container } from '$lib/container'; import { LabelCreatedStore } from '$lib/label/adapter/presenter/labelCreatedStore'; import { LabelsListedStore } from '$lib/label/adapter/presenter/labelsListedStore'; - import LabelManagementPage from '$lib/label/framework/ui/LabelManagementPage.svelte'; + import LabelOverallDashboardPage from '$lib/label/framework/ui/LabelOverallDashboardPage.svelte'; import { getContext, setContext } from 'svelte'; import type { PageProps } from './$types'; import { LabelViewModel } from '$lib/label/adapter/presenter/labelViewModel'; @@ -18,4 +18,4 @@ setContext(LabelsListedStore.name, labelsListedStore); - + diff --git a/frontend/src/routes/dashboard/label/[id]/+page.svelte b/frontend/src/routes/dashboard/label/[id]/+page.svelte index 9fef2aa..31a6e60 100644 --- a/frontend/src/routes/dashboard/label/[id]/+page.svelte +++ b/frontend/src/routes/dashboard/label/[id]/+page.svelte @@ -4,14 +4,17 @@ import { Container } from '$lib/container'; import { LabelViewModel } from '$lib/label/adapter/presenter/labelViewModel'; import { LabelLoadedStore } from '$lib/label/adapter/presenter/labelLoadedStore'; + import LabelContentDashboardPage from '$lib/label/framework/ui/LabelContentDashboardPage.svelte'; const { data, params }: PageProps = $props(); const { id } = params; + const numericId = $derived(Number(id)); + const container = getContext(Container.name); - const initialData = LabelViewModel.rehydrate(data.dehydratedData!); + const initialData = LabelViewModel.rehydrate(data.dehydratedData); const store = container.createLabelLoadedStore(initialData); setContext(LabelLoadedStore.name, store); -
{id}
+ diff --git a/frontend/src/routes/dashboard/post/+page.svelte b/frontend/src/routes/dashboard/post/+page.svelte index ccd11da..8551f79 100644 --- a/frontend/src/routes/dashboard/post/+page.svelte +++ b/frontend/src/routes/dashboard/post/+page.svelte @@ -2,7 +2,7 @@ import { Container } from '$lib/container'; import { PostCreatedStore } from '$lib/post/adapter/presenter/postCreatedStore'; import { PostsListedStore } from '$lib/post/adapter/presenter/postsListedStore'; - import PostManagementPage from '$lib/post/framework/ui/PostManagementPage.svelte'; + import PostOverallDashboardPage from '$lib/post/framework/ui/PostOverallDashboardPage.svelte'; import { getContext, setContext } from 'svelte'; import type { PageProps } from './$types'; import { PostInfoViewModel } from '$lib/post/adapter/presenter/postInfoViewModel'; @@ -18,4 +18,4 @@ setContext(PostsListedStore.name, postsListedStore); - + diff --git a/frontend/src/routes/post/[id]/+page.svelte b/frontend/src/routes/post/[id]/+page.svelte index f07da1e..f46d2fd 100644 --- a/frontend/src/routes/post/[id]/+page.svelte +++ b/frontend/src/routes/post/[id]/+page.svelte @@ -10,7 +10,7 @@ const { id } = params; const container = getContext(Container.name); - const initialData = PostViewModel.rehydrate(data.dehydratedData!); + const initialData = PostViewModel.rehydrate(data.dehydratedData); const store = container.createPostLoadedStore(initialData); setContext(PostLoadedStore.name, store);