longevity: pagina /longevity/progressione, grafico e tabella dell'andamento

Progressione.tsx: una linea per macro-score (connectNulls=false: un dato
mancante è un buco, non una linea inventata), tratteggio e spessore a
distinguere le serie invece di un colore nuovo, riga verticale tratteggiata
sui cambi di versione; sotto, la tabella per asse. Colori identici a
Radar.tsx, nessuno nuovo.

progressione.astro: stesso modello di io.astro (codicePerUtenteLoggato,
nessuna query diretta); sotto i due punti mostra il messaggio che ne serve
almeno uno in più. io.astro linka la pagina nuova.

Refs #5

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-26 13:02:57 +00:00
parent 4cd911098d
commit 5dc6b85d52
5 changed files with 219 additions and 1 deletions
+2 -1
View File
@@ -64,7 +64,8 @@ const referto = sessioneId !== null ? refertoDi(db, sessioneId) : null;
<p>
InsanityLab Longevity monitora il tuo percorso nel tempo: più compilazioni
raccontano come cambi, non solo come stai oggi.
<a href="/longevity/questionario">Compila di nuovo il questionario</a>.
<a href="/longevity/progressione">Guarda il tuo andamento nel tempo</a> o
<a href="/longevity/questionario">compila di nuovo il questionario</a>.
</p>
</section>
</div>
@@ -0,0 +1,47 @@
---
// L'andamento nel tempo del cliente: una sessione per punto, i punteggi congelati che
// quella sessione ha davvero. Stesso modello di io.astro: la pagina non interroga il
// database da sola (c'è un test che lo verifica, referto.test.ts, esteso a tutte le pagine
// sotto src/pages/longevity/), il codice cliente arriva da codicePerUtenteLoggato
// (anagrafica.ts, l'unico modulo autorizzato a toccare identity), i punti da progressioneDi
// (progressione.ts, che legge SOLO score — mai un ricalcolo).
import Longevity from '../../layouts/Longevity.astro';
import Progressione from '../../components/longevity/Progressione';
import { getLongevityDb } from '../../lib/longevity/db';
import { codicePerUtenteLoggato } from '../../lib/longevity/anagrafica';
import { progressioneDi } from '../../lib/longevity/progressione';
export const prerender = false;
const user = Astro.locals.user!;
const codice = codicePerUtenteLoggato(user.id);
const db = getLongevityDb();
const punti = codice ? progressioneDi(db, codice) : [];
---
<Longevity title="Andamento nel tempo" crumbs={['Andamento nel tempo']}>
{!codice && (
<div class="lg-card">
<p>Nessun fascicolo è ancora collegato al tuo account. Contatta lo staff InsanityLab.</p>
</div>
)}
{codice && punti.length < 2 && (
<div class="lg-card lg-card--incompleto">
<p>Serve almeno un secondo check-up o questionario per vedere un andamento.</p>
<p><a href="/longevity/io">Torna al tuo referto</a>.</p>
</div>
)}
{codice && punti.length >= 2 && (
<div class="lg-referto">
<section class="lg-card">
<h2>Il tuo andamento</h2>
<Progressione client:load punti={punti} />
</section>
<section class="lg-card">
<p><a href="/longevity/io">Torna al tuo referto</a>.</p>
</section>
</div>
)}
</Longevity>