From a9f146d77ef7ec176aa09d49940d9982b02aae2d Mon Sep 17 00:00:00 2001 From: Ivan Cacciari Date: Wed, 9 Sep 2026 21:01:49 +0200 Subject: [PATCH] Migliora le schede dello storico partite: loghi, casa-ospite e chevron. Co-authored-by: Cursor --- docs/CHANGELOG.md | 6 ++ docs/modules/collegamento-csi.md | 3 +- src/routes/classifica.tsx | 132 ++++++++++++++++++++++++------- 3 files changed, 111 insertions(+), 30 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index c3b03b1..0b37be5 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -12,6 +12,12 @@ all'indietro. ## [Non rilasciato] +### Modificato + +- **Storico partite** — ogni scheda mostra il logo accanto al nome di entrambe le squadre + (CRAP e avversario), risultato e parziali in ordine casa–ospite (verde/rosso restano + vittoria/sconfitta CRAP) e un chevron a destra per chiarire che la riga apre il dettaglio. + ## [0.9.0] - 2026-09-09 Prima versione pre-release: lo sviluppo precedente non era versionato a parte, quindi diff --git a/docs/modules/collegamento-csi.md b/docs/modules/collegamento-csi.md index 0261615..ec894b5 100644 --- a/docs/modules/collegamento-csi.md +++ b/docs/modules/collegamento-csi.md @@ -154,7 +154,8 @@ CSI (portale) useCsi() → src/lib/csi.ts (React Query, staleTime 6h) ↓ /classifica → src/routes/classifica.tsx (tab "Classifica": Coppa sopra, Girone - sotto; tab "Storico partite": ogni gara cliccabile) + sotto; tab "Storico partite": ogni squadra col proprio logo, + chevron di dettaglio sulle gare cliccabili) CSI (portale, 3 endpoint) ↓ fetch server-side on-demand, cache per-partita 6 ore diff --git a/src/routes/classifica.tsx b/src/routes/classifica.tsx index 0b40f59..364fdee 100644 --- a/src/routes/classifica.tsx +++ b/src/routes/classifica.tsx @@ -3,7 +3,7 @@ import { createFileRoute, Link } from "@tanstack/react-router"; import { AlertTriangle, ChevronRight, RefreshCw } from "lucide-react"; import { cn } from "@/lib/utils"; import { formatData, type RigaClassifica } from "@/lib/crapp-data"; -import { PageHeader } from "@/components/crapp/ui-bits"; +import { PageHeader, TeamLogo } from "@/components/crapp/ui-bits"; import { BarraSottosezioni } from "@/components/crapp/BarraSottosezioni"; import { useScoutMatches } from "@/lib/scout-store"; import { useCsi } from "@/lib/csi"; @@ -12,6 +12,43 @@ import { useVotiMvp, vincitoriMvp } from "@/lib/mvp-voti"; import { useEventi } from "@/lib/eventi"; import { LogoSquadra } from "@/components/crapp/DettaglioCsi"; +const LOGO_NOI = "/logo-nerorosso.svg"; +const NOME_NOI = "CRAP Volley"; + +/** Logo CRAP o avversario; cerchio con iniziali se il CSI non ha l'immagine. */ +function LogoPartita({ + nostro, + logoAvversario, + avversario, +}: { + nostro: boolean; + logoAvversario: string; + avversario: string; +}) { + if (nostro) { + return ( + + ); + } + if (logoAvversario) { + return ; + } + const iniziali = avversario + .split(/\s+/) + .filter(Boolean) + .slice(0, 2) + .map((p) => p[0]?.toUpperCase() ?? "") + .join(""); + return ( + + {iniziali || "?"} + + ); +} + const TAB_CLASSIFICA = ["classifica", "storico"] as const; type TabClassifica = (typeof TAB_CLASSIFICA)[number]; @@ -169,60 +206,96 @@ function Classifica() { {tuttiMatch.map((m) => { const vinta = m.setNostri > m.setLoro; const eventoId = eventoIdPerData.get(m.data); + const cliccabile = Boolean(eventoId) || !m.scout; + const casa = { + nome: m.casa ? NOME_NOI : m.avversario, + nostro: m.casa, + }; + const trasferta = { + nome: m.casa ? m.avversario : NOME_NOI, + nostro: !m.casa, + }; + // Badge e parziali in ordine casa–ospite; il colore resta sulla vittoria CRAP. + const setCasa = m.casa ? m.setNostri : m.setLoro; + const setOspite = m.casa ? m.setLoro : m.setNostri; const contenuto = ( <> -
-
- -
-

- {m.casa ? "CRAP Volley" : m.avversario} vs{" "} - {m.casa ? m.avversario : "CRAP Volley"} -

-

- {formatData(m.data)} · MVP {m.mvp || "da votare"} - {m.scout ? " · scoutata" : ""} -

+
+
+
+ +

{casa.nome}

+
+ +

{trasferta.nome}

+
+

+ {formatData(m.data)} · MVP {m.mvp || "da votare"} + {m.scout ? " · scoutata" : ""} +

- {m.setNostri}-{m.setLoro} + {setCasa}-{setOspite} + {cliccabile ? ( + + ) : null}
- {m.parziali.map((p, i) => ( - p[1] ? "bg-secondary" : "bg-muted text-muted-foreground", - )} - > - {p[0]}-{p[1]} - - ))} + {m.parziali.map((p, i) => { + const puntiCasa = m.casa ? p[0] : p[1]; + const puntiOspite = m.casa ? p[1] : p[0]; + const setVintoDaNoi = p[0] > p[1]; + return ( + + {puntiCasa}-{puntiOspite} + + ); + })} {eventoId && !m.mvp ? ( - Vota MVP + Vota MVP ) : null}
); + const aria = `${casa.nome} vs ${trasferta.nome}: dettaglio partita`; if (eventoId) { return ( {contenuto} @@ -240,7 +313,8 @@ function Classifica() { key={m.id} to="/partita-csi/$id" params={{ id: m.id }} - className="premi block rounded-3xl bg-card p-4 shadow-card active:scale-[0.99]" + aria-label={aria} + className="premi block rounded-3xl bg-card p-4 shadow-card ring-1 ring-transparent transition-[box-shadow,transform] active:scale-[0.99] hover:ring-accent/30" > {contenuto}