Diese Anwendungsfälle zeigen, was in der Verantwortung des Anwendungsentwicklers liegt (in den Diagrammen der Akteur controller) und was automatisch vom Framework erledigt wird (hellblaues Rechteck).

Anzeigen eines Formulars und Speichern eines Objekts

Zwei Aktionen sind beteiligt und nutzen 2 Dienste:

Diagram
Figure 1. Sequenzdiagramm für das Rendern eines Formulars und die Verarbeitung eines Objekts
Codebeispiel: Formular- und Speicher-Workflow
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 Aktion, die das Formular anzeigt
2 Erstellt das Objekt, falls es null ist
3 Erstellt das Formular
4 Formularschaltfläche, die die Formulardaten an die Aktion saveUser sendet
5 Zeigt das Formular an
6 Sichert die Speicheraktion ab
7 Aktion, die das Objekt speichert
8 Aufruf von taackSaveService; wenn das Objekt gültig ist, wird der Benutzer zur Aktion listUsers weitergeleitet.

Anzeigen einer Tabelle mit sortierbaren Spalten, Inline-Aktionen und einem Filter

Nur eine einzige Aktion ist erforderlich, um Paginierung, Filterung und Sortierung zu verwalten:

Diagram
Figure 2. Sequenzdiagramm zur Verwaltung von Aktionen in einer Tabelle zur Verarbeitung einer Objektliste
Codebeispiel für Filter und Tabelle
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 Aktion, die eine Liste von Objekten anzeigt
2 Erstellt den Filter; hier erhält der Filter den aktuell angemeldeten Benutzer als Parameter, da wir das Team des Benutzers auflisten möchten.
3 Erstellt die Tabelle
4 Erstellt den Block, der die Tabelle und den Filter enthält
5 Fügt eine Aktion zum Erstellen eines neuen Benutzers hinzu
6 Zeigt den Block an
Ausnahmsweise übergeben wir den Filter an buildTable, um die Abfrage zu erstellen und Filter-Manipulationen (Filter Hacking) zu verhindern.

Anzeigen eines modalen Fensters, anschließendes Schließen und Aktualisieren eines Teils des aktuellen Inhalts

Diagram
Figure 3. Sequenzdiagramm zur Verwaltung von Aktionen in einer Tabelle zur Verarbeitung einer Objektliste
Codebeispiel zum Schließen eines modalen Fensters und Aktualisieren der aktuellen Seite
taackSaveService.saveThenDisplayBlockOrRenderErrors(EngineeringChangeRequest,   (1)
    new UiBlockSpecifier().ui {                                                 (2)
        closeModalAndUpdateBlock {                                              (3)
            show buildShowProjects(ecr), {
                menuIcon
                    ActionIcon.ADD,
                    Ecr2Controller.&projectsForm as MC, ecr.id
            }
        }
})
1 Nachdem eine Aktion zum Speichern eines Objekts in einem modalen Fenster aufgerufen wurde, können Sie das modale Fenster schließen und Seitenelemente in einer einzigen Aktion aktualisieren
2 saveThenDisplayBlockOrRenderErrors nimmt einen UiBlockSpecifier als Parameter entgegen
3 closeModalAndUpdateBlock schließt zuerst das zuletzt geöffnete modale Fenster und wendet dann die Änderung an
4 Hier wird der Block mit dem in ajaxBlockId enthaltenen Namen aktualisiert

Bei Verwendung eines ajaxBlock

TODO

  • Aktualisieren eines Teils einer Seite

  • Anzeigen eines Objekts mit einem bearbeitbaren Feld

  • Anzeigen eines Diagramms

  • Exportieren einer Tabelle als CSV

  • Rendern eines Blocks in einem PDF

  • Rendern eines Blocks in einer E-Mail

  • …​