diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/event.ts | 29 | ||||
-rw-r--r-- | src/routes/frontend.ts | 39 |
2 files changed, 53 insertions, 15 deletions
diff --git a/src/lib/event.ts b/src/lib/event.ts new file mode 100644 index 0000000..334ddf6 --- /dev/null +++ b/src/lib/event.ts @@ -0,0 +1,29 @@ +import { IEventGroup } from "../models/EventGroup.js"; + +export interface EventListEvent { + id: string; + name: string; + location: string; + displayDate: string; + eventHasConcluded: boolean; + startMoment: moment.Moment; + endMoment: moment.Moment; + eventGroup?: IEventGroup; +} + +export const bucketEventsByMonth = ( + acc: Record<string, any>[], + event: EventListEvent, +) => { + const month = event.startMoment.format("MMMM YYYY"); + const matchingBucket = acc.find((bucket) => bucket.title === month); + if (!matchingBucket) { + acc.push({ + title: month, + events: [event], + }); + } else { + matchingBucket.events.push(event); + } + return acc; +}; diff --git a/src/routes/frontend.ts b/src/routes/frontend.ts index 86ad69c..14bb779 100644 --- a/src/routes/frontend.ts +++ b/src/routes/frontend.ts @@ -18,6 +18,7 @@ import { import MagicLink from "../models/MagicLink.js"; import { getConfigMiddleware } from "../lib/middleware.js"; import { getMessage } from "../util/messages.js"; +import { EventListEvent, bucketEventsByMonth } from "../lib/event.js"; const router = Router(); @@ -89,7 +90,7 @@ router.get("/events", async (_: Request, res: Response) => { .populate("eventGroup") .lean() .sort("start"); - const updatedEvents = events.map((event) => { + const updatedEvents: EventListEvent[] = events.map((event) => { const startMoment = moment.tz(event.start, event.timezone); const endMoment = moment.tz(event.end, event.timezone); const isSameDay = startMoment.isSame(endMoment, "day"); @@ -105,14 +106,16 @@ router.get("/events", async (_: Request, res: Response) => { )}`, eventHasConcluded: endMoment.isBefore(moment.tz(event.timezone)), eventGroup: event.eventGroup as any as IEventGroup, + startMoment, + endMoment, }; }); - const upcomingEvents = updatedEvents.filter( - (event) => event.eventHasConcluded === false, - ); - const pastEvents = updatedEvents.filter( - (event) => event.eventHasConcluded === true, - ); + const upcomingEventsInMonthBuckets = updatedEvents + .filter((event) => event.eventHasConcluded === false) + .reduce(bucketEventsByMonth, []); + const pastEventsInMonthBuckets = updatedEvents + .filter((event) => event.eventHasConcluded === true) + .reduce(bucketEventsByMonth, []); const eventGroups = await EventGroup.find({ showOnPublicList: true, }).lean(); @@ -130,8 +133,8 @@ router.get("/events", async (_: Request, res: Response) => { res.render("publicEventList", { title: "Public events", - upcomingEvents: upcomingEvents, - pastEvents: pastEvents, + upcomingEvents: upcomingEventsInMonthBuckets, + pastEvents: pastEventsInMonthBuckets, eventGroups: updatedEventGroups, instanceDescription: instanceDescription(), instanceRules: instanceRules(), @@ -425,7 +428,7 @@ router.get("/group/:eventGroupID", async (req: Request, res: Response) => { .lean() .sort("start"); - const updatedEvents = events.map((event) => { + const updatedEvents: EventListEvent[] = events.map((event) => { const startMoment = moment.tz(event.start, event.timezone); const endMoment = moment.tz(event.end, event.timezone); const isSameDay = startMoment.isSame(endMoment, "day"); @@ -442,12 +445,18 @@ router.get("/group/:eventGroupID", async (req: Request, res: Response) => { eventHasConcluded: endMoment.isBefore( moment.tz(event.timezone), ), + startMoment, + endMoment, }; }); - const upcomingEventsExist = updatedEvents.some( - (e) => !e.eventHasConcluded, - ); + const upcomingEventsInMonthBuckets = updatedEvents + .filter((event) => !event.eventHasConcluded) + .reduce(bucketEventsByMonth, []); + + const pastEventsInMonthBuckets = updatedEvents + .filter((event) => event.eventHasConcluded) + .reduce(bucketEventsByMonth, []); let firstLoad = false; if (eventGroup.firstLoad === true) { @@ -494,8 +503,8 @@ router.get("/group/:eventGroupID", async (req: Request, res: Response) => { title: eventGroup.name, eventGroupData: eventGroup, escapedName: escapedName, - events: updatedEvents, - upcomingEventsExist: upcomingEventsExist, + upcomingEvents: upcomingEventsInMonthBuckets, + pastEvents: pastEventsInMonthBuckets, parsedDescription: parsedDescription, editingEnabled: editingEnabled, eventGroupHasCoverImage: eventGroupHasCoverImage, |