Commit graph

37 commits

Author SHA1 Message Date
bcb712810f Hastecommit
All checks were successful
Backend-tester / test (push) Successful in 46s
2026-08-24 09:55:04 +02:00
7614c4b83a Legg til Jakter Jesper som visningsmodus for netto-scoring (ADR-106)
Bruker beskrev en turneringsform (start på -spillehandicap, brutto mot
par løpende, lavest sluttsum vinner) og spurte om dette egentlig var en
presentasjonsform fremfor en ny turneringsform. Riktig observasjon:
sluttsummen er matematisk identisk med stroke_net sitt netto-til-par.

Ny tournament.net_display_style ('standard'/'hunt', migrasjon 092), kun
gyldig sammen med scoring_method='stroke_net'. _attach_stroke_play_columns
fikk én stroke_val()-hjelper som bytter net_total (gradvis slagindeks-
basert) med gross_total - playing_handicap (hele handicapet trukket fra
med én gang) når hunt er aktiv -- ingen ny motorfunksjon. Ny, generelt
tilgjengelig tiebreak-verdi lowest_playing_hcp.

5 nye pytest-tester + full regresjon (198/198), tsc rent, full-stack
scratch-verifisert (hånd-utregnede tall matchet eksakt, offentlig
følg-live + utskrift arvet visningen uten kodeendring der).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-24 08:46:35 +02:00
b45aa5bbe4 Erstatt flytende Registrer score-banner med kompakt hjørne-FAB (V0)
Fullbredde-bunnbanneret hadde tre runder med bugs i skjul/vis-ved-
scroll-mekanismen (playerListReached), sist når det ble hengende synlig
over Kommentarer. Bruker avviste en fjerde punktfiks og ba i stedet om
en redesign: en liten, hjørne-forankret FAB som er liten nok til at den
ikke trenger å skjule seg igjen for å unngå å dekke innhold.

Ny frontend/components/compact-score-fab.tsx (V0-eksport, integrert
uendret). round-detail.tsx: playerListReached-mekanismen fjernet i sin
helhet (state + effekt + den sårbare mapExpanded-vakten), erstattet med
CompactScoreFab drevet av eksisterende inFlowButtonVisible. Netto -75
linjer.

