Ces cas d’utilisation montrent ce qui relève de la responsabilité du développeur d’application (sur les diagrammes, il s’agit de l’acteur controller) et ce qui est pris en charge automatiquement par le framework (rectangle bleu clair).

Afficher un formulaire et enregistrer un objet

Deux actions sont impliquées et utilisent 2 services :

Diagram
Figure 1. Diagramme de séquence du rendu d’un formulaire et du traitement d’un objet
Exemple de code : workflow formulaire + enregistrement
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 Action affichant le formulaire
2 Crée l’objet s’il est null
3 Crée le formulaire
4 Bouton de formulaire qui envoie les données du formulaire à l’action saveUser
5 Affiche le formulaire
6 Sécurise l’action d’enregistrement
7 Action qui enregistrera l’objet
8 Appel à taackSaveService ; ici, si l’objet est valide, l’utilisateur est redirigé vers l’action listUsers.

Afficher un tableau avec des colonnes triables, des actions en ligne et un filtre

Une seule action est nécessaire pour gérer la pagination, le filtrage et le tri :

Diagram
Figure 2. Diagramme de séquence gérant l’action sur un tableau pour traiter une liste d’objets
Exemple de code pour filtre et tableau
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 Action qui affiche une liste d’objets
2 Construit le filtre ; ici, le filtre prend l’utilisateur actuellement connecté en paramètre car nous souhaitons pouvoir lister l’équipe de l’utilisateur.
3 Construit le tableau
4 Construit le bloc contenant le tableau et le filtre
5 Ajoute une action pour créer un nouvel utilisateur
6 Affiche le bloc
Nous passons exceptionnellement le filtre à buildTable pour construire la requête et éviter le contournement de filtre (filter hacking).

Afficher une fenêtre modale, puis la fermer et rafraîchir une partie du contenu actuel

Diagram
Figure 3. Diagramme de séquence gérant l’action sur un tableau pour traiter une liste d’objets
Exemple de code pour fermer la fenêtre modale et rafraîchir la page actuelle
taackSaveService.saveThenDisplayBlockOrRenderErrors(EngineeringChangeRequest,   (1)
    new UiBlockSpecifier().ui {                                                 (2)
        closeModalAndUpdateBlock {                                              (3)
            show buildShowProjects(ecr), {
                menuIcon
                    ActionIcon.ADD,
                    Ecr2Controller.&projectsForm as MC, ecr.id
            }
        }
})
1 Après l’appel d’une action impliquant la sauvegarde d’un objet dans une fenêtre modale, vous pouvez fermer la fenêtre modale et rafraîchir les éléments de la page en une seule action
2 saveThenDisplayBlockOrRenderErrors prend un UiBlockSpecifier en paramètre
3 closeModalAndUpdateBlock fermera d’abord la dernière fenêtre modale ouverte, puis appliquera la modification
4 Ici, le bloc portant le nom contenu dans ajaxBlockId sera mis à jour

Lors de l’utilisation d’un ajaxBlock

TODO

  • Mettre à jour une partie d’une page

  • Afficher un objet avec un champ modifiable

  • Afficher un graphique

  • Exporter un tableau en CSV

  • Effectuer le rendu d’un bloc dans un PDF

  • Effectuer le rendu d’un bloc dans un e-mail

  • …​