Files
InsanityLab-web/apps/platforms/src/pages/longevity/io.astro
T
Adriano 5dc6b85d52 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>
2026-09-26 13:02:57 +00:00

74 lines
2.9 KiB
Plaintext

---
// Il referto del cliente: il radar a sette assi, la Fitness Age, le carte dei macro-score.
// La pagina non interroga il database da sola (c'è un test che lo verifica): il codice
// cliente arriva da codicePerUtenteLoggato (anagrafica.ts, l'unico modulo autorizzato a
// toccare identity), la sessione più recente e il referto stesso da vista.ts.
import Longevity from '../../layouts/Longevity.astro';
import Radar from '../../components/longevity/Radar';
import MacroScore from '../../components/longevity/MacroScore.astro';
import { getLongevityDb } from '../../lib/longevity/db';
import { codicePerUtenteLoggato } from '../../lib/longevity/anagrafica';
import { refertoDi, ultimaSessioneDi } from '../../lib/longevity/vista';
import { formattaNumero } from '../../lib/longevity/formato';
export const prerender = false;
const user = Astro.locals.user!;
const codice = codicePerUtenteLoggato(user.id);
const db = getLongevityDb();
const sessioneId = codice ? ultimaSessioneDi(db, codice) : null;
const referto = sessioneId !== null ? refertoDi(db, sessioneId) : null;
---
<Longevity title="Il tuo referto" crumbs={['Il tuo referto']}>
{!codice && (
<div class="lg-card">
<p>Nessun fascicolo è ancora collegato al tuo account. Contatta lo staff InsanityLab.</p>
</div>
)}
{codice && !referto && (
<div class="lg-card lg-card--incompleto">
<p>Non hai ancora compilato il questionario: senza quello non c'è ancora un referto da mostrare.</p>
<p><a href="/longevity/questionario">Comincia da qui</a>.</p>
</div>
)}
{referto && (
<div class="lg-referto">
<section class:list={['lg-card', { 'lg-card--incompleto': referto.fitnessAge === null }]}>
<p class="lg-score__label">Fitness Age</p>
<div class="lg-score">
<span class="lg-score__value lg-num">
{referto.fitnessAge !== null ? formattaNumero(referto.fitnessAge) : '—'}
</span>
{referto.fitnessAge !== null && <span class="lg-score__max">anni</span>}
</div>
<p class="lg-muted lg-macro__nota">
Copertura dati: {Math.round(referto.fitnessAgeCopertura * 100)}%
{referto.fitnessAge === null && ' — non ancora sufficiente per un numero.'}
</p>
</section>
<section class="lg-card">
<h2>Il tuo radar</h2>
<Radar client:load assi={referto.assi} />
</section>
<section class="lg-macro">
{referto.macro.map((m) => (
<MacroScore nome={m.nome} valore={m.valore} copertura={m.copertura} />
))}
</section>
<section class="lg-card">
<p>
InsanityLab Longevity monitora il tuo percorso nel tempo: più compilazioni
raccontano come cambi, non solo come stai oggi.
<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>
)}
</Longevity>