Implementa il ruolo allenatore nell'app
- Modello: tipo sugli slot, inRosa() al posto del filtro su attivo in tutte le letture della rosa di gioco (presenze, convocati, voti, palloni, classifiche, badge, sollecito); gli allenatori restano solo nei compleanni e in Squadra. - Permessi: user_roles letto una volta per tutti i ruoli; usePuoGestireEventi() apre /eventi e il sollecito presenze anche all'allenatore, lato server con richiediGestoreEventi(). Palloni, sondaggio e messaggi restano all'admin. - Identità: useGiocatoreInCampo() è null per l'allenatore, così non risponde alle presenze e non vota; useSonoAllenatore() decide cosa si vede. - Profilo: per l'allenatore solo Docs (nome, cognome, nascita, telefono, email) e Opzioni; card avatar e tab Opzioni estratte per riusarle. - Home, Squadra e partita: niente statistiche personali, badge, cacche e obiettivi per l'allenatore; in Rosa compare con la dicitura «Allenatore». - Admin: tipo in «Aggiungi», allenatori a parte in Profili, fuori da conteggi ed export CSI. Test unit su rosa di gioco e completamento, route test sull'allenatore. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
15a010855e
commit
2ec72fd08f
35 files changed
+1215
-577
No files matched your search
@@ -3,6 +3,7 @@ import assert from "node:assert/strict";
|
||||
import {
|
||||
aRigaProfilo,
|
||||
completamento,
|
||||
completamentoAllenatore,
|
||||
csvTesseramento,
|
||||
daRigaProfilo,
|
||||
sezioniComplete,
|
||||
@@ -115,6 +116,7 @@ const squadra: GiocatoreSquadra[] = [
|
||||
numeroTessera: null,
|
||||
dataTessera: null,
|
||||
nascita: null,
|
||||
tipo: "giocatore",
|
||||
},
|
||||
{
|
||||
id: "g2",
|
||||
@@ -128,6 +130,7 @@ const squadra: GiocatoreSquadra[] = [
|
||||
numeroTessera: null,
|
||||
dataTessera: null,
|
||||
nascita: null,
|
||||
tipo: "giocatore",
|
||||
},
|
||||
];
|
||||
const csv = csvTesseramento(squadra, { g1: completo });
|
||||
@@ -155,7 +158,14 @@ 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", email: null };
|
||||
const datiOk = {
|
||||
nome: "Ivan",
|
||||
cognome: "Cacciari",
|
||||
numero: 23,
|
||||
ruolo: "Banda",
|
||||
email: null,
|
||||
tipo: "giocatore" as const,
|
||||
};
|
||||
assert.equal(validaDatiSquadra(datiOk), null);
|
||||
assert.match(validaDatiSquadra({ ...datiOk, nome: " " }) ?? "", /nome/i);
|
||||
assert.match(validaDatiSquadra({ ...datiOk, cognome: "" }) ?? "", /cognome/i);
|
||||
@@ -184,4 +194,24 @@ assert.ok(
|
||||
"il fallback non può collegare account",
|
||||
);
|
||||
|
||||
// --- completamento dell'allenatore (DD-034) --------------------------------------
|
||||
assert.equal(completamentoAllenatore(null), 0, "senza profilo: 0%");
|
||||
assert.equal(
|
||||
completamentoAllenatore({ ...vuoto, dataNascita: "1980-01-01", telefono: "333" }),
|
||||
50,
|
||||
"due campi su quattro",
|
||||
);
|
||||
assert.equal(
|
||||
completamentoAllenatore({
|
||||
...vuoto,
|
||||
dataNascita: "1980-01-01",
|
||||
luogoNascita: "Bologna",
|
||||
telefono: "333",
|
||||
email: "a@b.it",
|
||||
}),
|
||||
100,
|
||||
"bastano i quattro dati personali: niente indirizzo, documento, certificato, foto",
|
||||
);
|
||||
assert.equal(completamentoAllenatore({ ...vuoto, telefono: " " }), 0, "spazi soli non contano");
|
||||
|
||||
console.log("profili-core: ok");
|
||||
Reference in new issue
Block a user