# JS - SBH Web

Guide del client web del gestionale SIGEA (sbh-web), generate dal repository adsw-next.

# JS1 SBH — accesso e novita'

# 1. Accesso

### La finestra dell'SBH Helper

Se l'SBH Helper non risponde, prima di connettersi compare **«Avvio dell'SBH Helper»**: sbh-web prova ad
avviarlo. Dopo qualche secondo, se non parte, propone **Installa** e **Riprova ad avviarlo**. Con
**Continua senza** si entra lo stesso: mancano stampa diretta, cartelle, posta e terminalini.

*Nessuna schermata: su questo PC l'helper era gia' acceso, quindi la finestra non compare.*

### La pagina di avvio

![Pagina di avvio](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/pagina-di-avvio.png)

Al centro **Connetti**. Sotto:
- **Postazione**: il nome con cui il server vede questo PC (dall'SBH Helper). L'icona lo copia.
- **Server**: quello predefinito del gateway, oppure uno scelto. Clic per cambiarlo.
- **Connessioni salvate**: i server usati spesso, con un nome.

✔ Verifica: la pagina mostra «Connetti» e la riga «Postazione».

![Server di connessione](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/server-di-connessione.png)

Il clic sul server apre **Server di connessione**: server e porta, fra quelli ammessi dal gateway.
**Ripristina predefinito** torna a quello del gateway.

✔ Verifica: la finestra «Server di connessione» ha i campi Server e Porta.

### Connessioni salvate

![Nuova configurazione](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/nuova-configurazione.png)

**Nuova configurazione**: nome, server, porta ed etichette (fino a 8, ognuna col suo colore).
**Salva questa connessione** salva invece il server scelto sopra.

![Connessioni salvate filtrate](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/connessioni-salvate-filtrate.png)

Le etichette diventano **filtri** sopra l'elenco (qui solo «prova»). La ricerca trova per nome, server,
prodotto, cliente o etichetta. Un clic sulla riga si collega; la matita modifica (F2), il cestino elimina.
Le connessioni stanno nel browser.

✔ Verifica: tre connessioni salvate; il filtro «prova» ne mostra due.

### Login

![Login](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/login.png)

Utente e password del server SIGEA (massimo 12 caratteri). La password e' mascherata; l'occhio la mostra.
Il primo accesso scarica i menu di tutti i moduli: 2-4 minuti. Poi restano nel browser.

✔ Verifica: il campo password e' di tipo password.

# 2. Dopo il login

![Menu e benvenuto](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/menu-e-benvenuto.png)

A sinistra il **menu** del modulo: in alto il modulo (clic per cambiarlo), la ricerca, poi **Preferiti** e
**Recenti** del modulo, poi le funzioni. Se un modulo ha piu' **versioni**, il menu ne mostra una riga per
versione. In fondo: modulo, versione e rilascio.

Al centro il benvenuto: modulo, utente, uscita predefinita e i tasti utili.

✔ Verifica: il piede del menu dice «Menu B20».

![Pannello di avvio](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/pannello-di-avvio.png)

Scelta una voce, il **pannello di avvio** mostra il percorso, il **logo del prodotto** (eSIGEA o SIGEAdb)
in alto a destra, i **tipi di lavoro** (Inserimento, Modifica, Interrogazione, Cancellazione), modalita',
ruolo e uscita. **Avvia** (o Invio) apre la funzione.

Dal menu, **Tab** porta il cursore nel pannello, sul tipo di lavoro scelto: si continua da tastiera.

✔ Verifica: quattro tipi di lavoro; dopo Tab il tipo scelto ha il fuoco.

![Recenti](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/recenti.png)

Dopo aver usato una funzione, compare fra i **Recenti** del modulo (anche nel benvenuto). La stella del
pannello la mette fra i **Preferiti**.

✔ Verifica: la sezione Preferiti/Recenti del menu e' a video.

# 3. In una funzione

![La funzione](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/la-funzione.png)

- In alto a destra, nella barra delle azioni, il **percorso completo del menu** (modulo › rami › funzione).
- Fra maschera e griglia, la presa coi **tre puntini**: si trascina per ridimensionare i pannelli.
- Nella barra in basso: tipo di lavoro, modalita', uscita e l'**interruttore della vista**.

✔ Verifica: il percorso nella barra contiene «Condizioni».

![Vista moderna](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/vista-moderna.png)

L'interruttore della vista passa da **Fedele** (come il client, a coordinate) a **Fedele con tasti** a
**Moderna** (a flusso: campi allineati, tendine «Scegli», lente accanto al campo). Un clic per vista.

✔ Verifica: dopo uno o piu' clic la maschera e' nella vista Moderna.

![Ricerca F8](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/ricerca-f8.png)

**F8** sul campo apre la **Ricerca**. Il filtro agisce sulle righe caricate; **Altre righe** chiede la
pagina dopo. Il **doppio clic** su una riga la sceglie e la riporta nel campo.

✔ Verifica: dopo il doppio clic il campo Codice pagamento ha un valore.

![Clic destro: Sviluppo](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/clic-destro-sviluppo.png)

Il **clic destro** sulla maschera apre il menu con la sezione **Sviluppo**: il nome della maschera e
**Copia nome maschera** (su un campo, anche il nome del campo).

✔ Verifica: il menu mostra «Copia nome maschera».

![Ispettore](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/ispettore.png)

**Shift + clic destro** su un campo apre l'**ispettore**: form, maschera, campo, posizione nel record,
help e valore. Senza traffico verso il server.

✔ Verifica: l'ispettore si apre sul campo CODE-PAGA.

# 4. Schede delle sessioni

![Schede e tooltip](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/schede-e-tooltip.png)

Nella barra in basso c'e' una scheda per sessione. Si aggiunge col **+** (con login) o con **Duplica**
dal clic destro sulla scheda (senza login). Ogni scheda mostra utente, **modulo** e **slot** (`#5`, `#6`).
Passando sopra, il **tooltip** dice server, utente, modulo, slot e stato.

L'**icona del telefonino** accanto allo slot (qui sulla scheda `#5`) indica la sessione a cui sono
agganciati i **terminalini RMH** dell'SBH Helper.

✔ Verifica: due schede, il tooltip della seconda e' a video.

![Dopo F5](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/dopo-f5.png)

**F5** (ricarica della pagina) **riprende tutte le sessioni**, ognuna dove era: qui le due schede tornano
sul menu, senza rifare il login.

✔ Verifica: dopo la ricarica le schede sono ancora due, col menu.

# 5. Opzioni utili

Il pulsante ☰ in basso a sinistra apre le **Opzioni**, a gruppi.

![Opzioni: Sessione](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/opzioni-sessione.png)
![Opzioni: Vista e Impostazioni](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/opzioni-vista-e-impostazioni.png)

- **Sessione**: SBH Helper (stato, stampante, terminalini), Servizi RMH (terminalini), Manuale in linea,
  Informazioni sulla sessione.
- **Vista**: Tutta la finestra, Tema scuro, Icone, Carattere, Barra dei comandi, Vista maschere.
- **Impostazioni**: Tasti funzione, **Dati salvati nel browser**.

La voce **Servizi RMH (terminalini)** compare solo con un SBH Helper che li offre: spenta, sbh-web non li
avvia.

![Dati salvati nel browser](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/dati-salvati-nel-browser.png)

**Dati salvati nel browser**: quanto occupa sbh-web, per categoria (sessioni da riprendere, menu, maschere,
guide, preferenze). **Svuota cache** libera spazio (il server rimanda i dati); **Dimentica sessioni da
riprendere** cancella i rientri.

✔ Verifica: la finestra «Dati salvati nel browser» si apre dalle Opzioni.

![SBH Helper: Dispositivi](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/sbh-helper-dispositivi.png)

**SBH Helper** apre il pannello dell'helper: versione, **Dispositivi** (i terminalini RMH: ping, log,
messaggi), Stampanti, Aggiorna. Qui i servizi RMH erano **occupati da un'altra sessione** (slot 5):
**Riprova** li richiede per la sessione attiva. Senza helper, la voce propone di scaricarlo.

*Nessun terminalino era collegato: l'elenco dei dispositivi e' vuoto.*

![Personalizzazione](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/personalizzazione.png)

**Personalizzazione** (icona in alto a destra della barra): «Stai personalizzando» sceglie il prodotto
(**eSIGEA** o **SIGEAdb**). Superficie e **tinta dello sfondo** valgono per le sessioni di quel prodotto.

![Campi di input](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/campi-di-input.png)

**Campi di input**: sfondo, bordo e bordo al focus dei campi attivi, e dei campi disattivi e in sola
lettura. **Auto** usa il colore del tema. Valgono per il modo chiaro o scuro in uso.

✔ Verifica: il pannello mostra la scelta del prodotto.

# JS2 SBH — avvio della sessione, login, schede, rientro e uscita

# 4. Opzioni › Informazioni sulla sessione

![Informazioni sulla sessione](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/informazioni-sulla-sessione.png)

Dal pulsante delle opzioni (le tre righe in basso a sinistra) › **Informazioni sulla sessione**: chi
e' collegato, a quale server, con quale connessione, versione e catalogo. E' quello che si chiede a
chi segnala un problema; **Copia** lo mette negli appunti in una volta.

✔ Verifica: la finestra mostra «Server (nodo)» e «Connessione n.».

✔ Verifica: «Postazione (client)» e' `GUIDA-AVVIO`, il nome scritto al §1: il nome client arriva
davvero al server.

✔ Verifica: «Utente» e' valorizzato.

# 5. Piu' sessioni: le schede

![Il menu della scheda](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/il-menu-della-scheda.png)

Ogni scheda della barra in basso e' una **sessione completa**, con la sua connessione al server:
due schede sono due utenti collegati, indipendenti. Il tasto destro su una scheda apre il suo menu.

✔ Verifica: nel menu della scheda «Duplica» e «Chiudi la scheda» sono attivi.

![La scheda duplicata](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/la-scheda-duplicata.png)

