I giocatori a pari valore condividono ora la stessa posizione (dense rank) invece di essere numerati in sequenza, e il sottotitolo di ogni riga segue il criterio scelto invece di mostrare sempre le presenze consecutive. Per Palloni mostra le volte consecutive in cui il giocatore li ha portati (nuovo Giocatore.seriePalloni). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
8.5 KiB
8.5 KiB
Changelog
Tutte le modifiche significative del progetto, dalla più recente. Il formato segue
Keep a Changelog e la numerazione
Semantic Versioning: il numero di versione è quello di
package.json.
L'elenco delle funzionalità disponibili e previste non si ripete qui: sta in ROADMAP.md, che elenca il cosa senza numeri di versione — quelli stanno solo qui.
[Non rilasciato] — 0.9.0
Prima versione, pre-release.
Aggiunto
- Login con Google tramite Supabase Auth e collegamento automatico dell'account al proprio
giocatore confrontando l'email (DD-011, DD-018; migration
m5_email_giocatori_squadra): senza sessione non si entra in nessuna schermata. - Dashboard amministratore
/admin: stato dei profili, download di documento, certificato e foto tessera, export CSV per il tesseramento, aggiunta e disattivazione dei giocatori (la riga non viene mai eliminata, così presenze, voti e badge restano agganciati al suo id). - Profilo giocatore: dati anagrafici, documento, certificato medico e foto tessera con le
relative scadenze (migration
m2_profili_giocatore, bucket privato), divisi nelle tab Stagione, Documenti e Opzioni — modules/profilo-giocatore.md. - Tracciamento del tesseramento CSI: numero e data di tessera in
giocatori_squadra, badge e contatore in dashboard (migrationm8_tesseramento_csi). - Foto profilo condivise tra dispositivi tramite il bucket pubblico
avatar-giocatori(migrationm6_avatar_giocatori). - Serie di presenze calcolate sui dati reali (
serieConsecutiva()), con la colonnarisposto_ilche congela l'istante della prima risposta tramite trigger (migrationm9_risposte_presenze_risposto_il): sblocca la serie "Conferme 24h" e i badge "Risposta lampo" e "Mai un forfait" — modules/serie-presenze.md. - Scout Live sincronizzato tra dispositivi: il blocco "chi sta scoutando" passa dalla tabella
scout_sessionie le partite concluse vengono archiviate inscout_partite(migrationm7_scout_partite). Si apre dalla sezione «Scout live» di/partita/$id, solo il giorno della partita, e può usarlo chiunque sia autenticato: uno per volta, grazie al lock. - Votazione MVP legata all'evento CrAPP e non al referto CSI o allo Scout: si apre due ore
dopo
data+oradella partita, anche senza risultato caricato — modules/mvp.md. - Badge Pagellone: la media pagelle conta per il badge solo con almeno
VOTI_MINIMI_PAGELLA(5) voti ricevuti — prima un singolo voto poteva sbloccarlo o farlo sparire senza nessuna significatività statistica — modules/badge.md. - Sondaggio pre-partita aperto dalle 8:00 del giorno della partita fino al fischio d'inizio
(poi resta chiuso, anche nei giorni successivi) e pulsante «Avvisa tutti del sondaggio» per
gli amministratori (
POST /api/public/apri-sondaggio); nessun cron, l'invio è manuale. - Turni palloni con rotazione automatica sulle partite e assegnazione manuale per gli allenamenti, che restano «da assegnare» finché non si sceglie (migration M10).
- Notifiche push con il testo cifrato dentro la push (
aes128gcm, RFC 8291), così arrivano anche ad app chiusa e a schermo bloccato (DD-026). - Collegamento CSI: classifica e risultati ufficiali letti dal portale Livescore CSI Bologna (stagione 2025/26, Open Misto Eccellenza, Girone B) — modules/collegamento-csi.md.
- Note dell'evento visibili in
/allenamento/$ide/partita/$id, con gli a capo mantenuti. - «Segnala un bug» e «Suggerisci una nuova funzionalità» in
/profilo: due link che aprono una issue GitHub sul template giusto, senza tabelle né schermate di gestione. - Interfaccia accessibile: contrasto dei token colore sopra 4.5:1,
viewport-fit=coveretheme-colorcoerenti con un'app chiara,lang="it",:focus-visibleglobale, tocchi da 44px,aria-current/aria-pressed/aria-controls/aria-busy, niente testo sotto i 12px. - Movimento con molle interrompibili di
motional posto delle@keyframesa durata fissa, swipe fra i mesi del calendario e barre di progresso che misurano l'avanzamento tra un traguardo e il successivo (DD-021). - Suite di test in
test/(unit, integration, end-to-end) eseguita con bun e senza nuove dipendenze:npm run testenpm run test:all. - Convenzioni interne: primitive condivise (
Card,Campo,classiInputinui-bits), cache aggiornata consetQueryDatainvece di rileggere il database dopo ogni scrittura, e logica pura estratta insrc/lib/con i suoi test. - Infrastruttura di sviluppo: migrazione da Lovable a sviluppo locale, repository GitHub indipendente, deploy automatico su Vercel.
Modificato
- In Squadra la classifica interna (filtro «Classifica per» + elenco) è sotto i 6 riquadri di Statistiche; la tab «Classifica» è stata rimossa dalla barra delle sottosezioni.
- Tolto l'hint statico "+2 questo mese" dalla StatTile Presenze in home (sezione «Colpo d'occhio»): mostrava un testo fisso, non un dato calcolato.
- La StatTile Media voto in home applica ora la stessa soglia minima di voti del badge
Pagellone (
VOTI_MINIMI_PAGELLA): sotto soglia mostra—invece di una media poco significativa (DD-028). - L'MVP di una partita richiede ora un quorum minimo di 2 voti totali (
VOTI_MINIMI_MVP) oltre al margine netto già richiesto: un solo voto non assegna più la vittoria (DD-028). Alcuni conteggimvpgià mostrati possono scendere per effetto della nuova regola. - Cancellare un evento pulisce ora a cascata, tramite trigger database, tutte le tabelle
collegate (presenze, pagelle, MVP, badge social, turni palloni, scout) invece di lasciarle
come righe orfane (migration
m14_pulizia_dati_evento_cancellato, DD-029). - Bonificate una tantum le righe orfane lasciate da cancellazioni precedenti a M14 (migration
m15_bonifica_dati_evento_orfani), senza toccare i vecchi voti MVP/pagelle/badge social legati a id Scout o CSI, che restano dati storici legittimi (DD-029). - La bonifica sopra è ora anche una funzione richiamabile,
bonifica_dati_evento_orfani()(migrationm16_funzione_bonifica_dati_evento_orfani, riservata al service role), coperta da test di integrazione invece che verificata solo a mano (DD-029).
Corretto
- Classifica interna di Squadra: a parità di valore (es. stesse presenze) i giocatori
condividono ora la stessa posizione invece di essere numerati in sequenza (
classificaRankinsrc/lib/rosa.ts); la corona di primo posto va a tutti i pari merito in testa, non solo al primo dell'elenco. - Il sottotitolo di ogni riga della classifica interna di Squadra mostrava sempre le
"presenze consecutive" anche ordinando per Media voto, MVP, Palloni o Cacche, un dato
scollegato dal criterio scelto: ora segue il criterio selezionato (
dettaglioClassificainsrc/lib/rosa.ts). Per Palloni mostra le volte consecutive in cui il giocatore li ha portati (nuovo campoGiocatore.seriePalloni, calcolato daserieConsecutivaPalloniinsrc/lib/palloni-core.ts), non più le presenze.
Sicurezza
- Migration
m4_solo_autenticati: tolto al ruoloanonl'accesso alle tabelle dell'app (applicata in produzione il 03/09/2026). - I permessi di amministrazione arrivano solo da
user_roles(src/lib/ruoli.ts): senza, basterebbe scegliere il nome giusto per amministrare. - Migration
m11_scritture_per_ruolo: ogni voto è firmato con lo slot collegato all'account (DD-023); il collegamento account → giocatore non è modificabile dal giocatore stesso (DD-016). - Migration
m12_niente_autovoto: i vincolimvp_no_autovotoebadge_social_no_autovotorifiutano l'auto-voto anche a chi scrive direttamente su PostgREST, come già facevapagelle_voti. - Al voto MVP partecipano solo i presenti (o in ritardo) di quell'evento; il filtro è applicativo, non RLS (modules/mvp.md).
- Migration
m13_convocati_e_pagelle_chiuse(DD-027): la policy di M11 supagelle_voti,mvp_votiebadge_social_votiverifica ora anche che votante e votato siano tra i convocati dell'evento, e per le sole pagelle chepagelle_chiusesia falso — prima erano filtri solo applicativi, aggirabili scrivendo direttamente su PostgREST. - La suite copre i rifiuti
401dirichiediAdmin(DD-024), i permessi dibadge_social_votie le deroghe admin di M11, e verifica che un ripensamento non riscrivarisposto_il(trigger dim9).