From 53eb2eff724331897548638950c83b7dcf9b9301 Mon Sep 17 00:00:00 2001 From: FluffyFire <62662486+sturla1511@users.noreply.github.com> Date: Fri, 18 Sep 2026 19:08:37 +0200 Subject: [PATCH 1/4] =?UTF-8?q?la=20til=20dato=20og=20role=20p=C3=A5=20eme?= =?UTF-8?q?ritus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/routes/(app)/emeritus/+page.svelte | 107 +++++++++++------- 1 file changed, 65 insertions(+), 42 deletions(-) diff --git a/programmerbar-web/src/routes/(app)/emeritus/+page.svelte b/programmerbar-web/src/routes/(app)/emeritus/+page.svelte index a3e30ea7..8ec0c54e 100644 --- a/programmerbar-web/src/routes/(app)/emeritus/+page.svelte +++ b/programmerbar-web/src/routes/(app)/emeritus/+page.svelte @@ -14,44 +14,51 @@ { name: 'Eivind D. Halderaker', role: 'Co-founder' } ]; - const members = [ - 'Erik Fjelltveit Nyhuus', - 'Lene Soltveit', - 'Steffen Andre Pettersen', - 'Siren Bjorøy', - 'Ole Straumland', - 'Tony Lam', - 'Eirik Rekve Thorsheim', - 'Ole Magnus Fon Johnsen', - 'August Ebne Røeggen', - 'Fredrik Hast Sørli', - 'Sturla Rognskog Mella', - 'Tord Vikøren Vikestad', - 'Henrik Sætre Breivik' + type Member = { name: string; role?: string; start?: string; end?: string }; + + const members: Member[] = [ + { name: 'Erik Fjelltveit Nyhuus' }, + { name: 'Steffen Andre Pettersen' }, + { name: 'Siren Bjorøy' }, + { name: 'Ole Straumland' }, + { name: 'August Ebne Røeggen' }, + { name: 'Sturla Rognskog Mella', start: 'Høst 2025' }, + { name: 'Tord Vikøren Vikestad', start: 'Høst 2025' }, + { name: 'Henrik Sætre Breivik', start: 'Høst 2025' }, + { name: 'Anna Sviland', start: 'Høst 2026' }, + { name: 'Anna Valencia Fari', start: 'Høst 2026' }, + { name: 'Oddmund Gullbrå Steinsland', start: 'Høst 2026' }, + { name: 'Maya Shantseva', start: 'Høst 2026' }, + { name: 'Torjus Berntsen', start: 'Høst 2026' } ]; - const pastMembers = [ - 'Mina Tolfsen', - 'Ask Rud Persson', - 'Palma Rud Persson', - 'Sigurd Johnsen Setså', - 'Erlend Raa Vågset', - 'Sofia Hestenes Eika', - 'Kristoffer Borg Nilsen', - 'Lars Lismoen', - 'Yoeri Otten', - 'Eirik Øygard', - 'Arne Natskår', - 'Alexander Alf Iversen', - 'Henrik Trondseth', - 'Emil Johannessen', - 'Andre Normann', - 'Sofie Nhu Nguyen', - 'Simen Hauge Østbø', - 'Stian Munkejord', - 'Gard Heine Kalland', - 'Lars Bysheim', - 'Lars Haukland' + const pastMembers: Member[] = [ + { name: 'Mina Tolfsen' }, + { name: 'Ask Rud Persson' }, + { name: 'Palma Rud Persson' }, + { name: 'Sigurd Johnsen Setså' }, + { name: 'Erlend Raa Vågset' }, + { name: 'Sofia Hestenes Eika' }, + { name: 'Kristoffer Borg Nilsen' }, + { name: 'Lars Lismoen' }, + { name: 'Yoeri Otten' }, + { name: 'Eirik Øygard' }, + { name: 'Arne Natskår' }, + { name: 'Alexander Alf Iversen' }, + { name: 'Henrik Trondseth' }, + { name: 'Emil Johannessen' }, + { name: 'Andre Normann' }, + { name: 'Sofie Nhu Nguyen' }, + { name: 'Simen Hauge Østbø' }, + { name: 'Stian Munkejord' }, + { name: 'Gard Heine Kalland' }, + { name: 'Lars Bysheim' }, + { name: 'Lars Haukland' }, + { name: 'Eirik Rekve Thorsheim' }, + { name: 'Tony Bao Lam', role: 'Innkjøp', end: 'Vår 2026' }, + { name: 'Lene Soltveit', role: 'Økonomiansvarlig', end: 'Vår 2026' }, + { name: 'Ole Magnus Fon Johnsen', role: 'Webansvarlig', end: 'Vår 2026' }, + { name: 'Fredrik Hast Sørli', role: 'Økonomiassistent', start: 'Høst 2025', end: 'Vår 2026' } ]; @@ -85,8 +92,8 @@ @@ -98,9 +105,13 @@ ## Styremedlemmer @@ -112,9 +123,21 @@ ## Tidligere Styremedlemmer From 99f29fbf7269c5256cd108f3771cb6498571f614 Mon Sep 17 00:00:00 2001 From: FluffyFire <62662486+sturla1511@users.noreply.github.com> Date: Fri, 18 Sep 2026 19:27:01 +0200 Subject: [PATCH 2/4] fixes --- .../src/routes/(app)/emeritus/+page.svelte | 196 +++++++++++------- 1 file changed, 123 insertions(+), 73 deletions(-) diff --git a/programmerbar-web/src/routes/(app)/emeritus/+page.svelte b/programmerbar-web/src/routes/(app)/emeritus/+page.svelte index 8ec0c54e..650c8494 100644 --- a/programmerbar-web/src/routes/(app)/emeritus/+page.svelte +++ b/programmerbar-web/src/routes/(app)/emeritus/+page.svelte @@ -14,54 +14,134 @@ { name: 'Eivind D. Halderaker', role: 'Co-founder' } ]; - type Member = { name: string; role?: string; start?: string; end?: string }; + type Semester = `Vår ${number}` | `Høst ${number}`; + type Period = { start?: Semester; end?: Semester }; + type Role = { + title: string; + period?: Period; + }; + type Member = { + name: string; + membership?: Period; + roles: Role[]; + }; const members: Member[] = [ - { name: 'Erik Fjelltveit Nyhuus' }, - { name: 'Steffen Andre Pettersen' }, - { name: 'Siren Bjorøy' }, - { name: 'Ole Straumland' }, - { name: 'August Ebne Røeggen' }, - { name: 'Sturla Rognskog Mella', start: 'Høst 2025' }, - { name: 'Tord Vikøren Vikestad', start: 'Høst 2025' }, - { name: 'Henrik Sætre Breivik', start: 'Høst 2025' }, - { name: 'Anna Sviland', start: 'Høst 2026' }, - { name: 'Anna Valencia Fari', start: 'Høst 2026' }, - { name: 'Oddmund Gullbrå Steinsland', start: 'Høst 2026' }, - { name: 'Maya Shantseva', start: 'Høst 2026' }, - { name: 'Torjus Berntsen', start: 'Høst 2026' } + { name: 'Erik Fjelltveit Nyhuus', roles: [{ title: 'Leder' }] }, + { name: 'Steffen Andre Pettersen', roles: [{ title: 'Sosialansvarlig' }] }, + { name: 'Siren Bjorøy', roles: [{ title: 'Bookingansvarlig' }] }, + { name: 'Ole Straumland', roles: [{ title: 'Frivilligansvarlig' }] }, + { name: 'August Ebne Røeggen', roles: [{ title: 'Nestleder' }] }, + { + name: 'Sturla Rognskog Mella', + membership: { start: 'Høst 2025' }, + roles: [ + { title: 'Frivilligansvarlig og webansvarlig', period: { start: 'Vår 2026' } }, + { + title: 'Assistent for frivilligansvarlig', + period: { start: 'Høst 2025', end: 'Høst 2025' } + } + ] + }, + { + name: 'Tord Vikøren Vikestad', + membership: { start: 'Høst 2025' }, + roles: [{ title: 'Bygg/admin' }] + }, + { + name: 'Henrik Sætre Breivik', + membership: { start: 'Høst 2025' }, + roles: [{ title: 'Quiz- og arrangementsansvarlig' }] + }, + { name: 'Anna Sviland', membership: { start: 'Høst 2026' }, roles: [] }, + { name: 'Anna Valencia Fari', membership: { start: 'Høst 2026' }, roles: [] }, + { name: 'Oddmund Gullbrå Steinsland', membership: { start: 'Høst 2026' }, roles: [] }, + { name: 'Maya Shantseva', membership: { start: 'Høst 2026' }, roles: [] }, + { name: 'Torjus Berntsen', membership: { start: 'Høst 2026' }, roles: [] } ]; const pastMembers: Member[] = [ - { name: 'Mina Tolfsen' }, - { name: 'Ask Rud Persson' }, - { name: 'Palma Rud Persson' }, - { name: 'Sigurd Johnsen Setså' }, - { name: 'Erlend Raa Vågset' }, - { name: 'Sofia Hestenes Eika' }, - { name: 'Kristoffer Borg Nilsen' }, - { name: 'Lars Lismoen' }, - { name: 'Yoeri Otten' }, - { name: 'Eirik Øygard' }, - { name: 'Arne Natskår' }, - { name: 'Alexander Alf Iversen' }, - { name: 'Henrik Trondseth' }, - { name: 'Emil Johannessen' }, - { name: 'Andre Normann' }, - { name: 'Sofie Nhu Nguyen' }, - { name: 'Simen Hauge Østbø' }, - { name: 'Stian Munkejord' }, - { name: 'Gard Heine Kalland' }, - { name: 'Lars Bysheim' }, - { name: 'Lars Haukland' }, - { name: 'Eirik Rekve Thorsheim' }, - { name: 'Tony Bao Lam', role: 'Innkjøp', end: 'Vår 2026' }, - { name: 'Lene Soltveit', role: 'Økonomiansvarlig', end: 'Vår 2026' }, - { name: 'Ole Magnus Fon Johnsen', role: 'Webansvarlig', end: 'Vår 2026' }, - { name: 'Fredrik Hast Sørli', role: 'Økonomiassistent', start: 'Høst 2025', end: 'Vår 2026' } + { name: 'Mina Tolfsen', roles: [] }, + { name: 'Ask Rud Persson', roles: [] }, + { name: 'Palma Rud Persson', roles: [] }, + { name: 'Sigurd Johnsen Setså', roles: [] }, + { name: 'Erlend Raa Vågset', roles: [] }, + { name: 'Sofia Hestenes Eika', roles: [] }, + { name: 'Kristoffer Borg Nilsen', roles: [] }, + { name: 'Lars Lismoen', roles: [] }, + { name: 'Yoeri Otten', roles: [] }, + { name: 'Eirik Øygard', roles: [] }, + { name: 'Arne Natskår', roles: [] }, + { name: 'Alexander Alf Iversen', roles: [] }, + { name: 'Henrik Trondseth', roles: [] }, + { name: 'Emil Johannessen', roles: [] }, + { name: 'Andre Normann', roles: [] }, + { name: 'Sofie Nhu Nguyen', roles: [] }, + { name: 'Simen Hauge Østbø', roles: [] }, + { name: 'Stian Munkejord', roles: [] }, + { name: 'Gard Heine Kalland', roles: [] }, + { name: 'Lars Bysheim', roles: [] }, + { name: 'Lars Haukland', roles: [] }, + { name: 'Eirik Rekve Thorsheim', roles: [] }, + { name: 'Tony Bao Lam', membership: { end: 'Vår 2026' }, roles: [{ title: 'Innkjøp' }] }, + { + name: 'Lene Soltveit', + membership: { end: 'Vår 2026' }, + roles: [{ title: 'Økonomiansvarlig' }] + }, + { + name: 'Ole Magnus Fon Johnsen', + membership: { end: 'Vår 2026' }, + roles: [{ title: 'Webansvarlig' }] + }, + { + name: 'Fredrik Hast Sørli', + membership: { start: 'Høst 2025', end: 'Vår 2026' }, + roles: [{ title: 'Økonomiassistent' }] + } ]; + + function formatPeriod(start?: string, end?: string, current = false): string { + if (start && end) return start === end ? start : `${start} – ${end.toLowerCase()}`; + if (end) return `Til og med ${end.toLowerCase()}`; + if (start) return current ? `${start} – nå` : `Fra ${start.toLowerCase()}`; + return ''; + } +{#snippet memberList(list: Member[], current: boolean)} + +{/snippet} + -

## Styremedlemmer

- + {@render memberList(members, true)}
-
-

+

## Tidligere Styremedlemmer

- + {@render memberList(pastMembers, false)}
From e5789b8de708fb11644464b67f78628e404d2020 Mon Sep 17 00:00:00 2001 From: FluffyFire <62662486+sturla1511@users.noreply.github.com> Date: Fri, 18 Sep 2026 19:42:28 +0200 Subject: [PATCH 3/4] added member periode liste --- .../src/routes/(app)/emeritus/+page.svelte | 155 ++++++++++++++---- 1 file changed, 123 insertions(+), 32 deletions(-) diff --git a/programmerbar-web/src/routes/(app)/emeritus/+page.svelte b/programmerbar-web/src/routes/(app)/emeritus/+page.svelte index 650c8494..e9413ab4 100644 --- a/programmerbar-web/src/routes/(app)/emeritus/+page.svelte +++ b/programmerbar-web/src/routes/(app)/emeritus/+page.svelte @@ -46,12 +46,12 @@ { name: 'Tord Vikøren Vikestad', membership: { start: 'Høst 2025' }, - roles: [{ title: 'Bygg/admin' }] + roles: [{ title: 'Bygg/admin', period: { start: 'Høst 2025' } }] }, { name: 'Henrik Sætre Breivik', membership: { start: 'Høst 2025' }, - roles: [{ title: 'Quiz- og arrangementsansvarlig' }] + roles: [{ title: 'Quiz- og arrangementsansvarlig', period: { start: 'Høst 2025' } }] }, { name: 'Anna Sviland', membership: { start: 'Høst 2026' }, roles: [] }, { name: 'Anna Valencia Fari', membership: { start: 'Høst 2026' }, roles: [] }, @@ -83,21 +83,25 @@ { name: 'Lars Bysheim', roles: [] }, { name: 'Lars Haukland', roles: [] }, { name: 'Eirik Rekve Thorsheim', roles: [] }, - { name: 'Tony Bao Lam', membership: { end: 'Vår 2026' }, roles: [{ title: 'Innkjøp' }] }, + { + name: 'Tony Bao Lam', + membership: { end: 'Vår 2026' }, + roles: [{ title: 'Innkjøp', period: { end: 'Vår 2026' } }] + }, { name: 'Lene Soltveit', membership: { end: 'Vår 2026' }, - roles: [{ title: 'Økonomiansvarlig' }] + roles: [{ title: 'Økonomiansvarlig', period: { end: 'Vår 2026' } }] }, { name: 'Ole Magnus Fon Johnsen', membership: { end: 'Vår 2026' }, - roles: [{ title: 'Webansvarlig' }] + roles: [{ title: 'Webansvarlig', period: { end: 'Vår 2026' } }] }, { name: 'Fredrik Hast Sørli', membership: { start: 'Høst 2025', end: 'Vår 2026' }, - roles: [{ title: 'Økonomiassistent' }] + roles: [{ title: 'Økonomiassistent', period: { start: 'Høst 2025', end: 'Vår 2026' } }] } ]; @@ -107,11 +111,54 @@ if (start) return current ? `${start} – nå` : `Fra ${start.toLowerCase()}`; return ''; } + + // Spring comes before autumn within a calendar year. + function semesterIndex(semester: Semester): number { + const [season, year] = semester.split(' '); + return Number(year) * 2 + (season === 'Høst' ? 1 : 0); + } + + function overlapsYear(period: Period | undefined, year: number, current: boolean): boolean { + if (!period?.start && !period?.end) return false; + // An unknown boundary must not imply membership in earlier/later years. + const start = semesterIndex((period.start ?? period.end)!); + const end = period.end ? semesterIndex(period.end) : current ? Infinity : start; + return start <= (year + 1) * 2 && end >= year * 2 + 1; + } + + const allMembers = [...members, ...pastMembers]; + const recordedYears = allMembers.flatMap((member) => + [member.membership, ...member.roles.map((role) => role.period)].flatMap((period) => + [period?.start, period?.end].flatMap((semester) => + semester ? [Math.floor((semesterIndex(semester) - 1) / 2)] : [] + ) + ) + ); + const boardYears = recordedYears.length + ? Array.from( + { length: Math.max(...recordedYears) - Math.min(...recordedYears) + 1 }, + (_, index) => Math.max(...recordedYears) - index + ) + : []; + let selectedYear = $state('all'); + const filteredMembers = $derived( + allMembers.filter((member) => { + const current = members.includes(member); + return ( + overlapsYear(member.membership, Number(selectedYear), current) || + member.roles.some((role) => overlapsYear(role.period, Number(selectedYear), current)) + ); + }) + ); -{#snippet memberList(list: Member[], current: boolean)} +{#snippet memberList(list: Member[])}