Commit graph

175 commits

Author SHA1 Message Date
544c952cab Kaskader cut-resultatet til alle senere runder (ADR-095)
Overlevere auto-legges til runder etter cut (tee kopiert fra cut-runden),
kuttede spilleres rundedeltakelse fjernes -- med mindre de allerede har
scorer der, da beskyttes dataene av eksisterende cut-sperre i stedet.
Bruker bekreftet eksplisitt: kaskade til ALLE runder, ikke bare neste.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-21 08:04:53 +02:00
dbb589d9f6 Fiks scroll ved automatisk hull-fremgang (samme header-høyde-fiks som #142)
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>
2026-08-20 09:28:06 +02:00
116600cd3c Fiks scroll-til-spillerliste for godt: mål header-høyden live, ikke hardkodet
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>
2026-08-20 08:57:22 +02:00
76b306cb29 Skjul flytende "Registrer score" når spillerlisten er nådd/passert
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>
2026-08-20 08:45:54 +02:00
ee31b2d00b Flytende "Registrer score" når banekartet er utvidet
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>
2026-08-20 08:25:11 +02:00
7426984e67 Fiks "Registrer score"-hoppet: landet bak sticky headeren pga. for lav scroll-mt
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>
2026-08-20 08:12:27 +02:00
c949259c77 Score-fanen: kutt hele main-toppaddingen, forrige reduksjon var for liten til å merkes
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>
2026-08-20 08:00:47 +02:00
a52ff91ff1 Flytt "Mer" inn i navnereden, "Mål et slag" inn i "Mer" -- kun scorekortførers eget kort
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>
2026-08-20 07:48:27 +02:00
f10121beaf Score-fanen: mindre luft under headeren + skjul passerte hindringer i avstandsmåleren
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>
2026-08-20 07:26:29 +02:00
49530ffd40 Tone ned Historikk/Avslutt/Send scorekort bak "Mer" på spillerkortene (Score-fanen)
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>
2026-08-20 06:57:41 +02:00
2e4cb9733c Score-fanen: fjern Deg-badge, begrens historikk til eget kort, fiks kompakt hindrings-ikoner, fjern duplikat manage-knapp
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>
2026-08-20 06:51:19 +02:00
05599aafe6 Fiks skjult score-registrering og doble Score-faner på rundens Score-fane
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.
2026-08-20 05:54:20 +02:00
724983fe03 Fiks utslagsvalg i spillertabellen: select forsvinner aldri lenger
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.
2026-08-19 17:37:26 +02:00
7d5726cf4d Fiks utslag-endring/bulk-tilordning + kommuniser frosset HCP-snapshot tydeligere
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>
2026-08-19 10:27:25 +02:00
95b05ab7f5 Bytt spillerpool-tabellens zebra-stripe fra grønntonet token til nøytral grå
bg-muted er grønntonet i denne paletten (klubbhus-fargene) -- brukeren
presiserte "Lyse GRÅ striper, ikke lyse grønne". Løst med translucent
svart/hvitt-overlegg (bærer ingen fargetone) i stedet for en fargtonet
token, fungerer automatisk riktig i begge temaer.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-19 10:04:36 +02:00
48f238d158 Fiks HCP-komma app-bredt, utdatert deltakertabell, zebra-striper i spillerpool
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>
2026-08-19 09:50:56 +02:00
7632f53702 Rutenett-stil for spillerpool-tabellen, ingen sidescroll på bred skjerm (tillegg til ADR-094)
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>
2026-08-19 09:35:37 +02:00
072638dc37 Gjør spillertabellen mer regneark-aktig, fyll full bredde (tillegg til ADR-094)
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>
2026-08-19 08:37:15 +02:00
5355aba75d Ekte i18n (next-intl) + hjelpeside/FAQ + Spillere-tabellen slått videre sammen (ADR-094)
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>
2026-08-19 07:54:07 +02:00
5daf2a764a Rundedeltakelse som bulk-tabell i Spillere-steget (ADR-093)
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>
2026-08-19 06:21:58 +02:00
1867c65143 Turneringsoppsett som steg-wizard (ADR-092)
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>
2026-08-18 20:18:47 +02:00
396fe40b7c Manuell deltakerstatus (DSQ/RTD/DNF/DNS) + spillerpool-kobling (ADR-091)
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å.
2026-08-18 18:06:49 +02:00
50e0ba902b Forklar Cut sitt "Antall som går videre"-felt med inline hjelpetekst
Bruker spurte hva feltet betyr -- oppførselen (topp N og delt plass) var
allerede riktig, bare uforklart der blikket lander.
2026-08-18 17:38:56 +02:00
0c864f0705 Omspill-tiebreak for vinneren + direkte HCP-retting per deltaker (ADR-090)
'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å.
2026-08-18 17:29:59 +02:00
c5ab6a18f2 Integrer TournamentSettingsCard (V0-eksport) i Oppsett-fanen
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.
2026-08-18 17:00:44 +02:00
300cb8aeaf Tiebreak ved likt resultat: countback eller laveste HCP (ADR-089)
Organisator velger metode fritt i Oppsett, uavhengig for vinner og
resten av feltet. Countback er kaskaderende siste 9->6->3->1 hull i
siste runde. Påvirker aldri Cut-grensen -- strukturelt håndhevet, ikke
bare avtalt ved konvensjon. Migrasjon 085 lagt til, men IKKE anvendt mot
ekte teecup_db ennå -- venter på bekreftelse.
2026-08-18 16:29:10 +02:00
9a9fcc84c0 Utslagsgrupper for individuelle turneringer: hvem spiller med hvem (ADR-088)
Tradisjonelt utslag (samme starthull, staggerte klokkeslett med fast
intervall), manuell gruppesammensetning med et forslag å justere, fast
gruppestørrelse. Fire ekte bugs funnet og fikset før utrulling via egen
scratch-verifisering (FK-korrupsjon, str/datetime-mismatch, tidssone,
React state). Migrasjon 084 lagt til, men IKKE anvendt mot ekte
teecup_db ennå -- venter på bekreftelse.
2026-08-18 15:43:39 +02:00
19c527f834 Cut i individuelle turneringer: topp N og delt plass (ADR-087)
Manuelt anvendt (organisator trykker "Anvend cut"), etter et valgt
rundenummer. Kuttede spillere blokkeres fra scoring i senere runder og
vises i egen seksjon på leaderboardet. Migrasjon 083 lagt til, men IKKE
anvendt mot ekte teecup_db ennå -- venter på bekreftelse.
2026-08-18 15:07:21 +02:00
accf5efd41 Spør organisator om merge/overskriv/dobbel ved e-postløs spillerimport
create_players_bulk matchet kun på e-post -- rader uten e-post ble alltid
satt inn på nytt selv om en identisk spiller allerede fantes (ni ekte
dubletter funnet i produksjon). Bulk-endepunktet tar nå et eksplisitt
match_player_id/duplicate_action per rad; frontend oppdager mulige
duplikater (navnetreff, ingen e-post) og spør organisator eksplisitt før
lagring, i stedet for å gjette.
2026-08-18 14:44:42 +02:00
54795065ef Nøytral "ikke startet"-rad + tee-tid/starthull i leaderboardet
Deltakere som ikke har spilt noe ennå fikk feilaktig totalLabel "E"/"0 p"
(til forveksling likt en ekte, jevn score) og en tallfestet sisteplass.
Vises nå nøytralt: total/posisjon null/None, og runde-nivåets tee-tid/
starthull (hvis satt) i stedet for score-cellen.
2026-08-18 14:23:03 +02:00
985dada178 V0-redesign av StrokePlayLeaderboard integrert
Rent innbytte -- identisk props-kontrakt. Løser bredde/autoscroll-bugene
fra forrige runde mer robust (ekte ResizeObserver-måling i stedet for en
brytningspunkt-antakelse), autostarter rulling for ubetjent
kiosk-visning, og legger til dempet visning for WD/DQ/DNS/NR/CUT-rader.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-18 13:49:12 +02:00
eeb7e9fb29 Leaderboard: fyller full bredde + autoscroll fungerer på storskjerm
StrokePlayLeaderboard var bygget for å skalere opp på lg:-brytningspunkt,
men satt inni en delt max-w-4xl-wrapper som aldri lot den. Samme
brytningspunkt fjernet skrolle-taket helt, så autoscroll-tickeren fikk
aldri noe å bevege for et stort felt. Begge rettet -- ren visuell polish
kommer i en oppfølgende V0-redesign av samme komponent.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-18 13:18:04 +02:00
207750acba Slett en hel turnering, permanent (ADR-086)
Nytt DELETE /orgs/{id}/tournaments/{id}, kun org-eier/admin. Eksplisitt
riktig-rekkefølge-sletting (ikke naiv kaskade) siden to RESTRICT-FK-er
sitter midt inni kaskade-grafen for begge turneringsformater -- verifisert
med fire nye backend-tester mot ekte populerte data. Søppelbøtte-ikon i
begge turnering-headerne med sterk confirm()-tekst.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-18 12:59:37 +02:00
82343e522b Rediger organisasjonens spillerpool når som helst (ADR-085)
Ny /organizations/[id]/players-rute gjenbruker spillerimport-tabellen
(ADR-082) uendret, men med ny orkestrering: laster eksisterende
spillere og lagrer med ekte PATCH per endret felt, ikke det
fyll-tomme-felt-eneste bulk-importendepunktet (som aldri overskriver
et allerede satt navn/HCP -- ubrukelig for reell redigering).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-18 12:09:29 +02:00
0a9320991b Hull-valget overlever nå en refresh (?hole=-URL-parameter)
currentHole levde kun i React-state, seedet fra round.start_hole ved
hver mount -- en refresh mistet valget og hoppet alltid tilbake til
starthullet. Fikset med samme URL-parameter-mønster tab-valget
allerede bruker: ny setHoleAndUrl() holder state og ?hole=N i sync
via router.replace (ikke push, for å unngå å fylle historikken med
ett tilbake-steg per hull).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-18 10:06:48 +02:00
1bc6b0b74d Sortering, side_fairway-fiks, ny poi_type fairway/stone_fence (ADR-084 del 5-6)
Hindringslisten manglet eksplisitt nærmest-spilleren-først-sortering --
fikset. Kryssjekk mot kildedata avdekket 12 kjente side_fairway-feil,
løst via full reimport av Tjømes 194 koordinatpunkter fra et nytt,
standardisert CSV-format (kjørt separat mot ekte teecup_db, ikke del
av denne commiten). To nye hindringstyper (fairway/stone_fence) med
egne ikoner.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-18 08:36:31 +02:00
8a1f1f83fa Road-ikon, ikon-mangel-lista nå tom (ADR-084 del 4)
Siste klassifiserte hindringstype uten eget ikon. Ren frontend-endring
-- road fantes allerede som domeneverdi og ekte data, bare usynlig i
diagrammet inntil nå.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-18 06:59:30 +02:00
eba8616438 Egen poi_type "creek" for bekk, skilt fra water (ADR-084 del 3)
Ny migrasjon 081 legger til creek i det delte course_poi_type-domenet.
Kobler inn brukerens nye bekk-ikon i diagrammet og reklassifiserer de
8 kjente Tjøme-bekk-punktene (hull 2/3/11/12) fra water til creek,
identifisert via samme koordinat-regneark som ga hazard_group-dataen
i forrige runde.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-18 06:53:35 +02:00
f3b3d30e4e Hull-diagram v2: rettelser fra ekte produksjonsbruk (ADR-084 del 2)
Ett-ikon-overlapp-fiks i midtbanen (green-ikonet manglet reservert
plass), bak-green-rendering (hindringer bak selve greenen vises nå over
green-ikonet i stedet for klemt inn i vanlig-sonen), fem nye
hindringsikoner, og en omskrevet liste (én rad per hindring, med
bane/posisjon-info).

Setter i tillegg ekte hazard_group-verdier på Tjømes koordinatdata,
utledet fra klubbens eget koordinat-regneark (som viste seg å ha en
egen gruppenummer-kolonne) i stedet for en heuristikk -- løser
definitivt de flerbunker-hullene forrige runde bevisst lot stå
uklassifisert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-18 06:43:57 +02:00
84f11e1a45 Hull-diagram v2: kategoriske venstre/senter/høyre-akser (ADR-084)
Erstatter ADR-083 sin kontinuerlige crossMeters-forskyvning, som ga for
liten synlig venstre/høyre-forskjell på ekte banedata (Tjøme hull 18).
Baner velges nå kategorisk via side_fairway; green/tee/spiller alltid
på senterakse. Ny hazard_group-kolonne (migrasjon 080, ikke rullet ut
mot ekte DB ennå) lar to punkter eksplisitt pares til én carry-hindring
(forkant+bakkant) uten å risikere å slå sammen to atskilte hindringer
på samme side.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-17 23:36:28 +02:00
dabf3478ec V0-integrering: polert hull-diagram
Integrerer V0-eksporten for hole-diagram-view.tsx. Traff props-
kontrakten i prompten eksakt -- ingen integreringsjustering nødvendig,
tsc rent på første forsøk. Egne tillegg fra V0 utover prompten: full
aria-label-oppsummering av hele diagrammet for skjermlesere, lett
kollisjons-unngåelse for nære hindringsetiketter.

Re-verifisert i scratch mot samme kjente syntetiske geometri som den
midlertidige hånd-kodede versjonen -- identiske tall/posisjoner.
Lys+mørk bekreftet.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-17 17:19:26 +02:00
6f79df6eab Visuelt hull-diagram for rangefinderen (tee nederst, green øverst)
Fikser to ting rapportert fra ekte produksjonsskjermbilde: (1) kun
nærmeste hindring ble vist -- target-distance.tsx viser nå ALLE
hindringer, sortert nærmest først, uavhengig av om et diagram kan
tegnes. (2) Nytt hull-diagram (hole-diagram-view.tsx) plasserer
hindringer og spiller i 2D langs en fast tee->green-akse, tee nederst/
green øverst konsistent uansett gangretning.

Ny geometri-modul frontend/lib/hole-geometry.ts (projectOntoAxis,
bygget på eksisterende haversineMeters/bearingDegrees) med 10
enhetstester som beviser matematikken riktig før noe visuelt ble
bygget. Verifisert i scratch mot presist kjente syntetiske koordinater
-- alle tall og posisjoner stemte eksakt med håndregnede fasitverdier.

Midlertidig hånd-kodet visning, venter på V0-eksport for den polerte
versjonen (samme mønster som FlagPlantSheet/PlayerImportPanel). Ingen
migrasjon, ingen backend-endring.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-17 16:46:50 +02:00
ced4bf869b V0-integrering: polert spillerimport-tabell, stor skjerm først
Integrerer V0-eksporten (tee-cup-login-screen.zip) for spillerimport-
panelet. Splittet i player-import-view.tsx (V0, ren kontrollert visning)
+ player-import-panel.tsx (orkestrering, uendret ekstern kontrakt) --
samme mønster som FlagPlantSheet.

Fant og fikset en reell integreringsfeil i scratch: V0s kjønn-nedtrekk
bruker female/male/other, rå CSV-tekst ("m"/"f") ble kopiert inn
uendret og ville stille mistet data ved lagring -- fikset med egen
verdinormalisering ved kolonnetilknytningen. æøå-kolonnegjetting-
begrensningen fra forrige commit fikset samtidig.

Ny STÅENDE regel lagt til CLAUDE.md underveis: turneringsoppsett
designes stor skjerm først (organisatoren sitter foran en PC), ikke
mobil-først -- V0-prompten oppdatert og kjørt på nytt med dette kravet
før eksporten som integreres her.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-17 15:51:31 +02:00
00809d6817 Massimport av spillere til turneringer (CSV) + redigerbar spillertabell
Ny POST /orgs/{id}/players/bulk (samme e-post-match-dedup-mønster som
selvregistreringens ADR-017 Beslutning B, utvidet til alle felt).
CSV parses klient-side (papaparse), enkel kolonnegjetting, redigerbar
forhåndsvisning før lagring. Dekker både lagturneringer (lagtildeling)
og individuelle turneringer (klassetilknytning) i samme flyt -- begge
steg samlet (org-pool + turneringspåmelding).

Midlertidig hånd-kodet UI (player-import-panel.tsx) bygget for å bevise
hele kjeden ende-til-ende -- venter på V0-eksport for den polerte
visningen før samlet utrulling, samme rekkefølge som FlagPlantSheet.

5 nye backend-tester (111/111 totalt), tsc rent, 45/45 vitest, full
scratch-verifisert i begge turneringsformater.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-17 14:53:55 +02:00
93af7c5bef Rangefinder-koordinater for offisielle (TeeOff-koblede) baner
Rangefinder-funksjonalitet fantes til nå kun for GolfAPI-importerte
personlige baner. Offisielle teeoff-koblede baner (org-turneringer OG
frittstående runder spilt på en ekte teeoff-bane) hadde aldri noen
koordinatkilde. Ny migrasjon 079: delte domener (course_poi_type/
location/side) for å unngå duplisert CHECK-vedlikehold på tvers av
tabeller, ny global tabell teeoff_course_coordinate.

Ny delt modul app/target_points.py + resolve_match_course_key() i
hole_history.py (tredje søster til de to eksisterende bane-bro-
funksjonene) -- alle tre kallesteder (frittstående runder, individuell
org-turnering, lag-matchplay) bruker nå samme CourseKey-abstraksjon.
rounds.py sitt eksisterende endepunkt refaktorert til samme mønster --
sideeffekt: frittstående runder på en ekte teeoff-bane får nå også
rangefinder (var alltid tom liste før).

Ny skrive-vei i courses.py (PUT/GET .../coordinates) -- generell,
gjenbrukbar mulighet for å legge inn koordinater på enhver offisiell
bane, ikke en engangsfiks. HoleTargetDistance generalisert (roundId ->
baseUrl) og wiret inn i begge org-turnering-scoringsflytene.

11 nye tester (106/106 backend totalt), full scratch-verifisert
ende-til-ende i nettleser i alle tre flyter inkl. lys/mørk og
selvskjuling, regresjonssjekk av eksisterende GolfAPI-rangefinder
bekreftet uendret oppførsel.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-17 12:06:47 +02:00
7d28727cb7 Kontosammenslåing, selvbetjent (ADR-080, "Del 2" av flere e-postadresser)
Selvbetjent sammenslåing av to TeeCup-kontoer: keeper (initiativtaker)
ber om sammenslåing, bekreftelseslenke sendt til taperens e-post beviser
eierskap, taperens data (org-medlemskap/spillerkoblinger/runder/venner)
flyttes over og taperens konto slettes. Ny migrasjon 077 (account_merge_
token, ikke kjørt mot ekte teecup_db ennå), ny app/account_merge.py
(N+1-transaksjoner per RLS-grensen, fullt konfliktkart), nye endepunkter
i app/routers/account_merge.py, ny frontend-seksjon i kontoinnstillinger
+ egen bekreftelsesside.

Fant og fikset en reell RLS-relatert bug via testsuiten før produksjon:
seks RLS-beskyttede tabeller var feilaktig plassert i den globale
"trygt å re-peke"-løkken, forårsaket et krasj pga. en Postgres GUC-kvirk
på pooled forbindelser. Se ADR-080 for full begrunnelse.

12 nye tester (95/95 backend totalt), full scratch-verifisert
ende-til-ende inkl. lys/mørk, ekte teecup_db urørt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-17 07:56:41 +02:00
9f2711e4b3 Personlig hull-historikk ut av slagvinduet + full historikk med grafer (ADR-079)
Historikk-panelet flyttet ut av selve slagvinduet/-arket i begge flyter:
inn i PlayerHoleCards-kortet (frittstående runder), som nytt "overview"-
steg med auto-hopp når tomt (org-turneringer). Klikk åpner nå en ny delt
full-historikk-skjerm (hole-history-detail.tsx) med aggregerte tall og en
score-fordeling som fargede stolper -- samme CategoryBar-mønster som
round-stats.tsx, ingen ny graf-avhengighet. Ingen backend-endring.

tsc + 45/45 vitest, scratch-verifisert i begge flyter inkl. kombinert
historikk på tvers av runde-/turneringstyper og auto-hopp for hull uten
historikk (lys+mørk). Rullet ut.

Med dette er alle tre forbedringene i score-registreringen (ADR-077/078/079)
fullført.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-16 10:21:48 +02:00
b292401fe4 Chip/Bunker/Straffeslag/Anywayslag som egen skjerm (ADR-078)
Splittet ScoringWizard sitt "details"-steg i "direction"/"holeDetails",
og bygget om HoleStatsSheet (org-turneringer) fra én lang skjerm til
tilsvarende steg-flyt -- samme opplevelse i begge scoringsflyter, uten å
røre HoleStatsSheet sin egen (bevisst annerledes) lagringsmodell.

Visuell polering via V0: de fire tellerne fikk et 2x2-rutenett av
flis-kort i stedet for en 1-kolonne-stabel. Stepper-komponenten er delt
mellom begge flyter, så endringen gjelder automatisk begge steder.

tsc + 45/45 vitest, scratch-verifisert i begge flyter (lys+mørk). Rullet ut.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-16 09:53:16 +02:00
c498bfca8f Tilbake-navigering til en tidligere spiller i scoringsveiviseren (ADR-077)
Kontekst-raden i ScoringWizard (alle spillerne, aktiv fremhevet) var
bevisst ikke-interaktiv ved bygging. Trygt å gjøre interaktiv nå: hvert
felt lagres allerede for seg med en gang (PATCH per felt), så bytte
spiller midt i et steg gir ingen datatap. Løser at man måtte fullføre
hele samlebånd-flyten for å rette opp en tidligere spillers feil.

tsc + 45/45 vitest, scratch-verifisert i nettleser (lys+mørk). Rullet ut.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-16 08:19:46 +02:00
f740814833 Order of Merit: offentlig/delt visning (ADR-076)
Siste av de tre gjenstående OOM-punktene fra ADR-043 (lag-OOM ADR-074,
eclectic på tvers av turneringer ADR-075, offentlig visning her).

Migrasjon 076: SECURITY DEFINER-bro public_order_of_merit_by_id, samme
anti-enumerering som public_org_by_slug/public_tournament_by_code. Ny
/public/order-of-merits/{id}-endepunkt (gjenbruker den eksisterende
leaderboard-beregningen direkte). Ny uautentisert frontend-side
modellert på public-club.tsx, "Del offentlig lenke" i innstillinger.

83/83 backend-tester, 45/45 vitest, scratch-verifisert i egen inkognito-
nettleserkontekst (ingen session-cookie). Migrasjon vist og bekreftet
før kjøring mot ekte teecup_db. Rullet ut.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-15 21:20:23 +02:00