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
applikasjonsbug.
**Bevisst UTENFOR omfang:** den strukturelt identiske "bla i eksisterende
spillere"-begrensningen finnes trolig også i lag-turneringers roster-
tillegg (`tournament-detail.tsx`, samme `pool`/`matches`/`exactMatch`-
mønster) -- IKKE rørt i denne runden, brukerens skjermbilder gjaldt
spesifikt den org-individuelle skjermen. Kjent, ikke glemt.
**Tillegg samme dag:** bruker ba om samme fiks i lag-turneringers
roster-tillegg (`tournament-detail.tsx`, `AddPlayerControl`) etter å ha
fått påpekt den strukturelt identiske begrensningen der. Samme
"available"-fallback-mønster (utledet av `matches`, ikke en egen
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`
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,
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`
som `teeoff_admin` (4 eksisterende spillere backfillet), etter
eksplisitt bekreftelse fra bruker. `docker compose build teecup_api
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 matches = useMemo(() => {
if (!trimmed) return []
const q = trimmed.toLowerCase()
// Alle poolspillere som ikke allerede er rostret på DETTE laget (spillere
// på det andre laget blir værende med, vist nedgraderte -- se onOtherTeam
// 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
.filter((p) => p.display_name.toLowerCase().includes(q))
.map((p) => {
const onTeam = findPlayerTeam(p.id)
return {
@ -962,7 +964,13 @@ function AddPlayerControl({
}
})
.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(
() => pool.some((p) => p.display_name.toLowerCase() === trimmed.toLowerCase()),
@ -1038,7 +1046,6 @@ function AddPlayerControl({
</Button>
</div>
{trimmed.length > 0 && (
<div className="overflow-hidden rounded-2xl border border-border bg-background">
<ul className="flex max-h-64 flex-col overflow-auto">
{matches.map(({ player, onOtherTeam }) => {
@ -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">
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>
)}
@ -1137,7 +1151,6 @@ function AddPlayerControl({
)}
</ul>
</div>
)}
</div>
)
}