diff --git a/src/pages/calendar.astro b/src/pages/calendar.astro new file mode 100644 index 0000000..ff2a405 --- /dev/null +++ b/src/pages/calendar.astro @@ -0,0 +1,213 @@ +--- +import { getCollection } from 'astro:content'; +import AppLayout from '../layouts/AppLayout.astro'; +import { fmtDate } from '../lib/markdown'; + +const user = Astro.locals.user; + +const allMeetings = await getCollection('meetings'); +const meetings = allMeetings.sort( + (a, b) => new Date(a.data.date).getTime() - new Date(b.data.date).getTime() +); + +const now = new Date(); +const upcoming = meetings.filter((m) => new Date(m.data.date) >= now); +const past = meetings.filter((m) => new Date(m.data.date) < now).reverse(); +--- + +
+ + + +
+ {upcoming.length > 0 && ( +
+

Upcoming

+ +
+ )} + + {past.length > 0 && ( +
+

Past

+ +
+ )} +
+ +
+
+ + diff --git a/src/pages/calendar/[slug].astro b/src/pages/calendar/[slug].astro new file mode 100644 index 0000000..7cb4baf --- /dev/null +++ b/src/pages/calendar/[slug].astro @@ -0,0 +1,300 @@ +--- +import { getCollection, getEntry } from 'astro:content'; +import AppLayout from '../../layouts/AppLayout.astro'; +import { fmtDate, renderMd } from '../../lib/markdown'; +import { getAttendanceSummary, getUserAttendance, setAttendance } from '../../lib/db'; + +const user = Astro.locals.user; +const { slug } = Astro.params; + +const meeting = await getEntry('meetings', slug as string); +if (!meeting) return Astro.redirect('/calendar'); + +const isPast = new Date(meeting.data.date) < new Date(); + +// Handle attendance POST +if (Astro.request.method === 'POST') { + const data = await Astro.request.formData(); + const status = data.get('status') as 'yes' | 'no' | null; + if (status === 'yes' || status === 'no') { + setAttendance(user.id, meeting.slug, status); + } + return Astro.redirect(`/calendar/${slug}`); +} + +const { Content } = await meeting.render(); +const attendance = getAttendanceSummary(meeting.slug); +const myStatus = getUserAttendance(user.id, meeting.slug); +--- + +
+ + + +
+
+
+ +

{meeting.data.title}

+
+
+
Time
+
{meeting.data.time}
+
+
+
Location
+
{meeting.data.location}
+
+ {meeting.data.attendees && ( +
+
Attendees
+
{meeting.data.attendees}
+
+ )} +
+
+ +
+ +
+
+ + {!isPast && ( + + )} +
+ +
+
+ +