diff --git a/apps/backend/src/index.ts b/apps/backend/src/index.ts index 083cdc0..97d07f8 100644 --- a/apps/backend/src/index.ts +++ b/apps/backend/src/index.ts @@ -439,20 +439,25 @@ class Sportsmanager { }, } : undefined, - firstLeg: match.hinspiel - ? { - homeTeam: { - ...teams[match.hinspiel.heim_team_id], - goals: Number(match.hinspiel.heim_punkte), - points: Number(match.hinspiel.heim_spielpunkte), - }, - awayTeam: { - ...teams[match.hinspiel.gast_team_id], - goals: Number(match.hinspiel.gast_punkte), - points: Number(match.hinspiel.gast_spielpunkte), - }, - } - : undefined, + firstLeg: + match.hinspiel && + !( + Number(match.hinspiel.heim_punkte) === 0 && + Number(match.hinspiel.gast_punkte) === 0 + ) + ? { + homeTeam: { + ...teams[match.hinspiel.heim_team_id], + goals: Number(match.hinspiel.heim_punkte), + points: Number(match.hinspiel.heim_spielpunkte), + }, + awayTeam: { + ...teams[match.hinspiel.gast_team_id], + goals: Number(match.hinspiel.gast_punkte), + points: Number(match.hinspiel.gast_spielpunkte), + }, + } + : undefined, // orig: { teams, home, away, match, homeTeam, awayTeam }, }; }; diff --git a/apps/frontend/src/pages/MatchDetails.tsx b/apps/frontend/src/pages/MatchDetails.tsx index 9e7b234..26d794c 100644 --- a/apps/frontend/src/pages/MatchDetails.tsx +++ b/apps/frontend/src/pages/MatchDetails.tsx @@ -53,37 +53,171 @@ export function MatchPage() { ); } +const SLOT_LABEL: Record = { + SINGLE: "Einzel", + DOUBLE: "Doppel", + SHOOT_OUT: "Shootout", +}; + +const SLOT_TEXT: Record = { + SINGLE: "text-emerald-400/80", + DOUBLE: "text-sky-400/80", + SHOOT_OUT: "text-amber-400/80", +}; + +function sidePlayers(side: any) { + return Array.isArray(side?.players) + ? side.players.filter((p: any) => p !== null && p !== undefined) + : []; +} + +function PlayerChip(props: { + player: any; + side: "home" | "away"; + winning?: boolean; +}) { + const p = () => props.player; + const name = () => (p() ? `${p().firstName} ${p().lastName}`.trim() : "Unbesetzt"); + const avatar = ( +
+ + {p()?.firstName?.[0]?.toUpperCase() || "?"} + + } + > + + +
+ ); + const label = ( + + {name()} + + ); + return ( +
+ {props.side === "home" ? ( + <> + {avatar} + {label} + + ) : ( + <> + {label} + {avatar} + + )} +
+ ); +} + +function PlayerSide(props: { + side: any; + align: "home" | "away"; + winning?: boolean; +}) { + const players = () => sidePlayers(props.side); + return ( +
+ 0} + fallback={ + + — + + } + > + {players().map((player: any) => ( + + ))} + +
+ ); +} + +function SlotCard(props: { slot: any }) { + const slot = () => props.slot; + const sets = () => (slot().sets ?? []).filter((s: any) => s !== null); + const homeTotal = () => + sets().reduce((n: number, s: any) => n + (Number(s.homeGoals) || 0), 0); + const awayTotal = () => + sets().reduce((n: number, s: any) => n + (Number(s.awayGoals) || 0), 0); + const homeWins = () => homeTotal() > awayTotal(); + const awayWins = () => awayTotal() > homeTotal(); + + return ( +
+
+ + {SLOT_LABEL[slot().type] || slot().type} + +
+
+ + +
+ 0} + fallback={} + > + {sets().map((s: any) => ( + + ))} + +
+ + +
+
+ ); +} + function MatchDetails(props: { match: any }) { return ( <>
-
- {props.match.slots?.map((s) => { - return ( -
- {s.type} -
-
- {s.home.players.map((p) => ( -
{p ? `${p.firstName} ${p.lastName}` : "-"}
- ))} -
-
- {s.sets.map((s) => ( - - ))} -
-
- {s.away.players.map((p) => ( -
{p ? `${p.firstName} ${p.lastName}` : "-"}
- ))} -
-
+
+ + Noch keine Ergebnisse
- ); - })} + } + > + {props.match.slots.map((s: any) => ( + + ))} +
);