From b13cee614efb1878fafde391f8d17b6f8e4f2a9d Mon Sep 17 00:00:00 2001 From: themodrnhakr Date: Mon, 29 Sep 2025 21:13:26 -0500 Subject: [PATCH] Task editing proof of concept. This method uses url query params to detect when the page should be in edit mode. There are two issues with the current approach: 1. The url query param is actually a pretty unintuitive pattern. It's disorienting to hit the back button and have it take you from edit mode to view mode rather than returning to the main task list. 2. The submit button does return the user to view mode, but caching results in the need for a refresh to see the updated task record. This can be solved. --- src/lib/ui/Tasks/TaskEdit.svelte | 134 +++++++++++++++++++++ src/routes/tasks/[task_id]/+page.server.ts | 54 ++++++++- src/routes/tasks/[task_id]/+page.svelte | 45 +++++-- 3 files changed, 221 insertions(+), 12 deletions(-) create mode 100644 src/lib/ui/Tasks/TaskEdit.svelte diff --git a/src/lib/ui/Tasks/TaskEdit.svelte b/src/lib/ui/Tasks/TaskEdit.svelte new file mode 100644 index 0000000..2c3288a --- /dev/null +++ b/src/lib/ui/Tasks/TaskEdit.svelte @@ -0,0 +1,134 @@ + + +
+ + + + + + + +
+ Details +
+ + + {#if form?.error && form.field === "description"} +

{form.error}

+ {/if} +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + +
+
+ + +
+ Body + +
+ + + + {#if form?.error && !form.field} +

{form.error}

+ {/if} +
diff --git a/src/routes/tasks/[task_id]/+page.server.ts b/src/routes/tasks/[task_id]/+page.server.ts index 38f6f3f..eae4ab6 100644 --- a/src/routes/tasks/[task_id]/+page.server.ts +++ b/src/routes/tasks/[task_id]/+page.server.ts @@ -1,10 +1,12 @@ import logger from "$lib/server/logger"; +import type { NewTask } from "$lib/server/services/tasks"; import TasksService from "$lib/server/services/tasks"; -import { error } from "@sveltejs/kit"; -import type { PageServerData } from "./$types"; +import { error, fail, redirect } from "@sveltejs/kit"; +import type { Actions, PageServerLoad } from "./$types"; -export const load: PageServerData = async ({ params }) => { - const tasks = new TasksService("internal"); +const tasks = new TasksService("internal"); + +export const load: PageServerLoad = async ({ params }) => { const taskResult = await tasks.getByTaskId([params.task_id]); if (taskResult.status === "failure" || !taskResult.data || taskResult.data.length === 0) { @@ -20,7 +22,7 @@ export const load: PageServerData = async ({ params }) => { const [parent, children] = await Promise.all([ task.parent ? tasks.getByDbId([task.parent]) - : Promise.resolve({ status: "ok" }), + : Promise.resolve({ status: "ok", data: [] }), tasks.getByParent(task.id), ]); @@ -31,3 +33,45 @@ export const load: PageServerData = async ({ params }) => { }; }; +export const actions: Actions = { + default: async ({ request, url }) => { + const formData = await request.formData(); + const data = Object.fromEntries(formData); + + if (!data.description || typeof data.description !== "string" || !data.description.trim()) { + return fail(400, { data, error: "Description is required.", field: "description" }); + } + + const createDateFn = (dateStr: unknown) => { + // The client now sends a full ISO string or an empty string + if (dateStr && typeof dateStr === "string") { + return new Date(dateStr); + } + return null; + }; + + const taskData: NewTask = { + id: data.id ? Number(data.id) : undefined, + description: typeof data.description === "string" ? data.description : null, + body: typeof data.body === "string" ? data.body : null, + status: typeof data.status === "string" ? data.status : null, + priority: typeof data.priority === "string" ? data.priority : null, + subtype: typeof data.subtype === "string" ? data.subtype : null, + openDate: createDateFn(data.openDate), + closeDate: createDateFn(data.closeDate), + }; + + const upsertResult = await tasks.upsert(taskData); + + if (upsertResult.status === "failure") { + return fail(500, { data, error: upsertResult.error, code: upsertResult.code }); + } + + if (!upsertResult.data) { + return fail(500, { data, error: "An unexpected error occurred: missing result data." }); + } + + // On a successful save, redirect back to the main task page + throw redirect(303, url.pathname); + }, +}; diff --git a/src/routes/tasks/[task_id]/+page.svelte b/src/routes/tasks/[task_id]/+page.svelte index 81eefbc..619184a 100644 --- a/src/routes/tasks/[task_id]/+page.svelte +++ b/src/routes/tasks/[task_id]/+page.svelte @@ -1,11 +1,16 @@ - + + +{#if isEditing} + +{:else} + +{/if}