Add full shell, replaceable Omics adapter and bilingual interaction
Implement approved specification #32 and tickets #33-#37. Keep host authentication server-verified and pin session interaction language. Compile scoped base selectors for browser compatibility and retain full gutters during CSS pruning.
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
# Piano — Full shell e integrazione con il portale
|
||||
|
||||
Stato: implementazione completata e installata sul Mac; deploy server non eseguito.
|
||||
|
||||
Esiti e limiti del collaudo: [rapporto di verifica](../reports/2026-09-13-full-shell-implementation.md).
|
||||
|
||||
Specifica consolidata: [Full shell, integrazione Omics e interfaccia bilingue](2026-09-13-full-shell-spec.md),
|
||||
pubblicata come [specifica su Gitea](https://git.tylconsulting.it/mptyl/ThothII/issues/32).
|
||||
Ticket approvati: [Full sul Mac](https://git.tylconsulting.it/mptyl/ThothII/issues/33),
|
||||
[Embedded Omics](https://git.tylconsulting.it/mptyl/ThothII/issues/34),
|
||||
[Sessioni bilingui](https://git.tylconsulting.it/mptyl/ThothII/issues/35),
|
||||
[Traduzione completa](https://git.tylconsulting.it/mptyl/ThothII/issues/36),
|
||||
[Consegna verificata](https://git.tylconsulting.it/mptyl/ThothII/issues/37).
|
||||
Le dipendenze sono registrate anche nativamente sul tracker.
|
||||
|
||||
## Obiettivo
|
||||
|
||||
Aggiungere una shell autonoma `full` mantenendo compatibile l'integrazione corrente `embedded`
|
||||
con Omics Portal. La complessità del portale deve restare confinata a un `PortalAdapter`.
|
||||
|
||||
## Regole definitive
|
||||
|
||||
- `embedded` è il default e non renderizza alcun header ThothII.
|
||||
- La configurazione installata su questo Mac imposta `shell.mode: full` e
|
||||
`shell.defaultLocale: en`.
|
||||
- Il deploy server imposta `shell.mode: embedded` e `shell.adapter: omics-portal`.
|
||||
- `full` renderizza header, rail sinistro vuoto di almeno 20 px e logout locale.
|
||||
- Fullscreen è uno stato separato dalla shell: il pulsante entra/esce dalla Fullscreen API e
|
||||
l'icona riflette anche l'uscita con `Esc`.
|
||||
- Full include lingua, tema `light/dark`, fullscreen e nome utente; non include la rotellina
|
||||
amministrativa.
|
||||
- Embedded riceve dal portale solo `locale`, `theme` e `fullscreen`; il server verifica l'accesso.
|
||||
- Login e logout embedded restano responsabilità di Omics Portal.
|
||||
- La lingua UI è separata dalla lingua di interazione fissata nella sessione.
|
||||
|
||||
## Sequenza di implementazione
|
||||
|
||||
### 1. Configurazione e stato shell
|
||||
|
||||
- Aggiungere `shell.mode`, `shell.defaultLocale` e `shell.adapter` al descrittore di
|
||||
installazione, mantenendo `embedded` come default quando `shell` non è presente.
|
||||
- Proiettare nel runtime frontend solo configurazione non segreta.
|
||||
- Centralizzare lo stato shell in un controller; i componenti non devono leggere direttamente
|
||||
il portale.
|
||||
|
||||
### 2. Adapter e bridge Omics
|
||||
|
||||
- Implementare `PortalAdapter` con la sola API `subscribe`.
|
||||
- Implementare `OmicsPortalAdapter` osservando il documento condiviso, secondo il contratto rivisto.
|
||||
- Leggere il locale dal selettore renderizzato da Django, osservare il tema e ascoltare il fullscreen.
|
||||
- Conservare il cambio lingua tramite reload Omics e il percorso server di autenticazione esistente.
|
||||
- Validare snapshot e cleanup; in caso di errore mostrare un messaggio di integrazione in
|
||||
embedded, senza fallback a controlli locali.
|
||||
|
||||
### 3. i18n e lingua del modello
|
||||
|
||||
- Introdurre cataloghi UI estendibili, inizialmente `it` e `en`, con fallback inglese.
|
||||
- Usare il locale corrente per le nuove sessioni.
|
||||
- Persistire nel manifest la lingua di interazione e usarla per domande, spiegazioni e scelte
|
||||
del revisore; una ripresa conserva quella lingua.
|
||||
- Non tradurre SQL, identificatori o contenuti del workspace.
|
||||
|
||||
### 4. Shell full
|
||||
|
||||
- Renderizzare header solo in `full`.
|
||||
- Collegare selettore lingua, tema, fullscreen, nome utente e logout alle funzioni già esistenti
|
||||
o equivalenti del frontend/backend.
|
||||
- Implementare il cambio icona e la sincronizzazione con `fullscreenchange`.
|
||||
- Applicare il rail sinistro vuoto con larghezza base semplice e non inferiore a 20 px.
|
||||
|
||||
### 5. Verifica
|
||||
|
||||
- Unit test per validazione adapter, cambio stato, fallback locale e regole di sessione.
|
||||
- Test frontend per entrambe le shell, logout full e fullscreen con `Esc`.
|
||||
- Test backend per il passaggio della lingua nelle nuove sessioni e la conservazione in resume.
|
||||
- Test di integrazione Omics per preferenze iniziali, tema, fullscreen, locale dopo reload e accesso.
|
||||
- Build frontend/backend, suite harness e build documentale.
|
||||
|
||||
## Fuori ambito
|
||||
|
||||
- Cambiare il proxy/authentication chain già operativo.
|
||||
- Passare a iframe o introdurre `postMessage`.
|
||||
- Trasferire token o oggetti utente nel browser bridge.
|
||||
- Aggiungere una shell `system` per il tema o un terzo tema.
|
||||
- Implementare un adapter per un secondo portale: deve solo essere possibile sostituire quello
|
||||
Omics tramite la stessa interfaccia.
|
||||
|
||||
## Gate di approvazione
|
||||
|
||||
L'implementazione è approvabile quando il codice rispetta il [contratto v1](../contracts/portal-shell-adapter-v1.md),
|
||||
la modalità embedded non mostra header proprio e la modalità full non dipende da Omics Portal.
|
||||
@@ -0,0 +1,99 @@
|
||||
# Full shell, integrazione Omics e interfaccia bilingue
|
||||
|
||||
## Problem Statement
|
||||
|
||||
ThothII è utilizzabile nel contenitore di Omics Portal, ma quando viene avviato
|
||||
autonomamente deve offrire i comandi generali che oggi appartengono al portale.
|
||||
Gli utenti devono poter scegliere italiano o inglese per l'interfaccia e per le
|
||||
nuove conversazioni con il modello, senza modificare la lingua dei contenuti del
|
||||
workspace. L'integrazione server deve conservare l'accesso già effettuato in Omics.
|
||||
|
||||
## Solution
|
||||
|
||||
Due modalità di installazione: Full Thoth Shell con header autonomo e Embedded
|
||||
Thoth Shell pilotata dall'header del portale. Sul Mac si installa full con inglese
|
||||
predefinito. Un Portal Shell Adapter sostituibile concentra le conoscenze Omics;
|
||||
l'autenticazione utilizza i percorsi già esistenti. La lingua di interazione
|
||||
rimane fissata per tutta la durata di una sessione, comprese le riprese.
|
||||
|
||||
## User Stories
|
||||
|
||||
1. As an operatore, I want scegliere full o embedded durante l'installazione, so that il contenitore corrisponda al luogo di utilizzo.
|
||||
2. As an operatore Mac, I want full con inglese predefinito, so that l'applicazione sia autonoma appena aperta.
|
||||
3. As an operatore di un'installazione precedente, I want mantenere embedded senza aggiungere configurazioni obbligatorie, so that un aggiornamento non interrompa l'integrazione Omics.
|
||||
4. As an utente full, I want un header con lingua, tema, fullscreen e nome utente, so that i comandi generali siano sempre raggiungibili.
|
||||
5. As an utente full, I want una fascia sinistra vuota di almeno 20 px bilanciata con lo spazio destro, so that il contenuto abbia margini coerenti.
|
||||
6. As an utente full, I want nessuna rotellina amministrativa del portale, so that il contenitore mostri solo i comandi richiesti.
|
||||
7. As an utente full, I want aprire il logout dal nome utente, so that possa terminare il mio accesso.
|
||||
8. As an utente locale, I want usare le credenziali ThothII esistenti, so that non debba configurare Omics.
|
||||
9. As an utente full con OIDC, I want terminare la sessione ThothII, so that il logout non sia limitato al login locale.
|
||||
10. As an utente Omics, I want aprire Datamart Builder già autenticato, so that non debba effettuare un secondo accesso.
|
||||
11. As an utente embedded, I want un solo header fornito da Omics, so that non compaiano comandi duplicati.
|
||||
12. As an utente embedded, I want che login e logout siano gestiti dal portale, so that l'accesso sia coerente con le altre pagine.
|
||||
13. As an utente embedded, I want che ThothII recepisca le preferenze già impostate prima dell'apertura, so that lingua e tema siano subito corretti.
|
||||
14. As an utente, I want scegliere light o dark, so that la leggibilità corrisponda alle condizioni ambientali.
|
||||
15. As an utente, I want leggere form, menu, errori e finestre anche in dark, so that il tema sia completo.
|
||||
16. As an utente full, I want entrare in fullscreen del browser, so that il browser lasci spazio all'applicazione.
|
||||
17. As an utente, I want vedere l'icona di uscita quando il fullscreen è attivo e l'icona iniziale dopo Esc, so that il comando rappresenti lo stato effettivo.
|
||||
18. As an utente, I want un messaggio comprensibile se il browser rifiuta il fullscreen, so that il controllo non mostri uno stato inesistente.
|
||||
19. As an utente, I want tutte le label e i testi non generati dal modello in italiano o inglese, so that possa usare l'applicazione nella lingua scelta.
|
||||
20. As an utente assistito da lettore di schermo, I want nomi accessibili e messaggi tradotti, so that i controlli siano utilizzabili quanto quelli visivi.
|
||||
21. As an utente embedded, I want il cambio lingua segua il normale ricaricamento Omics, so that tutta la pagina condivida la lingua.
|
||||
22. As an revisore, I want ritrovare la sessione dopo quel ricaricamento e proteggere le modifiche non salvate, so that non perda il lavoro.
|
||||
23. As an revisore, I want le nuove domande e scelte del modello nella lingua UI selezionata, so that l'interazione sia comprensibile.
|
||||
24. As an revisore, I want riprendere una sessione nella sua lingua originale, so that le preferenze del nuovo browser non cambino il workflow.
|
||||
25. As an revisore di sessioni precedenti, I want una regola stabile per i manifest privi della lingua di interazione, so that le riprese restino prevedibili.
|
||||
26. As an responsabile dei dati, I want conservare lingua e contenuto di workspace, SQL, identificatori e valori, so that una preferenza UI non alteri i dati.
|
||||
27. As an manutentore, I want aggiungere cataloghi per altre lingue con fallback inglese, so that l'i18n sia estendibile.
|
||||
28. As an integratore, I want sostituire OmicsPortalAdapter con un altro adapter della stessa interfaccia, so that un nuovo portale non richieda modifiche alle pagine o al workflow.
|
||||
29. As an utente il cui accesso scade, I want che lo stato protetto venga chiuso e il rientro segua il contenitore, so that non compaia un login ThothII in embedded.
|
||||
30. As an operatore, I want documentazione accurata di configurazione, autenticazione, adapter, migrazione e verifiche, so that il deploy server sia ripetibile.
|
||||
|
||||
## Implementation Decisions
|
||||
|
||||
- La configurazione installata distingue topologia, autenticazione e shell. Shell omessa significa embedded con adapter Omics predefinito; adapter sconosciuti sono errori espliciti. Full non istanzia adapter.
|
||||
- La configurazione frontend pubblica contiene soltanto dati non segreti e usa il meccanismo runtime esistente, compreso il prefisso API necessario al montaggio Omics.
|
||||
- Un controller di shell espone preferenze e stato; i componenti non accedono direttamente al portale.
|
||||
- L'interfaccia PortalAdapter offre una sottoscrizione con snapshot iniziale, aggiornamenti, errori e disiscrizione. Lo snapshot contiene locale, tema light/dark e fullscreen.
|
||||
- L'implementazione Omics legge la lingua effettivamente renderizzata dal selettore, osserva il tema sul documento e ascolta il fullscreen del browser. Non introduce handshake, eventi personalizzati o polling per le preferenze. Il contratto DOM è privato dell'adapter.
|
||||
- Il montaggio resta nello stesso documento. Nessun header o comando locale di autenticazione/presentazione viene introdotto in embedded.
|
||||
- Il server resta autorevole per identità e autorizzazioni. Il bridge UI non trasmette token, utente o flag authenticated. La catena di identità fidata esistente viene conservata.
|
||||
- I rifiuti di accesso all'applicazione devono essere distinti dai 403 relativi a una singola operazione. Ricontrollare l'accesso alla riconnessione e al ritorno alla pagina; non promettere revoca istantanea di altre schede tramite il solo proxy.
|
||||
- Full riutilizza login e logout esistenti, preserva le protezioni dalle modifiche non salvate e abilita il logout anche per sessioni ThothII OIDC. Il logout globale dall'identity provider non è implicito.
|
||||
- Fullscreen è indipendente dalla modalità full. L'icona segue lo stato effettivo e le richieste rifiutate sono gestite. I token dark esistenti vengono completati, con verifica dei contenuti sovrapposti e dell'isolamento degli stili embedded.
|
||||
- L'i18n utilizza cataloghi estendibili EN/IT con fallback inglese, comprese label, aiuti, placeholder, accessibilità, errori e widget deterministici. I payload tecnici restano stabili.
|
||||
- La lingua di interazione viene scelta dal locale UI risolto, salvata nel manifest e propagata al contesto del modello. Resume non accetta override dal browser.
|
||||
- Le sessioni precedenti prive del campo usano la lingua del workspace come compatibilità; il valore viene fissato alla prima ripresa mediante aggiornamento idempotente. Non si pretende di ricostruire una lingua storica non registrata.
|
||||
- Il cambio lingua Omics mantiene la navigazione Django. La selezione della sessione deve sopravvivere alla navigazione; le modifiche non salvate devono essere protette, senza avviare una nuova generazione implicitamente.
|
||||
|
||||
## Testing Decisions
|
||||
|
||||
I punti di verifica erano già approvati nel piano: comportamento della shell e
|
||||
dell'accesso dall'interfaccia, contratto pubblico dell'adapter, creazione/ripresa
|
||||
tramite API e CLI del workflow, configurazione d'installazione e integrazione
|
||||
Omics. Non si richiede una nuova approvazione degli stessi punti.
|
||||
|
||||
- Test comportamentali: stato osservabile, testo e controlli accessibili, permessi e lingua persistita; evitare metodi privati o asserzioni sull'organizzazione interna.
|
||||
- Riutilizzare i test AuthGate/AppShell con API simulate al confine HTTP, quelli delle route sessioni e quelli pubblici del repository/CLI del workflow.
|
||||
- Verificare adapter con un documento equivalente al template reale, preferenze iniziali, aggiornamenti e cleanup; includere montaggio ripetuto.
|
||||
- Verificare nuova sessione, resume con lingua UI diversa, manifest precedente e input locale invalido; il contesto fornito al modello deve contenere la lingua persistita.
|
||||
- Verificare fullscreen con ingresso, uscita, Esc e rifiuto; entrambe le modalità con dark, form e menu aperti.
|
||||
- Verificare accesso embedded senza secondo login, scadenza/403, riconnessione degli eventi e ritorno a una scheda; verificare logout full e protezione dei dati di un utente precedente.
|
||||
- Typecheck e test mirati durante lo sviluppo; suite complete alla fine, build documentale e prova browser proporzionata. Non usare chiamate reali al modello per i test deterministici.
|
||||
|
||||
## Out of Scope
|
||||
|
||||
- Deploy sul server di produzione o modifica delle credenziali.
|
||||
- Seconda implementazione per un portale futuro, iframe e protocollo postMessage.
|
||||
- Nuovo sistema di autenticazione, propagazione di token nel browser o logout globale OIDC.
|
||||
- Tema system, ingresso automatico in fullscreen, rotellina amministrativa nell'header full.
|
||||
- Traduzione di SQL, dati, identificatori o contenuti del workspace; traduzione a posteriori delle decisioni generate dal modello.
|
||||
- Persistenza di una trascrizione integrale delle conversazioni.
|
||||
|
||||
## Further Notes
|
||||
|
||||
La revisione della semplificazione del 2026-09-13 è stata approvata dall'utente e
|
||||
prevale sui dettagli superati del primo contratto a eventi. La specifica consolida
|
||||
le decisioni senza riaprire l'intervista. Le modifiche vengono revisionate sui due
|
||||
assi Standards/Spec e committate sul branch corrente, preservando i cambiamenti
|
||||
preesistenti estranei a questa funzionalità.
|
||||
Reference in New Issue
Block a user