2026-08-07 15:36:02 +02:00
|
|
|
# Changelog
|
|
|
|
|
|
2026-09-06 23:23:35 +02:00
|
|
|
Tutte le modifiche significative del progetto, dalla più recente. Il formato segue
|
|
|
|
|
[Keep a Changelog](https://keepachangelog.com/it/1.1.0/) e la numerazione
|
|
|
|
|
[Semantic Versioning](https://semver.org/lang/it/): il numero di versione è quello di
|
|
|
|
|
`package.json`.
|
2026-08-07 15:36:02 +02:00
|
|
|
|
2026-09-06 23:23:35 +02:00
|
|
|
L'elenco delle funzionalità disponibili e previste non si ripete qui: sta in
|
|
|
|
|
[ROADMAP.md](ROADMAP.md), che elenca il _cosa_ senza numeri di versione — quelli stanno solo
|
|
|
|
|
qui.
|
2026-08-07 15:36:02 +02:00
|
|
|
|
2026-09-06 23:23:35 +02:00
|
|
|
## [Non rilasciato] — 0.9.0
|
2026-09-06 22:11:26 +02:00
|
|
|
|
2026-09-06 23:23:35 +02:00
|
|
|
Prima versione, pre-release.
|
2026-09-06 22:11:26 +02:00
|
|
|
|
2026-09-06 23:23:35 +02:00
|
|
|
### Aggiunto
|
2026-09-06 19:30:49 +02:00
|
|
|
|
2026-09-06 23:23:35 +02:00
|
|
|
- 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](modules/profilo-giocatore.md).
|
|
|
|
|
- Tracciamento del tesseramento CSI: numero e data di tessera in `giocatori_squadra`, badge e
|
|
|
|
|
contatore in dashboard (migration `m8_tesseramento_csi`).
|
|
|
|
|
- Foto profilo condivise tra dispositivi tramite il bucket pubblico `avatar-giocatori`
|
|
|
|
|
(migration `m6_avatar_giocatori`).
|
|
|
|
|
- Serie di presenze calcolate sui dati reali (`serieConsecutiva()`), con la colonna
|
|
|
|
|
`risposto_il` che congela l'istante della **prima** risposta tramite trigger (migration
|
|
|
|
|
`m9_risposte_presenze_risposto_il`): sblocca la serie "Conferme 24h" e i badge "Risposta
|
|
|
|
|
lampo" e "Mai un forfait" — [modules/serie-presenze.md](modules/serie-presenze.md).
|
|
|
|
|
- Scout Live sincronizzato tra dispositivi: il blocco "chi sta scoutando" passa dalla tabella
|
|
|
|
|
`scout_sessioni` e le partite concluse vengono archiviate in `scout_partite` (migration
|
|
|
|
|
`m7_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`+`ora` della partita, anche senza risultato caricato — [modules/mvp.md](modules/mvp.md).
|
2026-09-08 14:08:52 +02:00
|
|
|
- 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](modules/badge.md).
|
2026-09-07 14:06:15 +02:00
|
|
|
- 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.
|
2026-09-06 23:23:35 +02:00
|
|
|
- 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](modules/collegamento-csi.md).
|
|
|
|
|
- Note dell'evento visibili in `/allenamento/$id` e `/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=cover` e
|
|
|
|
|
`theme-color` coerenti con un'app chiara, `lang="it"`, `:focus-visible` globale, tocchi da
|
|
|
|
|
44px, `aria-current`/`aria-pressed`/`aria-controls`/`aria-busy`, niente testo sotto i 12px.
|
|
|
|
|
- Movimento con molle interrompibili di `motion` al posto delle `@keyframes` a 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 test` e `npm run test:all`.
|
|
|
|
|
- Convenzioni interne: primitive condivise (`Card`, `Campo`, `classiInput` in `ui-bits`),
|
|
|
|
|
cache aggiornata con `setQueryData` invece di rileggere il database dopo ogni scrittura, e
|
|
|
|
|
logica pura estratta in `src/lib/` con i suoi test.
|
|
|
|
|
- Infrastruttura di sviluppo: migrazione da Lovable a sviluppo locale, repository GitHub
|
|
|
|
|
indipendente, deploy automatico su Vercel.
|
2026-09-06 19:30:49 +02:00
|
|
|
|
2026-09-09 08:36:53 +02:00
|
|
|
### 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.
|
2026-09-09 09:32:19 +02:00
|
|
|
- Tolto l'hint statico "+2 questo mese" dalla StatTile Presenze in home (sezione «Colpo
|
|
|
|
|
d'occhio»): mostrava un testo fisso, non un dato calcolato.
|
2026-09-09 09:56:56 +02:00
|
|
|
- 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 conteggi `mvp` già mostrati possono scendere per effetto della nuova regola.
|
2026-09-09 10:16:29 +02:00
|
|
|
- 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
|
2026-09-09 10:24:43 +02:00
|
|
|
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).
|
2026-09-09 10:32:16 +02:00
|
|
|
- La bonifica sopra è ora anche una funzione richiamabile, `bonifica_dati_evento_orfani()`
|
|
|
|
|
(migration `m16_funzione_bonifica_dati_evento_orfani`, riservata al service role), coperta
|
|
|
|
|
da test di integrazione invece che verificata solo a mano (DD-029).
|
2026-09-09 08:36:53 +02:00
|
|
|
|
2026-09-06 23:23:35 +02:00
|
|
|
### Sicurezza
|
2026-09-06 19:30:49 +02:00
|
|
|
|
2026-09-06 23:23:35 +02:00
|
|
|
- Migration `m4_solo_autenticati`: tolto al ruolo `anon` l'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 vincoli `mvp_no_autovoto` e `badge_social_no_autovoto`
|
|
|
|
|
rifiutano l'auto-voto anche a chi scrive direttamente su PostgREST, come già faceva
|
|
|
|
|
`pagelle_voti`.
|
|
|
|
|
- Al voto MVP partecipano solo i presenti (o in ritardo) di quell'evento; il filtro è
|
|
|
|
|
applicativo, non RLS ([modules/mvp.md](modules/mvp.md)).
|
2026-09-08 14:08:52 +02:00
|
|
|
- Migration `m13_convocati_e_pagelle_chiuse` (DD-027): la policy di M11 su `pagelle_voti`,
|
|
|
|
|
`mvp_voti` e `badge_social_voti` verifica ora anche che votante e votato siano tra i
|
|
|
|
|
convocati dell'evento, e per le sole pagelle che `pagelle_chiuse` sia falso — prima erano
|
|
|
|
|
filtri solo applicativi, aggirabili scrivendo direttamente su PostgREST.
|
2026-09-06 23:23:35 +02:00
|
|
|
- La suite copre i rifiuti `401` di `richiediAdmin` (DD-024), i permessi di
|
|
|
|
|
`badge_social_voti` e le deroghe admin di M11, e verifica che un ripensamento non riscriva
|
|
|
|
|
`risposto_il` (trigger di `m9`).
|