这些具体应用场景将展示开发人员在开发过程中的职责 (对应到图表中就是控制器参与者),以及框架在开发过程中的作用 (对应到图表中就是蓝色长方形部分)。

显示表单,保存数据对象

这个过程有2个Action参与,并涉及使用了2个Service:

Diagram
Figure 1. 表单流程时序图
代码示例:表单+保存流程
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
2 若数据对象不存在,则新建
3 创建表单块
4 表单提交按钮,负责传输表单数据至 saveUser Action中
5 将表单呈现在页面上
6 给该Action添加权限管理
7 负责保存数据对象的Action
8 调用taackSaveService,若验证通过,则将页面重定向至 listUsers

显示表格,附带可排序列、行内按钮、以及筛选器

只需要一个Action即可管理翻页、筛选、以及排序:

Diagram
Figure 2. 表格管理流程时序图
代码示例:筛选器与表格
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
2 构建筛选器。这里它以当前用户作为参数,因为该表格想要列出当前用户所在的团队的所有人员。
3 构建表格
4 构建总块以包含进筛选器块与表格块
5 添加按钮,负责创建新用户
6 将该块呈现在页面上
我们特意将构建好的筛选器传入buildTable中,是为了进行数据查询以及预防黑客

显示弹窗、关闭弹窗、更新页面一部分内容

Diagram
Figure 3. 弹窗管理流程时序图
代码示例:关闭弹窗与刷新页面内容
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 在保存数据对象之后调用新一轮弹窗,其内您可以选择关闭弹窗并刷新页面内容,所有步骤都在同一个Action内完成。
2 saveThenDisplayBlockOrRenderErrors 采用 UiBlockSpecifier 作为参数
3 closeModalAndUpdateBlock 将会关闭弹窗并应用新内容至当前页面

待做事项

  • Updating a portion of a page

  • Show some object with an editable field

  • Show a graph

  • Export a table in CSV

  • Rendering a block in a PDF

  • Rendering a block in a Mail

  • …​