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}