From d237061a94532389111d9870892e2086b9516de2 Mon Sep 17 00:00:00 2001 From: toino Date: Sat, 1 Jun 2024 23:17:14 +0100 Subject: [PATCH] Add campus to dropdown --- src/lib/util.ts | 7 ++++++ src/routes/+layout.svelte | 34 +++++++++++++++++------------ src/routes/+layout.ts | 23 +++++++++++++++++++ src/routes/[lang=lang]/+page.svelte | 10 +++------ 4 files changed, 53 insertions(+), 21 deletions(-) diff --git a/src/lib/util.ts b/src/lib/util.ts index aee041b..f4b66a6 100644 --- a/src/lib/util.ts +++ b/src/lib/util.ts @@ -8,5 +8,12 @@ type Entries = { export const typedEntries = (obj: T) => Object.entries(obj) as Entries; +export const sortedEntriesByKey = ( + obj: T, + fn: (a: keyof T, b: keyof T) => number, +) => typedEntries(obj).toSorted(([a], [b]) => fn(a, b)); + +export const strCompare = (a: string, b: string) => a.localeCompare(b); + const mongoIdRegex = /^[0-9a-f]{24}$/i; export const isMongoId = (id: string) => mongoIdRegex.test(id); diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index f647643..55378e0 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -3,16 +3,17 @@ import type { Restaurant } from "$lib/restaurant"; import { MetaTags } from "svelte-meta-tags"; import "../app.pcss"; - import { _, __, messages } from "$lib/i18n"; + import { _, __, messages, type Language } from "$lib/i18n"; + import { sortedEntriesByKey, strCompare } from "$lib/util"; export let data; - $: lang = $page.data.lang as string | undefined; + $: lang = $page.data.lang as Language | undefined; $: date = $page.data.date as string | undefined; - $: restaurants = lang - ? data.restaurants.filter((restaurant) => restaurant.lang === lang) - : data.restaurants; + $: restaurantsByCampus = lang + ? data.restaurantsByLanguageAndCampus[lang] + : data.restaurantsByCampus; $: selectedRestaurant = "restaurant" in $page.data @@ -37,15 +38,20 @@ diff --git a/src/routes/+layout.ts b/src/routes/+layout.ts index f7816bc..605a07f 100644 --- a/src/routes/+layout.ts +++ b/src/routes/+layout.ts @@ -1,3 +1,4 @@ +import { __, type Language, messages } from "$lib/i18n"; import type { Restaurant } from "$lib/restaurant"; import type { LayoutLoad } from "./$types"; @@ -8,7 +9,29 @@ export const load: LayoutLoad = async ({ fetch }) => { const { restaurants } = (await req.json()) as { restaurants: Restaurant[] }; + const restaurantsByLanguage = Object.groupBy( + restaurants, + (r) => r.lang, + ) as Record; + + const restaurantsByLanguageAndCampus = Object.fromEntries( + Object.entries(restaurantsByLanguage).map(([lang, restaurants]) => [ + lang, + Object.groupBy( + restaurants, + (r) => r.campus ?? __(r.lang, messages.other), + ) as Record, + ]), + ) as Record>; + + const restaurantsByCampus = Object.values( + restaurantsByLanguageAndCampus, + ).reduce((acc, lang) => ({ ...acc, ...lang }), {}); + return { restaurants, + restaurantsByCampus, + restaurantsByLanguage, + restaurantsByLanguageAndCampus, }; }; diff --git a/src/routes/[lang=lang]/+page.svelte b/src/routes/[lang=lang]/+page.svelte index 907bea5..7257fb7 100644 --- a/src/routes/[lang=lang]/+page.svelte +++ b/src/routes/[lang=lang]/+page.svelte @@ -1,16 +1,12 @@ -{#each typedEntries(restaurantsByCampus).toSorted( ([a], [b]) => a.localeCompare(b), ) as [campus, restaurants] (campus)} +{#each sortedEntriesByKey(restaurantsByCampus, strCompare) as [campus, restaurants] (campus)}

{campus}

    {#each restaurants as restaurant (restaurant.id)}