--- // Popup a pieno schermo con gli orari delle class in Sala Piccola. // // I calendari sono ricostruiti dal dato (`data/calendari.ts`) e non sono le immagini ricevute // dal cliente: si leggono da telefono, si scaricano in PDF, e per correggere una cella non // serve rifare uno screenshot. // // Si vedono tutti gli orari non ancora scaduti, uno sotto l'altro: chi guarda ad agosto vuole // sapere com'è settembre per intero. Quelli passati spariscono da soli. // // Si apre da qualunque elemento con `data-apri-calendario` nella stessa pagina. import { calendariDaMostrare, avvisiAttivi, GIORNI, DISCIPLINE, type Calendario, type Giorno } from '../data/calendari'; import { t } from '../lib/content'; const adesso = new Date(); const mostrati = calendariDaMostrare(adesso); // Giornate fuori griglia (eventi, chiusure): spariscono da sole quando sono passate. const avvisi = avvisiAttivi(adesso); const dataDi = (iso: string) => new Date(iso).toLocaleDateString('it-IT', { day: 'numeric', month: 'long', year: 'numeric', timeZone: 'Europe/Rome', }); // Legenda per griglia: elencare discipline che lì non compaiono farebbe cercare lezioni // che quel periodo non ha. const disciplinePresenti = (cal: Calendario) => DISCIPLINE.filter((d) => cal.righe.some((r) => Object.values(r.celle).includes(d))); --- {mostrati.length > 0 && (

{mostrati[0].cal.sala}

Calendario delle class

{avvisi.length > 0 && ( )}
{mostrati.map(({ cal, stato }) => (

{cal.titolo}

{stato === 'in-corso' ? 'In vigore' : `${t('calendario.futuro-label')} ${dataDi(cal.from)}`}
{GIORNI.map((g) => ( ))} {cal.righe.map((r) => ( {GIORNI.map((g: Giorno) => { const chiuso = cal.chiusi.includes(g); const lezione = r.celle[g]; return ( ); })} ))}
Ora {g} {cal.noteGiorno?.[g] && {cal.noteGiorno[g]}}
{r.ora} {chiuso ? {t('calendario.chiuso-label')} : lezione ?? ''}
    {disciplinePresenti(cal).map((d) => (
  • {d}
  • ))}
))}
)}