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>
This commit is contained in:
parent
2e4cb9733c
commit
49530ffd40
2 changed files with 104 additions and 15 deletions
34
CHANGELOG.md
34
CHANGELOG.md
|
|
@ -13354,3 +13354,37 @@ Neste steg:
|
||||||
kodefeil, siden logikken er en direkte, symmetrisk speiling av den
|
kodefeil, siden logikken er en direkte, symmetrisk speiling av den
|
||||||
allerede beviste `initialTab`-beregningen ved førstegangslasting.
|
allerede beviste `initialTab`-beregningen ved førstegangslasting.
|
||||||
Flagget eksplisitt til bruker som ikke fullt skjermbilde-verifisert.
|
Flagget eksplisitt til bruker som ikke fullt skjermbilde-verifisert.
|
||||||
|
|
||||||
|
135. **Spillerkort på Score-fanen: "Mer"-knapp toner ned historikk +
|
||||||
|
Avslutt/Send scorekort, 2026-08-20.** Direkte oppfølging av #134 --
|
||||||
|
historikk-panelet og Avslutt/Send-radene lå fortsatt alltid synlig
|
||||||
|
på hvert kort, bare henholdsvis begrenset til eget kort og uendret.
|
||||||
|
Bruker foreslo selv en "Mer"-knapp som løsning; Claude skrev en
|
||||||
|
V0-prompt for mønsteret, bruker kjørte den og lastet opp eksporten
|
||||||
|
(`player-card-more.tsx`).
|
||||||
|
|
||||||
|
Ny lokal komponent `PlayerCardMore` i `round-detail.tsx` (rett etter
|
||||||
|
`ParticipantCompletionActions`) -- eier KUN vis/skjul, tar imot
|
||||||
|
`history`/`actions` som `ReactNode`-props. Interaksjonsmønsteret
|
||||||
|
(grid-rows 0fr->1fr myk høyde-animasjon, samme prinsipp som "Vis
|
||||||
|
banekart og hindringer" fra #133, tekst+chevron på knappen, innhold
|
||||||
|
tatt ut av a11y-tre/tab-rekkefølge mens skjult) hentet fra
|
||||||
|
V0-eksporten. De EKTE `HoleHistoryPanel` og `ParticipantCompletionActions`
|
||||||
|
sendes inn uendret som barn -- V0 sine egne plassholder-rader
|
||||||
|
(`HistoryRow`/`SecondaryActions`) ble IKKE tatt i bruk, kun designet
|
||||||
|
for dem. Kun `PlayerHoleCards` (Score-fanen) endret -- `PlayerList`
|
||||||
|
("Spillere og runde") beholder `ParticipantCompletionActions` synlig
|
||||||
|
uten veksling, siden den siden allerede er en ren
|
||||||
|
administrasjonsvisning der handlingene ikke er "i veien".
|
||||||
|
|
||||||
|
**Verifisert i scratch:** mocket `RoundDetail`-forhåndsvisning med tre
|
||||||
|
spillere (eier m/historikk, to medspillere u/historikk). Bekreftet:
|
||||||
|
alle tre kort viser kompakt "Mer" som standard, klikk utvider korrekt
|
||||||
|
(knapp blir "Skjul", chevron snur), egen historikk + Avslutt/Send
|
||||||
|
scorekort vises for eierens kort, KUN Avslutt/Send (ingen tomt/rart
|
||||||
|
mellomrom) for medspillerne, ingen dobbel padding/kant-artefakt der
|
||||||
|
de ekte komponentenes egen styling (border-t/px-4) møter wrapperen.
|
||||||
|
Sjekket lys og mørk modus. `tsc --noEmit` rent.
|
||||||
|
|
||||||
|
**Ikke rullet ut ennå** -- verifisert i scratch, venter på
|
||||||
|
bekreftelse fra bruker før build/deploy til live.
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@
|
||||||
// aldri kun det ene feltet som ble endret.
|
// aldri kun det ene feltet som ble endret.
|
||||||
|
|
||||||
import type React from "react"
|
import type React from "react"
|
||||||
import { useCallback, useEffect, useMemo, useRef, useState } from "react"
|
import { useCallback, useEffect, useId, useMemo, useRef, useState } from "react"
|
||||||
import Link from "next/link"
|
import Link from "next/link"
|
||||||
import dynamic from "next/dynamic"
|
import dynamic from "next/dynamic"
|
||||||
import { usePathname, useRouter, useSearchParams } from "next/navigation"
|
import { usePathname, useRouter, useSearchParams } from "next/navigation"
|
||||||
|
|
@ -5945,6 +5945,54 @@ function ParticipantCompletionActions({
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Tone-ned-mønster for spillerkortets sekundære rader (historikk +
|
||||||
|
// Avslutt/Send scorekort) på Score-fanen -- V0-eksport (zip, 2026-08-20,
|
||||||
|
// brukerkorrigering: disse lå tidligere alltid synlig, uansett hvor sjelden
|
||||||
|
// brukt). Eier KUN vis/skjul -- selve historikk-panelet og handlingsraden
|
||||||
|
// forblir de ekte, uendrede komponentene (HoleHistoryPanel/
|
||||||
|
// ParticipantCompletionActions), sendt inn som barn. Brukes KUN i
|
||||||
|
// PlayerHoleCards (Score-fanen) -- PlayerList ("Spillere og runde") beholder
|
||||||
|
// ParticipantCompletionActions synlig uten denne vekslen, siden den siden
|
||||||
|
// allerede er en ren administrasjonsvisning.
|
||||||
|
function PlayerCardMore({ history, actions }: { history?: React.ReactNode; actions: React.ReactNode }) {
|
||||||
|
const [open, setOpen] = useState(false)
|
||||||
|
const regionId = useId()
|
||||||
|
return (
|
||||||
|
<div className="flex flex-col border-t border-border">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
onClick={() => setOpen((v) => !v)}
|
||||||
|
aria-expanded={open}
|
||||||
|
aria-controls={regionId}
|
||||||
|
className="flex min-h-11 items-center justify-center gap-1.5 self-center rounded-xl px-4 py-2 text-sm font-bold text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
||||||
|
>
|
||||||
|
{open ? "Skjul" : "Mer"}
|
||||||
|
<ChevronDown
|
||||||
|
aria-hidden="true"
|
||||||
|
className={cn("size-4 shrink-0 transition-transform duration-200", open && "rotate-180")}
|
||||||
|
/>
|
||||||
|
</button>
|
||||||
|
{/* Myk høyde-animasjon via grid-rows 0fr -> 1fr -- samme prinsipp som
|
||||||
|
"Vis banekart og hindringer" lenger oppe på skjermen. Innholdet
|
||||||
|
fjernes fra a11y-treet og tab-rekkefølgen mens det er skjult. */}
|
||||||
|
<div
|
||||||
|
id={regionId}
|
||||||
|
className={cn(
|
||||||
|
"grid transition-all duration-300 ease-out",
|
||||||
|
open ? "grid-rows-[1fr] opacity-100" : "grid-rows-[0fr] opacity-0",
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
<div className="overflow-hidden">
|
||||||
|
<div className={cn("flex flex-col gap-2 pb-2", !open && "invisible")} aria-hidden={!open}>
|
||||||
|
{history && <div className="px-4">{history}</div>}
|
||||||
|
{actions}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
// ADR-066-flagg-tillegget (2026-08-14) -- V0-eksport (zip 11), integrert
|
// ADR-066-flagg-tillegget (2026-08-14) -- V0-eksport (zip 11), integrert
|
||||||
// mot samme props-kontrakt som den midlertidige versjonen den erstatter.
|
// mot samme props-kontrakt som den midlertidige versjonen den erstatter.
|
||||||
// Ren UI: komponenten eier kun steg-/geo-/inputtilstand og gjør aldri
|
// Ren UI: komponenten eier kun steg-/geo-/inputtilstand og gjør aldri
|
||||||
|
|
@ -6910,21 +6958,28 @@ function PlayerHoleCards({
|
||||||
spilleren ikke har historikk ennå. KUN scorekortførers
|
spilleren ikke har historikk ennå. KUN scorekortførers
|
||||||
(isSelf) eget kort (2026-08-20, brukerkorrigering --
|
(isSelf) eget kort (2026-08-20, brukerkorrigering --
|
||||||
panelets tekst sier "Din historikk", som var feil for
|
panelets tekst sier "Din historikk", som var feil for
|
||||||
andre spilleres kort). */}
|
andre spilleres kort). Tonet ned bak "Mer" sammen med
|
||||||
{player.isSelf && (
|
Avslutt/Send scorekort (2026-08-20, V0-eksport
|
||||||
<div className="px-4 pb-2">
|
`player-card-more.tsx`) -- begge var sjeldent brukte
|
||||||
<HoleHistoryPanel
|
handlinger som likevel alltid tok plass på hvert kort. */}
|
||||||
url={`/rounds/${roundId}/participants/${player.id}/holes/${currentHole}/history`}
|
<PlayerCardMore
|
||||||
onOpenFull={() => setHistoryPlayerId(player.id)}
|
history={
|
||||||
|
player.isSelf ? (
|
||||||
|
<HoleHistoryPanel
|
||||||
|
url={`/rounds/${roundId}/participants/${player.id}/holes/${currentHole}/history`}
|
||||||
|
onOpenFull={() => setHistoryPlayerId(player.id)}
|
||||||
|
/>
|
||||||
|
) : undefined
|
||||||
|
}
|
||||||
|
actions={
|
||||||
|
<ParticipantCompletionActions
|
||||||
|
player={player}
|
||||||
|
holesPlayed={list?.filter((h) => h.played).length ?? 0}
|
||||||
|
readOnly={readOnly}
|
||||||
|
onPatch={onPatchParticipant}
|
||||||
|
onSendScorecard={onSendScorecard}
|
||||||
/>
|
/>
|
||||||
</div>
|
}
|
||||||
)}
|
|
||||||
<ParticipantCompletionActions
|
|
||||||
player={player}
|
|
||||||
holesPlayed={list?.filter((h) => h.played).length ?? 0}
|
|
||||||
readOnly={readOnly}
|
|
||||||
onPatch={onPatchParticipant}
|
|
||||||
onSendScorecard={onSendScorecard}
|
|
||||||
/>
|
/>
|
||||||
{playFormat === "flag" && (() => {
|
{playFormat === "flag" && (() => {
|
||||||
const currentPosition = computeFlagCurrentPosition(
|
const currentPosition = computeFlagCurrentPosition(
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue