Questi casi d’uso mostrano ciò che compete allo sviluppatore dell’applicazione (nei diagrammi è l’attore controller) e ciò che viene eseguito automaticamente dal framework (rettangolo azzurro).

Visualizzare un modulo e salvare un oggetto

Sono coinvolte due azioni che utilizzano 2 servizi:

Diagram
Figure 1. Diagramma di sequenza per il rendering del modulo e l’elaborazione dell’oggetto
Esempio di codice: flusso di lavoro modulo + salvataggio
def userForm(User user) {                           (1)
    user ?= new User()                              (2)

    UiFormSpecifier f = new UiFormSpecifier()       (3)
    f.ui user, {
        hiddenField user.subsidiary_
        hiddenField user.origin_
        section "User", {
            field user.username_
            field user.firstName_
            field user.lastName_
            ajaxField user.manager_, this.&selectUserM2O as MC
            field user.trigram_
            field user.password_
        }
        section "Coords", {
            field user.businessUnit_
            field user.job_
            field user.directPhone_
            field user.additionalPhone_
            field user.mail_
            field user.mainSubsidiary_
            field user.allowedSubsidiaries_
        }
        // [. . .]
        formAction this.&saveUser as MC, user.id    (4)
    }

    taackUiService.show new UiBlockSpecifier().ui { (5)
        modal {
            form "User Form", f, BlockSpec.Width.MAX
        }
    }
}

@Transactional
@Secured("ROLE_ADMIN")                              (6)
def saveUser() {                                    (7)
    taackSaveService.saveThenRedirectOrRenderErrors(User, this.&listUser) (8)
}
1 Azione che visualizza il modulo
2 Crea l’oggetto se è null
3 Crea il modulo
4 Pulsante del modulo che invia i dati del modulo all’azione saveUser
5 Mostra il modulo
6 Protegge l’azione di salvataggio
7 Azione che salverà l’oggetto
8 Chiamata a taackSaveService; qui, se l’oggetto è valido, l’utente viene reindirizzato all’azione listUsers.

Visualizzare una tabella con colonne ordinabili, azioni in linea e un filtro

È necessaria una sola azione per gestire paginazione, filtraggio e ordinamento:

Diagram
Figure 2. Diagramma di sequenza che gestisce l’azione su una tabella per elaborare un elenco di oggetti
Esempio di codice per filtro e tabella
def index() {                                                   (1)
    User cu = authenticatedUser as User

    UiFilterSpecifier f = buildUserTableFilter cu               (2)
    UiTableSpecifier t = buildUserTable f                       (3)

    UiBlockSpecifier b = new UiBlockSpecifier().ui {            (4)
        tableFilter(f, t) {
            menuIcon ActionIcon.ADD, this.&userForm as MC       (5)
        }
    }

    taackUiService.show(b, buildMenu())                         (6)
}
1 Azione che visualizza un elenco di oggetti
2 Costruisce il filtro; qui il filtro riceve come parametro l’utente attualmente connesso perché vogliamo poter elencare il team dell’utente.
3 Costruisce la tabella
4 Costruisce il blocco contenente la tabella e il filtro
5 Aggiunge un’azione per creare un nuovo utente
6 Mostra il blocco
Passiamo eccezionalmente il filtro a buildTable per costruire la query ed evitare la manipolazione dei filtri (filter hacking).

Visualizzare una finestra modale, chiuderla e aggiornare parte del contenuto corrente

Diagram
Figure 3. Diagramma di sequenza che gestisce l’azione su una tabella per elaborare un elenco di oggetti
Esempio di codice per chiudere la finestra modale e aggiornare la pagina corrente
taackSaveService.saveThenDisplayBlockOrRenderErrors(EngineeringChangeRequest,   (1)
    new UiBlockSpecifier().ui {                                                 (2)
        closeModalAndUpdateBlock {                                              (3)
            show buildShowProjects(ecr), {
                menuIcon
                    ActionIcon.ADD,
                    Ecr2Controller.&projectsForm as MC, ecr.id
            }
        }
})
1 Dopo che in una finestra modale viene chiamata un’azione che comporta il salvataggio di un oggetto, è possibile chiudere la finestra modale e aggiornare gli elementi della pagina in un’unica azione
2 saveThenDisplayBlockOrRenderErrors accetta uno UiBlockSpecifier come parametro
3 closeModalAndUpdateBlock chiuderà prima l’ultima finestra modale aperta e poi applicherà la modifica
4 Qui verrà aggiornato il blocco il cui nome è contenuto in ajaxBlockId

Quando si utilizza un ajaxBlock

TODO

  • Aggiornare una porzione di pagina

  • Mostrare un oggetto con un campo modificabile

  • Mostrare un grafico

  • Esportare una tabella in CSV

  • Eseguire il rendering di un blocco in un PDF

  • Eseguire il rendering di un blocco in un’e-mail

  • …​