From 240dc17f4dcdca71e0df36b5b491012dc7c2c27c Mon Sep 17 00:00:00 2001 From: pollutri Date: Thu, 28 May 2026 17:30:16 +0200 Subject: [PATCH] factory reset/preset implementati --- README.md | 277 +++++++++++++++++++++++++++++++++++++++++---- app/admin/page.tsx | 121 ++++++++++---------- lib/config.ts | 5 + 3 files changed, 322 insertions(+), 81 deletions(-) diff --git a/README.md b/README.md index 208f3a5..be3005d 100644 --- a/README.md +++ b/README.md @@ -1,41 +1,272 @@ -This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). +# Captive Portal CMS — Casa della Scuola -## Getting Started +CMS per portali captive: gestione di card informative, gallerie, flip-book e contenuti kiosk a schermo intero, con un'area di amministrazione locale. Stack: Next.js 16 (App Router, Turbopack), React 19, TypeScript, Tailwind v4. Persistenza su file (nessun database). Pensato per girare su **server Ubuntu offline**. -First, run the development server: +--- +## Indice + +1. [Avvio](#avvio) +2. [Configurazione (`lib/config.ts`)](#configurazione-libconfigts) +3. [Tipi di card](#tipi-di-card) +4. [File consentiti negli upload](#file-consentiti-negli-upload) +5. [Limiti di testo](#limiti-di-testo) +6. [Sicurezza degli input](#sicurezza-degli-input) +7. [Struttura dei dati (`data/`)](#struttura-dei-dati-data) +8. [Backup e ripristino](#backup-e-ripristino) +9. [Factory Preset (developer)](#factory-preset-developer) +10. [Font](#font) +11. [Prerequisiti di sistema](#prerequisiti-di-sistema) +12. [Risoluzione problemi](#risoluzione-problemi) + +--- + +## Avvio + +**Sviluppo:** ```bash +npm install npm run dev -# or -yarn dev -# or -pnpm dev -# or -bun dev ``` +Apri [http://localhost:3000](http://localhost:3000) (portale pubblico) e [http://localhost:3000/admin](http://localhost:3000/admin) (amministrazione). + +**Produzione:** +```bash +npm run build +npm start +``` + +> **Server offline:** la macchina di produzione non ha accesso a internet. NON eseguire `npm install` lì. Installa le dipendenze su una macchina con internet (stesso OS, Linux), poi copia l'intera cartella `node_modules` sul server insieme al progetto buildato. Su Ubuntu basta `npm run build` (se `node_modules` è presente) + `npm start`. + +--- + +## Configurazione (`lib/config.ts`) + +Tutte le impostazioni globali sono **flag build-time** nel file [`lib/config.ts`](lib/config.ts). Dopo ogni modifica serve ricostruire: `npm run build`. + +| Variabile | Default | Descrizione | +|---|---|---| +| `EXTERNAL_LINK_ENABLED` | `true` | Mostra il tipo di card "External Link" nel menu dell'admin. Le card di quel tipo già esistenti restano comunque visibili e cliccabili anche se messo a `false`. | +| `FACTORY_RESET_ENABLED` | `false` | Mostra la sezione "Factory Preset" nell'admin (funzione developer). Vedi [Factory Preset](#factory-preset-developer). Gli endpoint API restano attivi a prescindere. | +| `DEFAULT_FONT` | `''` | Font di default se il portale non ne ha impostato uno. Stringa vuota = font di sistema (Arial). Altrimenti il nome esatto di un file in `data/fonts/` (es. `"Geist-Variable.woff2"`). | +| `TEXT_LIMITS` | vedi sotto | Limiti caratteri di tutti i campi testuali. | +| `UPLOAD_LIMITS` | vedi sotto | Dimensioni massime upload per famiglia di file. | + +### Limiti testo (`TEXT_LIMITS`) +```ts +card: { + title: 200, + shortDescription: 500, + fullContent: 20_000, + actionUrl: 2000, +}, +portal: { + title: 200, + welcomeText: 1000, +}, +``` + +### Limiti upload (`UPLOAD_LIMITS`) +```ts +image: 25 MB, +pdf: 20 MB, +video: 1 GB, +``` + +Per cambiare un qualunque limite: modifica il numero in `lib/config.ts` e ricostruisci. Il valore è condiviso tra interfaccia (contatore / `maxLength`), validazione server e check di upload — un solo punto di verità. + +--- + +## Tipi di card + +| Tipo | Nome in admin | Comportamento | +|---|---|---| +| `INFO_PAGE` | Info Page | Pagina informativa: solo cover, niente galleria. | +| `IMAGE_GALLERY` | Image Gallery | Galleria di immagini/video/PDF sfogliabile a schermo intero. | +| `BOOK` | Flip-Book | Sfoglialibro in formato A4 (due pagine affiancate). | +| `FULLSCREEN_LOCK` | Fullscreen Lock (kiosk) | **Takeover totale**: se presente, il portale pubblico mostra SOLO il suo contenuto (immagine o video) a tutto schermo, senza hero, griglia o pulsanti di chiusura. Le altre card vengono nascoste. Utile per redirect/segnaletica kiosk. | +| `EXTERNAL_LINK` | External Link | Apre un URL esterno. Visibile nel menu solo se `EXTERNAL_LINK_ENABLED = true`. | + +**Note sulla Fullscreen Lock:** +- Se ci sono più card lock, viene usata la prima per ordine di visualizzazione. +- `/admin` resta sempre accessibile anche con una lock attiva. +- Per tornare al portale normale: elimina (o cambia tipo a) la card lock. -Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. +--- -You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. +## File consentiti negli upload + +Gli upload passano per tre controlli in cascata. Se uno fallisce, **nessun file viene salvato** e l'admin riceve un messaggio d'errore. + +### 1. Whitelist estensioni +| Famiglia | Estensioni | Limite | +|---|---|---| +| Immagini | `png` `jpg` `jpeg` `gif` `webp` | 25 MB | +| Video | `mp4` `m4v` `webm` `mov` `ogv` `ogg` | 1 GB | +| Documenti | `pdf` | 20 MB | + +Tutto il resto (es. `svg`, `heic`, `bmp`, `avi`, `exe`) viene rifiutato. **SVG è escluso di proposito** (può contenere `