diff --git a/cases.md b/cases.md new file mode 100644 index 0000000..2d38683 --- /dev/null +++ b/cases.md @@ -0,0 +1,5 @@ +# Cases for players or something +- player who didnt show up +- player draws +- events with multiple attempts (best / average) +- how actual points are decided diff --git a/src/routes/api/eventResults/+server.ts b/src/routes/api/eventResults/+server.ts new file mode 100644 index 0000000..73a2e0a --- /dev/null +++ b/src/routes/api/eventResults/+server.ts @@ -0,0 +1,12 @@ +export async function POST({ request }: any) { + // Decode body + let responseBody = await request.json(); + + // If there is no request then dont respond + if (!responseBody) { + return new Response('nuh uh'); + } else { + console.log(JSON.stringify(responseBody)); + return new Response('ok'); + } +} diff --git a/src/routes/event/scoring/[eventId]/+page.svelte b/src/routes/event/scoring/[eventId]/+page.svelte index 6b7a8f4..bc8983b 100644 --- a/src/routes/event/scoring/[eventId]/+page.svelte +++ b/src/routes/event/scoring/[eventId]/+page.svelte @@ -52,35 +52,62 @@ let pendingScores = $state>({}); let committedScores = $state>({}); - function average(scores: (number | null)[]): number { + let hydrated = $state(false); + + $effect(() => { + if (!hydrated || !eventId) return; + localStorage.setItem( + `scores-${eventId}`, + JSON.stringify({ + pendingScores: $state.snapshot(pendingScores), + committedScores: $state.snapshot(committedScores) + }) + ); + }); + + $effect(() => { + if (!hydrated || !eventId) return; + localStorage.setItem(`sortByScore-${eventId}`, String(sortByScore)); + }); + + function average(scores: (number | null)[], fallback = Infinity): number { const valid = scores.filter((s): s is number => s !== null); - if (valid.length === 0) return Infinity; + if (valid.length === 0) return fallback; return valid.reduce((a, b) => a + b, 0) / valid.length; } - function best(scores: (number | null)[]): number { + function best(scores: (number | null)[], fallback = Infinity): number { const valid = scores.filter((s): s is number => s !== null); - if (valid.length === 0) return Infinity; + if (valid.length === 0) return fallback; return Math.min(...valid); } + function getPoints(placement: number): number { + return event?.scoringPreset?.find((s: any) => s.placement === placement)?.points ?? 0; + } + + let lowerIsBetter = $derived(event?.resultPresets[0]?.lowerIsBetter === 1); + let displayBrackets = $derived( brackets.map((bracket) => ({ ...bracket, items: sortByScore ? [...bracket.items].sort((a, b) => { + const fallback = lowerIsBetter ? Infinity : -Infinity; const sa = useAverage - ? average(committedScores[a.id] ?? []) - : best(committedScores[a.id] ?? []); + ? average(committedScores[a.id] ?? [], fallback) + : best(committedScores[a.id] ?? [], fallback); const sb = useAverage - ? average(committedScores[b.id] ?? []) - : best(committedScores[b.id] ?? []); - return sa - sb; + ? average(committedScores[b.id] ?? [], fallback) + : best(committedScores[b.id] ?? [], fallback); + return lowerIsBetter ? sa - sb : sb - sa; }) : bracket.items })) ); + let highestPlayer: number = 0; + onMount(async () => { const response = await fetch('/api/registeredEvents', { method: 'POST', @@ -94,6 +121,27 @@ ...b, items: [...b.items] })); + + for (let bracket in brackets) { + for (let player in brackets[bracket].items) { + if (parseInt(player) > highestPlayer) { + highestPlayer = parseInt(player); + console.log(highestPlayer, 'high'); + } + } + } + + const savedScores = localStorage.getItem(`scores-${eventId}`); + if (savedScores) { + const parsed = JSON.parse(savedScores); + pendingScores = parsed.pendingScores ?? {}; + committedScores = parsed.committedScores ?? {}; + } + + const savedSort = localStorage.getItem(`sortByScore-${eventId}`); + if (savedSort !== null) sortByScore = savedSort === 'true'; + + hydrated = true; loading = false; eventEndpoint = new EventSource('/api/registeredEvents'); @@ -138,11 +186,23 @@ eventId, brackets: brackets.map((b) => ({ name: b.name, - players: b.items.map((p, i) => ({ ...p, position: i + 1 })) + players: b.items.map((p, i) => ({ + ...p, + position: i + 1, + points: getPoints(i + 1), + scores: committedScores[p.id] ?? [], + average: average(committedScores[p.id] ?? []) + })) })) }) }); - submitStatus = res.ok ? 'done' : 'error'; + if (res.ok) { + localStorage.removeItem(`scores-${eventId}`); + localStorage.removeItem(`sortByScore-${eventId}`); + submitStatus = 'done'; + } else { + submitStatus = 'error'; + } } catch { submitStatus = 'error'; } @@ -150,10 +210,10 @@ {#if loading} -
loading
+
Loading Player Data
{:else}
-
+
{event.name} - {event.division} - scoring
@@ -163,10 +223,31 @@
- - +
+
some
+ {#each Array.from({ length: highestPlayer + 1 }, (_, i) => i) as placement} +
+
+ {ordinal(placement + 1)} + {event.scoringPreset[placement] + ? event.scoringPreset[placement].points + : 0} + pts +
+
+ {/each} +
{#each displayBrackets as bracket, bi} -
+
{bracket.name}