Ces cas d’utilisation montrent ce qui est de la responsabilité du développeur de l’application (sur les diagrammes, c’est l’acteur contrôleur), ce qui est fait automatiquement par le framework (rectangle bleu clair).

Affichage d’un formulaire et sauvegarde d’un objet

Deux actions sont impliquées, utilisant 2 services :

Diagram
Figure 1. Rendu du diagramme de séquence Formulaire et Objet de processus
Exemple de code : flux de travail 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éer l’objet si l’objet est nul
3 Créer le formulaire
4 Bouton de formulaire qui envoie les données du formulaire à l’action saveUser
5 afficher le formulaire
6 Sécuriser l’action save
7 Action qui va sauvegarder 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 Gestion d’une action sur un tableau pour traiter une liste d’objets
Exemple de code 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()     (4)
    b.ui {
        tableFilter "Filter", f, "Users", t, BlockSpec.Width.MAX, {
            action ActionIcon.CREATE, this.&userForm as MC (5)
        }
    }

    taackUiService.show(b, buildMenu())             (6)
}
1 Action qui affiche une liste d’objets
2 Construire le filtre, ici le filtre prend l’utilisateur actuellement connecté comme paramètre, car nous voulons pouvoir lister les équipes d’utilisateurs.
3 Construire le tableau
4 Construire le bloc contenant le tableau et le filtre
5 Ajouter une action pour créer un nouvel utilisateur
6 Afficher le bloc
Nous passons exceptionnellement le filtre à la buildTable pour construire la requête et éviter le piratage de filtre

Afficher une fenêtre modale puis la fermer et actualiser une partie du contenu actuel

Diagram
Figure 3. Diagramme de séquence Gestion d’une action sur une table pour traiter une liste d’objets
Exemple de code pour fermer la fenêtre modale et actualiser la page actuelle
taackSaveService.saveThenDisplayBlockOrRenderErrors(EngineeringChangeRequest,   (1)
new UiBlockSpecifier().ui {                 (2)
    closeModalAndUpdateBlock {              (3)
        show "Projects", buildShowProjects(ecr), BlockSpec.Width.MAX, {
            action
                ActionIcon.ADD,
                Ecr2Controller.&projectsForm as MC,
                [id: ecr.id, ajaxBlockId: ajaxBlockId]
        }
    }
})
1 Après qu’une action impliquant la sauvegarde d’un objet est appelée dans une modale, vous pouvez fermer la modale et actualiser les éléments de la page en une seule action
2 saveThenDisplayBlockOrRenderErrors prend un UiBlockSpecifier comme paramètre
3 closeModalAndUpdateBlock fermera d’abord la dernière modale ouverte puis appliquera la modification
4 Ici, le bloc avec le nom contenu dans ajaxBlockId sera mis à jour

TODO

  • Mise à jour d’une partie d’une page

  • Afficher un objet avec un champ modifiable

  • Afficher un graphique

  • Exporter un tableau en CSV

  • Rendu d’un bloc dans un PDF

  • Rendu d’un bloc dans un Mail

  • …​