Verifisert i full-stack scratch (3 spillere + 6 kommentarer): FAB
forblir synlig og ikke-obstruktiv helt ned til og forbi Kommentarer,
lys+mørk modus, 48px trykkflate. tsc rent.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-23 08:34:39 +02:00
0d690e84d8 Revert "Fiks flytende Registrer score-knapp som ble hengende over Kommentarer"
This reverts commit 3b90061c73.
2026-08-23 08:03:35 +02:00
3b90061c73 Fiks flytende Registrer score-knapp som ble hengende over Kommentarer
playerListReached-effekten i round-detail.tsx hadde en stale
"if (!mapExpanded) return"-vakt igjen fra før knappens synlighets-
trigger ble frikoblet fra mapExpanded (se CHANGELOG #146). Siden
banekartet er kollapset som standard, kjørte effekten aldri for de
fleste brukere -- playerListReached ble værende false for alltid, og
knappen sluttet aldri å vises igjen etter å ha dukket opp forbi
side-flyt-knappen, inkl. over Kommentarer-seksjonen lengre ned.

Fjernet vakten, effekten måler nå alltid. Verifisert i full-stack
scratch med samme scenario som brukerens skjermdump (3 spillere + 6
kommentarer), aria-hidden bekreftet korrekt gjennom hele scrollet.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-23 07:54:11 +02:00
c5b5f441da Bland org-turnering-runder inn i personlig statistikk-dashboard (ADR-105)
Punkt 3 i scoring-paritet-gap-listen: GET /rounds/stats/summary leste
tidligere kun frittstående runder. Ny _fetch_tournament_stats_rows()
speiler hole_history.py sin N+1-per-org-henting og blander resultatet
inn i samme by_round/stat_level_by_round/played_at_by_round-dict-er som
personlige rader -- ingen endring i selve aggregeringslogikken
(_resolve_stats_window/_build_round_series/_summarize_rounds er allerede
generiske). Kilde-antall vises separat i UI (samme presedens som
hole_history.py sin times_personal/times_tournament).

5 nye pytest-tester + full regresjon (193/193), tsc rent, full-stack
scratch-verifisert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-22 17:15:05 +02:00
dd974678fa Skjul HCP på offentlig leaderboard for rene bruttoslagspill-turneringer
Bruker: "når det er brutto som er hovedkonkurransen trenger vi ikke se
hcp i leaderboarden" -- HCP er kun meningsfullt der den faktisk brukes
til slagfordeling (netto/stableford/Københavner/BBB), ikke ren brutto/
eclectic-gross. PublicTournamentInfo += scoring_method (manglet før),
leaderboard-raden skjuler nå HCP-teksten når turneringens scoring_method
er stroke_gross eller eclectic_gross. Verifisert mot ekte Klubbmesterskap
2026 (bekreftet stroke_gross) i scratch før utrulling.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-21 20:20:22 +02:00
3a9ae02841 Rett Thru-kolonnens vertikale justering i offentlig leaderboard
Bruker rapporterte fra ekte mobilbruk (teecup.golf, live): THRU-etiketten
sto lavere enn I DAG/TOTAL. Thru-verdien manglet samme min-h-10 som
ScoreShape (brukt av I dag/Total) gir de andre kolonnene -- hele
Thru-kolonnen ble dermed lavere og sentrerte etiketten ut av linje.
Verifisert rettet i scratch før utrulling.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-21 20:14:48 +02:00
b8e7d1d004 Rett navn-avkorting på smale mobilskjermer i offentlig leaderboard
Funnet under scratch-verifisering (360px viewport): spillernavn ble kuttet
med "..." ("Erol Haag..."), under lesbarhetsbarren (CLAUDE.md, ufravikelig
tilgjengelighetsregel). Navnet får nå bryte til ny linje i stedet for å
avkortes -- undertittelen (HCP/klasse) beholder truncate siden den er
mindre kritisk. Strammet også inn radens gap/padding på de minste
skjermene for å gi navnekolonnen mer plass. Verifisert på nytt mot 360px
med et bevisst langt testnavn, bekreftet OK.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-21 20:08:11 +02:00
9fad4b3f38 Offentlig "Følg live" for individuelle turneringer: V0-UI + full kobling
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>
2026-08-21 19:50:35 +02:00
f207be374f Offentlig "Følg live" for individuelle turneringer: backend + Program-fiks
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>
2026-08-21 19:44:13 +02:00
1e3ffe634b Ærlig feilmelding for ugyldig kilde-data ved baneimport (EXTERNAL_DATA_INVALID)
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>
2026-08-21 17:11:41 +02:00
546900c2d6 Før endringer i turneringsoppsettet
Some checks failed
Backend-tester / test (push) Successful in 1m8s
Frontend-tester / test (push) Failing after 20s
2026-08-21 13:54:01 +02:00
2562e20ec3 13-årsgrense — håndhevet server-side (eneste vei inn i appen, ADR-051) og med umiddelbar rød feilmelding klientside i begge profil-skjemaer. Testet på nøyaktig dagsgrensen.
PWA-installasjonstekst — skiller nå Safari/Chrome på iOS, ikke lenger feilaktig Safari-only.
Beskrivelsestekst — "golfklubber" fjernet, nytt punkt om at turneringsadmin/-presentasjon fungerer godt på PC.
Dette krever både teecup_api og teecup_frontend (ingen migrasjon).
2026-08-10 07:00:11 +02:00
26313c8017 Kort på hull-kortet: "end"-steget (ballens posisjon) tilbyr nå samme valg som utslags-steget: GPS ("Jeg er ved ballen nå") eller kart ("Vis kart mens jeg går").
Velger du kart, vises utslagspunktet som en fast oransje referansemarkør, og kartet zoomer/panorerer automatisk slik at både din posisjon og utslagspunktet er synlige med det samme. Du trykker der ballen ligger — markøren blir grønn for å skille den fra referansen.
2026-08-08 21:38:10 +02:00
18c7749a72 Fiks: kartet sentrerte alltid på en hardkodet Oslo-koordinat
Produksjonsbug rapportert umiddelbart etter forrige fiks: "Kartet viser
ikke hvor jeg faktisk er, men en eller annen vilkårlig by."

MapPointPicker sin center-koordinat var hardkodet til Oslo, ledsaget av
en kommentar som hevdet "real app centers on last-known position" --
den logikken fantes aldri, kun påstanden. Rettet: kartet henter nå
brukerens ekte GPS-posisjon (ett getCurrentPosition-kall, samme mønster
som "Min posisjon nå") FØR selve Mapbox-kartet initialiseres, med Oslo
kun som fallback hvis posisjon ikke kan hentes.

Scratch-verifisert: overstyrte navigator.geolocation til Bergen sentrum,
bekreftet kartet faktisk åpnet der (annen bystruktur enn forrige Oslo-
test), ikke lenger på den faste koordinaten. Se CHANGELOG.md punkt 52.
2026-08-08 18:35:21 +02:00
7e7c33a724 Fiks: kart-steget kollapset til 0px høyde (mapbox-gl.css CSS-krasj)
Produksjonsbug: "Kunne ikke laste kartet" for alle, bekreftet av bruker
etter oppfølgingsspørsmål ("alle tre" -- kart-valg, resultat-forhånds-
visning, delt bilde).

Rotårsak: mapbox-gl.css sin egen ".mapboxgl-map { position: relative }"
overstyrte Tailwind sin "absolute"-klasse på kart-beholderen (samme
klassenavn Mapbox GL JS legger til ved init, senere i CSS-cascaden).
Så snart position ikke lenger var absolute, mistet inset-0 all effekt
på størrelsen -- beholderen kollapset til height:0, kartet lastet helt
fint (style/tiles/events alle 200/204) men ble klippet vekk, usynlig.
Rettet ved å bytte til h-full w-full, som løser størrelsen via prosent-
arv uavhengig av hvilken position-verdi som vinner.

Kunne ikke fanges opp i tidligere scratch-tester siden Mapbox sin
URL-restriksjon alltid avviste localhost-scratch-opprinnelser før
kartet fikk lastet/rendret. Verifisert denne runden ved å overstyre
Referer-headeren for å simulere det ekte domenet.

Bygget i samme runde (ikke opprinnelig planlagt, brukerønske): en
client-side satellitt-forhåndsvisning i resultatsteget før lagring, med
det offentlige tokenet direkte som <img src> mot Mapbox Static Images
API.

Se CHANGELOG.md punkt 51 for full diagnose, inkl. en separat snubletråd
i mitt eget scratch-testverktøy (grep uten ^-anker matchet en
kommentarlinje) og en ekte service-worker-cache-fallgruve funnet
underveis.
2026-08-08 17:23:59 +02:00
db944bc119 Slag-for-slag GPS-avstandsmåling: liste over egne slag + fiks stille del-feil
Brukertilbakemelding: "jeg burde jo se slaget selv, selv om det ikke er
delt" -- merkelappen viste tidligere kun et antall, aldri kølle/avstand
for de faktiske slagene. ShotMeasurementEntry lagrer nå hele slag-listen
(ikke bare .length), med en ny utvidbar ShotList (kølle+avstand, "Delt"-
merke eller "Del"-lenke for et ikke-delt slag, slette-knapp per slag via
det allerede eksisterende DELETE-endepunktet). Splittet den ene knappen
i en utvidbar "N slag målt"-disclosure og en separat "+"-knapp for nye
målinger.

Tredje stille-feil-bug funnet og rettet i samme runde (samme klasse som
forrige commit): re-del-fra-liste sjekket heller ikke svaret sitt. Lagt
til egen shareError-state, bevisst atskilt fra submitError (som holder
selve måle-arket åpent ved avvist innsending) -- siden slaget allerede
er lagret når en delingsfeil kan oppstå, ville gjenbruk av submitError
risikert et duplikat-slag ved gjentatt "Lagre slag".

Scratch-verifisert: to slag opprettet, listen viser riktig kølle/
avstand, re-del fra listen fungerer (bekreftet ekte melding postet),
sletting fjerner slaget fra listen. Se CHANGELOG.md punkt 50.
2026-08-08 16:45:13 +02:00
8da2423942 Fiks: slagmåling ga alltid 0m, delinger forsvant stille
Produksjonsbug rapportert av bruker rett etter forrige utrulling: "den
målte aldri mer enn 0 meter. Jeg så ingen bilder."

Rotårsak 1: "end"-steget (ballens posisjon) avfyrte GPS-målingen
automatisk idet steget ble aktivt, uten tid for brukeren til faktisk å
gå fra utslagsstedet til ballen -- start/slutt endte på samme sted,
samme øyeblikk. Fjernet auto-avfyringen, krever nå et eksplisitt "Jeg
er ved ballen nå"-trykk.

Rotårsak 2 (konsekvens av #1): en 0m-avstand avvist av backendens
distance_meters > 0-validering (422) gjorde at submitShot() bare lukket
arket stille, ingen feilmelding. Lagt til submitError/submitting-state,
parser både appens {detail:{message}} og FastAPI/Pydantic sin rå
{detail:[{msg}]}-valideringsform (bekreftet eksakt hvilken ved å
trigge en ekte 422), viser feilen i arket, holder det åpent ved feil.

Scratch-verifisert med navigator.geolocation midlertidig overstyrt
(ekte GPS-tillatelse permanent denied i CDP-automatiserte nettleser-
sesjoner): "Jeg er ved ballen nå" vises korrekt, et ekte gap ga
"130 m" (ikke 0) og delingen postet riktig, og en 0m-innsending viser nå
feilmeldingen i stedet for å lukke stille. Se CHANGELOG.md punkt 49.
2026-08-08 15:06:48 +02:00
ad3c47bfa3 Ny-runde-veiviser: legg utslag direkte i gjesteskjemaet
Brukertilbakemelding: valg av utslag for en nyopprettet gjest var lite
intuitivt -- måtte inn i det ferdigopprettede gjestekortets "Rediger"-
visning for i det hele tatt å se hvilket utslag som ble valgt.
addGuest() valgte allerede utslag automatisk (kjønnsbasert), men helt
stille -- selve GuestForm hadde aldri et synlig Utslag-felt.

Lagt til et kontrollert teeId-felt direkte i gjesteskjemaet, samme
NativeSelect-mønster og kjønn->utslag-resynk-logikk som PlayerCards
tilsvarende felt allerede hadde -- inkludert i "Fyll inn automatisk"-
knappen for kjente gjester (samme feilklasse, ikke tidligere rettet
der).

Scratch-verifisert: kjønnsbytte i skjemaet oppdaterer utslag-valget
umiddelbart, og det ferdige spillerkortet viser riktig utslag med det
samme uten å måtte åpne redigering. Se CHANGELOG.md punkt 47.
2026-08-08 13:38:00 +02:00
4981c7eaed Slag-for-slag GPS-avstandsmåling: inngangspunkt 2 — merkelapp på hull-kortet (ADR-048)
Fullfører v1-kravet om å dekke begge hull-eiertyper fra start (forrige
commit dekket kun deltaker-eide hull via ScoringWizard). Refaktorerte
den inline logikken ut til en delt lokal funksjon ShotMeasurementEntry
(samme "lokal gjenbruk innad i filen"-mønster som resten av filens
komponenter) -- bygger riktig URL-base for enten
.../participants/{id}/holes/{n}/shots eller .../sides/{id}/holes/{n}/
shots fra en enkel owner:{kind,id}-prop.

Koblet inn i PlayerHoleCards (deltaker-eide hull, som søsken av kortets
store klikkbare knapp -- ikke nøstet, ugyldig å neste <button> i
<button>) og SideScorecardGrid (side-eide hull -- to merkelapper med
lag-etikett rett under scorekort-gridet, siden selve tabellen er for
tett til en knapp per rute).

Bruker satte inn et ekte Mapbox-token (NEXT_PUBLIC_MAPBOX_TOKEN) i .env
midt i denne runden. Scratch-verifisert med det ekte tokenet: kart-veien
avvist med 403 (URL-restriksjon mot scratch-miljøets localhost-
opprinnelse) -- bekreftet at feilhåndteringen i MapPointPicker fungerer
rent i stedet for å krasje. Begge merkelapper bekreftet henter og
oppdaterer riktig, uavhengig av hverandre, for både deltaker- og
side-eide hull.

Se CHANGELOG.md punkt 46 for full verifiseringsdetalj.
2026-08-08 13:12:25 +02:00
11d10f7661 Erstatt /my-rounds/new med ny-runde-veiviser fra egen V0-prompt
Gammel components/new-round.tsx (3364 linjer) slettet, erstattet av
components/ny-runde/ + lib/ny-runde/ -- V0-eksporten (full teknisk spec,
null designføring) ported mot de faktiske backend-kontraktene i
app/routers/rounds.py: Gender-oversettelse, forenklet Tee-form (aldri
CR/Slope til klienten), CourseMeta-discriminated-union for teeoff- vs.
egen-bane, ekte POST /rounds -> sides -> participants-sekvens, ekte
kontosøk/gjeste-oppslag, ekte banesøk inkl. geolokasjon.

Fire bugs funnet og rettet under scratch-verifisering: manglende
forwardRef på TextInput (i selve V0-eksporten), manglende
tee-synk til eierens spillerkort etter banevalg (egen portingsfeil),
manglende Ingen/Alle-hurtigknapp i steg 5 (samme mangel rettet i appen
2026-08-06), og en produksjonsbug oppdaget EKTE brukere etter utrulling:
fetchFacilityCourses() leste responsen fra offisielt banesøk som en rå
array i stedet for {slug,name,courses}-objektet backend faktisk
returnerer -- ga en uendelig "Laster baner..."-hang for enhver runde
startet på en offisiell (teeoff-)bane. Rettet + lagt til reell
feilhåndtering i OfficialCourses (manglet helt, feilen ble tidligere
en stille, ufanget promise-rejection).

Se CHANGELOG.md punkt 41 og 43 for full verifiseringsdetalj.
2026-08-08 12:34:25 +02:00
12f10d92a3 Før redesign 2026-08-07 22:02:56 +02:00
f55a51e9e2 e reelle bugger (500 på /feeds paginering, en rute-/rewrite-kollisjon på /feed, og manglende WS-refetch-kobling for kommentarer) — se ADR-044/CHANGELOG for detaljer. Før jeg ruller dette ut mot ekte teecup_db, her er planen:
Kommandoer jeg vil kjøre mot ekte teecup_db/teecup_api/teecup_frontend:

psql migrasjon 058_round_messages.sql mot ekte teecup_db (ny round_message-tabell, ingen endring i eksisterende tabeller).
docker compose up -d --build teecup_api teecup_frontend (begge containere, siden dette er backend+frontend sammen).
Etterpå: bekreft round_message-tabellen finnes, /health//my-rounds/new//my-feed → 200 over https, teeoff.no upåvirket.
2026-08-06 07:01:22 +02:00
038516d236 All five tasks from the original list are complete, plus one critical production bug found and fixed along the way. Summary:
Fullført:

TeeCup-beskrivelse for logo — levert tidligere.
Migrasjon 056 (scramble_solo) — kjørt og live.
Matchspill-varianten (scramble_solo_match, migrasjon 057) — bygget, verifisert, live.
Kritisk bug funnet og rettet: lagspillere kunne ikke registrere score i det hele tatt for scramble_solo-formatene (evig spinner, ingen feilmelding) — var allerede live og ødelagt for ekte lagspillere. Rettet for begge varianter, rullet ut.
"Bruk som mal for egen bane" — vises nå kun i "Opprett ny bane"-flyten (ny lenke "Basér på en eksisterende bane i stedet"), ikke i det vanlige søket.
Alt er rullet ut live på teecup.golf, verifisert i nettleser mot isolerte scratch-miljøer (ryddet opp etterpå), og dokumentert i CHANGELOG.md (punkt 22–24) og FEATURE_BACKLOG.md.
2026-08-05 21:37:32 +02:00
0e89546dc7 one and live. Summary:
New "Presentasjon" tab on all tournament screens (team and individual) — organizer can now set description, visibility (public/org/participants), registration approval/waitlist settings, upload a hero image, and manage sponsors with logos. All of this backend has quietly existed since ADR-018 (2026-07-18) with zero UI ever wired to it.
Two small backend additions (no migration): computed hero_image_url/logo_url fields matching the existing avatar_url pattern, and a DELETE .../hero-image endpoint that was missing.
Found and fixed a real mobile layout bug during scratch verification (sponsor row crowding truncated names on a 390px screen) before it ever reached you.
Scratch-verified end-to-end on both tournament types, including confirming the public /t/{id} page picks up the organizer's description. Deployed to teecup.teeoff.no, both containers healthy.
Only caveat: no real tournament exists in production yet to click through live, so that final visual check is still pending — it'll be there the next time you open or create one.
CHANGELOG and FEATURE_BACKLOG updated to reflect all of this.
2026-08-03 19:04:48 +02:00
242c7a2bfc Før filendringer 2026-08-03 14:32:48 +02:00
d395f86753 Update Todos
Skrive migrasjon 052 (guest_first_name/guest_last_name + backfill)

Bygge backend: splitt navn i ParticipantCreate/Update, auto-synk guest_name

Bygge backend: GET known-guest-oppslag (e-post-basert, scoped til egen bruker)

Bygge backend: retroaktiv e-post-kobling ved innlogging (auth.py)

Bygge backend: HTML-e-post-støtte i email.py (multipart/alternative)

Bygge backend: scorekort/statistikk-e-post ved complete_round (individuell + delt-ball)

Frontend: e-post-felt + navnesplitt + autofyll fra søk i AddGuestForm

Frontend: "vi kjenner igjen denne e-posten"-forslag i AddGuestForm

Scratch-verifisere hele kjeden (migrasjon+backend+frontend+e-post) end-to-end

Kjøre migrasjon mot ekte teecup_db og rulle ut (etter bekreftelse)
Alt er bygget og scratch-verifisert. Før jeg ruller ut mot ekte teecup_db, her er planen — trenger din bekreftelse per sikkerhetsregelen:

Migrasjon 052_guest_name_split.sql (rent additiv, ingen sletting):

ALTER TABLE round_participant ADD COLUMN guest_first_name text; + guest_last_name text
Backfiller eksisterende guest_name-rader ved samme "første ord/resten"-heuristikk som frontend bruker til autofyll
Deretter: docker compose up -d --build teecup_api teecup_frontend

Hva som er bygget:

E-post som valgfritt felt i "Legg til uten konto (gjest)" (fantes i backend fra før, manglet i selve skjemaet)
Navn splittet i for-/etternavn (etternavn valgfritt)
Retroaktiv kobling: spiller runder som gjest før du har konto → runden dukker opp i "Egne runder" når du logger inn med samme e-post, men teller ikke automatisk mot faktisk HCP (må bekreftes selv — unngår at en fremmed kan påvirke HCP-en din uten samtykke)
E-post med scorekort + statistikk + invitasjon sendes automatisk når runden fullføres, til enhver gjest med registrert e-post — første HTML-e-post i appen
Autofyll fra søkefeltet inn i gjesteskjemaet
"Vi kjenner igjen denne e-posten"-forslag, scoped til dine egne tidligere gjester (ikke globalt — unngår en personvernlekkasje)
2026-08-03 06:24:57 +02:00
5e66ce63f5 Før bakgrunnsfjerning 2026-08-02 16:34:54 +02:00
3da637b7a2 Ja, jeg forsto rekkefølgen — steg 1 og 2 er nå ferdig og scratch-verifisert:
Steg 1 (backend, HCP-prosent + Match-HCP): ny migrasjon 051_round_allowance_override.sql (round.allowance_override jsonb), koblet inn i _recompute_side_handicaps/_relative_strokes_for_round + POST/PATCH /rounds. Verifisert presist i scratch: 100%→50%-prosent ga playing_handicap 24/10 → 12/5 nøyaktig som beregnet for hånd, og use_matchplay_handicap slått av ga rå 12/5 i stedet for differensial 7/0. Slagspill upåvirket (regresjon bekreftet).

Steg 2 (kode-fiks, lag-gruppering): ScorecardGrid (live-scoring) og MatchScorecardGrid (post-runde/fremtidig sammenslått side) sorterer nå stabilt på round_side_id før rendering. Bygget en fersk scratch-fourball-runde med akkurat ditt bug-scenario (A→Rødt, B→Blått, C→Rødt, D→Blått, lagt til i den rekkefølgen) og bekreftet visuelt i nettleseren i begge visningene: Rødt lag vises samlet, deretter Blått — ikke lenger interleaved.

Typesjekk + full produksjonsbuild kompilerte rent gjennom hele runden.

Gjenstår før jeg går videre til V0-promptene: migrasjon 051 er kun kjørt i scratch, ikke mot ekte teecup_db. Planen er:

docker exec -i teeoff_db psql -U teeoff_admin -d teecup_db -v ON_ERROR_STOP=1 < 051_round_allowance_override.sql
— ett rent additivt ALTER TABLE round ADD COLUMN allowance_override jsonb, ingen eksisterende rader berøres. Deretter docker compose up -d --build teecup_api teecup_frontend (backend for allowance-koblingen, frontend for gruppering-fiksen).

Bekreft så kjører jeg dette, og går videre til V0-prompt 1 (rundeoppsett-veiviseren).
2026-08-02 08:24:01 +02:00
27bff38afe Kort: selve grunnfargen er et bevisst, ekte match. Hvordan overflatene BYGGES OPP (glass vs. flatt, boxed vs. flytende) er derimot forskjellig, og det er V0 sin egen tolkning, ikke noe hentet direkte fra dette bildet. 2026-08-01 21:15:07 +02:00
968ea79184 Update Todos
Chapman: format-valg i new-round.tsx + tournament-program.tsx (session)

Nassau: nytt vindu-resultatvisning i round-detail.tsx + session-scorecard.tsx

Københavner: format-valg + poengtabell-visning i individual-tournament-detail.tsx

Bingo Bango Bongo: format-valg + per-hull picker + poengtabell

Flaggturnering: format-valg + nedtelling/resultatvisning

Shamble: format-valg + best_n + lagvisning (frittstående + org-lag)

Money Ball: format-valg + lineup_order + lagvisning (frittstående + org-lag)

High-low-high: format-valg + løpende poeng-resultatvisning (alle 3 flater)

Ekte produksjonsbuild -- FERDIG, kompilerte rent (27 ruter)

Browserverifisert alle åtte formatene -- fant og fikset ekte backend-bug (side-handicap-recompute)

Rullet ut mot ekte teecup_api/teecup_frontend -- FERDIG, health checks grønne, teeoff.no upåvirket
Rullet ut live 2026-07-30. Frontend for alle åtte nye turneringsformatene (Chapman, Nassau, Københavner, Bingo Bango Bongo, Flaggturnering, Shamble, Money Ball, High-low-high) er nå bygget, browserverifisert og live — dekker alle tre flatene (frittstående runder, org-lagturneringer, org-individuelle turneringer). Fant og fikset én reell backend-bug underveis (side-handicap ble ikke regnet på nytt når en deltakers HCP ble satt/endret etter at de allerede var tildelt en side). Ingen migrasjon i denne runden, teeoff.no upåvirket. ADR-039/åtte-formater-arbeidet er dermed helt ferdig, backend og frontend.
2026-08-01 06:51:53 +02:00
19a21073ba Update Todos
Bygg PWA-installasjonsoppfordring (Android beforeinstallprompt + iOS instruksjonsbanner)

Design og bygg flere flighter i én frittstående runde (løs gruppering, retning 1)

Design og bygg scramble/greensome-statistikk (valgt utslag per spiller)

Bygg push-varsler til telefonens OS (VAPID, push_subscription, service worker)

Scratch-verifiser backend for alle fire (27/27 sjekker gjort)

Browserverifiser alle fire i nettleser mot scratch-backend

Rull ut mot ekte systemer (migrasjoner + containere), med bekreftelse

Oppdater CLAUDE.md/FEATURE_BACKLOG.md/ARCHITECTURE_DECISIONS.md
Alle fire er ferdigstilt, verifisert og live. Kort oppsummert:

PWA-installasjonsoppfordring — ekte beforeinstallprompt-fanging, Android-knapp + iOS-instruksjonsbanner, vist på dashbordet. Bekreftet at Chrome faktisk fyrte eventet i testøkten.
Flere flighter i én frittstående runde — løs gruppering av separate runder (delt UUID), "+ Legg til en flight til" gjenbruker hele opprett-flyten forhåndsutfylt, nytt kombinert leaderboard på tvers av flighter. Testet fra knappetrykk til ferdig runde, bekreftet i database.
Scramble/greensome: valgt utslag per spiller — nytt felt i hull-registreringen (helt valgfritt), "Utslag brukt"-oppsummering på statistikksiden. Bygget for frittstående runder; org-turneringer bevisst utenfor omfang denne runden (notert i backloggen).
Push-varsler til telefonens OS — Web Push/VAPID, ny av/på-bryter i kontoinnstillinger, dekker alle fire varseltyper automatisk. VAPID-nøkler generert og lagt i .env uten å vises i chatten. Én ærlig begrensning: ekte OS-varsel-levering med innvilget tillatelse kunne ikke testes i denne automatiserte nettleserøkten (tillatelsen var forhåndsblokkert av miljøet) — verdt å teste selv på en ekte enhet.
27/27 scratch-sjekker, full nettleser-gjennomgang uten konsollfeil, migrasjoner 035–037 kjørt mot ekte teecup_db, begge containere redeployet og verifisert, teeoff.no upåvirket. Alle tre .md-filene er oppdatert med full detalj.
2026-07-28 22:34:16 +02:00
7631ef60e6 Bygget: ADR-036 fase 2 — rundevisibilitet, helt etter det allerede designede mønsteret (privat/offentlig/venner-i-valgt-kategori):
round.visibility_mode (privat som trygg standard) + ny tabell for hvilke venne-kategorier som får se en gitt runde.
Kjernesjekken (_can_view_round) viste seg å være en ren utvidelse av den eksisterende eier/medspiller-sjekken, så fire lese-endepunkter ble omstrukturert til delte funksjoner og gjenbrukt av sju nye offentlige endepunkter + et nytt offentlig sanntids-WS — i stedet for å bygge alt parallelt fra bunnen.
Ny vennprofil-side (/my-friends/[id]) — navn/avatar/HCP/hjemmeklubb + liste over personens synlige runder, "pågår nå" øverst.
Ny read-only live-visning (/watch/[id]) for tredjeparter — matchstatus, skins-tavle eller individuell rangering avhengig av spilleform.
Synlighetsvelger lagt til både i opprett-runde og rediger-runde.
Verifisert grundig: 191 automatiserte sjekker (inkl. full regresjon av to eksisterende testsuiter) + en fullstendig nettleser-gjennomgang med tre reelle brukere i separate innloggingskontekster — inkludert en helt anonym leser som beviste at "offentlig" faktisk betyr offentlig, og en reell venn/kategori-negativ-kontroll som beviste at feil kategori korrekt nekter tilgang.

Migrasjon kjørt mot ekte database (kun additiv), begge containere rullet ut, teeoff.no upåvirket.
2026-07-28 19:25:37 +02:00
071874e8c8 Ferdig og live. Oppsummert:
Offline-køen fra ADR-028 (turnering-scorekortet) er nå portert til frittstående runder — begge scoringsveivisere (vanlig og delt-ball) fungerer offline.
Portingen ble faktisk enklere enn originalen: siden PATCH-endepunktene for frittstående runder erstatter hele hull-raden per kall, kunne en køet skriving speiles direkte inn i lokal state uten egne verdi-overlays.
Samme mønster som originalen: navigator.onLine-sjekk, nettverksfeil fanges og køes, automatisk synk når nettet kommer tilbake, manuell "Synkroniser nå"-knapp, og en "Lagret lokalt · venter på synk"-indikator i selve veiviseren.
Faktisk browserverifisert denne gangen (i motsetning til den opprinnelige ADR-028-runden, som aldri ble testet i praksis) — brukte Chrome DevTools sin ekte offline-emulering: registrerte score offline, bekreftet kø i IndexedDB, gikk online igjen, bekreftet automatisk synk og at serveren faktisk mottok riktige verdier. Gjort for begge veivisertypene.
Ingen migrasjon — rullet ut mot ekte systemer, begge containere boot-et rent, teeoff.no upåvirket.
2026-07-28 18:17:49 +02:00
b21609915d Ferdig og live. Oppsummert:
Slag og Putter hopper nå videre av seg selv i det øyeblikket en verdi velges — ingen "Neste"-trykk nødvendig.
"Avstand første putt" lå tidligere sammen med putt-tallet på samme steg — auto-hopp der ville gjort feltet uoppnåelig, så det fikk et eget steg (som også auto-hopper).
"Flere detaljer"-steget (kølle/retning/chip/bunker/straffeslag/anywayslag) beholder bevisst "Neste"/"Ferdig"-knappen, siden det har flere felt samtidig og ingen entydig "nå er jeg ferdig"-verdi.
Gjelder både vanlig scoring og delt-ball-scoring (foursome/greensome/scramble).
"Forrige" fungerer fortsatt trygt — går du tilbake til et allerede besvart steg, hopper det ikke automatisk fremover igjen.
Browserverifisert i scratch (full flyt gjennom alle steg + tilbake-navigasjon + delt-ball), rullet ut mot ekte systemer — ingen migrasjon, begge containere boot-et rent, teeoff.no upåvirket.
2026-07-28 15:32:02 +02:00
83c4749516 Ferdig og live. Kort oppsummert:
Bygget: hele frontend for ADR-039-spillformene — utvidet spilleform-velgeren i "Ny runde" til alle åtte formater med skins-konfig, en ny SidesPanel i "Spillere og runde" (opprett/slett sider, tildel/fjern spillere med sanntids kapasitetssperre), en ny FormatResultPanel (løpende matchstatus for match/fourball/foursome/greensome/scramble, skins-tavle for skins), setup_complete-gating av "Fullfør runde", og et eget delt-ball-scorekort+veiviser for foursome/greensome/scramble.

Testet reelt i nettleser (Chrome DevTools mot en isolert scratch-backend, ikke bare typesjekk) — spilte gjennom en komplett match-, skins- og foursome-runde fra bunnen av. Fant og fikset to reelle stale-state-buger underveis (setup-melding og matchstatus ble stående utdatert etter side-tildeling til de ikke lenger refetchet runden). Skins- og foursome-handicap-matematikken kryssjekket for hånd og stemte eksakt.

Rullet ut mot ekte systemer — ingen migrasjon, kun teecup_frontend bygget på nytt, begge containere boot-et rent, teeoff.no upåvirket. ADR-039 er dermed helt ferdig, backend og frontend.
2026-07-28 13:00:50 +02:00