## Guida all' associazione di logiche applicative al Content Panel

### Introduzione

In guigen per implementare logiche dinamiche tipicamente si fa ricorso ai commands. Gli eventi della vita dell'applicazione in cui può essere inserita la modellazione della logica dinamica sono i seguenti:

1. inzializzazione dell' applicazione
2. inizialiazzazione\refresh\ingresso in un ContentPanel
3. evento di user interacion (intercettato da un EventHandler)

Escludendo il caso dell'inizializzazione applicativa e concentrandosi sugli eventi relativi al ContentPanel, per poter modellare questa logica dinamica è possibile utilizzare l'elemento CPCommand (child del nodo raggruppatore CPCommands). Il CPCommand è caratterizzato da un nodo child di tipo command nel quale è possibile modellare la logica vera e propria, e una property execute che definisce il momento, l'evento, in cui questo comando viene attivato :

1. ON_INIT
2. ON_REFRESH
3. ON_ENTER
4. BEFORE_EVENTS
5. AFTER_EVENTS

Con una opportuna combinazione di logiche distribuite nel vari momenti di innesco è possibile definire in modo molto fine la logica dinamica delle varie schermate.

Esempio di modellazione

### Tipologie di innesco (execute) dei CPCommand

Operation | Descrizione | Esempi di utilizzo | Codice Generato | Check
ON_INIT | La logica appliucativa è eseguita ad ogni primo ingresso nel ContentPanel(per sessione). | Viene utilizzato tipicamente per eseguire le operazioni che non è necessario ripetere durante il flusso e che potrebbero ridurre le capacità prestazionali se eseguite ad ogni interazione client/server Caricamento Combo dal contenuto immutabile (es. elenco regioni) | Il programma modellato sul CPCommand viene compilato in una struttura di comandi (pattern command); l'invocazione avviene nel metodo `prepare()`. Poichè il `prepare()` viene invocato prima di ogni action, per vincolare l'esecuzione della logica solo al primo ingresso viene testata la property di sessione `CPCommandInit<ContentPanel.name>`. | un ContentPanel non può contenere più di un CPCommand di tipo ON_INIT
ON_REFRESH | La logica applicativa è eseguita ad ogni azione di interazione utente eseguita sulla schermata (ingresso nella schermata, evento di interazione con un widget, ...) NOTE: Se in pagina viene inserito un CPCommand ON_INIT allora l'ON_REFRESH non verrà eseguito al primo accesso alla schermata. Se in pagina viene inserito un CPCommand ON_ENTER allora l'ON_REFRESH non verrà eseguito in concomitanza al nuovo ingresso al ContentPanel. La logica associata all' ON_REFRESH è analoga a quella eseguita dal onRefreshCommand definito come nodo figlio diretto del ContentPanel, il quale è da considerarsi deprecato. |  | Il programma modellato sul CPCommand viene compilato in una struttura di comandi (pattern command); l'invocazione avviene nel metodo `prepare()`. In questo modo la logica verrà eseguita ad ogni richiamo della action. Se sono modellati contemporaneamente sia l'ON_INIT che l'ON_REFRESH, poichè il metodo `prepare()` viene invocato prima dell'esecuzione della action, per fare in modo che l'esecuzione della logica avvenga solo negli accessi successivi al primo vengono testate la variabile in sessione `CPCommandInit<ContentPanel.name>` e `currentContentPanel` | un ContentPanel non può contenere un CPCommand di tipo ON_REFRESH e un onRefreshCommand contemporaneamente un ContentPanel non può contenere più di un CPCommand di tipo ON_REFRESH
ON_ENTER | La logica applicativa è eseguita ad ogni accesso ad una schermata. | Un tipico utilizzo di questo punto di innesco è quello di eseguire le logiche applicative dipendenti dal flusso di navigazione e che devono essere eseguite a ogni nuovo ingresso in pagina Precaricamento dati in schermata (es. funzionalità modifica in un gestionale) | Il programma modellato sul CPCommand viene compilato in una struttura di comandi (pattern command); L'invocazione avviene nel metodo `execute()` della action, ossia il metodo che viene invocato ad ogni ingresso in pagina | un ContentPanel non può contenere più di un CPCommand di tipo ON_ENTER
BEFORE_EVENTS | La logica è eseguita prima dell' esecuzione della logica associata ad un eventHandler. La logica è la medesima per tutti gli EventHandler presenti nella schermata |  | Il programma modellato sul CPCommand viene compilato in una struttura di comandi (pattern command); L'invocazione avviene nel metodo `handle_<widget>_<EVENTO>()`, prima dell'invocazione del metodo `doCommand()` del comando associato all'event handler | un ContentPanel non può contenere più di un CPCommand di tipo BEFORE_EVENTS
AFTER_EVENTS | La logica è eseguita dopo l' esecuzione della logica associata ad un eventHandler. La logica è la medesima per tutti gli EventHandler presenti nella schermata |  | Il programma modellato sul CPCommand viene compilato in una struttura di comandi (pattern command); L'invocazione avviene nel metodo `handle_<widget>_<EVENTO>()`, subito dopo l'invocazione del metodo `doCommand()` del comando associato all'event handler | un ContentPanel non può contenere più di un CPCommand di tipo BEFORE_EVENTS

### Riepilogo delle sequenze di esecuzione delle logiche nei vari punti di innesco, classificate per "evento" associato al content panel

In alcuni casi la sequenza delle logiche eseguite può essere differente a seconda che l'interazione sia realizzata in modalità ajax oppure in modalità non ajax.

Eventi su Content Panel | Logiche eseguite
Primo ingresso su ContentPanel per sessione applicativa |
Modalià non Ajax | Modalià Ajax *
CP Destinazione ON_INIT ON_REFRESH ON_ENTER | CP Destinazione (prima chiamata) ON_INIT ON_REFRESH ON_ENTER CP Destinazione (seconda chiamta) ON_INIT ON_REFRESH ON_ENTER
Nuovo ingresso al ContentPanel (diverso da primo ingresso per sessione) |
Modalià non Ajax | Modalià Ajax *
CP Destinazione ON_INIT ON_REFRESH ON_ENTER | CP Destinazione (prima chiamata) ON_INIT ON_REFRESH ON_ENTER CP Destinazione (seconda chiamta) ON_INIT ON_REFRESH ON_ENTER
Esecuzione logica di un EventHandler (es. OnClick Button) | CP che contiene il widget che ha originato l'evento. Impostazione Parametri a fronte della request HTTP ON_REFRESH BEFORE_EVENTS Logica EventHandler AFTER_EVENTS (in caso di JumpCommand vengono anche eseguite le logiche associate al pannello destinazione)

1. Eseguito
2. Non Eseguito

* Salto verso il CP Destinazione tramite un JumpCommand in modalità Ajax.
Effetto modalità Ajax: viene effettuata una seconda chiamata JS sull'action del ContentPanel di destinazione
Nella catena vengono mostrati le execute invocate nelle 2 chiamate.