ScoreTab viste hele turneringsfeltet i stedet for brukerens egen
utslagsgruppe. Defaulter nå til egen flight med "vis hele feltet"-
veksling og fallback når gruppe mangler. is_self beregnes server-side
(aldri rå user_id). Lukker et reelt RLS-hull på tournament_round_group
funnet underveis (migrasjon 089).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Begge byggene (dagens tidligere print-feature/valideringsfiks-bygg, og
dagens siste bygg med offentlig individuell "Følg live") bekreftet friske
og verifisert mot ekte teecup.golf. Flagger én reell gjenstående sak:
selve PDF-nedlastingsknappene er ikke klikk-gjennom-testet ennå.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Fullfører ADR-098. Ny components/public-individual-live.tsx (V0-bygget,
presentasjonslaget uendret fra eksporten) koblet til de ekte endepunktene
fra forrige commit. Rettet en reell modellmismatch underveis: V0-mock-en
modellerte hver runde som sitt eget separate leaderboard, den ekte
backend-beregningen er ett samlet, kumulativt turnering-leaderboard --
rundevelgeren styrer nå kun hvilken rundes hull-for-hull som lastes.
Ny offentlig GET .../rounds/{round_id}/participants/{tournament_participant_id}
/holes for hull-for-hull-utvidelsen (egen rute, ikke gjenbruk av
frittstående-runders tilsvarende -- ulik datamodell).
app/t/[id]/live/page.tsx avgjør nå format SERVER-side før noe rendres,
unngår klient-side-feilklassen fra forrige commit helt for denne siden.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Org-individuelle turneringer manglet en fungerende offentlig tilskuerside
helt (bevisst utsatt i FEATURE_BACKLOG.md 2026-08-14, "hvis/når etterspurt"
-- nå etterspurt). Denne runden bygger backend-grunnmuren:
- PublicTournamentInfo += format_type (manglet, landingssiden kunne ikke
skille format offentlig).
- Ny GET /public/tournaments/{id}/rounds -- rundeliste med utledet status
(ikke startet/pågår/fullført).
- Ny GET /public/tournaments/{id}/individual-leaderboard -- gjenbruker
_compute_individual_standings uendret, fjerner kun player_id, inkluderer
HCP (bruker bekreftet eksplisitt).
- Sanntid: broadcast_live_update() koblet inn i _recompute_round_score,
gjenbruker samme WebSocket-kanal Cup-siden allerede bruker (ADR-027-
mønsteret), ingen ny WS-infrastruktur.
- public-tournament.tsx sin "Program"-seksjon viser nå rundeliste for
individuelle turneringer i stedet for en alltid-tom Cup-økt-liste.
Selve "Følg live"-sidens UI (V0) og /t/[id]/live sin format-forgrening
gjenstår -- egen commit når V0-eksporten er klar.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Alle 4 runder peker nå på riktig offisiell bane, 51 spilleres utslag
korrekt flyttet, tre duplikat-baner slettet, lekket bane-mal rettet.
Gitignorer backups/ (fulle databasedumper skal aldri committes).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Rotårsak for "banen er allerede importert"-forvirringen rundt Tjøme-baner:
teeoffs egen hull-data hadde en duplisert hcp-indeks (13 to ganger, 14
manglet). Manglende validering lot dette komme gjennom og feile stille på
en UNIQUE-constraint, oversatt til den misvisende DUPLICATE-meldingen.
Legger til eksplisitt 1-18-validering før lagring, med en ærlig feilkode/
-melding, i både teeoff- og GolfAPI-import-stiene og alle fire frontend-
kallstedene.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Bruker aksepterte eksplisitt den svakere verifiseringen på denne, med
plan om å reversere/justere om nødvendig.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
scrollToHolePanel() brukte samme flawed scroll-mt-28-mønster som
scrollToPlayerList() hadde i #142 -- byttet til samme getHeaderHeight()-
baserte manuelle scroll. Denne kalles fra BÅDE manuell Forrige/Neste OG
automatisk hull-fremgang etter siste spillers siste steg. Kunne IKKE
klikkes gjennom og verifiseres presist denne runden -- scratch-
nettleserøkten hard-reloadet uforklarlig på ethvert router.replace-kall,
også mot den ekte /my-rounds/[id]-ruta. Notert ærlig som et
verifiseringsgap i CHANGELOG.md #143, ikke skjult. Ikke rullet ut ennå.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Presis scratch-måling avdekket at den hardkodede 112px-antagelsen (arvet
fra scroll-mt-28) var feil -- ekte headerhøyde var 141.5px for en runde
med bane+utslag+dato+klokkeslett samtidig, siden headeren pakkes til
flere linjer avhengig av innhold. Ny getHeaderHeight() måler live i
stedet for å gjette. scrollToPlayerList() erstatter scrollIntoView med
manuell beregning; playerListReached bruker samme terskel (delt
SCROLL_GAP_PX-konstant) -- måtte rettes en gang til underveis da de to
brukte ulike terskler. Se CHANGELOG.md #142. Ikke rullet ut ennå.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Ny playerListReached-tilstand skjuler den flytende knappen (og dens
spacer) fra #140 så snart spillerlisten når headerens høyde -- forblir
skjult resten av veien nedover, dukker opp igjen kun ved scroll tilbake
opp forbi listen. Første forsøk med IntersectionObserver+rootMargin var
feil (fyrer ikke på interne terskler mens allerede overlappende) -- byttet
til en scroll/resize-lytter med direkte getBoundingClientRect-sjekk. Se
CHANGELOG.md #141. Ikke rullet ut ennå.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
V0-eksport integrert: RegisterScoreButton gjenbrukt i normal flyt
(kollapset) og som fixed bottom-pinnet knapp (utvidet), med gradient-
scrim, skygge, safe-area-inset-bottom, og aria-hidden/pointer-events-none
korrekt håndtert når skjult. Se CHANGELOG.md #140. Ikke rullet ut ennå.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
playerListRef brukte scroll-mt-4, mens holePanelRef (samme sticky-header-
problem, hull-til-hull-navigasjon) allerede riktig bruker scroll-mt-28.
Samme verdi nå begge steder. Se CHANGELOG.md #139. Ikke rullet ut ennå.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Bruker viste et nytt skjermbilde fra live etter forrige fiks -- ingen
synlig forskjell. pt-3/pt-4 kuttet bare 12px av en 44-52px kombinert
avstand, for lite til å merkes på en full mobilskjerm. main sin
toppadding er nå pt-0 -- eneste luft mot headeren er nå seksjonenes egne
mt-5/mb-5, samme rytme som resten av siden. Se CHANGELOG.md #136.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
V0-eksport integrert: PlayerCardMore utvidet med scoreButton/measureShot-
props, navnereden er nå en ikke-knapp wrapper med score-knappen og en
kompakt "Mer"-pille som søsken (unngår button-i-button). "Mål et slag" er
ikke lenger en egen rad -- ligger nå i "Mer"-panelet, og er (som
historikk) begrenset til player.isSelf; var tidligere synlig for alle
spilleres kort. Se CHANGELOG.md #138. Ikke rullet ut ennå.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
To brukerpåpekte funn: (1) unødvendig stort tomrom mellom RoundHeader og
hull-navigatoren når ingen varsel-banner vises -- main sin toppadding
stablet seg oppå seksjonens egen mt-5 i stedet for å erstatte den.
(2) hindringer skal kun vises når de fortsatt ligger mellom spiller og
green -- passerte hindringer var unødvendig støy. Se CHANGELOG.md
#136/#137 for detalj og verifisering. Punkt 2 ikke rullet ut ennå.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
V0-eksport (etter Claude-skrevet prompt) integrert som ny PlayerCardMore-
wrapper -- eier kun vis/skjul, de ekte HoleHistoryPanel/
ParticipantCompletionActions sendes inn uendret. Kun PlayerHoleCards
(Score-fanen) berørt, ikke PlayerList (administrasjonsvisningen). Se
CHANGELOG.md #135 for full detalj og verifisering. Ikke rullet ut ennå.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Fire brukerpåpekte oppfølgingsfunn rett etter forrige runde (#133):
Deg-badgen på spillerkort er unødvendig, historikk-panelet viste seg
feilaktig på medspilleres kort, kompakt avstandsmåler falt tilbake til
en generisk varseltrekant i stedet for ekte hindrings-ikoner, og den
nye Spillere-og-runde-vekslen duplikerte RoundHeader sin Administrer-
knapp. Se CHANGELOG.md #134 for full detalj og verifisering.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Avstandsmåleren fylte hele mobilskjermen uten å antyde at score-
registrering fantes lenger ned (funnet via brukers skjermbilde). Viser nå
kompakt som standard med en "Vis banekart"-utvidelse og en alltid synlig
"Registrer score"-snarvei. Den separate, duplikate "Score"-pillefanen inni
round-detail.tsx (visuelt identisk med RoundHeader sin egen Score/
Scorekort/Leaderboard-rad) er erstattet med én tydelig annerledes
veksle-knapp -- fikser samtidig et reelt navigasjonshull der det ikke
fantes noen vei tilbake til Score fra en ekstern "?tab=manage"-lenke.
Funnet via brukers skjermopptak av forsøk på å endre én spillers
utslag -- en ikke-tilordnet rad viste kun en død strek, ingen
interaktiv kontroll, og et feilklikk på den tette avkrysningsboksen
satt brukeren fast. Utslagsvelgeren vises nå alltid; å velge et
utslag tilordner raden automatisk. Boks og select har også fått
tydelig mer avstand for å redusere feilklikk.
To reelle bugs i rundedeltakelse: enkelt-rad utslagsendring sendte feil
ID-type til backend (traff alltid 404, stille), og "Velg alle" hoppet
over allerede-tilordnede deltakere slik at et valgt standardutslag
aldri slo inn for dem. Begge rettet. I tillegg: ny hjelpetekst i
Spillere-steget og et nytt FAQ-spørsmål forklarer at turnering-HCP er
en bevisst frosset kopi av spillerpoolen (ADR-090), ikke en bug.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
HCP: type="number" blokkerte komma-tegnet i nettleseren før JS-parsingen
noensinne så det; byttet til text+inputMode=decimal og lagt til manglende
.replace(",",".") i tre lagre-stier. Deltakertabell: "Rediger i
spillerpoolen" er en full sidenavigasjon, bfcache kunne gjenopprette
turneringssiden i utdatert tilstand -- løst med stille bakgrunns-refresh
ved visibilitychange/pageshow. Spillerpool: zebra-striper lagt tilbake
oppå rutenett-stilen fra forrige runde.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
EditTable (player-import-view.tsx) får samme grid-stil som
spillertabellen, med individuell kolonnebredde per felt slik at alle
13 spillerpool-felt får plass uten sidescroll. mode.kind==="roster"-
grenen bevart ved manuell fletting siden V0-eksporten var en eldre
snapshot uten den varianten.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Bruker sammenlignet med et regneark og påpekte unødvendig sidescroll
på bred skjerm -- tettet opp med rutenett-stil og en colgroup som lar
rundekolonnene fylle resten av bredden. Samme props-kontrakt.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Grunnmur for oversettelse (cookie-basert, ingen URL-endring), ny
/hjelp-side med oversikt+FAQ på norsk og engelsk, og Deltakere+
Rundedeltakelse slått sammen til én bred tabell i Spillere-steget.
Resten av appens ~2200 strenger og 479 backend-feilkoder er bevisst
utsatt til senere, avgrensede runder -- se FEATURE_BACKLOG.md.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Oppfølger til ADR-092: fant og fikset misvisende "alle er gruppert"-
tekst i Utslagsgrupper-panelet (viste seg egentlig å bety "ingen
deltakere i runden ennå"). Egentlig årsak: å tilordne en deltaker til
en runde var kun mulig ett om gangen, gjemt bak et rundekort. Ny
bulk-tabell i "Spillere" (V0-generert) med sjekkbokser per runde,
kjønn/alder/utslagssted redigerbart samme sted. Nytt PATCH-endepunkt
for å endre utslagssted uten å miste gruppemedlemskap.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Oppsett-fanen var én lang stablet side med alle kort etter hverandre.
Omgjort til 6 klikkbare steg med fri navigasjon, strukturelt inspirert
av Golf GameBooks steg-navigasjon (ikke visuelt -- egne clubhouse-
tokens). Grupper og startliste er det eneste genuint nye steget,
løfter Utslagsgrupper ut av å være gjemt inni hver enkelt runde.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Ny status-kolonne på tournament_participant, overstyrer leaderboardets
total og blokkerer score i alle runder. Ny direkte lenke fra
turneringens Deltakere-liste til riktig rad i org-spillerpoolen.
Migrasjon 087 lagt til, men IKKE anvendt mot ekte teecup_db ennå.
'playoff' som ny tiebreak_winner_method-verdi -- rangeres som 'none'
(appen kan ikke avgjøre et omspill selv), men regelen vises proaktivt i
Oppsett og som banner på leaderboardet. HCP: la til handicap_index_
snapshot i TournamentParticipantUpdate + inline redigering i
Deltakere-lista, uten å røre allerede frosne runde-verdier. Migrasjon
086 lagt til, men IKKE anvendt mot ekte teecup_db ennå.
Navn/datoer/synlighet/beskrivelse/påmelding -- rent innbytte mot
props-kontrakten. Fant og fikset samme tidssone-bugklasse som ADR-088
proaktivt denne gangen (mønstergjenkjenning) før den nådde en nettleser.
name/start_date/end_date manglet helt fra TournamentUpdate. Påmeldings-/
synlighetsfeltene var allerede fullt fungerende på backend (ekte
selvregistrerings-logikk), men uten UI noe sted -- V0-prompt skrevet for
en ny TournamentSettingsCard, ikke bygget ennå.