From ef5c9063210db09fabe408ed37f22c9198ae84f9 Mon Sep 17 00:00:00 2001 From: Kalle <38327916+Sendouc@users.noreply.github.com> Date: Tue, 23 May 2023 23:13:31 +0300 Subject: [PATCH] Calendar: Sort this week's past events last --- app/routes/calendar/index.tsx | 47 +++++++++++++++++++++++++++++++-- app/styles/calendar.css | 4 +++ app/utils/dates.ts | 6 +++++ public/locales/en/calendar.json | 1 + 4 files changed, 56 insertions(+), 2 deletions(-) diff --git a/app/routes/calendar/index.tsx b/app/routes/calendar/index.tsx index 24d8761df..96e9d782b 100644 --- a/app/routes/calendar/index.tsx +++ b/app/routes/calendar/index.tsx @@ -25,6 +25,7 @@ import { databaseTimestampToDate, dateToThisWeeksMonday, dateToWeekNumber, + getWeekStartsAtMondayDay, weekNumberToDate, } from "~/utils/dates"; import { type SendouRouteHandle } from "~/utils/remix"; @@ -39,6 +40,7 @@ import { } from "~/utils/urls"; import { actualNumber } from "~/utils/zod"; import { Tags } from "./components/Tags"; +import { Divider } from "~/components/Divider"; export const links: LinksFunction = () => { return [{ rel: "stylesheet", href: styles }]; @@ -98,6 +100,7 @@ export const loader = async ({ request }: LoaderArgs) => { return json({ currentWeek, displayedWeek, + currentDay: new Date().getDay(), nearbyStartTimes: db.calendarEvents.startTimesOfRange({ startTime: subMonths( weekNumberToDate({ week: displayedWeek, year: displayedYear }), @@ -333,14 +336,36 @@ function EventsList({ }: { events: SerializeFrom["events"]; }) { + const data = useLoaderData(); const { t, i18n } = useTranslation("calendar"); + const sortPastEventsLast = data.currentWeek === data.displayedWeek; + + const eventsGrouped = eventsGroupedByDay(events); + if (sortPastEventsLast) { + eventsGrouped.sort(pastEventsLast(data.currentDay)); + } + + let dividerRendered = false; return (
- {eventsGroupedByDay(events).map(([daysDate, events]) => { + {eventsGrouped.map(([daysDate, events]) => { + const renderDivider = + sortPastEventsLast && + !dividerRendered && + getWeekStartsAtMondayDay(daysDate) < data.currentDay; + if (renderDivider) { + dividerRendered = true; + } + return (
+ {renderDivider ? ( + + {t("pastEvents.dividerText")} + + ) : null}
{daysDate.toLocaleDateString(i18n.language, { weekday: "long", @@ -435,8 +460,9 @@ function EventsList({ ); } +type EventsGrouped = [Date, SerializeFrom["events"]]; function eventsGroupedByDay(events: SerializeFrom["events"]) { - const result: Array<[Date, SerializeFrom["events"]]> = []; + const result: EventsGrouped[] = []; for (const calendarEvent of events) { const previousIterationEvents = result[result.length - 1] ?? null; @@ -454,3 +480,20 @@ function eventsGroupedByDay(events: SerializeFrom["events"]) { return result; } + +function pastEventsLast(currentDay: number) { + return function (a: EventsGrouped, b: EventsGrouped) { + const aDay = getWeekStartsAtMondayDay(a[0]); + const bDay = getWeekStartsAtMondayDay(b[0]); + + if (aDay < currentDay && bDay >= currentDay) { + return 1; + } + + if (aDay >= currentDay && bDay < currentDay) { + return -1; + } + + return 0; + }; +} diff --git a/app/styles/calendar.css b/app/styles/calendar.css index 834e71db6..44f21369b 100644 --- a/app/styles/calendar.css +++ b/app/styles/calendar.css @@ -120,6 +120,10 @@ background-color: var(--bg); } +.calendar__event__divider { + padding-block-start: 40px; +} + .calendar__event__date { font-weight: var(--semi-bold); padding-block-start: var(--s-6); diff --git a/app/utils/dates.ts b/app/utils/dates.ts index 74add8235..2b1e24fda 100644 --- a/app/utils/dates.ts +++ b/app/utils/dates.ts @@ -26,6 +26,12 @@ export function dateToThisWeeksMonday(date: Date) { return copiedDate; } +export function getWeekStartsAtMondayDay(date: Date) { + const currentDay = date.getDay(); + + return currentDay === 0 ? 7 : currentDay; +} + // https://stackoverflow.com/a/71336659 export function weekNumberToDate({ week, diff --git a/public/locales/en/calendar.json b/public/locales/en/calendar.json index 1ca581c66..31a00e54b 100644 --- a/public/locales/en/calendar.json +++ b/public/locales/en/calendar.json @@ -13,6 +13,7 @@ "results": "Results", "createMapList": "Create map list", "from": "From {{author}}", + "pastEvents.dividerText": "Past events", "forms.dates": "Dates", "forms.bracketUrl": "Bracket URL",