creating modal works, edit modal is showing

This commit is contained in:
2025-07-05 11:02:01 +02:00
parent ebcbab654f
commit 22ca3e9645
4 changed files with 105 additions and 98 deletions

View File

@@ -80,10 +80,10 @@ app.post('/task', async(req, res) => {
newTask.userid = userId newTask.userid = userId
console.log(newTask) console.log(newTask)
const returnedTask = await db.insert(task).values(newTask).returning() const returnedTasks = await db.insert(task).values(newTask).returning()
console.log(returnedTask) console.log(returnedTasks)
res.status(201).json(returnedTask); res.status(201).json(returnedTasks[0]);
}); });
app.post('/event', async (req, res) => { app.post('/event', async (req, res) => {
@@ -122,7 +122,8 @@ app.put('/event', (req, res) => {
} }
db.update(event).set(updatedEvent).where(eq(event.id, id)) db.update(event).set(updatedEvent).where(eq(event.id, id))
res.status(200).json(updatedEvent);}); res.status(200).json(updatedEvent);
});
app.delete('/task/:id', async (req, res) => { app.delete('/task/:id', async (req, res) => {
const id = parseInt(req.params['id']); const id = parseInt(req.params['id']);

View File

@@ -9,14 +9,15 @@ const colorMode = useColorMode();
const toast = useToast() const toast = useToast()
const currentTheme = ref<'dark' | 'system' | 'light'>(colorMode.preference as 'dark' | 'system' | 'light'); const currentTheme = ref<'dark' | 'system' | 'light'>(colorMode.preference as 'dark' | 'system' | 'light');
const showTaskFormModal = ref(false); const showTaskCreateModal = ref(false);
const showTaskEditModal = ref(false);
const taskFormModalInput = ref<Partial<Task>>({}); const taskFormModalInput = ref<Partial<Task>>({});
const date = defineModel<DateTime>('date', { required: true }) const date = defineModel<DateTime>('date', { required: true })
const tasks = defineModel<Task[]>('tasks', { required: true }) const tasks = defineModel<Task[]>('tasks', { required: true })
const emits = defineEmits<{ const emits = defineEmits<{
(e: 'createTask', name: string): void (e: 'createTask', task: Task): void
(e: 'deleteTask', id: number): void (e: 'deleteTask', id: number): void
(e: 'editTask', task: Task): void (e: 'editTask', task: Task): void
}>() }>()
@@ -78,22 +79,22 @@ const selectedDate = computed({
} }
}) })
function addTask() { function addTask(task: Task) {
const name = prompt("Todo name:") tasks.value.push(task)
console.log(name) console.log(tasks.value)
if (name !== null) { emits('createTask', task)
emits('createTask', name)
} }
} function deleteTask(task: Task) {
function deleteTask(todo: Task) { if (task.id === undefined) {
if (todo.id === undefined) {
toast.add({ toast.add({
title: "Task does not exist anymore" title: "Task does not exist anymore"
}) })
return return
} }
emits('deleteTask', todo.id) tasks.value = tasks.value.filter(t => t.id !== task.id)
emits('deleteTask', task.id)
} }
function editTask(task: Task) { function editTask(task: Task) {
emits('editTask', task) emits('editTask', task)
@@ -101,14 +102,22 @@ function editTask(task: Task) {
function openTaskFormModal(task: Partial<Task>) { function openTaskFormModal(task: Partial<Task>) {
taskFormModalInput.value = task taskFormModalInput.value = task
showTaskFormModal.value = true showTaskCreateModal.value = true
}
function openTaskEditModal(task: Task) {
taskFormModalInput.value = task
showTaskEditModal.value = true
} }
</script> </script>
<template> <template>
<UCard class="flex w-64 h-full" :ui="{ body: 'w-full' }"> <UCard class="flex w-64 h-full" :ui="{ body: 'w-full' }">
<UiTaskFormModal v-model:open="showTaskFormModal" :input="taskFormModalInput" action="create" /> <UiTaskFormModal v-model:open="showTaskCreateModal" :input="taskFormModalInput" action="create"
@submnitted="addTask" />
<UiTaskFormModal v-model:open="showTaskEditModal" :input="taskFormModalInput" action="edit"
@submnitted="editTask" />
<div class="flex flex-col h-full w-full gap-5"> <div class="flex flex-col h-full w-full gap-5">
<header class="flex flex-col gap-2"> <header class="flex flex-col gap-2">
@@ -117,7 +126,7 @@ function openTaskFormModal(task: Partial<Task>) {
</header> </header>
<div class="flex flex-col grow justify-between"> <div class="flex flex-col grow justify-between">
<div class="flex flex-col gap-2"> <div class="flex flex-col gap-2">
<Title1>Todos</Title1> <Title1>Tasks</Title1>
<div class="flex gap-2 flex-col"> <div class="flex gap-2 flex-col">
<ListItem v-for="task in todoTasks"> <ListItem v-for="task in todoTasks">
<div class="flex w-full gap-4 items-center"> <div class="flex w-full gap-4 items-center">
@@ -127,7 +136,7 @@ function openTaskFormModal(task: Partial<Task>) {
</span> </span>
<div class="flex gap-1"> <div class="flex gap-1">
<UButton size="xs" color="neutral" class="flex justify-center" <UButton size="xs" color="neutral" class="flex justify-center"
icon="mingcute:pencil-line" @click="() => editTask(task)" /> icon="mingcute:pencil-line" @click="() => openTaskEditModal(task)" />
<UButton size="xs" color="primary" class="flex justify-center" <UButton size="xs" color="primary" class="flex justify-center"
icon="octicon:trashcan-16" @click="() => deleteTask(task)" /> icon="octicon:trashcan-16" @click="() => deleteTask(task)" />
</div> </div>
@@ -142,7 +151,7 @@ function openTaskFormModal(task: Partial<Task>) {
</span> </span>
<div class="flex gap-1"> <div class="flex gap-1">
<UButton size="xs" color="neutral" class="flex justify-center" <UButton size="xs" color="neutral" class="flex justify-center"
icon="mingcute:pencil-line" @click="() => editTask(task)" /> icon="mingcute:pencil-line" @click="() => openTaskEditModal(task)" />
<UButton size="xs" color="primary" class="flex justify-center" <UButton size="xs" color="primary" class="flex justify-center"
@click="() => deleteTask(task)" icon="octicon:trashcan-16" /> @click="() => deleteTask(task)" icon="octicon:trashcan-16" />
</div> </div>

View File

@@ -35,6 +35,7 @@ watchEffect(() => {
descriptionField.value = props.input.description ?? '' descriptionField.value = props.input.description ?? ''
estimatedTimeField.value = (((props.input.estimated_time) ?? 0) / 60) estimatedTimeField.value = (((props.input.estimated_time) ?? 0) / 60)
dueDateField.value = props.input.due_date?.toFormat('yyyy-MM-dd') ?? '' dueDateField.value = props.input.due_date?.toFormat('yyyy-MM-dd') ?? ''
dueTimeField.value = props.input.due_date?.toFormat('HH:mm') ?? ''
}) })
const formSchema = z.object({ const formSchema = z.object({
@@ -89,10 +90,13 @@ function cancel() {
<template #body> <template #body>
<div class="flex flex-col gap-2"> <div class="flex flex-col gap-2">
<UInput type="text" placeholder="Name" v-model="titleField" required /> <UInput type="text" placeholder="Name" v-model="titleField" required />
<UInput type="number" class="grow" placeholder="estimated time in hours" v-model="estimatedTimeField"
icon="mdi:stopwatch-outline" required />
<div class="flex flex-row gap-2"> <div class="flex flex-row gap-2">
<UInput class="grow" placeholder="2025-06-16" v-model="dueDateField" icon="i-lucide-calendar" <UInput type="date" class="grow" placeholder="due data e.g 2025-06-16" v-model="dueDateField"
icon="i-lucide-calendar" required />
<UInput class="grow" placeholder="due time e.g 15:34" v-model="dueTimeField" icon="i-lucide-clock"
required /> required />
<UInput class="grow" placeholder="15:34" v-model="dueTimeField" icon="i-lucide-clock" required />
</div> </div>
<UTextarea type="text" placeholder="Description" v-model="descriptionField" required /> <UTextarea type="text" placeholder="Description" v-model="descriptionField" required />
</div> </div>

View File

@@ -7,6 +7,7 @@ import { Event, type SerializableEvent } from '~/utils/event';
const date = ref<DateTime>(DateTime.now()) const date = ref<DateTime>(DateTime.now())
const events = ref<Event[]>([]) const events = ref<Event[]>([])
const tasks = ref<Task[]>([])
const { data: eventsResponse } = await useAsyncData<SerializableEvent[]>( const { data: eventsResponse } = await useAsyncData<SerializableEvent[]>(
'events', 'events',
@@ -20,10 +21,7 @@ const {data: tasksResponse, refresh} = await useAsyncData<SerializableTask[]>(
onMounted(() => { onMounted(() => {
events.value = eventsResponse.value?.map(Event.fromSerializable) ?? [] events.value = eventsResponse.value?.map(Event.fromSerializable) ?? []
}) tasks.value = tasksResponse.value?.map(Task.fromSerializable) ?? []
const tasks = computed(() => {
return tasksResponse.value?.map(Task.fromSerializable) ?? []
}) })
async function postEvent(event: Event) { async function postEvent(event: Event) {
@@ -31,16 +29,11 @@ async function postEvent(event: Event) {
await axios.post('/event', event.toSerializable()) await axios.post('/event', event.toSerializable())
} }
async function postTask(name: string) { async function postTask(task: Task) {
console.log('posting Task') console.log('posting Task')
await axios.post('/task', { const createdTask = await axios.post<SerializableTask>('/task', task)
title: name, console.log(createdTask)
description: "", task.id = createdTask.data.id
done: false,
estimated_time: 0,
due_date: (new Date()).toISOString(),
})
await refresh()
} }
async function deleteTask(id: number) { async function deleteTask(id: number) {