Samme "bla i eksisterende spillere"-fiks i lag-turneringers roster (ADR-070-tillegg)

AddPlayerControl i tournament-detail.tsx hadde samme begrensning som
AddParticipantControl hadde før dagens fiks: matches var kun avledet
ved ikke-tomt søk. Samme "available"-fallback-mønster lagt til her --
spillere på det andre laget forblir synlige (nedgradert), kun de på
DETTE laget ekskluderes. Ren frontend-endring, ingen migrasjon.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Erol Haagenrud 2026-08-14 19:55:44 +02:00
parent a8a2c602ce
commit 467cbd1ec2
3 changed files with 57 additions and 23 deletions

View file

@ -6989,11 +6989,23 @@ lagret korrekt. Ingen kodeendring nødvendig; kun automatiserings-
verktøyets begrensning med native dato-inputs, ikke en reell verktøyets begrensning med native dato-inputs, ikke en reell
applikasjonsbug. applikasjonsbug.
**Bevisst UTENFOR omfang:** den strukturelt identiske "bla i eksisterende **Tillegg samme dag:** bruker ba om samme fiks i lag-turneringers
spillere"-begrensningen finnes trolig også i lag-turneringers roster- roster-tillegg (`tournament-detail.tsx`, `AddPlayerControl`) etter å ha
tillegg (`tournament-detail.tsx`, samme `pool`/`matches`/`exactMatch`- fått påpekt den strukturelt identiske begrensningen der. Samme
mønster) -- IKKE rørt i denne runden, brukerens skjermbilder gjaldt "available"-fallback-mønster (utledet av `matches`, ikke en egen
spesifikt den org-individuelle skjermen. Kjent, ikke glemt. tilstand) lagt til -- spillere allerede rostret på det ANDRE laget
forblir i listen, nedgradert/deaktivert med "allerede på {lag}", kun
spillere på DETTE laget ekskluderes fra `matches`. Tom-tilstand-teksten
splittet på samme måte (pool tomt / alle allerede lagt til / søk uten
treff). Ingen migrasjon -- ren frontend-endring. `tsc --noEmit` rent +
45/45 vitest. Egen scratch-database + scratch `teecup_api`-container
(port 18004, live-mountet kode) + lokal `next dev` (port 13004): to
lag, tre poolspillere (én allerede rostret på det andre laget) --
bekreftet at kontrollen viser alle tre direkte ved tomt søk (riktig
nedgradert for den som er opptatt), søk smalner riktig inn, og
"Legg til"-flyten for en eksisterende spiller fungerer uendret. Lys+mørk
bekreftet. Scratch-stacken revet ned -- ekte `teecup_db`/`teecup_api`/
`teecup_frontend` urørt (ingen migrasjon å rulle ut for dette tillegget).
**Rullet ut 2026-08-14** -- migrasjon 074 kjørt mot ekte `teecup_db` **Rullet ut 2026-08-14** -- migrasjon 074 kjørt mot ekte `teecup_db`
som `teeoff_admin` (4 eksisterende spillere backfillet), etter som `teeoff_admin` (4 eksisterende spillere backfillet), etter

View file

@ -11336,12 +11336,21 @@ Neste steg:
korrekt. Kun et automatiseringsverktøy-kvirk med native dato-inputs, korrekt. Kun et automatiseringsverktøy-kvirk med native dato-inputs,
ingen kodeendring nødvendig. ingen kodeendring nødvendig.
**Bevisst UTENFOR omfang:** samme "bla i eksisterende"-begrensning
finnes trolig også i lag-turneringers roster-tillegg
(`tournament-detail.tsx`, strukturelt identisk mønster) -- ikke rørt,
brukerens skjermbilder gjaldt spesifikt den org-individuelle skjermen.
**Rullet ut 2026-08-14** -- migrasjon 074 kjørt mot ekte `teecup_db` **Rullet ut 2026-08-14** -- migrasjon 074 kjørt mot ekte `teecup_db`
som `teeoff_admin` (4 eksisterende spillere backfillet), etter som `teeoff_admin` (4 eksisterende spillere backfillet), etter
eksplisitt bekreftelse fra bruker. `docker compose build teecup_api eksplisitt bekreftelse fra bruker. `docker compose build teecup_api
teecup_frontend && up -d` -- begge containere startet rent. teecup_frontend && up -d` -- begge containere startet rent.
**Tillegg samme dag:** flagget den strukturelt identiske "bla i
eksisterende"-begrensningen i lag-turneringers roster-tillegg
(`tournament-detail.tsx`) som bevisst utenfor omfang -- bruker ba om
samme fiks der. Samme "available"-fallback-mønster lagt til
`AddPlayerControl` (spillere på DET ANDRE laget forblir synlige,
nedgradert/deaktivert -- kun de på DETTE laget ekskluderes). Ren
frontend-endring, ingen migrasjon. `tsc --noEmit` rent + 45/45
vitest. Scratch-database + scratch `teecup_api` (port 18004) +
lokal `next dev` (port 13004): to lag, tre poolspillere (én allerede
rostret på det andre laget) -- bekreftet browsing, søk-innsnevring
og eksisterende-spiller-tillegg alle fungerer, lys+mørk. Ingen
migrasjon å rulle ut -- fikset direkte i `teecup_frontend` sammen
med neste ordinære build/deploy.

