diff --git a/packages/web/src/routes/progress/[id]/+page.server.ts b/packages/web/src/routes/progress/[id]/+page.server.ts index cd77903..e22802f 100755 --- a/packages/web/src/routes/progress/[id]/+page.server.ts +++ b/packages/web/src/routes/progress/[id]/+page.server.ts @@ -1,10 +1,10 @@ -import { db } from "$lib/db" -import { tasks, tasksToTopics } from "$lib/db/schema" -import { eq } from "drizzle-orm" +import { db } from '$lib/db'; +import { tasks, tasksToTopics, topics } from '$lib/db/schema'; +import { eq, and } from 'drizzle-orm'; export const load = async ({ params }) => { return { - task: (await db.query.tasks.findFirst({ + task: await db.query.tasks.findFirst({ with: { tasksToTopics: { with: { @@ -13,17 +13,50 @@ export const load = async ({ params }) => { } }, where: eq(tasks.id, params.id) - - }) - ), + }), topics: await db.query.topics.findMany() - } -} + }; +}; export const actions = { - addTopic: async ({ request, params }) => { - const data = await request.formData() + createTopic: async ({ request, params }) => { + const data = await request.formData(); - const task = await db.insert(tasksToTopics).values({ taskId: params.id, topicId: data.get('topic-id') }).returning() + const topic = await db + .insert(topics) + .values({ name: data.get('name') }) + .returning(); + + const existing = await db.query.tasksToTopics.findFirst({ + where: and( + eq(tasksToTopics.taskId, Number(params.id)), + eq(tasksToTopics.topicId, topic[0].id) + ) + }); + + if (!existing) { + await db + .insert(tasksToTopics) + .values({ taskId: Number(params.id), topicId: topic[0].id }) + .returning(); + } + }, + addTopic: async ({ request, params }) => { + const data = await request.formData(); + + const topicId = Number(data.get('topic-id')); + + const existing = await db.query.tasksToTopics.findFirst({ + where: and(eq(tasksToTopics.taskId, Number(params.id)), eq(tasksToTopics.topicId, topicId)) + }); + + console.log(existing); + + if (!existing) { + await db + .insert(tasksToTopics) + .values({ taskId: Number(params.id), topicId }) + .returning(); + } } -} +}; diff --git a/packages/web/src/routes/progress/[id]/+page.svelte b/packages/web/src/routes/progress/[id]/+page.svelte index c1c7246..d0a3586 100755 --- a/packages/web/src/routes/progress/[id]/+page.svelte +++ b/packages/web/src/routes/progress/[id]/+page.svelte @@ -10,7 +10,9 @@ let open = $state(false); let value = $state(''); + let search = $state(''); let triggerRef = $state(null!); + let addTopicForms = $state([]); // We want to refocus the trigger button when the user selects // an item from the list so users can continue navigating the @@ -37,23 +39,39 @@ - + - No topic found. + {#if search && !data.topics.filter((t) => t.name?.includes(search)).length} +
+ + +
+ {:else}No topic found. + {/if}
- {#each data.topics as topic} - { - value = topic.id.toString(); - closeAndFocusTrigger(); - }} + {#each data.topics.filter((t) => !search || t.name?.includes(search)) as topic} +
(value = topic.id.toString())} > - - {topic.name} - + + { + addTopicForms[topic.id].submit(); + closeAndFocusTrigger(); + }} + > + + {topic.name} + + {/each}