# 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.