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).
34 lines
1.1 KiB
TypeScript
34 lines
1.1 KiB
TypeScript
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. Gå tilbake til dashbordet og prøv igjen.
|
|
</p>
|
|
</main>
|
|
)
|
|
}
|
|
|
|
return (
|
|
<SessionIndividualLeaderboard
|
|
organizationId={org}
|
|
tournamentId={id}
|
|
sessionId={sessionId}
|
|
tournamentName={tournamentName}
|
|
/>
|
|
)
|
|
}
|