From 91ac7ce65c68d68fdde5097fce8d3b053e81c4ef Mon Sep 17 00:00:00 2001
From: Davide Grilli
Date: Fri, 6 Nov 2026 23:25:50 +0100
Subject: [PATCH] Sondaggio cacche: classifica completa per tutti i giocatori
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Elenco con posizioni a pari merito senza salti, barra proporzionale
e riga personale evidenziata, anche a sondaggio chiuso.
Sezione «Report tecnico» della partita rinominata «Scout».
Co-Authored-By: Claude Sonnet 5.5
---
docs/CHANGELOG.md | 6 ++
docs/modules/scout-live.md | 6 +-
src/components/crapp/SondaggioCacche.tsx | 81 +++++++++++++++++++-----
src/routes/partita.$id.tsx | 2 +-
4 files changed, 76 insertions(+), 19 deletions(-)
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index 9e6a58b..2d864b1 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -13,6 +13,12 @@ versioni `0.y.z` erano pre-release.
## [Non rilasciato]
+### Modificato
+
+- Sondaggio cacche: la classifica completa è visibile a tutti i giocatori, anche a sondaggio
+ chiuso, con posizioni a pari merito senza salti (1°, 1°, 2°) e la propria riga evidenziata.
+- Pagina partita: la sezione «Report tecnico» si chiama «Scout».
+
## [1.6.0] - 2026-11-02
Voto MVP definitivo e segreto, Scout live a valutazioni. Cinque migration, da `m35` a `m39`,
diff --git a/docs/modules/scout-live.md b/docs/modules/scout-live.md
index 7e5eb8e..c7d40e8 100644
--- a/docs/modules/scout-live.md
+++ b/docs/modules/scout-live.md
@@ -109,7 +109,7 @@ Senza punteggio, `chiudiSet()` chiude il set (come 0-0) se ha almeno una valutaz
parziali se ha dati (`parzialiFinali()`, `scout-store.ts`). Con nessuna valutazione risponde
«Nessun set da salvare». Una partita senza punti ha parziali 0-0 e **non è un risultato**:
`haPunteggio()` la esclude da Home, Classifica e dalla pagina della partita, dove non sostituisce il
-referto CSI; resta visibile il «Report tecnico» con il CSV.
+referto CSI; resta visibile il «Scout» con il CSV.
`finePartita()` (`scout.tsx`) compone i parziali finali, inserisce la partita in
`scout_partite` (INSERT, non upsert), poi cancella la riga da `scout_live` (stato consumato)
@@ -122,7 +122,7 @@ e rilascia la sessione.
`scout-export.ts` genera un CSV (separatore `;`, BOM UTF-8) con parziali, riepilogo per giocatore e
log cronologico delle azioni. Se ci sono valutazioni, aggiunge una tabella per set e giocatore con
i conteggi di «più» e «meno» di ogni fondamentale (solo per chi ne ha). Scaricabile dagli admin dalla
-pagina partita, sezione "Report tecnico".
+pagina partita, sezione "Scout".
---
@@ -156,7 +156,7 @@ calcolati a runtime).
- Le valutazioni dei set chiusi e delle partite finite sono salvate ma non si rivedono nell'app: lo
scout mostra solo il set in corso e l'unica lettura è il CSV admin. Evoluzione: tabella nella
pagina partita.
-- Il blocco «Report tecnico» della pagina partita mostra ancora Punti/Ace/Muri/Errori (a zero per le
+- Il blocco «Scout» della pagina partita mostra ancora Punti/Ace/Muri/Errori (a zero per le
partite di sole valutazioni) e non le valutazioni, che sono solo nel CSV admin.
- Scout aperto a tutta la squadra: nessun filtro su chi può registrare le azioni, l'unica
garanzia è il lock di sessione (vedi sopra).
diff --git a/src/components/crapp/SondaggioCacche.tsx b/src/components/crapp/SondaggioCacche.tsx
index ef5b58a..f7ed237 100644
--- a/src/components/crapp/SondaggioCacche.tsx
+++ b/src/components/crapp/SondaggioCacche.tsx
@@ -40,11 +40,15 @@ export function SondaggioCacche({
const media = mediaPartita(righe, eventoId);
const classifica = [...dellaPartita]
.sort((a, b) => b.quantita - a.quantita)
- .slice(0, 3)
.map((r) => {
const g = squadra.find((g) => g.id === r.giocatore_id);
return { ...r, nome: g ? nomeCompleto(g) : "—" };
- });
+ })
+ // Pari merito = stessa posizione, senza salti (1°, 1°, 2°).
+ .map((r, _, tutti) => ({
+ ...r,
+ pos: new Set(tutti.filter((t) => t.quantita > r.quantita).map((t) => t.quantita)).size + 1,
+ }));
async function rispondi(quantita: number) {
if (!io) return;
@@ -89,6 +93,7 @@ export function SondaggioCacche({
? "Sondaggio chiuso: era aperto fino al fischio d'inizio."
: "Apre alle 8:00 del giorno della partita: riceverai una notifica."}