View file

@ -948,11 +948,13 @@ function AddPlayerControl({
const trimmed = query.trim() const trimmed = query.trim()
const matches = useMemo(() => { // Alle poolspillere som ikke allerede er rostret på DETTE laget (spillere
if (!trimmed) return [] // på det andre laget blir værende med, vist nedgraderte -- se onOtherTeam
const q = trimmed.toLowerCase() // under). Skilt ut fra `matches` slik at "bla i eksisterende"-listen kan
// vises uavhengig av om søkefeltet er tomt (samme fiks som
// AddParticipantControl i individual-tournament-detail.tsx, ADR-070).
const availableForThisTeam = useMemo(() => {
return pool return pool
.filter((p) => p.display_name.toLowerCase().includes(q))
.map((p) => { .map((p) => {
const onTeam = findPlayerTeam(p.id) const onTeam = findPlayerTeam(p.id)
return { return {
@ -962,7 +964,13 @@ function AddPlayerControl({
} }
}) })
.filter((m) => !m.onThisTeam) .filter((m) => !m.onThisTeam)
}, [pool, trimmed, findPlayerTeam, team.id]) }, [pool, findPlayerTeam, team.id])
const matches = useMemo(() => {
if (!trimmed) return availableForThisTeam
const q = trimmed.toLowerCase()
return availableForThisTeam.filter((m) => m.player.display_name.toLowerCase().includes(q))
}, [availableForThisTeam, trimmed])
const exactMatch = useMemo( const exactMatch = useMemo(
() => pool.some((p) => p.display_name.toLowerCase() === trimmed.toLowerCase()), () => pool.some((p) => p.display_name.toLowerCase() === trimmed.toLowerCase()),
@ -1038,9 +1046,8 @@ function AddPlayerControl({
</Button> </Button>
</div> </div>
{trimmed.length > 0 && ( <div className="overflow-hidden rounded-2xl border border-border bg-background">
<div className="overflow-hidden rounded-2xl border border-border bg-background"> <ul className="flex max-h-64 flex-col overflow-auto">
<ul className="flex max-h-64 flex-col overflow-auto">
{matches.map(({ player, onOtherTeam }) => { {matches.map(({ player, onOtherTeam }) => {
if (onOtherTeam) { if (onOtherTeam) {
return ( return (
@ -1080,9 +1087,16 @@ function AddPlayerControl({
) )
})} })}
{matches.length === 0 && !showCreate && ( {matches.length === 0 && availableForThisTeam.length === 0 && (
<li className="px-4 py-3 text-center text-sm text-muted-foreground"> <li className="px-4 py-3 text-center text-sm text-muted-foreground">
Ingen treff. {pool.length === 0
? "Ingen spillere i organisasjonen ennå -- opprett den første under."
: "Alle spillere i organisasjonen er allerede lagt til dette laget."}
</li>
)}
{matches.length === 0 && availableForThisTeam.length > 0 && trimmed.length > 0 && (
<li className="px-4 py-3 text-center text-sm text-muted-foreground">
Ingen treff blant eksisterende spillere.
</li> </li>
)} )}
@ -1135,9 +1149,8 @@ function AddPlayerControl({
</div> </div>
</li> </li>
)} )}
</ul> </ul>
</div> </div>
)}
</div> </div>
) )
} }