Files
InsanityLab-web/src/pages/piattaforme/stress-index/impostazioni.astro
T
Adriano c4eb598a3a Piattaforme riservate: ruolo dedicato e port della dashboard Stress Index
Il ruolo `campus` diventa `piattaforme` e non apre più solo la sezione
Biohacking: copre tutte le aree riservate, con migrazione guardata sugli
utenti esistenti. Nell'header la vecchia voce Biohacking lascia il posto a
un menu Piattaforme con i due link, visibile solo a chi ha il ruolo, e
/piattaforme diventa la pagina di atterraggio.

Stress Index è portata dentro il sito: le nove viste dell'area
professionisti diventano pagine Astro sotto /piattaforme/stress-index,
con lo stile del sito al posto del design system del prototipo. React
resta solo dove serve davvero — grafici recharts e scheda cliente — il
resto è Astro con un filo di JS. I dati sono ancora quelli dimostrativi,
raccolti in lib/stress-index/data.ts.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-31 15:49:47 +02:00

122 lines
5.2 KiB
Plaintext

---
// Impostazioni: profilo, notifiche, account. I campi sono ancora un modulo dimostrativo —
// non c'è un endpoint di salvataggio — ma la struttura è quella definitiva.
import StressIndex from '../../../layouts/StressIndex.astro';
import Card from '../../../components/stress-index/Card.astro';
import { professional } from '../../../lib/stress-index/data';
export const prerender = false;
const [nome = '', cognome = ''] = professional.name.replace(/^Dr\.?\s*/i, '').split(' ');
const GIORNI = ['Lunedì', 'Martedì', 'Mercoledì', 'Giovedì', 'Venerdì', 'Sabato', 'Domenica'];
const ORE = ['07:00', '08:00', '09:00', '18:00', '19:00', '20:00'];
const TABS = [
{ key: 'profilo', label: 'Profilo' },
{ key: 'notifiche', label: 'Notifiche' },
{ key: 'account', label: 'Account' },
];
---
<StressIndex title="Impostazioni" crumbs={['Impostazioni']}>
<div class="si-head">
<h1>Impostazioni</h1>
<p>Profilo, notifiche e account</p>
</div>
<div class="si-tabs" role="tablist" id="si-set-tabs">
{TABS.map((t, i) => (
<button type="button" role="tab" class="si-tabs__btn" data-tab={t.key} aria-selected={i === 0 ? 'true' : 'false'}>{t.label}</button>
))}
</div>
<section data-panel="profilo" class="si-stack">
<Card title="Dati professionista">
<div class="si-form-grid">
<label class="si-field">Titolo<input type="text" value="Dr." /></label>
<label class="si-field">Professione<input type="text" value={professional.role} /></label>
<label class="si-field">Nome<input type="text" value={nome} /></label>
<label class="si-field">Cognome<input type="text" value={cognome} /></label>
<label class="si-field">Specializzazione<input type="text" value={professional.role} /></label>
</div>
</Card>
<Card title="Studio">
<div class="si-form-grid">
<label class="si-field">Nome studio<input type="text" value={professional.studio} /></label>
<label class="si-field">Indirizzo<input type="text" placeholder="Via Roma 1, Bologna" /></label>
<label class="si-field">Telefono<input type="tel" placeholder="+39 051 123456" /></label>
<label class="si-field">Sito web<input type="url" placeholder="https://studio.it" /></label>
</div>
<p class="si-mt"><button type="button" class="si-btn si-btn--solid">Salva</button></p>
</Card>
</section>
<section data-panel="notifiche" hidden>
<Card title="Preferenze di notifica">
<ul class="si-list si-list--rows si-prefs">
<li>
<span>
<strong>Riassunto settimanale via email</strong>
<span class="si-muted si-small">Un riepilogo periodico dell'andamento dei clienti</span>
</span>
<input type="checkbox" checked />
</li>
<li>
<span>
<strong>Alert immediati</strong>
<span class="si-muted si-small">Email non appena viene generato un alert cliente</span>
</span>
<input type="checkbox" checked />
</li>
<li>
<span>
<strong>Novità di prodotto</strong>
<span class="si-muted si-small">Aggiornamenti sulle nuove funzionalità</span>
</span>
<input type="checkbox" />
</li>
</ul>
<div class="si-form-grid si-mt">
<label class="si-field">Giorno dell'invio
<select>{GIORNI.map((g) => <option>{g}</option>)}</select>
</label>
<label class="si-field">Ora dell'invio
<select>{ORE.map((o) => <option>{o}</option>)}</select>
</label>
</div>
<p class="si-mt"><button type="button" class="si-btn si-btn--solid">Salva preferenze</button></p>
</Card>
</section>
<section data-panel="account" hidden class="si-stack">
<Card title="Accesso">
<label class="si-field">Email<input type="email" value={professional.email} readonly /></label>
<p class="si-muted si-small si-mt">Per cambiare l'indirizzo email serve una richiesta al supporto.</p>
<div class="si-form-grid si-mt">
<label class="si-field">Password attuale<input type="password" autocomplete="current-password" /></label>
<label class="si-field">Nuova password<input type="password" autocomplete="new-password" /></label>
<label class="si-field">Conferma nuova password<input type="password" autocomplete="new-password" /></label>
</div>
<p class="si-mt"><button type="button" class="si-btn si-btn--solid">Aggiorna password</button></p>
</Card>
<Card title="Abbonamento">
<p class="si-muted si-small">Per il piano e la fatturazione fa riferimento al supporto Stress Index.</p>
</Card>
<p><a class="si-btn" href="/admin/logout">Esci dall'account</a></p>
</section>
</StressIndex>
<script>
const tabs = document.getElementById('si-set-tabs');
if (tabs) {
const buttons = Array.from(tabs.querySelectorAll<HTMLButtonElement>('.si-tabs__btn'));
const panels = Array.from(document.querySelectorAll<HTMLElement>('[data-panel]'));
for (const btn of buttons) {
btn.addEventListener('click', () => {
for (const b of buttons) b.setAttribute('aria-selected', String(b === btn));
for (const p of panels) p.hidden = p.dataset.panel !== btn.dataset.tab;
});
}
}
</script>