Calendario: il 19 e il 20 settembre non sono un buco, sono un evento e una chiusura
Quei due giorni non stanno in nessuna delle due griglie perche' non hanno class: il 19 c'e' la presentazione della nuova apertura, il 20 si sta chiusi. Scritto come avviso con la sua finestra, il vuoto smette di sembrare una trascrizione incompleta e diventa un'informazione. Gli avvisi compaiono in cima al popup e in fondo al PDF - e' il file che gira su WhatsApp, e chi lo riceve non ha la pagina davanti. Spariscono da soli quando sono passati: un avviso scaduto dice che il centro e' chiuso in un giorno gia' trascorso, e chi legge non sa piu' se valga per quest'anno o per il prossimo. Lo spazio riservato in fondo alla pagina cresce con gli avvisi, altrimenti la griglia si allunga fino a spingerli su una seconda pagina. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import PDFDocument from 'pdfkit';
|
||||
import { GIORNI, type Calendario, type Disciplina, type Giorno } from '../data/calendari';
|
||||
import { GIORNI, type AvvisoCalendario, type Calendario, type Disciplina, type Giorno } from '../data/calendari';
|
||||
|
||||
// PDF del calendario, disegnato dal dato con PDFKit.
|
||||
//
|
||||
@@ -32,7 +32,7 @@ export const nomeFilePdf = (cal: Calendario): string =>
|
||||
* in A4 orizzontale, e spezzarla su due pagine renderebbe illeggibile proprio ciò che si va a
|
||||
* cercare — l'incrocio fra un giorno e un'ora.
|
||||
*/
|
||||
export function generaCalendarioPdf(cal: Calendario): Promise<Buffer> {
|
||||
export function generaCalendarioPdf(cal: Calendario, avvisi: AvvisoCalendario[] = []): Promise<Buffer> {
|
||||
const doc = new PDFDocument({
|
||||
size: 'A4',
|
||||
layout: 'landscape',
|
||||
@@ -88,7 +88,9 @@ export function generaCalendarioPdf(cal: Calendario): Promise<Buffer> {
|
||||
|
||||
// Righe: l'altezza si ricava dallo spazio che resta, così la griglia riempie la pagina
|
||||
// qualunque sia il numero di fasce e non serve ritoccarla a mano quando ne cambiano.
|
||||
const spazioSotto = 52; // legenda + nota + piè di pagina
|
||||
// legenda + nota + piè di pagina, più una riga per ogni giornata fuori griglia: senza
|
||||
// tenerne conto la griglia si allungherebbe fino a spingere gli avvisi in una seconda pagina.
|
||||
const spazioSotto = 52 + avvisi.length * 11;
|
||||
const altezzaRiga = Math.min(
|
||||
22,
|
||||
(doc.page.height - doc.page.margins.bottom - spazioSotto - y) / cal.righe.length,
|
||||
@@ -147,12 +149,22 @@ export function generaCalendarioPdf(cal: Calendario): Promise<Buffer> {
|
||||
xLeg += 13 + doc.widthOfString(d) + 18;
|
||||
}
|
||||
|
||||
// --- Giornate fuori griglia (eventi, chiusure) ---
|
||||
let yAvvisi = yLeg + 16;
|
||||
for (const a of avvisi) {
|
||||
doc.rect(x0, yAvvisi - 1, 2, 9).fill(C_ACCENTO);
|
||||
doc.font('Helvetica-Bold').fontSize(7).fillColor(C_TESTO)
|
||||
.text(a.quando, x0 + 7, yAvvisi, { continued: true })
|
||||
.font('Helvetica').fillColor(C_TENUE).text(` — ${a.testo}`);
|
||||
yAvvisi += 11;
|
||||
}
|
||||
|
||||
doc.font('Helvetica').fontSize(7).fillColor(C_TENUE).text(
|
||||
"Gli orari possono subire variazioni. Le lezioni si prenotano dall'app Bsport.",
|
||||
x0, yLeg + 16, { width: larghezzaUtile },
|
||||
x0, yAvvisi + 3, { width: larghezzaUtile },
|
||||
);
|
||||
doc.font('Helvetica').fontSize(7).fillColor(C_ACCENTO)
|
||||
.text('insanitylab.it', x0, yLeg + 27, { width: larghezzaUtile, align: 'right' });
|
||||
.text('insanitylab.it', x0, yAvvisi + 14, { width: larghezzaUtile, align: 'right' });
|
||||
|
||||
doc.end();
|
||||
return finito;
|
||||
|
||||
Reference in New Issue
Block a user