22a400b854
Refs #10 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
84 lines
3.3 KiB
Plaintext
84 lines
3.3 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">
|
|
{user.role === 'admin' || user.role === 'trainer' ? (
|
|
<p>
|
|
Il tuo account è da staff: non ha un fascicolo personale.
|
|
<a href="/longevity/gestionale">Torna al gestionale</a>.
|
|
</p>
|
|
) : (
|
|
<p>
|
|
Nessun fascicolo è ancora collegato al tuo account. Contatta lo staff InsanityLab.
|
|
<a href="/piattaforme">Torna alle piattaforme</a>.
|
|
</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>
|