From ebc6358c2972a56072a9c38f45b0cc4407e82635 Mon Sep 17 00:00:00 2001 From: quirinecker Date: Mon, 16 Jun 2025 11:18:26 +0200 Subject: [PATCH] added dialog for creating events --- web/components/ui/calendar/Calendar.vue | 111 +++++++++++++++++++++--- web/utils/event.ts | 32 ++++--- 2 files changed, 119 insertions(+), 24 deletions(-) diff --git a/web/components/ui/calendar/Calendar.vue b/web/components/ui/calendar/Calendar.vue index 3738fc1..09ad52e 100644 --- a/web/components/ui/calendar/Calendar.vue +++ b/web/components/ui/calendar/Calendar.vue @@ -4,10 +4,32 @@ import CalendarHeader from './CalendarHeader.vue'; import CalendarCollumn from './CalendarCollumn.vue'; import { Event } from '~/utils/event'; import { DateTime } from 'luxon'; +import { UTextarea } from '#components'; const events = defineModel('events', { required: true }) const date = defineModel('date', { required: true }) const draggedEvent = ref() +const createModalOpened = ref(false) +const createContext = ref<{ date: DateTime, timespan: Timespan } | undefined>(undefined) +const createModal = { + open: ref(false), + fromTimeField: ref(''), + toTimeField: ref(''), + toDateField: ref(''), + fromDateField: ref(''), + nameField: ref(''), + descriptionField: ref(''), + clear: () => { + createModal.nameField.value = '' + createModal.fromDateField.value = '' + createModal.toDateField.value = '' + createModal.fromTimeField.value = '' + createModal.toTimeField.value = '' + createModal.descriptionField.value = '' + } +} + +const toast = useToast() type Day = { date: DateTime @@ -87,33 +109,94 @@ const seperators = ref([ { text: '9 PM', time: hour(21) }, ]) - -function quickCreate(date: DateTime, timespan: Timespan) { - const eventTitle = prompt("Event title") - - if (eventTitle === null) { - return +function openCreateModal(date: DateTime, timespan: Timespan) { + createContext.value = { + date: date, + timespan: timespan } - const newEvent: Event = new Event( - eventTitle, - date.startOf('day').plus({ minutes: timespan.from * 24 * 60 }), - date.startOf('day').plus({ minutes: timespan.to * 24 * 60 }) - ) + const from = date.startOf('day').plus({ minutes: timespan.from * 24 * 60 }) + const to = date.startOf('day').plus({ minutes: timespan.to * 24 * 60 }) - emits('create', newEvent) - events.value.push(newEvent) + createModal.fromDateField.value = from.toISODate() ?? '' + createModal.toDateField.value = to.toISODate() ?? '' + createModal.fromTimeField.value = from.toFormat('HH:mm') + createModal.toTimeField.value = to.toFormat('HH:mm') + createModal.open.value = true +} + +function create() { + const from = dateFromFields(createModal.fromDateField.value, createModal.fromTimeField.value) + const to = dateFromFields(createModal.toDateField.value, createModal.toTimeField.value) + + if (!from.isValid) { + toast.add({ + title: 'Invalid `from` date format' + }) + } + + if (!to.isValid) { + toast.add({ + title: 'Invalid `to` date format' + }) + } + + if (createModal.nameField.value.trim() === '') { + toast.add({ + title: 'Name is required' + }) + } + + const event = new Event(createModal.nameField.value, from, to, createModal.descriptionField.value) + emits('create', event) + createModal.clear() + createModal.open.value = false + events.value.push(event) +} + +function dateFromFields(date: string, time: string) { + return DateTime.fromFormat(`${date} ${time}`, 'yyyy-MM-dd HH:mm') }