Skip to content

Commit 61d767a

Browse files
authored
Add member list page (/members) (#1236)
* add member list page * refactor
1 parent e97b580 commit 61d767a

2 files changed

Lines changed: 101 additions & 5 deletions

File tree

src/lib/components/YearSelector.svelte

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@
55
import { cn } from "$lib/utils";
66
import { SvelteURLSearchParams } from "svelte/reactivity";
77
8-
let { class: klass }: { class?: string } = $props();
8+
let {
9+
class: klass,
10+
max = new Date().getFullYear(),
11+
min = 1982,
12+
}: { class?: string; max?: number; min?: number } = $props();
913
1014
const generateLink = $derived((value: string) => {
1115
const searchParams = new SvelteURLSearchParams(page.url.searchParams);
@@ -45,7 +49,7 @@
4549
value={page.url.searchParams.get("year") ?? "2026"}
4650
>
4751
<Tabs.List bind:ref={tabList}>
48-
{#each Array.from({ length: new Date().getFullYear() - 1982 + 1 }, (value, index) => 1982 + index).toReversed() as n (n)}
52+
{#each Array.from({ length: max - min + 1 }, (value, index) => min + index).toReversed() as n (n)}
4953
<a href={generateLink(n + "")}>
5054
<!-- eslint-disable-next-line @typescript-eslint/no-this-alias -->
5155
<Tabs.Trigger value={"" + n}>{n}</Tabs.Trigger></a
Lines changed: 95 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,97 @@
1-
<script>
2-
import NotImplemented from "$lib/components/NotImplemented.svelte";
1+
<script lang="ts">
2+
import ProgrammeBadge from "$lib/components/member/ProgrammeBadge.svelte";
3+
import MemberCard from "$lib/components/MemberCard.svelte";
4+
import * as m from "$paraglide/messages";
5+
import SetPageTitle from "$lib/components/nav/SetPageTitle.svelte";
6+
import { type PageData } from "./$types";
7+
import YearSelector from "$lib/components/YearSelector.svelte";
8+
import * as Select from "$lib/components/ui/select";
9+
import { page } from "$app/state";
10+
import { SvelteURLSearchParams } from "svelte/reactivity";
11+
12+
let { data }: { data: PageData } = $props();
13+
let members = $derived(data.members);
14+
let programme = $derived(data.programme as keyof typeof programmes);
15+
let year = $derived(data.year);
16+
17+
const programmeYears = {
18+
all: 1982,
19+
D: 1982,
20+
C: 2001,
21+
"VR/AR": 2021,
22+
} as const;
23+
24+
const programmes = {
25+
all: m.members_all(),
26+
C: "C",
27+
D: "D",
28+
"VR/AR": "VR/AR",
29+
} as const;
30+
31+
const getProgrammeLink = $derived((value: string) => {
32+
const searchParams = new SvelteURLSearchParams(page.url.searchParams);
33+
searchParams.set("programme", value.toString());
34+
return `?${searchParams.toString()}`;
35+
});
336
</script>
437

5-
<NotImplemented />
38+
<SetPageTitle title="{programmes[programme]} {year}" />
39+
40+
<div class="layout-container">
41+
<div class="flex flex-row items-center gap-2">
42+
<Select.Root type="single" name="classProgramme" bind:value={programme}>
43+
<Select.Trigger
44+
oninput={async (e) => {
45+
console.log(e);
46+
const searchParams = new SvelteURLSearchParams(page.url.searchParams);
47+
searchParams.set("year", e.currentTarget.value);
48+
return `?${searchParams.toString()}`;
49+
}}
50+
class="h-[inherit]! w-full py-2!"
51+
>{programmes[programme]}</Select.Trigger
52+
>
53+
<Select.Content>
54+
{#each Object.entries(programmes) as classProgramme (classProgramme[0])}
55+
<a href={getProgrammeLink(classProgramme[0])}
56+
><Select.Item value={classProgramme[0]}
57+
>{classProgramme[1]}</Select.Item
58+
></a
59+
>
60+
{/each}
61+
</Select.Content>
62+
</Select.Root>
63+
64+
<YearSelector
65+
min={new Date().getFullYear() - programmeYears[programme] + 1}
66+
/>
67+
</div>
68+
69+
<div class="my-4 flex items-center gap-4">
70+
{#if programme !== "all"}
71+
<ProgrammeBadge
72+
member={{
73+
classProgramme: programme,
74+
classYear: year,
75+
}}
76+
size="lg"
77+
/>
78+
{/if}
79+
<p>
80+
{#if members.length === 0}
81+
{m.members_noMembers()}
82+
{:else if members.length > 1}
83+
{m.members_members({ x: members.length })}
84+
{:else}
85+
{m.members_oneMember()}
86+
{/if}
87+
</p>
88+
</div>
89+
90+
<div
91+
class="grid grid-cols-1 gap-2 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4"
92+
>
93+
{#each members as member (member.id)}
94+
<MemberCard class="w-full" {member} showClass={programme === "all"} />
95+
{/each}
96+
</div>
97+
</div>

0 commit comments

Comments
 (0)