Dashboard admin: aggiungi, disattiva e riattiva giocatori
- Aggiungi giocatore: nuovo form in /admin (nome, cognome, numero, ruolo, email opzionale), id g<N> calcolato in automatico. - Email modificabile anche per i giocatori già in rosa dal pannello Dati squadra, non solo alla creazione — completa quanto rimandato da DD-018. - Disattiva/Riattiva: un giocatore che lascia la squadra sparisce dalla rosa attiva senza che la riga venga eliminata, così presenze, voti, pagelle e badge della stagione restano agganciati al suo id. Nuova sezione "Giocatori disattivati" per riattivarli. - Messaggio d'errore leggibile per l'unico vincolo unique della tabella (email duplicata) invece del codice Postgres grezzo. Nessuna migration: sia l'inserimento sia la modifica passano dalla policy admin FOR ALL già esistente su giocatori_squadra. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -4,6 +4,7 @@ import {
|
||||
dividiNome,
|
||||
nomeCompleto,
|
||||
numeroGiaUsato,
|
||||
prossimoIdGiocatore,
|
||||
rosaFallback,
|
||||
slotDi,
|
||||
slotPerEmail,
|
||||
@@ -84,7 +85,7 @@ assert.equal(
|
||||
assert.equal(slotPerEmail(rosaEmail, ""), null, "stringa vuota trattata come nessuna email");
|
||||
|
||||
// --- validaDatiSquadra ----------------------------------------------------------------
|
||||
const datiOk = { nome: "Mario", cognome: "Rossi", numero: 7, ruolo: "schiacciatore" };
|
||||
const datiOk = { nome: "Mario", cognome: "Rossi", numero: 7, ruolo: "schiacciatore", email: null };
|
||||
assert.equal(validaDatiSquadra(datiOk), null, "dati validi: nessun errore");
|
||||
assert.match(validaDatiSquadra({ ...datiOk, nome: "" })!, /nome/i);
|
||||
assert.match(
|
||||
@@ -105,6 +106,29 @@ assert.match(
|
||||
/numero/i,
|
||||
"il numero deve essere intero",
|
||||
);
|
||||
assert.equal(
|
||||
validaDatiSquadra({ ...datiOk, email: "foo@bar.com" }),
|
||||
null,
|
||||
"email valida: nessun errore",
|
||||
);
|
||||
assert.equal(
|
||||
validaDatiSquadra({ ...datiOk, email: "" }),
|
||||
null,
|
||||
"email vuota è ammessa: non ancora nota",
|
||||
);
|
||||
assert.match(
|
||||
validaDatiSquadra({ ...datiOk, email: "non-e-una-email" })!,
|
||||
/email/i,
|
||||
"senza @ l'email non è valida",
|
||||
);
|
||||
|
||||
// --- prossimoIdGiocatore ----------------------------------------------------------------
|
||||
assert.equal(
|
||||
prossimoIdGiocatore([riga({ id: "g1" }), riga({ id: "g3" }), riga({ id: "g2" })]),
|
||||
"g4",
|
||||
"il prossimo id segue il numero più alto già in uso",
|
||||
);
|
||||
assert.equal(prossimoIdGiocatore([]), "g1", "rosa vuota: si parte da g1");
|
||||
|
||||
// --- numeroGiaUsato ----------------------------------------------------------------
|
||||
const rosaNumeri: GiocatoreSquadra[] = [
|
||||
|
||||
@@ -149,7 +149,7 @@ assert.equal(slotDi(squadra, "u2")?.id, "g2");
|
||||
assert.equal(slotDi(squadra, "sconosciuto"), null);
|
||||
|
||||
// --- dati squadra modificabili dall'admin (DD-017) ---------------------------
|
||||
const datiOk = { nome: "Ivan", cognome: "Cacciari", numero: 23, ruolo: "Banda" };
|
||||
const datiOk = { nome: "Ivan", cognome: "Cacciari", numero: 23, ruolo: "Banda", email: null };
|
||||
assert.equal(validaDatiSquadra(datiOk), null);
|
||||
assert.match(validaDatiSquadra({ ...datiOk, nome: " " }) ?? "", /nome/i);
|
||||
assert.match(validaDatiSquadra({ ...datiOk, cognome: "" }) ?? "", /cognome/i);
|
||||
|
||||
Reference in New Issue
Block a user