From ac5a78113ab6e63aed8b444c4879e624d00a7c1d Mon Sep 17 00:00:00 2001 From: core Date: Wed, 21 Feb 2024 11:29:12 -0500 Subject: [PATCH] events work --- src/lib/date.ts | 14 ++ .../vaccs/[id]/events/+page.server.ts | 74 +++++++--- .../dashboard/vaccs/[id]/events/+page.svelte | 131 +++++++++++++++--- .../[id]/events/data-table-actions.svelte | 46 ++++++ .../[id]/events/data-table-banner.svelte | 18 +++ 5 files changed, 245 insertions(+), 38 deletions(-) create mode 100644 src/lib/date.ts create mode 100644 src/routes/dashboard/vaccs/[id]/events/data-table-actions.svelte create mode 100644 src/routes/dashboard/vaccs/[id]/events/data-table-banner.svelte diff --git a/src/lib/date.ts b/src/lib/date.ts new file mode 100644 index 0000000..dbdace7 --- /dev/null +++ b/src/lib/date.ts @@ -0,0 +1,14 @@ +export function humanReadableDate(d: Date): string { + // Sat Feb 17, 2024, 18:00 (EST) + let options: Intl.DateTimeFormatOptions = { + weekday: "short", + year: "numeric", + month: "short", + day: "numeric", + hour: "2-digit", + minute: "2-digit", + timeZoneName: "short", + }; + + return new Intl.DateTimeFormat("en-US", options).format(d); +} diff --git a/src/routes/dashboard/vaccs/[id]/events/+page.server.ts b/src/routes/dashboard/vaccs/[id]/events/+page.server.ts index 746198a..beb101f 100644 --- a/src/routes/dashboard/vaccs/[id]/events/+page.server.ts +++ b/src/routes/dashboard/vaccs/[id]/events/+page.server.ts @@ -54,38 +54,33 @@ export const actions: Actions = { ); } + // combine the datetimes + + let startDate = form.data.startDate.split("T")[0]; + let startTime = String(form.data.startTime).padStart(4, "0"); + let startHour = startTime.slice(0, 2); + let startMinute = startTime.slice(2); + let start = `${startDate}T${startHour}:${startMinute}:00Z`; + + let endDate = form.data.endDate.split("T")[0]; + let endTime = String(form.data.endTime).padStart(4, "0"); + let endHour = endTime.slice(0, 2); + let endMinute = endTime.slice(2); + let end = `${endDate}T${endHour}:${endMinute}:00Z`; + // generate the blurhash const imageData = await getPixels(form.data.bannerUrl); const data = Uint8ClampedArray.from(imageData.data); const blurhash = encode(data, imageData.width, imageData.height, 4, 4); - // combine the datetimes - let startDate = new Date(form.data.startDate); - let start_hour = parseInt( - String(form.data.startTime).padStart(4, "0").slice(0, 2), - ); - let start_minute = parseInt( - String(form.data.startTime).padStart(4, "0").slice(2), - ); - startDate.setHours(start_hour, start_minute); - - let endDate = new Date(form.data.endDate); - let end_hour = parseInt( - String(form.data.endTime).padStart(4, "0").slice(0, 2), - ); - let end_minute = parseInt( - String(form.data.endTime).padStart(4, "0").slice(2), - ); - endDate.setHours(end_hour, end_minute); - await prisma.event.create({ data: { id: ulid(), name: form.data.name, hostId: event.params.id, - start: startDate, - end: endDate, + start: start, + end: end, description: form.data.description, bannerUrl: form.data.bannerUrl, bannerBlurHash: blurhash, @@ -99,4 +94,41 @@ export const actions: Actions = { form, }; }, + setVisibility: async (event) => { + let { user, roles } = await loadUserData(event.cookies); + + if ( + !can( + roles, + event.params.id, + user.vaccId, + `vacc.${event.params.id}.events.manage`, + ) + ) { + return redirect( + 307, + `/dashboard/vaccs/${event.params.id}/`, + { message: "You don't have permission to do that.", type: "error" }, + event.cookies, + ); + } + + let data = await event.request.formData(); + + if (!data.has("eventId") || !data.has("public")) { + return { success: false }; + } else { + let id = data.get("eventId")!.toString(); + let isPublic = data.get("public")!.toString() === "true"; + await prisma.event.update({ + where: { + id + }, + data: { + public: isPublic + } + }); + return { success: true }; + } + } }; diff --git a/src/routes/dashboard/vaccs/[id]/events/+page.svelte b/src/routes/dashboard/vaccs/[id]/events/+page.svelte index c0dc4f2..2ffa185 100644 --- a/src/routes/dashboard/vaccs/[id]/events/+page.svelte +++ b/src/routes/dashboard/vaccs/[id]/events/+page.svelte @@ -1,6 +1,6 @@

Upcoming Events

- {#if can(data.roles, data.vacc_id, data.user.vaccId, `vacc.${data.vacc_id}.events.manage`)} + {#if canManageEvents}
+ + + {#each $headerRows as headerRow} + + + {#each headerRow.cells as cell (cell.id)} + + + + + + {/each} + + + {/each} + + + {#each $pageRows as row (row.id)} + + + {#each row.cells as cell (cell.id)} + + + + + + {/each} + + + {/each} + + + + {#if can(data.roles, data.vacc_id, data.user.vaccId, `vacc.${data.vacc_id}.events.manage`)} diff --git a/src/routes/dashboard/vaccs/[id]/events/data-table-actions.svelte b/src/routes/dashboard/vaccs/[id]/events/data-table-actions.svelte new file mode 100644 index 0000000..267486d --- /dev/null +++ b/src/routes/dashboard/vaccs/[id]/events/data-table-actions.svelte @@ -0,0 +1,46 @@ + + + + + + + + + Actions + {navigator.clipboard.writeText(event.id); toast.success("Event ID copied to clipboard");}}> + Copy ID + + {#if canManageEvents} + + {#if event.public} + Make Private + {:else} + Make Public + {/if} + + Edit + + + Delete + + {/if} + + + \ No newline at end of file diff --git a/src/routes/dashboard/vaccs/[id]/events/data-table-banner.svelte b/src/routes/dashboard/vaccs/[id]/events/data-table-banner.svelte new file mode 100644 index 0000000..0ae51f6 --- /dev/null +++ b/src/routes/dashboard/vaccs/[id]/events/data-table-banner.svelte @@ -0,0 +1,18 @@ + + + + + \ No newline at end of file