**Duplica** apre una connessione nuova con le stesse credenziali, senza rifare il login: le
credenziali restano nella memoria della pagina, mai nel browser (vedi il §8: dopo una ricarica non
ci sono piu' e la scheda nuova chiede il login).

✔ Verifica: compare una seconda scheda che entra da sola, senza richiesta di login, arriva al menu
(«UTENTE · menu») e diventa l'attiva.

![Due schede affiancate](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/due-schede-affiancate.png)

**Affianca alla scheda attiva** (dal menu di una scheda che non e' quella attiva) divide lo schermo
fra due sessioni: per esempio un'interrogazione a sinistra e un inserimento a destra. Il clic in una
delle due la rende attiva (tastiera e finestre vanno a lei). **Separa**, dallo stesso menu, torna a
una sola.

✔ Verifica: con «Affianca» due sessioni sono a video insieme, ognuna col suo menu e piu' stretta.

✔ Verifica: con «Separa» ne resta a video una sola.

![Chiudere una scheda](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/chiudere-una-scheda.png)

**Chiudi la scheda** su una scheda connessa esce dalla sua sessione in modo ordinato e lo chiede
prima, con una finestra dell'app e non con quella del browser.

✔ Verifica: «Chiudi la scheda» chiede «Chiudere la scheda?»; confermato, la scheda sparisce e resta
la prima, col suo menu.

![Una scheda nuova](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/una-scheda-nuova.png)

Il **+** accanto alle schede apre una sessione nuova **con il suo login** (per entrare con un altro
utente): la scheda nasce sulla pagina Connetti. Una scheda senza connessione si chiude subito, senza
conferma, perche' non c'e' niente sul server da chiudere.

✔ Verifica: il «+» apre la scheda «Nuova sessione» con Connetti, e la prima resta connessa (pallino
verde).

✔ Verifica: il menu della scheda nuova dice «Nessuna connessione aperta» e «Chiudi la scheda» la
toglie subito.

# 6. Una funzione aperta

![Condizioni pagamento in interrogazione](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/condizioni-pagamento-in-interrogazione.png)

Dal menu: modulo **B20**, cerca «Condizioni», **Condizioni pagamento**, tipo di lavoro
**Interrogazione**, **Avvia**. Con una funzione aperta il client protegge il lavoro: uscire a meta'
troncherebbe il programma COBOL (file e transazioni non chiusi), quindi si esce solo dal menu.

✔ Verifica: la griglia ha le righe e il cursore e' sul Codice pagamento.

✔ Verifica: la scheda dice utente e form (non piu' «menu») e la barra mostra form e maschera in
input.

✔ Verifica: il pulsante di uscita e' spento.

![La scheda con una funzione aperta](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/la-scheda-con-una-funzione-aperta.png)

✔ Verifica: nel menu della scheda «Chiudi la scheda» e' spento, con «Prima chiudi la funzione e
torna al menu».

# 7. Il rientro dopo una ricarica

![Dopo la ricarica della pagina](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/dopo-la-ricarica-della-pagina.png)

Ricaricare la pagina (F5), chiudere la scheda del browser e riaprire `/sbh`, o andare avanti e
indietro, non perde la sessione: il gateway la tiene parcheggiata per qualche minuto, il browser
rigioca quello che il server gli aveva mandato e si riaggancia. La funzione torna com'era, col campo
in input. Per questo il browser non chiede piu' «Vuoi davvero uscire?»: non c'e' niente da perdere.

✔ Verifica: ricaricando, il browser non mostra nessun avviso.

✔ Verifica: la griglia torna con la stessa prima riga, il cursore sul Codice pagamento e nessuna
attesa in corso.

✔ Verifica: dopo la ricarica c'e' una sola scheda (quella ripresa prende il posto della scheda vuota
dell'avvio).

# 8. Uscire dalla pagina con la sessione aperta

![Uscire dalle sessioni?](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/uscire-dalle-sessioni.png)

Andare altrove nell'applicazione (qui: **Tutti i moduli** in alto a sinistra › un modulo) con una
sessione aperta non la abbandona in silenzio: l'app chiede cosa farne.

- **Resta**: si annulla la navigazione.
- **Lascia in sospeso**: si esce, le sessioni restano parcheggiate sul gateway e tornando su `/sbh`
  entro il tempo detto riprendono da dove erano, come dopo la ricarica del §7.
- **Forza l'uscita** (con una funzione aperta) o **Chiudi le sessioni ed esci** (dal menu): chiude
  tutte le connessioni. Con una funzione aperta la tronca a meta'.

La guida prova **Resta**: «Lascia in sospeso» terminerebbe il giro con una sessione parcheggiata sul
server, che il passo successivo dovrebbe riprendere; il rientro stesso e' gia' provato al §7.

✔ Verifica: compare «Uscire dalle sessioni?» e avverte che c'e' una funzione aperta.

✔ Verifica: i pulsanti sono «Resta», «Lascia in sospeso» e «Forza l'uscita».

✔ Verifica: il testo dice che le sessioni in sospeso riprendono «entro 15 minuti» (il tempo di
rientro del gateway, `SBH_RESUME_SECONDS`, di default 900 secondi).

✔ Verifica: con «Resta» la finestra si chiude, si resta su `/sbh` e la funzione e' ancora a video.

![Duplica dopo il rientro](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/duplica-dopo-il-rientro.png)

Tornati al menu col tasto Esci della funzione, l'uscita si riaccende. La sessione ripresa dopo la
ricarica **si puo' duplicare**, ma con una differenza: le credenziali che servono a «Duplica» per
entrare da sola stavano nella memoria della pagina, e la ricarica le ha cancellate (e' voluto: non
si salvano nel browser). Il menu della scheda lo dice nel sottotitolo, «Nuova connessione: dopo una
ricarica il login va rifatto».

✔ Verifica: di nuovo al menu, il pulsante di uscita e' attivo e la scheda dice «UTENTE · menu».

✔ Verifica: dopo il rientro «Duplica» e' attivo, con «dopo una ricarica il login va rifatto».

![La scheda duplicata chiede il login](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/la-scheda-duplicata-chiede-il-login.png)

La scheda nuova si collega da sola e arriva alla richiesta di login del server. La guida non entra
(non conosce le credenziali: stanno in `config/.env.sbh`) e chiude la scheda dal suo menu, con la
conferma: l'uscita e' ordinata anche dalla richiesta di login (il client risponde Esci al server).

✔ Verifica: la seconda scheda mostra il login e dice «Accesso…», mentre la prima resta connessa.

✔ Verifica: «Chiudi la scheda» con la conferma la toglie e resta la prima, col suo menu.

# 9. L'uscita ordinata

![Chiudere la sessione?](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/chiudere-la-sessione.png)

Dal menu, il pulsante di uscita in basso a destra (o Opzioni › **Esci dalla sessione**) chiude la
sessione in modo ordinato: il client dice al server che se ne va, il server chiude i suoi programmi
e libera la connessione. La conferma e' una finestra dell'app.

✔ Verifica: l'uscita chiede «Chiudere la sessione?» con il pulsante «Chiudi la sessione».

![Sessione chiusa](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/sessione-chiusa.png)

✔ Verifica: confermato, la barra dice «Chiuso» e torna la pagina Connetti.

✔ Verifica: accanto a «Chiuso» non ci sono piu' nodo e numero della connessione finita.

✔ Verifica: nel browser non resta nessuna sessione da riprendere (nessuna voce `sbh-web.sessione.*`
nel localStorage).

# Introduzione

> Come si apre una sessione del gestionale legacy dal client web, come si entra, come si lavora con
> piu' sessioni a schede, cosa succede se si ricarica la pagina e come si esce senza lasciare
> connessioni appese sul server. Percorso: **http://localhost:4202/sbh › Connetti › Accedi**; per la
> funzione di prova **B20 › Condizioni pagamento › Interrogazione**.
>
> Rieseguire: `cd frontend && npx playwright test --config=playwright.sbh.config.ts sbh-web-guida-avvio`
> (con altre sessioni al lavoro, aggiungere `--output=test-results/sbh-guida-avvio`).
> 42 verifiche, 18 schermate. Non crea dati: la funzione di prova e' aperta in interrogazione.

**Perche' uno spec Playwright e non un `.cjs` in `e2e/guide/`.** Le altre guide girano con uno
script `node e2e/guide/<slug>-guide.cjs` contro l'ERP sulla 4200. Questa parla con un server SIGEA
legacy vero, attraverso il gateway SBH, e ha bisogno di utente e password: li carica
`frontend/playwright.sbh.config.ts` da `config/.env.sbh` (ignorato da git, non si legge e non si
copia altrove). Lo script e' quindi `frontend/e2e/sbh-web-guida-avvio.spec.ts`, che usa quella
config, la cache dei menu di `e2e/sbh-web-accesso.ts` (`SBH_STATO`) e lo stesso schema degli altri
spec sbh-web. Ogni `✔ Verifica` qui sotto e' un `expect` dello spec, nello stesso ordine.

Prerequisiti: `npm run sbh:leggero` avviato (app sulla 4202, gateway sulla 5086), la VPN verso il
server legacy. Viewport 1500x900. Lo spec chiude sempre la sessione in modo ordinato, anche se un
passo fallisce: il server ha un numero massimo di connessioni e una sessione abbandonata resta
occupata finche' il gateway non la chiude.

# JS3 Client SBH — il pannello Opzioni, le stampe e gli strumenti

# 1. Il pannello Opzioni

Con il modulo e la voce scelti nel menu (la funzione non e' ancora avviata), il pulsante con le tre
righe in fondo a sinistra apre il pannello **verso l'alto**, dentro la barra: e' quello che nel
client legacy stava nei menu della finestra. Le voci sono divise in tre gruppi: **Sessione**
(uscire, archivio stampe, manuale, informazioni), **Vista** (menu, tutta la finestra, stampa della
schermata, strumenti della griglia, tema, carattere, trace) e **Impostazioni** (tasti funzione). Una
voce che in quel momento non ha senso resta a video ma spenta, e sotto il nome dice perche': cosi'
non si cerca una funzione che "non c'e'".

A destra delle schede, con una funzione aperta, la barra dice **che funzione sta girando**: tipo di
lavoro, **Definitivo** o **Simulato** (il simulato su fondo arancione), la stampante con cui e' partita
(nome e tipo; segue il cambio chiesto dal programma con «Scegli la stampante») e il ruolo. Quando la
barra non ha spazio (tante schede, finestra stretta, schermo diviso) diventano un pulsante compatto che
apre verso l'alto un pannello con i dettagli. I tasti funzione non stanno piu' qui: sono nella barra
dei comandi (§14). Form, maschera e campo li mostra **F7** sul campo in input (la mini-guida del client
legacy) o Maiusc + clic destro; il piede del pannello Opzioni lo ricorda.

![Il pannello Opzioni dal menu](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/il-pannello-opzioni-dal-menu.png)

✔ Verifica: il pannello ha i tre gruppi Sessione, Vista, Impostazioni, in quest'ordine.

✔ Verifica: dal menu **Archivio stampe** e' spento e dice «Solo mentre la funzione aspetta un
input».

✔ Verifica: dal menu **Stampa la schermata** e' spento e dice «Nessuna funzione a video».

✔ Verifica: dal menu **Esci dalla sessione** e' attivo (dentro una funzione no, vedi §6).

# 10. Un documento nel visualizzatore

Il visualizzatore mostra le stampe (PDF, HTML, testo impaginato in Courier a sei righe per pollice)
e i file che il server manda. Per vederlo senza stampare niente, **Griglia in XML** mette l'XML
della griglia delle condizioni fra i documenti, come l'export XML del client legacy: arriva una
finestra a tutto schermo (per l'XML una pagina a tutta larghezza in carattere fisso; le stampe di
testo restano fogli A4 e, se una riga e' piu' larga del foglio, il foglio scorre) con **Stampa**,
**Scarica**, **Apri in una nuova scheda** e **Affianca alle maschere**.

![La griglia in XML nel visualizzatore](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/la-griglia-in-xml-nel-visualizzatore.png)

✔ Verifica: il visualizzatore si intitola «20000DTB2-200 (XML)».

✔ Verifica: il documento contiene l'XML della griglia (`<grid>`).

✔ Verifica: l'XML e' una pagina a tutta larghezza (non un foglio A4) e le righe piu' lunghe della
finestra si leggono scorrendo, non sono tagliate.

# 11. Affiancato alle maschere

**Affianca alle maschere** sposta il documento nel pannello Documenti del §5: la funzione resta a
sinistra e si continua a lavorare, la stampa a destra. Il pulsante Documenti porta il numero dei
documenti ricevuti nella sessione.

![Il documento affiancato alle maschere](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/il-documento-affiancato-alle-maschere.png)

✔ Verifica: il pannello a destra mostra lo stesso XML e il campo della funzione resta a video.

✔ Verifica: il pulsante Documenti porta il numero dei documenti ricevuti.

✔ Verifica: ricliccato Documenti, il pannello si chiude.

# 12. Tasti funzione

Come la configurazione tasti del client legacy (`SbhKeyConfDlg`): quale tasto della tastiera fa
**Esci**, **Conferma**, **Guida** e **Cerca / Salto**, fra F9, F10, F11, F12 ed Esc. Un tasto vale
per un'azione sola: sceglierlo per un'altra le scambia. Qui il predefinito di Esci e' **Esc**; «Come
il client legacy» rimette Esci su F11. La scelta resta nel browser e si vede subito nel tasto Esci
della barra dei comandi (il tooltip dice il tasto) e nel sottotitolo della voce.

![Tasti funzione](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/tasti-funzione.png)

✔ Verifica: messo Esci su F11, il tasto Esci della barra dei comandi dice «Esci · F11».

✔ Verifica: il sottotitolo di «Tasti funzione» nel pannello dice «Esci F11».

✔ Verifica: rimesso Esci su Esc, il tasto dice di nuovo «Esci · Esc» e la preferenza salvata e' quella
di prima.

# 14. La barra dei comandi

La toolbar del client legacy sopra le maschere (`TBR_FORM`, `SbhFormChildFrame.cpp:599`): conferma,
invio, esci; campo e pagina precedente/successiva; F1-F8; cerca (F9) e guida del campo; poi stampa,
esporta, funzioni della griglia, manuale e informazioni. Ogni pulsante fa **esattamente** quello che fa
il suo tasto e si accende solo se il campo in input lo ammette (nel legacy `SbhFormRegion::UpdateCmd`
e `ResolveCmd`, `SbhFormRegion.cpp:610-750`); le funzioni del client si accendono come le loro voci
nelle Opzioni. Il tooltip dice il nome e il tasto, con la rimappatura della §12 («Esci · Esc», o
«Esci · F11»). Il clic non toglie il cursore al campo. I Maiusc+F e Rifiuta compaiono solo quando il
campo li ammette; le etichette dei tasti sono fisse, come nel legacy (il COBOL non ne manda).

Script: `npx playwright test --config=playwright.sbh.config.ts sbh-web-barra-comandi`
(`frontend/e2e/sbh-web-barra-comandi.spec.ts`), su **BE0 › Tabella I V A** in interrogazione.

Dove sta la sceglie l'utente dal menu **⋯** della barra, e resta nel browser (`sbh-web.barra-comandi`,
per tutte le schede di sessione): **fissa in alto** (il predefinito), **fissa in basso**, **mobile**
(una finestrella da trascinare per la maniglia a sinistra, anche con le frecce; doppio clic la rimette
in alto a destra; la **X** la chiude), **segue il cursore** (compatta, solo i tasti accesi, sotto il
campo in input o sopra se sotto non c'e' posto: si sposta con un'animazione breve quando cambia il
campo, niente animazione con «riduci movimento» del sistema). Spenta, si riaccende da **Opzioni ›
Vista › Barra dei comandi** o con **Alt+Maiusc+B**, e torna com'era. Sta sopra le maschere e le
NEW-FORM, dentro lo schermo della sessione.

![La barra fissa in alto](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/la-barra-fissa-in-alto.png)

✔ Verifica: fissa in alto, sopra le maschere; Esci e Invio accesi, il tooltip di Esci dice «Esci · Esc».

![Il menu della barra](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/il-menu-della-barra.png)

✔ Verifica: aperto il menu ⋯, il cursore resta nel campo in input e «Fissa in alto» e' spuntata.

![La barra mobile, trascinata](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/la-barra-mobile-trascinata.png)

✔ Verifica: mobile, trascinata in basso a sinistra si sposta col puntatore e la posizione si ricorda nel
browser; trascinata oltre il bordo si ferma dentro lo schermo della sessione; il cursore resta nel campo.

![La barra che segue il cursore](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/la-barra-che-segue-il-cursore.png)

✔ Verifica: segue il cursore, compatta, accanto al campo in input senza coprirlo, solo tasti accesi.

✔ Verifica: Alt+Maiusc+B la spegne, la voce delle Opzioni dice «Spenta» e la riaccende com'era.

✔ Verifica: la **X** rossa della barra fa quello che fa Esc: la funzione si chiude e si torna al menu.

# 2. Manuale in linea

**Manuale in linea** apre in una finestrella del browser accostata a destra (sempre la stessa,
«sbh-manuale», che si riusa) la pagina del manuale della **voce scelta nel menu**, come la finestra del
manuale del client legacy; senza una voce scelta apre la pagina iniziale. Se il browser blocca le
finestre, si apre in una scheda.
L'indirizzo lo costruisce `manualUrl` (`sbh-web/src/session/utils/menu-file.util.ts`): il modulo con
la B che diventa E (B20 → E20), la versione se non e' 0000, la fase e le posizioni della voce
nell'albero a due cifre, e il prodotto dal livello d'uso (SIGEA, eSIGEA, SIGEAdb).

![La pagina del manuale di Condizioni pagamento](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/la-pagina-del-manuale-di-condizioni-pagamento.png)

✔ Verifica: con la voce scelta, sotto il nome della voce c'e' «Della funzione scelta nel menu».

✔ Verifica: la scheda nuova si apre su
`https://gsdoc.genesyssoftware.eu/page-function/E20…/1?prodotto=…`.

Sul server di prova e' la pagina «1.1.1.1 - Tabelle Generali: 1. Condizioni di Pagamento».

✔ Verifica: scelta la voce, il pannello Opzioni si chiude da solo.

# 3. Informazioni sulla sessione

Nel legacy era «Informazioni su»: chi e' collegato, a quale server, con quale connessione, catalogo,
livello d'uso, documentale e versione del client. Serve soprattutto quando si chiede aiuto:
**Copia** mette tutto negli appunti, una riga per voce.

![Informazioni sulla sessione](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/Hwfinformazioni-sulla-sessione.png)

✔ Verifica: ci sono le righe Utente, Server (nodo), Porta, Connessione n., Catalogo, Livello d'uso.

✔ Verifica: Utente non e' vuoto (non «—»).

✔ Verifica: Connessione n. e' un numero.

✔ Verifica: Client comincia con «sbh-web».

✔ Verifica: **Chiudi** chiude la finestra.

# 4. Tema scuro

**Tema scuro** e' un interruttore: cambia il tema di tutta l'applicazione (la stessa preferenza
della luna nella barra in alto dell'ERP), non solo delle maschere.

![Tema scuro](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/tema-scuro.png)

✔ Verifica: acceso, la pagina passa al tema scuro (classe `app-dark` sulla pagina).

✔ Verifica: l'interruttore della voce e' acceso.

✔ Verifica: ricliccato, si torna al tema chiaro.

# 5. Documenti: il pannello affiancato

Il pulsante **Documenti** della barra in basso apre a destra un pannello con le stampe e i file che
il server manda durante la sessione, affiancato alle maschere: lo schermo si divide e il divisore si
trascina (doppio clic lo rimette a meta'). Prima di qualunque stampa il pannello e' vuoto e lo dice.

![Il pannello Documenti, ancora vuoto](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/il-pannello-documenti-ancora-vuoto.png)

✔ Verifica: il pannello dice «Le stampe della sessione compaiono qui.».

✔ Verifica: il pulsante Documenti resta premuto finche' il pannello e' aperto.

✔ Verifica: ricliccato, il pannello si chiude.

# 6. Dentro la funzione: Stampa la schermata

Si sceglie **Interrogazione** e si avvia. Aperta la funzione il pannello cambia: si accendono le
voci che lavorano sulla funzione a video (stampa, strumenti della griglia, archivio stampe) e si
spegne **Esci dalla sessione**, perche' uscire con una funzione aperta la troncherebbe a meta' (il
COBOL non chiude file e transazioni): prima si torna al menu con Esci.

**Stampa la schermata** e' l'hardcopy del client legacy: stampa **la funzione com'e' a video**, e
solo quella. Da `printScreen`
(`sbh-web/src/session/components/sbh-session-page/sbh-session-page.component.ts`): mette la classe
`sbh-print-target` sul contenitore della funzione e `sbh-printing` sulla pagina, poi chiama la
finestra di stampa del browser; le regole `@media print` di `sbh-cornice.component.ts` nascondono
tutto il resto (barra in alto, menu, barra in basso, pannelli) e allargano la funzione alla pagina.
Chiusa la finestra di stampa (`afterprint`) le due classi si tolgono. Stampante, copie e formato si
scelgono nella finestra del browser: la stampa silenziosa su una stampante di Windows del legacy da
un browser non si puo' fare. Lo script **non** apre la finestra di stampa (bloccherebbe il browser
di prova): verifica che la voce ci sia e sia attiva.

![Il pannello Opzioni dentro la funzione](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/il-pannello-opzioni-dentro-la-funzione.png)

✔ Verifica: dentro la funzione **Stampa la schermata** e' attiva e dice «La funzione a video,
com'e'».

✔ Verifica: dentro la funzione **Archivio stampe** e' attivo.

✔ Verifica: dentro la funzione **Esci dalla sessione** e' spento.

# 7. Trace del protocollo

**Trace del protocollo** apre a destra il pannello con ogni frame scambiato col server: ◀ quello che
arriva, ▶ quello che parte, · gli eventi (sessione aperta, chiusa, macro non gestite). Serve a
capire cosa il programma chiede e cosa il client risponde, senza il log del client legacy. Il
livello, in alto a sinistra, dice quanto scrivere e si ricorda nel browser:

| livello | cosa scrive |
|---|---|
| 0 | niente: trace spento |
| 1 | solo gli eventi (sessione, errori, avvisi), nessun frame |
| 2 | anche una riga per frame: `MCCB func=… subf=… optn=… retn=… name="…" dati=… sicb=…` e i byte |
| 3 | anche il **dump esadecimale** di ogni frame: offset, 16 byte in esadecimale, gli stessi in testo |

Il trace scrive solo da quando e' acceso: per vedere l'avvio della funzione si accende dal menu,
**prima** di avviare. La casella **Filtra** tiene le righe che contengono il testo (una macro, il
nome di una maschera) e il contatore dice quante sono su quante; **Scarica** salva un `.txt` con le
righe **filtrate** (come il `000.txt` del log legacy) col nome `sbh-trace-AAAAMMGG-hhmmss.txt`
in ora locale; il cestino svuota. Le righe lunghe vanno a capo dentro il pannello; il dump
esadecimale, che a capo non si leggerebbe, scorre in orizzontale dentro la sua riga.

![Trace al livello 3, con il dump esadecimale dell'avvio](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/trace-al-livello-3-con-il-dump-esadecimale-dellavvio.png)

✔ Verifica: al livello 3 sotto le righe dei frame c'e' il dump esadecimale.

✔ Verifica: ci sono righe in arrivo (◀) e in partenza (▶).

✔ Verifica: nessuna riga esce a destra del pannello: le righe lunghe vanno a capo.

✔ Verifica: filtrando per il nome della griglia `20000DTB2-200` restano meno righe, tutte con quel
nome, e il contatore dice «N / totale».

✔ Verifica: **Scarica** salva `sbh-trace-AAAAMMGG-hhmmss.txt` con la data di oggi e l'ora locale,
e il file contiene solo le righe filtrate.

✔ Verifica: al livello 2, aprendo e chiudendo l'archivio stampe, compaiono righe `func=` senza dump.

✔ Verifica: al livello 1, la stessa apertura dell'archivio non scrive nessun frame.

✔ Verifica: al livello 0, svuotato, il pannello dice «Trace spento.».

# 8. Tutta la finestra

Dopo il login al legacy la shell tiene solo la barra in alto col logo; **Tutta la finestra** toglie
anche quella e la sessione prende tutta la finestra del browser (non lo schermo intero: le schede e
la barra degli indirizzi di Chrome restano). Vale per tutte le schede di sessione. Si torna indietro
con la stessa voce o col pulsante che compare nella barra in basso.

![Tutta la finestra](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/3CKtutta-la-finestra.png)

✔ Verifica: acceso, la barra in alto sparisce.

✔ Verifica: il pulsante «Tutta la finestra» della barra in basso resta premuto.

✔ Verifica: ricliccato quel pulsante, la barra in alto torna.

# 9. Archivio stampe

L'**archivio stampe** (lo storico delle stampe sul server, `SbhSpmSearchDlg` del legacy) si apre
solo mentre la funzione **aspetta un input**: le richieste viaggiano "a parte" rispetto alla
maschera in attesa, e il server risponde senza che il programma si muova; chiuso l'archivio, la
funzione riprende da dove era, col cursore sul campo. All'apertura il server manda l'elenco delle
**stampanti d'uscita** che hanno stampe nello storico; si cerca per stampante d'uscita, utente
(quello del login) e date di creazione (oggi, di partenza). Sulla ricerca di oggi non c'era niente:
lo script allarga **Creati dal** a un anno fa e trova due flussi del registro IVA.

![Archivio stampe: due flussi dell'ultimo anno](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/archivio-stampe-due-flussi-dellultimo-anno.png)

✔ Verifica: la stampante d'uscita e' gia' scelta: l'elenco e' arrivato dal server.

✔ Verifica: senza un flusso scelto Anteprima, Ristampa, Proroga 30 gg ed Elimina sono spenti.

✔ Verifica: allargata la data, la ricerca trova flussi, con titolo, uscita e formato (Testo).

Un clic su un flusso lo sceglie e chiede al server i suoi **documenti**, che compaiono a destra con
titolo, copie, ristampe, ultima stampa, email e identificativo. Con un flusso scelto si accendono i
comandi in fondo: **Anteprima** (il flusso arriva nel visualizzatore del browser), **Proroga 30 gg**
della conservazione ed **Elimina** (in due clic: il primo arma la conferma). **Ristampa** vuole
anche la **stampante del server**, scelta nella tendina accanto (l'elenco arriva dal server). Le
caselle a sinistra dei documenti scelgono **quali** documenti del flusso vedere in anteprima o
ristampare; nessuna casella = tutto il flusso. La guida si ferma qui: anteprima, ristampa, proroga
ed eliminazione agiscono sullo storico vero e non si provano.

![Flusso scelto, documento spuntato, stampante del server scelta](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/flusso-scelto-documento-spuntato-stampante-del-server-scelta.png)

✔ Verifica: cliccato un flusso, a destra c'e' «Documenti di <titolo del flusso> (n)» con le righe
dei documenti.

✔ Verifica: con il flusso scelto Anteprima, Proroga 30 gg ed Elimina sono attivi.

✔ Verifica: senza la stampante del server Ristampa resta spento.

✔ Verifica: la casella di un documento si spunta (un documento scelto).

✔ Verifica: l'elenco delle stampanti del server non e' vuoto, e sceltane una Ristampa si accende.

✔ Verifica: chiuso l'archivio, la funzione riprende col cursore sul codice pagamento.

# JS4 Griglie e analisi nel client web del legacy SBH

# 1. La griglia: righe che arrivano dal COBOL

La griglia sotto la maschera non la disegna il client: le righe le crea il programma COBOL con
`INIT-MASK` + `PUT-SCREEN` (maschera `20000DTB2-200`), e il client le mostra con la griglia standard
dell'ERP, RevoGrid. Le prime tre colonne (Cod., la matita, Descrizione) restano ferme quando si
scorre a destra: sono le 24 rate (TC, GG dec, % Rata) a far scorrere la griglia.

![La griglia di Condizioni pagamento](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/la-griglia-di-condizioni-pagamento.png)

✔ Verifica: la griglia mostra le condizioni mandate dal COBOL (codice e descrizione in ogni riga).

✔ Verifica: le intestazioni sono i titoli della maschera (Cod., Descrizione, TC_1, % Rata 1).

# 10. Dove si salvano le scelte

Oggi tutto sta nel **browser** (`localStorage`), per postazione, come i file `.cnf`/`.pvt` del
client legacy stavano sul PC:

| Scelta | Chiave | Chi la scrive |
|---|---|---|
| larghezze trascinate, colonne nascoste, ordine delle colonne | `core-grid.colonne.<stateKey>` | la griglia comune (`core/src/grid/grid.component.ts`) |
| viste salvate di pivot e grafico | `core-grid.analisi.<stateKey>` | `LocalAnalysisStore` (`core/src/grid/analysis/analysis-store.ts`) |
| Configura la griglia (ordinamento, subtotali, funzioni) | `sbh-web.gridconf.<catalogo>.<utente>.<form>.<maschera>` | `SbhSessionService.setGridConf` (sbh-web) |

Lo `stateKey` lo sceglie chi ospita la griglia; sbh-web usa `sbh.<form>.<maschera>.<utente>`
(qui `sbh.20000FTB2.20000DTB2-200.SYSTEM MANAGER`). Una griglia senza `stateKey` non ricorda le
colonne, e le sue viste finiscono sotto un'impronta dei campi (`campi.<hash>`): stessa tabella,
stesse viste.

Le viste di pivot e grafico passano da un'interfaccia, `GridAnalysisStore` (`list` / `save` /
`remove`), fornita col token `GRID_ANALYSIS_STORE`. Per portarle sul **server**, con le viste che
seguono l'utente su ogni postazione e si possono condividere, basta fornire un'altra
implementazione del token: la griglia e le due finestre non cambiano. Le scelte sulle colonne e la
configurazione di sbh-web oggi non hanno un'interfaccia analoga.

---

# 2. Ordinare cliccando un'intestazione

Un clic ordina crescente, il secondo decrescente, il terzo toglie l'ordinamento e rimette l'ordine
in cui il COBOL ha mandato le righe. L'ordinamento e' del client: il COBOL non ne sa niente, e le
righe che rilegge con `GET-GRID` restano le sue.

La colonna ordinata si riconosce da un **filetto** di 2px col colore primario in fondo
all'intestazione, con una freccina ▲/▼ all'estremita' dove c'e' spazio: a destra sulle colonne
di testo, a sinistra su quelle allineate a destra (numeri, date), dove a destra c'e' il testo. Sta
in fondo alla cella in posizione assoluta apposta: non occupa larghezza, quindi si vede anche sulle
colonne «a filo» del contenuto, dove l'imbuto del filtro non ci sta piu' e si nasconde.

### Una colonna allineata a destra

![Cod. ordinata: il filetto a tutta larghezza, la freccina a sinistra](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/cod-ordinata-il-filetto-a-tutta-larghezza-la-freccina-a-sinistra.png)

✔ Verifica: un clic su «Cod.» ordina i codici dal piu' piccolo.

✔ Verifica: su «Cod.», colonna numerica stretta (45px) allineata a destra, il filetto di 2px
attraversa tutta l'intestazione e la freccina sta nella meta' di sinistra.

✔ Verifica: un secondo clic inverte: in cima il codice piu' grande.

### Una colonna stretta allineata a sinistra

![TC_1 ordinata: il filetto attraversa tutta l'intestazione](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/tc-1-ordinata-il-filetto-attraversa-tutta-lintestazione.png)

✔ Verifica: su «TC_1», larga 37px, il filetto attraversa tutta l'intestazione.

✔ Verifica: ordinando «TC_1» il filetto di «Cod.» sparisce: si ordina per una colonna alla volta.

✔ Verifica: su «Descrizione» il filetto e' largo quanto l'intestazione.

✔ Verifica: al terzo clic l'ordinamento si toglie e torna l'ordine del COBOL.

# 3. Filtri di colonna dal tasto destro sull'intestazione

Il tasto destro su un'intestazione apre il menu della colonna (dal 2026-10-02): «Filtra…» apre il
filtro di quella colonna (lo stesso dell'imbuto che compare passandoci sopra); nello stesso menu
«Nascondi la colonna», «Raggruppa per questa colonna» e «Totale sotto», che sono le scelte
dell'Analisi Avanzata. Sulle intestazioni a icona o a casella che il COBOL gestisce col tasto destro
vince il COBOL, e il menu non si apre. Il pannello dice su cosa agisce, «su tutte le righe»: qui la griglia ha
tutte le righe in mano, non c'e' un server a cui chiedere. Le condizioni sono quelle di RevoGrid
(Uguale, Diverso, Inizia con, Contiene, Non contiene, vuoto / non vuoto) e si possono sommare con
«Aggiungi condizione».

![Il filtro di Descrizione: Contiene BANC](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/il-filtro-di-descrizione-contiene-banc.png)

✔ Verifica: tasto destro › «Filtra…» su «Descrizione» apre il filtro della colonna, sotto l'intestazione.

✔ Verifica: «Contiene BANC» lascia solo le condizioni con BANC nella descrizione.

### La griglia filtrata

![La griglia filtrata](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/la-griglia-filtrata.png)

✔ Verifica: l'intestazione filtrata cambia colore e tiene l'imbuto acceso.

✔ Verifica: «Azzera» rimette tutte le righe.

### Una colonna stretta

Sotto i 62px (Valuta, 55px) l'imbuto coprirebbe il titolo: resta al suo posto ma invisibile, e il
filtro si apre dal tasto destro.

![Il filtro di Valuta, aperto dal tasto destro](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/il-filtro-di-valuta-aperto-dal-tasto-destro.png)

✔ Verifica: su «Valuta», colonna stretta, l'imbuto non si vede nemmeno passandoci sopra.

✔ Verifica: il tasto destro su «Valuta» apre il filtro accanto alla colonna, subito sotto
l'intestazione.

# 4. Il menu del tasto destro su una cella

Il tasto destro su una cella apre il menu della griglia: in testa le **statistiche** della
selezione (quante celle, se sono numeri: somma, media, minimo e massimo; le stesse della barra di
stato in fondo), poi Copia, Esporta, il sottomenu **Analisi** e gli Strumenti. Per selezionare piu'
celle: clic sulla prima, Maiuscolo+clic sull'ultima.

![Tre celle selezionate e il sottomenu Analisi](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/tre-celle-selezionate-e-il-sottomenu-analisi.png)

✔ Verifica: con una sola cella selezionata il menu dice «1 cella».

✔ Verifica: tre celle di «% Rata 1» selezionate: il menu dice «3 celle — NUMERI» e la somma e' la
loro.

✔ Verifica: Copia › Per Excel mette negli appunti le tre celle, una per riga.

✔ Verifica: Esporta offre CSV, Excel e PDF.

✔ Verifica: la finestra «Esporta in CSV» scarica un file .csv.

✔ Verifica: il sottomenu Analisi ha Pivot, Grafico e Analisi avanzata.

# 5. Colonne visibili e larghezze ricordate

Strumenti › **Colonne visibili** accende e spegne le colonne; trascinando il bordo destro di
un'intestazione si cambia la larghezza (una targhetta dice i pixel mentre si trascina, una riga
tratteggiata dove finira' il bordo). Le scelte si ricordano nel browser per form, maschera e utente:
dove, lo dice il § 10.

![Strumenti › Colonne visibili](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/strumenti-colonne-visibili.png)

Le colonne senza titolo compaiono nell'elenco col loro tooltip o come «(azioni)»: qui la matita.
L'elenco si apre verso l'alto e scorre; quando il menu e' vicino al bordo destro (oltre
`larghezza − 720px`, i tre livelli menu › Strumenti › Colonne visibili) i sottomenu si aprono verso
sinistra, come nella schermata, e restano tutti dentro la finestra.

✔ Verifica: il sottomenu «Colonne visibili» si apre verso l'alto, non esce sotto la finestra e
scorre.

✔ Verifica: nessuna voce senza nome: la colonna della matita si chiama col suo tooltip o
«(azioni)».

✔ Verifica: tolta la spunta a «DescPag» la colonna sparisce dalla griglia.

### Le larghezze

![Il bordo di Descrizione trascinato: la targhetta con i pixel](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/il-bordo-di-descrizione-trascinato-la-targhetta-con-i-pixel.png)

✔ Verifica: trascinando il bordo destro «Descrizione» si stringe di 80px.

✔ Verifica: colonne nascoste e larghezze stanno nel browser sotto
`core-grid.colonne.<form>.<maschera>.<utente>`.

✔ Verifica: uscendo e rientrando nella funzione «DescPag» resta nascosta.

All'apertura il COBOL manda `SET-GRID RESIZE-COL`, cioe' «adatta le colonne al contenuto»: la
griglia lo fa senza toccare le larghezze scelte a mano. Il pulsante «Adatta le colonne» degli
Strumenti invece le dimentica apposta: e' il modo di dire «torna come prima».

✔ Verifica: rientrando, «Descrizione» resta stretta come l'ha lasciata il trascinamento, anche dopo
l'adatta del COBOL.

✔ Verifica: rimessa la spunta, «DescPag» torna.

# 6. Opzioni › «Configura la griglia»: ordinamento e subtotali

E' la configurazione del client legacy (il suo `.cnf`): ordinamento fino a tre colonne, il
subtotale a ogni cambio delle prime, le «Righe di totale» con una funzione per colonna (somma,
media, conteggio, distinti, minimo, massimo). A differenza del clic sull'intestazione, questa
passa per la griglia come la farebbe il COBOL con `PUT-GRID AGGREGATE`: le righe di totale non sono
istanze e non tornano al COBOL.

![Configura la griglia: TC_1 con subtotale, Cod. con Conteggio](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/configura-la-griglia-tc-1-con-subtotale-cod-con-conteggio.png)

![I subtotali per tipo carta](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/i-subtotali-per-tipo-carta.png)

✔ Verifica: ordinata per TC_1 con subtotale: a ogni cambio di TC_1 compare una riga di totale in
grassetto su fondo grigio.

✔ Verifica: la riga di subtotale porta il conteggio dei codici del gruppo.

✔ Verifica: la riga di subtotale ha il fondo del totale su tutte le colonne della maschera, anche
quella della matita. La colonna `#` (numero di riga della griglia comune) resta bianca: «Aperto».

✔ Verifica: la configurazione si ricorda nel browser
(`sbh-web.gridconf.<catalogo>.<utente>.<form>.<maschera>`).

✔ Verifica: «Togli configurazione» torna all'ordine del COBOL, senza righe di totale, e dimentica la
scelta.

# 7. Il pivot

Dal tasto destro › Analisi › **Pivot** (o Opzioni › «Pivot della griglia»). Lavora sulle righe a
video, coi filtri di colonna applicati, senza la colonna delle azioni e senza righe di totale; i
numeri e le date sono veri, non il testo formattato. A sinistra i campi (`#` numero, `≡` testo), da
**trascinare** nelle quattro zone Righe, Colonne, Valori, Filtri; un clic su un campo lo mette nella
zona piu' probabile.

### Righe, colonne, valori

All'apertura propone una partenza: in Righe la colonna di testo con piu' valori diversi, in Valori
la somma del numero piu' utile. Qui si costruisce «quante condizioni per tipo carta e decorrenza»:
TC_1 in Righe, DecPag in Colonne, e sul chip del valore la funzione Conteggio.

![TC_1 × DecPag, conteggio](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/tc-1-decpag-conteggio.png)

✔ Verifica: il pivot parte da una proposta: righe = la colonna di testo piu' varia, valori = la
somma di un numero.

✔ Verifica: trascinato TC_1 in Righe: una riga per ogni tipo carta (AB, BB, CN…).

✔ Verifica: trascinato DecPag in Colonne: una colonna per valore (0, 1, 2, 3) piu' il totale.

✔ Verifica: con «Conteggio» il totale generale e' il numero di righe analizzate.

✔ Verifica: «Mostra come: % del totale» porta il totale generale a 100.

### Ordine, primi N, calore e barre

Nella barra dei comandi: A–Z / 123 ordina per etichetta o per valore, la freccia inverte, «Primi N»
tiene i gruppi piu' grandi e mette il resto in «Altri». I numeri si leggono in tre modi: **Calore**
(il fondo della cella piu' intenso dove il numero e' piu' grande, su una scala a radice perche' si
vedano anche le differenze piccole), **Barre** (una barra da destra lunga quanto il valore rispetto
al massimo della colonna), 123 (solo numeri).

![Per valore, decrescente, primi 5, in modo Calore](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/per-valore-decrescente-primi-5-in-modo-calore.png)

✔ Verifica: ordinato per valore, decrescente, «Primi 5»: cinque tipi carta dal piu' usato, il resto
in «Altri».

✔ Verifica: in modo «Calore» il fondo delle celle e' piu' intenso dove il numero e' piu' grande.

![Lo stesso pivot in modo Barre](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/lo-stesso-pivot-in-modo-barre.png)

✔ Verifica: in modo «Barre» ogni cella ha una barra lunga quanto il valore rispetto al massimo.

### Gruppi apribili

Con due campi in Righe il primo diventa un gruppo che si apre e si chiude (clic sull'etichetta, o i
due pulsanti ⊕ ⊖ per tutti).

![TC_1 › Descrizione, gruppi chiusi](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/tc-1-descrizione-gruppi-chiusi.png)

✔ Verifica: con due campi in Righe (TC_1 › Descrizione) i tipi carta diventano gruppi apribili.

✔ Verifica: «Chiudi tutti i gruppi» lascia solo i tipi carta.

✔ Verifica: «Apri tutti i gruppi» rimette le descrizioni sotto ogni tipo carta.

### Drill-down: le righe di una cella

Un clic su una cella apre sotto il pivot le righe della griglia che la compongono, con tutte le
colonne: e' il modo di passare dal numero ai casi.

![Il clic sul totale di RB: le 41 righe](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/il-clic-sul-totale-di-rb-le-41-righe.png)

✔ Verifica: un clic su una cella apre sotto le righe che la compongono, tante quante il conteggio.

### Filtro dei valori

Un campo in Filtri non diventa ne' riga ne' colonna: serve a escludere dei valori. L'imbuto del chip
apre l'elenco dei valori con «tutti» / «nessuno», e il chip conta quanti ne sono esclusi.

![DataDecPag in Filtri, escluso il valore 1](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/datadecpag-in-filtri-escluso-il-valore-1.png)

✔ Verifica: nel filtro DataDecPag, tolto «1»: il chip conta un valore escluso e il totale scende.

### Esportare e salvare la vista

I due pulsanti a destra esportano il pivot com'e' a video in Excel (`.xlsx`) e CSV. Le **viste
salvate** (in basso a sinistra) ricordano righe, colonne, valori, filtri e opzioni; ☆ la salva come
predefinita, che si apre da sola la volta dopo.

![La vista «Guida griglie» salvata](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/la-vista-guida-griglie-salvata.png)

✔ Verifica: i due pulsanti di export scaricano il pivot in .xlsx e in .csv.

✔ Verifica: salvata la vista «Guida griglie»: compare in «Viste salvate» e nel browser sotto
`core-grid.analisi.<form>.<maschera>.<utente>`.

✔ Verifica: riaperto il pivot, la vista salvata rimette righe, colonne, valori e filtro.

# 8. Il grafico

Dal pivot col pulsante **Grafico** (prima riga = etichette dell'asse, prima colonna = serie, stessi
valori), dal tasto destro › Analisi › Grafico o da Opzioni › «Grafico della griglia». Otto tipi
(Colonne, Barre, Linee, Aree, Torta, Ciambella, Polare, Radar), una o piu' serie, impilato, primi N
con «Altri». In testa i **numeri chiave**: Totale (di tutte le righe), Media e Massimo/Minimo
calcolati sulle etichette a video, senza «Altri» (per questo la media dice «su N etichette»); il
Massimo porta la sua quota del totale.

![Il grafico aperto dal pivot](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/il-grafico-aperto-dal-pivot.png)

✔ Verifica: «Grafico» dal pivot apre il grafico con le etichette del pivot: una per tipo carta.

✔ Verifica: la serie arriva dal pivot anche se e' un campo numerico: la tendina «Serie» dice
DecPag. Asse e serie offrono tutti i campi, anche i numerici.

✔ Verifica: il filtro del pivot passa al grafico: Totale 130 come nel pivot (DataDecPag = 1
escluso), e nella barra il bottone «1 esclusi ×».

✔ Verifica: i numeri chiave: Totale, Media, Massimo (con la sua quota), Minimo.

✔ Verifica: un clic su «esclusi ×» toglie il filtro: il Totale torna a tutte le righe (133).

### Tipo, impilato, primi N

![Barre orizzontali, impilate, primi 5 con Altri](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/barre-orizzontali-impilate-primi-5-con-altri.png)

✔ Verifica: i tipi si scelgono con un clic: «Barre» diventa quello attivo.

✔ Verifica: «Impilato» mette le serie una sull'altra.

✔ Verifica: «Primi 5» con «Altri» acceso: cinque etichette piu' una che raccoglie il resto.

### Le righe di una barra, il PNG

![Il clic su una barra: le righe che la compongono](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/il-clic-su-una-barra-le-righe-che-la-compongono.png)

✔ Verifica: un clic su una barra apre le righe che la compongono.

✔ Verifica: «PNG» scarica l'immagine del grafico.

### Ciambella e viste del grafico

![Ciambella, e la vista salvata del grafico](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/ciambella-e-la-vista-salvata-del-grafico.png)

✔ Verifica: cambiando tipo le righe della barra di prima si chiudono (valgono per la barra
cliccata, non per il grafico nuovo).

✔ Verifica: «Ciambella» toglie la scelta delle serie (una torta ha un solo cerchio di valori).

✔ Verifica: anche il grafico salva le sue viste, accanto a quelle del pivot.

✔ Verifica: la × accanto a una vista la cancella, anche dal browser.

# 9. Opzioni › «Griglia in XML»

L'export XML del client legacy: la griglia com'e' (tipi, titoli, una `<row>` per riga con tutti i
campi, anche l'id interno), aperta nel visualizzatore dei documenti della sessione in una pagina a
tutta larghezza (non un foglio di stampa), da dove si stampa, si scarica o si affianca alle
maschere.

![L'XML della griglia nel visualizzatore](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/lxml-della-griglia-nel-visualizzatore.png)

✔ Verifica: «Griglia in XML» apre nel visualizzatore dei documenti l'XML della griglia, una `<row>`
per riga.

✔ Verifica: l'XML sta in una pagina a tutta larghezza, non in un foglio A4: le righe lunghe scorrono
con la pagina.

# JS5 Il client web del legacy SBH — menu e maschere

# 1. Il modulo

Il legacy ha un menu per modulo (B20 Amministrazione, B27 Ciclo Attivo, …). In testa al menu, a
sinistra, c'e' la **barra del modulo**: icona, nome, codice e numero di funzioni. Il modulo si cambia
in due modi, con gli stessi moduli e la stessa scelta.

**La lista a tendina.** Un clic sulla barra (ovunque, tranne sui quadratini) o sulla **freccia**
accanto ai quadratini apre, subito sotto la barra e larga quanto il pannello, la lista dei moduli:
una riga per modulo con la sua icona, il codice, il nome e il numero di funzioni. Il modulo corrente
ha il segno a sinistra, i moduli senza funzioni sono attenuati; un modulo con piu' versioni e' una
riga sola, con le funzioni di tutte le versioni. Si usa da tastiera:

| Tasto | Cosa fa |
|---|---|
| clic sulla barra, oppure ↓ / ↑ con la barra a fuoco | apre la lista, col fuoco sul modulo corrente |
| ↑ ↓ | modulo precedente / successivo (la lista scorre per tenerlo in vista) |
| Home / Fine | primo / ultimo modulo |
| una lettera o piu' lettere di seguito | il primo modulo il cui codice o nome comincia cosi' (premuta di nuovo, il successivo) |
| INVIO (o Spazio), oppure clic sulla riga | sceglie il modulo; la lista si chiude e il fuoco torna sulla barra |
| Esc | chiude la lista e torna sulla barra, **senza** chiedere di uscire dalla sessione |
| Tab, o un clic fuori | chiude la lista |

**La griglia.** I **quadratini** a destra della barra aprono «Scegli il modulo»: una carta per modulo
col numero di funzioni, e una ricerca per codice o descrizione. Si scrive `B20` e resta una carta
sola. Serve quando i moduli sono tanti e si cerca per parola.

![Scegli il modulo, filtrato su B20](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/scegli-il-modulo-filtrato-su-b20.png)

✔ Verifica: il dialog mostra una carta per ogni modulo del server (piu' di dieci).

✔ Verifica: scritto `B20` nella ricerca restano solo le carte che lo contengono.

✔ Verifica: scelta la carta, in testa al menu c'e' «Amministrazione» con `B20` e il numero di
funzioni.

✔ Verifica: il piede del menu dice `Menu B20 · vers. … · rel. …`: e' la versione del file di menu
scaricato dal server, quella da citare in una segnalazione.

# 10. Uscire dalla funzione, Preferiti e Recenti nel benvenuto

Esc (o il tasto «Esc Esci» della barra) manda Esci al COBOL: ogni Esci fa risalire il programma di
un passo, finche' si chiude e il server torna al menu (lo spec ne preme fino a sei). Cambiando
modulo si arriva al **benvenuto**: utente, modulo, stampante predefinita e, sotto, i **Preferiti** e
i **Recenti**, con l'icona del tipo di lavoro usato. I Recenti li scrive l'avvio di una voce; i
Preferiti la stella.

![Il benvenuto con la voce nei Preferiti e nei Recenti](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/il-benvenuto-con-la-voce-nei-preferiti-e-nei-recenti.png)

✔ Verifica: dopo gli Esci il server e' di nuovo sul menu (pannello di avvio o benvenuto).

✔ Verifica: dal menu il pulsante Esci dalla sessione e' di nuovo acceso.

✔ Verifica: nel benvenuto di B10 la sezione Preferiti contiene `B20 1.1.1.1 Condizioni Pagamento`.

✔ Verifica: la sezione Recenti contiene la stessa voce.

# 11. Riaprire un preferito e chiudere la sessione

Un clic su un preferito cambia modulo da solo e riapre il pannello di avvio della voce. Da li' la
stella si toglie; l'Esci dalla sessione chiede conferma con una finestra del client, non del
browser, perche' chiude la connessione col server.

![Il preferito riaperto e la conferma di uscita](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/il-preferito-riaperto-e-la-conferma-di-uscita.png)

✔ Verifica: il clic sul preferito riapre il pannello di «Condizioni Pagamento»…

✔ Verifica: …tornando da solo al modulo Amministrazione (B20).

✔ Verifica: e' scelto «Interrogazione», il tipo di lavoro con cui la voce era stata messa nei
Preferiti (la lente nella riga del benvenuto), non il primo tipo della voce.

✔ Verifica: cliccata di nuovo, la stella si spegne (vuota).

✔ Verifica: Esci dalla sessione apre «Chiudere la sessione?» con «La connessione col server SIGEA si
chiude. Per rientrare servira' di nuovo il login.»

✔ Verifica: «Chiudi la sessione» porta lo stato a «Chiuso».

Il tipo ricordato vale solo se la voce lo ammette ancora: se nel frattempo il menu del server non
lo abilita piu', il pannello torna al predefinito della voce.

# 12. Quello che questa voce non mostra

Due cose richieste a questa guida non si vedono su Condizioni pagamento in interrogazione, e
quindi qui non hanno una riga ✔: scriverla senza averla vista sarebbe una verifica finta.

- **Messaggi del COBOL.** Il client ne ha tre forme: la finestra che aspetta un tasto (conoscitivo,
  attenzione, errore, grave, decisionale: `sbh-message.component.ts`, con OK e i tasti proposti dal
  programma), il toast che sparisce da solo per le informazioni (`sbh-toast`), e la nota rossa in
  basso per l'errore del campo (`getScreen().error`). Provati su questa voce: codice `0`, codice
  inesistente `99998`, F3, F6, F12 e F4 sul campo Convalida (che apre la finestra «Simulazione
  condizione di pagamento») — il COBOL non manda nessun messaggio. L'unico messaggio a video e'
  quello del client in §11. Per provarli serve una voce che scrive (Inserimento), che questa guida
  non usa per non toccare i dati del server.
- **Etichette-pulsante e voce «premuta».** Un'etichetta con un trigger nel legacy e' un pulsante
  grigio (`mask__text--btn`), e un'etichetta in REVERSE e' la voce in cui ci si trova, disegnata
  come pulsante premuto (`mask__text--pressed`, `sbh-mask.component.ts:257-259`; il caso d'origine
  e' IACLI50D). La maschera `20000FTB2` non ha etichette con trigger ne' in REVERSE (contate dallo
  prove fatte scrivendo la guida: zero).

# 2. L'albero del menu e la ricerca

L'albero e' quello del client legacy: ogni voce ha il suo **numero** accanto (1.1, 1.10, 2.1…),
perche' nel gestionale le funzioni si chiamano per numero al telefono. La casella «Cerca nel menu»
accetta testo o numero: scritta la parola, l'albero mostra solo i rami che portano a una voce che la
contiene, gia' aperti, con la parola evidenziata.

Il menu si usa tutto da tastiera, come l'albero del client legacy. Arrivati sul menu — anche tornando da
una funzione — la voce dell'ultima funzione avviata e' gia' scelta, con i rami aperti fino a lei e il
fuoco sopra: non serve cliccare. Poi:

| Tasto | Cosa fa |
|---|---|
| `↑` `↓` | voce sopra / sotto fra quelle visibili; su una funzione il pannello di avvio la mostra subito |
| `→` | apre il ramo; se e' gia' aperto va alla prima voce dentro |
| `←` | chiude il ramo; su una voce interna torna al ramo che la contiene |
| `Home` `Fine` | prima / ultima voce visibile |
| `Invio` | su un ramo lo apre o lo chiude; su una funzione la **avvia** con le scelte del pannello (come il doppio clic) |
| `Spazio` | sceglie la funzione e porta il fuoco sui tipi di lavoro del pannello |
| cifre | vanno alla voce con quel numero (`1` `2` di seguito = voce 12), come nel legacy |
| `*` | apre tutti i rami allo stesso livello |

Le lettere restano del pannello di avvio (`I M R C E S` scelgono il tipo di lavoro), ESC e i tasti
funzione restano del programma. Con una funzione aperta il menu e' in consultazione: ci si muove, ma
Invio non avvia nulla.

Col mouse vale lo stesso del legacy (`SbhMenuView.cpp:2208-2231`): un clic su una funzione la sceglie e
apre il pannello di avvio; il **doppio clic** la avvia subito con le scelte che il pannello ha in quel
momento (tipo di lavoro proposto o gia' scelto, modalita', ruolo e stampante ricordati), senza passare
da **Avvia**. Se la voce non puo' partire (nessun dispositivo compatibile) resta il pannello, che dice
perche'. Il doppio clic su un ramo lo apre o lo chiude; in consultazione non avvia nulla.

✔ Verifica: doppio clic su «1.1.1.1 Condizioni Pagamento» e la funzione parte in Inserimento,
Definitiva, sull'uscita predefinita, senza fermarsi sul pannello.

✔ Verifica: tornati al menu da una funzione, senza toccare il mouse, `↓` e `↑` muovono il fuoco a
partire dalla voce appena usata.

✔ Verifica: `Invio` su una funzione la fa partire senza passare dal pulsante **Avvia**.

![L'albero del modulo B20](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/lalbero-del-modulo-b20.png)

✔ Verifica: accanto a ogni voce c'e' il suo numero.

✔ Verifica: sopra l'albero c'e' il titolo «Funzioni».

![La ricerca «Condizioni»](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/la-ricerca-condizioni.png)

✔ Verifica: scritto «Condizioni», il titolo diventa «Risultati».

✔ Verifica: la parola e' evidenziata in ogni voce trovata (almeno tre: Tabelle, Stampa, Export).

✔ Verifica: i rami sono aperti fino a «1 Condizioni Pagamento», senza dover cliccare i padri.

# 3. Il pannello di avvio

Nel client legacy una voce si avvia con una finestrella di opzioni; qui la scelta della voce apre al
centro il **pannello di avvio**, che mette in fila le tre decisioni da prendere prima che il server
parta: il tipo di lavoro, la modalita', l'uscita. In alto il percorso della voce nel menu, in basso
il riepilogo di quello che partira'. `Invio` o **Avvia** fanno partire la funzione.

![Il pannello di avvio con Interrogazione scelta](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/il-pannello-di-avvio-con-interrogazione-scelta.png)

✔ Verifica: il percorso in alto e' `B20 › 1.1 Parametri base › 1.1.1 Tabelle Generali › 1.1.1.1
Condizioni Pagamento`.

✔ Verifica: il titolo e' «Condizioni Pagamento», col numero `1.1.1.1` davanti.

✔ Verifica: i tipi di lavoro sono quattro (Inserimento, Modifica, Interrogazione, Cancellazione),
ognuno con la sua lettera (`I M R C`): sono quelli che la voce abilita, non tutti e sei.

✔ Verifica: sotto «Interrogazione» il suggerimento e' «Consulta i dati», su una riga come le altre
carte.

✔ Verifica: all'apertura e' scelto il primo, Inserimento: la voce non dichiara un tipo predefinito
(nessuna etichetta «predefinito») e il client fa come il legacy, prende il primo abilitato.

✔ Verifica: in Modalita' non c'e' la scelta Definitiva/Simulata: la voce ammette solo la definitiva,
e una scelta con una sola risposta non si mostra…

✔ Verifica: …al suo posto c'e' scritto «Solo definitiva: la funzione aggiorna gli archivi»: la voce
lo dichiara nel menu (tipo elaborazione `0`, come `UpdateTipoElab` in `SbhMenuView.cpp:1059-1077`), il
client non lo deduce. Sulle voci che ammettono tutte e due le modalita' la scelta c'e', con la
simulata proposta. (La schermata 04 e' di prima: mostra ancora i due pulsanti con «Simulata» spenta.)

✔ Verifica: in Uscita c'e' l'elenco dei dispositivi del server (DUMPR, HOLD, SYSPR, …) col
protocollo a destra.

✔ Verifica: e' scelta la stampante predefinita della sessione (SYSPR), con l'etichetta
«PREDEFINITA».

✔ Verifica: cliccato «Interrogazione», il riepilogo in basso dice «Interrogazione»…

✔ Verifica: …«Definitiva» e l'uscita (`Testo su SYSPR`).

Il ruolo (ALL, SYSADMN, SYSADMNA) compare solo quando l'utente ne ha piu' di uno; l'ultimo scelto si
ricorda.

# 4. La stella dei Preferiti e il libro del manuale

Accanto al titolo ci sono due icone. La **stella** mette la voce nei Preferiti: si ricordano nel
browser e compaiono nel benvenuto (§10), anche per voci di altri moduli. Il **libro** apre il
manuale in linea della funzione in una finestrella a parte accostata a destra, come la finestra del manuale del client legacy.

![La stella accesa e il libro del manuale](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/la-stella-accesa-e-il-libro-del-manuale.png)

✔ Verifica: cliccata la stella, e' piena e colorata (`aria-pressed` vero).

✔ Verifica: l'icona e' quella della stella piena, non il contorno.

✔ Verifica: il libro punta alla pagina della funzione, non alla home del sito:
`https://gsdoc.genesyssoftware.eu/page-function/E2001010101000000/1?prodotto=SIGEAdb` (https: il
sito rimanda li' anche chi chiede http). Si legge cosi': modulo `E20` (la B iniziale diventa E),
fase `01`, poi due cifre per ogni livello del percorso `1.1.1.1` completate a dodici
(`010101010000`), e il prodotto dal livello SIGEA che il server dichiara al login (`5…` =
SIGEAdb). Lo spec controlla l'indirizzo senza aprire il sito.

✔ Verifica: il link si apre in una scheda nuova (`target="_blank"`).

# 5. La maschera a video

**Avvia**: il server manda la maschera e il client la disegna come il legacy, a colonne e righe di
caratteri. Il menu si ritira in un pulsante «Menu» nella barra in basso, per lasciare lo spazio alla
maschera. Il **campo in input** — quello che il COBOL sta aspettando — ha il bordo colorato e il
focus; gli altri sono grigi e non si possono toccare, perche' nel legacy si scrive solo dove il
programma chiede. I **tasti funzione validi per quel campo** stanno nella barra dei comandi in alto
(accesi quelli ammessi): cambiano a ogni campo, perche' li dichiara il COBOL campo per campo.

La barra in basso dice **che funzione sta girando**: il tipo di lavoro (con la sua icona),
**Definitivo** o **Simulato** (il simulato su fondo arancione, per non scambiarlo), la stampante con
cui la funzione e' partita (nome e tipo, per esempio `PDF01 PDF`; se il programma la cambia con la
finestra «Scegli la stampante», la barra si aggiorna) e il ruolo, se c'e'. Sono le scelte fatte nel
pannello di avvio: restano anche dopo una ricarica della pagina. Sul menu gli indicatori non ci
sono: le scelte correnti le mostra il pannello di avvio. Se la barra e' stretta (tante schede,
finestra piccola, schermo diviso) gli indicatori si raccolgono in un pulsante compatto (l'icona del
tipo di lavoro, `SIM` se simulato): il clic apre verso l'alto un pannello con tutti i dettagli.

**F7** sul campo in input mostra la **mini-guida** come il client legacy: form, maschera, campo, i
tasti ammessi e il trigger del campo, con il codice della barra di stato di SBH (per esempio
`-N0702  BEA31`: segno, numerico, cifre e decimali, poi le lettere dei tasti). Resta accesa e segue il
campo mentre ci si sposta; F7 di nuovo la spegne. Non manda niente al server: nel legacy F7 non e' un
tasto del COBOL. La stessa scheda, per qualunque item, si apre con Maiusc + clic destro.

![La maschera di Condizioni pagamento](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/la-maschera-di-condizioni-pagamento.png)

✔ Verifica: il campo «Codice pagamento» ha il focus appena la maschera arriva.

✔ Verifica: ha il bordo del campo in input…

✔ Verifica: …e gli altri campi (per esempio «Convalida») no.

✔ Verifica: la barra in basso dice la modalita' della funzione in corso (Definitivo o Simulato).

✔ Verifica: F7 sul campo apre la mini-guida con il form `20000FTB2`…

✔ Verifica: …e i tasti del campo, fra cui `Esc Esci`.

✔ Verifica: F7 di nuovo la spegne.

✔ Verifica: sotto la testata la griglia delle condizioni e' piena (1 CONTANTI, 2 RIMESSA DIRETTA,
…), con la matita di riga.

✔ Verifica: il menu e' ridotto al pulsante «Menu» nella barra.

✔ Verifica: il pulsante di spegnimento (Esci dalla sessione) e' spento: dentro una funzione non si
esce, si troncherebbe il programma a meta'.

Esc in una maschera **non** chiude una finestra del browser: e' il tasto Esci del COBOL, e lo manda
al server. Per questo i dialog del client (guida, ricerca) si chiudono con la **X**.

# 6. F10 — la guida del campo

Un campo con la guida ha un piccolo angolo colorato in basso a destra. F10 apre la guida: titolo del
campo, testo di help e, se ci sono, i valori ammessi da scegliere. Il testo arriva dai file di help
che il client ha gia' scaricato, quindi aprire e chiudere la guida **non** manda niente al server.

![La guida di «Codice pagamento»](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/la-guida-di-codice-pagamento.png)

✔ Verifica: il campo «Codice pagamento» ha l'angolo della guida.

✔ Verifica: F10 apre il dialog con il titolo «Codice pagamento».

✔ Verifica: il testo e' l'help del campo: «I codici a partire dal 99.900 sono riservati GENESYS…».

✔ Verifica: la X chiude la guida.

✔ Verifica: chiusa la guida senza scegliere, il cursore torna sul campo «Codice pagamento», come
nel legacy: si riprende a scrivere senza cliccare.

✔ Verifica: il campo resta com'era, vuoto e ancora in input.

# 7. F8 — la ricerca

F8 sul codice chiede al COBOL la sua ricerca: il server risponde con una **FIND-GRID** e il client
la apre come finestra di ricerca. Il server manda le righe una pagina alla volta (qui dieci); la
casella in alto filtra solo le righe gia' arrivate, perche' il filtro vero l'ha gia' fatto il COBOL
col valore del campo.

### Mentre carica

Finche' il server manda le righe la finestra e' aperta ma vuota, con lo spinner: si capisce che il
tasto e' stato preso e che si sta aspettando il server, non il client. Per fotografarlo lo spec
trattiene per un momento le risposte del server sul WebSocket (non le altera, le ritarda).

![La finestra di ricerca mentre carica](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/la-finestra-di-ricerca-mentre-carica.png)

✔ Verifica: al centro c'e' lo spinner con «Ricerca in corso…».

✔ Verifica: «Conferma selezione» e' spento finche' le righe non ci sono.

### La prima pagina

![La prima pagina della ricerca](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/la-prima-pagina-della-ricerca.png)

✔ Verifica: arrivate le righe, in basso a sinistra c'e' «10 righe caricate».

✔ Verifica: «Altre righe» e' acceso: il server ha detto che ce ne sono altre.

✔ Verifica: in fondo alla griglia non c'e' scritto «fine elenco»: il conteggio lo da' solo il piede
della finestra, perche' la griglia non sa quante pagine ha ancora il server.

### Altre righe

«Altre righe» (o Pag. giu') chiede la pagina successiva. Le righe gia' caricate restano a video,
ferme e sbiadite, con lo spinner sopra: non si perde il punto in cui si era.

![Altre righe: la griglia ferma sotto lo spinner](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/altre-righe-la-griglia-ferma-sotto-lo-spinner.png)

✔ Verifica: sopra le righe ferme c'e' lo spinner con «Carico altre righe…».

✔ Verifica: arrivata la pagina, il conteggio dice «20 righe caricate»: la seconda pagina si accoda.

### La scelta torna al COBOL

Dopo «Altre righe» la selezione va sulla **prima riga nuova** (103): una freccia giu' la porta sulla
104, Invio conferma. La scelta torna al COBOL come risposta alla ricerca, e il programma continua da
solo: legge la condizione e porta il cursore al campo successivo.

![La testata di 104 R.D. 45 GG](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/la-testata-di-104-r-d-45-gg.png)

✔ Verifica: il codice scelto (104) e' nel campo «Codice pagamento».

✔ Verifica: il COBOL ha caricato la testata e il campo in input ora e' «Convalida».

✔ Verifica: accanto ai codici compaiono le descrizioni in blu («Dalla data della fattura», «Non
attiva», «Normale»): il client le prende dalla guida del campo, senza chiederle al server.

✔ Verifica: la barra dei tasti e' cambiata in `F4 F12 Conferma Esc Esci`, quelli del nuovo campo.

# 8. Opzioni › Carattere di maschere e griglie

Le maschere del legacy sono pensate per 80 colonne: su uno schermo grande possono essere piccole.
Il pulsante con le tre righe in basso a sinistra apre le **Opzioni**; «Carattere di maschere e
griglie» ha tre pulsanti, `−  A  +`. Il carattere scala tutta la maschera (campi, righe, testi) e
la griglia, e si ricorda nel browser per le sessioni successive. «A» torna alla misura normale.

![Carattere al 120%: la maschera e la griglia si allargano](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/carattere-al-120-la-maschera-e-la-griglia-si-allargano.png)

✔ Verifica: all'apertura l'opzione dice «100%».

✔ Verifica: due clic su `+` e dice «120%».

✔ Verifica: il campo «Codice pagamento» e' piu' largo di prima.

✔ Verifica: anche le righe della griglia sono piu' alte.

✔ Verifica: «A» riporta il campo esattamente alla larghezza di partenza.

# 9. Il menu in consultazione durante la funzione

Con una funzione aperta il menu non sparisce: il pulsante «Menu» nella barra lo riapre **sopra** la
maschera, per guardare dove si e' o cercare la prossima voce. Non si puo' pero' avviare niente: il
server sta eseguendo un programma e il legacy ne esegue uno per volta per sessione.

![Il menu aperto sopra la funzione](https://gsdoc.genesyssoftware.eu/uploads/images/gallery/2026-10/scaled-1680-/il-menu-aperto-sopra-la-funzione.png)

✔ Verifica: in testa al menu c'e' l'avviso «Funzione in corso: menu in consultazione».

✔ Verifica: le voci sono spente (grigie, non avviabili).

✔ Verifica: un secondo clic su «Menu» lo richiude.