teecup/frontend/app/tournaments/[id]/sessions/[sessionId]/individual-leaderboard/page.tsx

35 lines
1.1 KiB
TypeScript
Raw Normal View History

Update Todos Undersøk kode-kontekst for alle tre byggeoppgavene Avklar åpne designspørsmål med bruker Bygg: flytte spiller mellom lag (backend + frontend) Bygg: individuell rangering i turnering (backend + frontend) Bygg: midlertidige spillere + etter-runde-e-post (backend + frontend) Typesjekket produksjonsbuild av frontend Scratch-verifiser alt tre + full regresjon Browser-verifiser alt tre (Chrome DevTools) Oppdater CLAUDE.md/FEATURE_BACKLOG.md/ARCHITECTURE_DECISIONS.md Rull ut mot ekte systemer (med bekreftelse) Alle tre er live. Oppsummert: Flytte spiller mellom lag — ny "Flytt til {annet lag}"-handling i lag-oversikten, atomisk, blokkert hvis spilleren allerede er lagt til i en match. Individuell rangering per økt — ny brutto/netto/poeng-rangering for singles/fourball-slagspill-økter, ved siden av det eksisterende lag-poeng-leaderboardet, lenket fra blind draw-skjermen. Midlertidige spillere: etter-runde-e-post — ny knapp som sender scorekort + ekte innloggingslenke til spillere uten konto, med dobbel-utsendingssperre. Alt verifisert grundig: 54/54 nye scratch-sjekker + full regresjon (5+28+19 eksisterende sjekker), typesjekket produksjonsbuild, og en fullstendig gjennomgang i ekte nettleser (Chrome DevTools) av alle tre — ingen konsollfeil. Migrasjon 034 kjørt mot ekte database, begge containere redeployet, teeoff.no upåvirket. Samtidig rettet jeg opp noen steder der FEATURE_BACKLOG.md/ARCHITECTURE_DECISIONS.md hadde blitt hengende etter den faktiske, allerede leverte tilstanden (ADR-039-utrulling, PWA-offline-browsertesting).
2026-07-28 20:56:08 +02:00
import { SessionIndividualLeaderboard } from "@/components/session-individual-leaderboard"
export default async function SessionIndividualLeaderboardPage({
params,
searchParams,
}: {
params: Promise<{ id: string; sessionId: string }>
searchParams: Promise<{ org?: string; name?: string }>
}) {
const { id, sessionId } = await params
const { org, name } = await searchParams
const tournamentName = name?.trim() || "Turnering"
// Samme grunn som de andre turnering-undersidene: API-et krever
// organization_id på alle økt-/scoring-endepunkter (RLS, se ADR-001/003).
if (!org) {
return (
<main className="flex min-h-[100dvh] flex-col items-center justify-center gap-2 bg-background px-5 text-center">
<p className="text-sm font-medium text-destructive">
Mangler organisasjon i lenken. tilbake til dashbordet og prøv igjen.
</p>
</main>
)
}
return (
<SessionIndividualLeaderboard
organizationId={org}
tournamentId={id}
sessionId={sessionId}
tournamentName={tournamentName}
/>
)
}