This commit is contained in:
Zeeshaun
2026-05-06 18:31:27 +00:00
parent 2263dc3aa5
commit c48023ace4
11 changed files with 404 additions and 97 deletions
+72 -27
View File
@@ -12,8 +12,7 @@ import { Textarea } from "@/components/ui/textarea";
import { fetchJson } from "@/lib/client";
import type { GamePlayerStatsInput, GameRecord, LineupRecord } from "@/lib/types";
const statFields = [
["pitchCount", "Pitches"],
const battingFields = [
["atBats", "AB"],
["runs", "R"],
["hits", "H"],
@@ -26,6 +25,15 @@ const statFields = [
["stolenBases", "SB"]
] as const;
const pitchingFields = [
["pitchCount", "Pitches"],
["inningsPitchedOuts", "IP Outs"],
["earnedRunsAllowed", "ER"],
["hitsAllowed", "H Allowed"],
["walksAllowed", "BB Allowed"],
["strikeoutsPitched", "Pitching K"]
] as const;
function pickDefaultLineupId(gameDate: string, lineups: LineupRecord[]) {
const exactDate = lineups.find((lineup) => lineup.gameDate === gameDate);
return exactDate?._id ?? lineups[0]?._id ?? "";
@@ -196,16 +204,6 @@ export function GameScoringClient() {
<span className="field-label">Opponent</span>
<Input value={opponent} onChange={(event) => setOpponent(event.target.value)} placeholder="Optional" />
</label>
<div className="grid grid-cols-2 gap-3">
<label>
<span className="field-label">Our Score</span>
<Input type="number" min={0} value={teamScore} onChange={(event) => setTeamScore(event.target.value)} />
</label>
<label>
<span className="field-label">Their Score</span>
<Input type="number" min={0} value={opponentScore} onChange={(event) => setOpponentScore(event.target.value)} />
</label>
</div>
<label className="md:col-span-2">
<span className="field-label">Game Notes</span>
<Textarea rows={3} value={notes} onChange={(event) => setNotes(event.target.value)} />
@@ -230,9 +228,29 @@ export function GameScoringClient() {
{selectedLineup && isScoring ? (
<SectionCard
title="Player Results"
description="Stat entry is optional. Leave any field blank if you do not want to track it for that player."
description="Enter player results as the game unfolds. Final score lives here because you know it once the game is actually being scored."
>
<div className="grid gap-3">
<div className="grid grid-cols-2 gap-3 rounded-[1.5rem] border border-border bg-muted/30 p-4 md:max-w-sm">
<label>
<span className="field-label">Our Score</span>
<Input
type="number"
min={0}
value={teamScore}
onChange={(event) => setTeamScore(event.target.value)}
/>
</label>
<label>
<span className="field-label">Their Score</span>
<Input
type="number"
min={0}
value={opponentScore}
onChange={(event) => setOpponentScore(event.target.value)}
/>
</label>
</div>
{selectedLineup.battingOrder.map((slot, index) => {
const statLine = playerStats[slot.playerId] ?? {
playerId: slot.playerId,
@@ -251,20 +269,47 @@ export function GameScoringClient() {
<p className="text-xs text-muted-foreground">Batting order slot {index + 1}</p>
</div>
</div>
<div className="grid grid-cols-3 gap-2 sm:grid-cols-5 lg:grid-cols-6">
{statFields.map(([field, label]) => (
<label key={field}>
<span className="field-label">{label}</span>
<Input
type="number"
min={0}
value={statLine[field] ?? ""}
onChange={(event) =>
updatePlayerStat(slot.playerId, slot.playerName, field, event.target.value)
}
/>
</label>
))}
<div className="grid gap-3">
<div>
<p className="mb-2 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground">
Batting Line
</p>
<div className="grid grid-cols-3 gap-2 sm:grid-cols-5 lg:grid-cols-6">
{battingFields.map(([field, label]) => (
<label key={field}>
<span className="field-label">{label}</span>
<Input
type="number"
min={0}
value={statLine[field] ?? ""}
onChange={(event) =>
updatePlayerStat(slot.playerId, slot.playerName, field, event.target.value)
}
/>
</label>
))}
</div>
</div>
<div>
<p className="mb-2 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground">
Pitching Line
</p>
<div className="grid grid-cols-2 gap-2 sm:grid-cols-3 lg:grid-cols-6">
{pitchingFields.map(([field, label]) => (
<label key={field}>
<span className="field-label">{label}</span>
<Input
type="number"
min={0}
value={statLine[field] ?? ""}
onChange={(event) =>
updatePlayerStat(slot.playerId, slot.playerName, field, event.target.value)
}
/>
</label>
))}
</div>
</div>
</div>
</CardContent>
</Card>