Rinomina le tab del profilo in Documenti e Opzioni.
«Tesseramento» nominava lo scopo invece del contenuto (dati personali, documento, certificato medico, foto tessera); cambia anche la rotta in /profilo?tab=documenti. «Impostazioni» diventa «Opzioni» così le quattro etichette stanno in uno schermo da telefono: le voci della barra si dividono la riga in parti uguali (grow basis-0) e tornano a scorrere solo se non ci stanno, quindi vale anche per Squadra e Classifica. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -6,6 +6,16 @@ qui: sta in [ROADMAP.md](ROADMAP.md).
|
|||||||
|
|
||||||
## Versione attuale — agosto 2026
|
## Versione attuale — agosto 2026
|
||||||
|
|
||||||
|
### Profilo: tab Documenti e Opzioni, barra senza scroll
|
||||||
|
|
||||||
|
- L'etichetta nominava lo scopo (il tesseramento CSI) invece del contenuto: dentro ci sono
|
||||||
|
dati personali, documento, certificato medico e foto tessera. Cambia anche la rotta
|
||||||
|
(`/profilo?tab=documenti`): i vecchi link `?tab=tesseramento` aprono la tab Stagione.
|
||||||
|
- «Impostazioni» diventa «Opzioni»: con le quattro etichette accorciate la barra delle
|
||||||
|
sottosezioni ci sta in uno schermo da telefono. Le voci ora si dividono la riga in parti
|
||||||
|
uguali (`grow basis-0`) e tornano a scorrere solo se non ci stanno, quindi vale anche per
|
||||||
|
le barre di Squadra e Classifica.
|
||||||
|
|
||||||
### Palloni: allenamenti senza proposta automatica
|
### Palloni: allenamenti senza proposta automatica
|
||||||
|
|
||||||
- `completaTurni` non assegna più gli allenamenti: restano «da assegnare» finché non si
|
- `completaTurni` non assegna più gli allenamenti: restano «da assegnare» finché non si
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ persistente: la riga viene eliminata non appena letta dal service worker).
|
|||||||
|
|
||||||
## Iscrizione alle notifiche push
|
## Iscrizione alle notifiche push
|
||||||
|
|
||||||
In Profilo → Impostazioni c’è **un solo interruttore** («Notifiche»). Non esistono preferenze
|
In Profilo → Opzioni c’è **un solo interruttore** («Notifiche»). Non esistono preferenze
|
||||||
separate per tipo di messaggio: l’iscrizione registra il dispositivo e lo rende destinatario
|
separate per tipo di messaggio: l’iscrizione registra il dispositivo e lo rende destinatario
|
||||||
di **tutte** le push (promemoria palloni, solleciti presenze) e abilita anche le notifiche
|
di **tutte** le push (promemoria palloni, solleciti presenze) e abilita anche le notifiche
|
||||||
smart in app, che usano lo stesso service worker.
|
smart in app, che usano lo stesso service worker.
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ Viene mostrata una barra di avanzamento (esempio: _Profilo completato — 85%_),
|
|||||||
|
|
||||||
Quando tutte le sezioni sono complete il widget scompare automaticamente.
|
Quando tutte le sezioni sono complete il widget scompare automaticamente.
|
||||||
|
|
||||||
Il tap apre Profilo sulla sottosezione **Tesseramento** (`/profilo?tab=tesseramento`), non
|
Il tap apre Profilo sulla sottosezione **Documenti** (`/profilo?tab=documenti`), non
|
||||||
sulla tab Stagione.
|
sulla tab Stagione.
|
||||||
|
|
||||||
## Profilo
|
## Profilo
|
||||||
@@ -142,7 +142,7 @@ Sezione già presente.
|
|||||||
|
|
||||||
Contiene tutti i badge ottenuti e quelli ancora da sbloccare.
|
Contiene tutti i badge ottenuti e quelli ancora da sbloccare.
|
||||||
|
|
||||||
### Impostazioni
|
### Opzioni
|
||||||
|
|
||||||
Contiene.
|
Contiene.
|
||||||
|
|
||||||
@@ -159,7 +159,7 @@ Contiene.
|
|||||||
## Dashboard amministratore
|
## Dashboard amministratore
|
||||||
|
|
||||||
Gli amministratori dispongono di una schermata dedicata (`/admin`, raggiungibile da
|
Gli amministratori dispongono di una schermata dedicata (`/admin`, raggiungibile da
|
||||||
Profilo → Impostazioni).
|
Profilo → Opzioni).
|
||||||
|
|
||||||
Per ogni giocatore vengono mostrati.
|
Per ogni giocatore vengono mostrati.
|
||||||
|
|
||||||
|
|||||||
@@ -80,7 +80,9 @@ export function BarraSottosezioni({
|
|||||||
vaiA(i);
|
vaiA(i);
|
||||||
}}
|
}}
|
||||||
className={cn(
|
className={cn(
|
||||||
"snap-center shrink-0 rounded-full px-3.5 py-2 text-xs font-bold uppercase tracking-wide transition-colors",
|
// grow+basis-0: se le voci ci stanno riempiono la riga in parti uguali,
|
||||||
|
// altrimenti shrink-0 le tiene leggibili e la barra torna a scorrere.
|
||||||
|
"snap-center shrink-0 grow basis-0 rounded-full px-3.5 py-2 text-xs font-bold uppercase tracking-wide transition-colors",
|
||||||
"min-h-11 touch-manipulation whitespace-nowrap",
|
"min-h-11 touch-manipulation whitespace-nowrap",
|
||||||
selezionata
|
selezionata
|
||||||
? "bg-accent text-accent-foreground shadow-pop"
|
? "bg-accent text-accent-foreground shadow-pop"
|
||||||
|
|||||||
@@ -418,7 +418,7 @@ export function CompletaProfilo({
|
|||||||
<Reveal indice={indice} className="px-5 pt-4">
|
<Reveal indice={indice} className="px-5 pt-4">
|
||||||
<Link
|
<Link
|
||||||
to="/profilo"
|
to="/profilo"
|
||||||
search={{ tab: "tesseramento" }}
|
search={{ tab: "documenti" }}
|
||||||
className="premi block rounded-3xl bg-card p-4 shadow-card"
|
className="premi block rounded-3xl bg-card p-4 shadow-card"
|
||||||
>
|
>
|
||||||
<div className="flex items-center justify-between gap-3">
|
<div className="flex items-center justify-between gap-3">
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ import { esci } from "@/lib/auth";
|
|||||||
import { useIsAdmin } from "@/lib/ruoli";
|
import { useIsAdmin } from "@/lib/ruoli";
|
||||||
import { Reveal } from "@/components/motion/Reveal";
|
import { Reveal } from "@/components/motion/Reveal";
|
||||||
|
|
||||||
const TAB_PROFILO = ["stagione", "badge", "tesseramento", "impostazioni"] as const;
|
const TAB_PROFILO = ["stagione", "badge", "documenti", "impostazioni"] as const;
|
||||||
type TabProfilo = (typeof TAB_PROFILO)[number];
|
type TabProfilo = (typeof TAB_PROFILO)[number];
|
||||||
|
|
||||||
function isTabProfilo(v: unknown): v is TabProfilo {
|
function isTabProfilo(v: unknown): v is TabProfilo {
|
||||||
@@ -233,13 +233,13 @@ function Profilo() {
|
|||||||
contenuto: <CollezioneBadge g={g} votiSocial={votiSocial.data ?? []} />,
|
contenuto: <CollezioneBadge g={g} votiSocial={votiSocial.data ?? []} />,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "tesseramento",
|
id: "documenti",
|
||||||
label: "Tesseramento",
|
label: "Documenti",
|
||||||
contenuto: <ProfiloAmministrativo giocatoreId={g.id} conTendina={false} />,
|
contenuto: <ProfiloAmministrativo giocatoreId={g.id} conTendina={false} />,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "impostazioni",
|
id: "impostazioni",
|
||||||
label: "Impostazioni",
|
label: "Opzioni",
|
||||||
contenuto: (
|
contenuto: (
|
||||||
<div className="space-y-3">
|
<div className="space-y-3">
|
||||||
<div className="divide-y divide-border overflow-hidden rounded-3xl bg-card shadow-card">
|
<div className="divide-y divide-border overflow-hidden rounded-3xl bg-card shadow-card">
|
||||||
|
|||||||
Reference in New Issue
Block a user