0.5.6 版(修复 0.5.5 版中的错误)

screenshot news sorting
Figure 1. 列标题显示排序方向
如何在单击表格时保留上下文
def showPart(PlmFreeCadPart part, Long partVersion, Boolean isHistory) {(1)
    taackUiService.show(
            plmFreeCadUiService.buildFreeCadPartBlockShow(
                    part, partVersion, false, isHistory),               (2)
            buildMenu(),
            "isHistory")                                                (3)
}
1 isHistory 是一个动作参数
2 isHistory 用于绘制块;我们需要重新传输它以绘制完全相同的块布局,通过保留上下文 <3>`isHistory` 键作为最后一个 taackUiService.show 参数传递。您可以输入许多要保留的键。

0.5.4 版本

0.5.3 版本

  • 修复表单复选框

  • 允许在 TQL 中为公式列使用别名

  • 代码清理和增加依赖的版本

0.5.2 版本

  • JDBC 客户端现在也是 AsciidoctorJ 扩展

  • 向 JDBC 可访问域字段添加 getter

  • 添加 DSL TQL 和 TDL (Taack 语法示范) 用于描述如何显示查询数据(表格或条形图)

  • 恢复菜单上的手动标签

  • 关于图表 DSL 的更多内容(感谢 Chong 和 ZhenQing)

  • 更好的自定义方式

TQL 和 TDL (Taack 语法示范)
select
    u.rawImg,
    u.username,
    u.manager.username
from User u
where u.dateCreated > '2024-01-01' and u.manager.username = 'admin';
--
table rawImg as "Pic", username as "Name", manager as "Manager"
news table
Figure 2. 结果

0.5.1 版本

TaackPlugin 的替换
@PostConstruct
void init() {
    TaackUiEnablerService.securityClosure(
        this.&securityClosure,
        CrewController.&editUser as MC,
        CrewController.&saveUser as MC)
    TaackAppRegisterService.register(
        new TaackApp(
            CrewController.&index as MC,                    (1)
            new String(
                this.class
                    .getResourceAsStream("/crew/crew.svg")  (2)
                    .readAllBytes()
            )
        )
    )
}
1 切入点
2 图标
将 Charts 替换成 Diagrams
private static UiDiagramSpecifier d1() {
    new UiDiagramSpecifier().ui {
        bar(["T1", "T2", "T3", "T4"] as List<String>, false, {
            dataset 'Truc1', [1.0, 2.0, 1.0, 4.0]
            dataset 'Truc2', [2.0, 0.1, 1.0, 0.0]
            dataset 'Truc3', [2.0, 0.1, 1.0, 1.0]
        }, DiagramTypeSpec.HeightWidthRadio.ONE)
    }
}
包含图表的 PDF
printableBody {
    diagram(d1(), BlockSpec.Width.HALF)
    diagram(d2(), BlockSpec.Width.HALF)
}
层叠柱状图

news diagram

0.5.0 版本

Based on Bootstrap

  • Themable

    • Color Scheme from your desktop

    • Adjustable component size

  • Easier to extend

Improved Loading Time

  • Less assets

  • CSS and JS shortened

Main Code Changes

New Layout DSL

  • Same layout for forms and blocks

    • col and row

    • tabs and tab

With for col only

DSL Menu for blocks

  • Menu DSL replace actions

  • No need to use icons

  • Menus are auto-translated

Simpler Code

Leads To :

  • Easier maintenance

  • Easier to contribute

0.4.2 版本

此版本有一些不错的改进(摒弃一些旧代码)

  • 改进 DSL 层次结构

    • 隐藏字段置于顶部以提高可读性

    • 表单中取消冗余参数传递

    • 过滤器中取消冗余参数传递

    • filterField 仅在 section 可用

    • 表单顶层字段仅在 header 上

  • 可以很好地显示表单字段 M2M 类型的 hook

  • 用来注册典型的对象过滤器的 hook

  • 改进恢复状态

  • 修复带有分页的表格分组/树

  • TBD

0.4.1 版本

更新后的菜单布局

screenshot news menu 0.4.1

菜单布局代码
private UiMenuSpecifier buildMenu(String q = null) {
    new UiMenuSpecifier().ui {
        menu CrewController.&index as MC
        menu CrewController.&listRoles as MC
        menu CrewController.&hierarchy as MC
        menuIcon ActionIcon.CONFIG_USER, this.&editUser as MC
        menuIcon ActionIcon.EXPORT_PDF, this.&downloadBinPdf as MC
        menuSearch this.&search as MethodClosure, q
        menuOptions(SupportedLanguage.fromContext())            (1)
    }
}
1 语言选择在搜索栏的右侧,也可以添加其他枚举类
Kotlin JS 调试方法
$ cd infra/browser/client                             (1)
$ ./gradlew browserDevelopmentRun                     (2)
$ vi intranet/server/grails-app/conf/application.yml  (3)
# Uncomment line bellow
# client.js.path: 'http://localhost:8080/client.js'

# Then your browser should show Kotlin code !
1 移动到生成 JS 代码的 client 路径下
2 启动一个服务 client.js 和 client.js.map 的服务器…​
3 编辑你的 application.yml 文件
新的 Solr DSL 简化(不再需要标签)
@PostConstruct
private void init() {
    taackSearchService.registerSolrSpecifier(this,
            new SolrSpecifier(User,
                CrewController.&showUserFromSearch as MethodClosure,
                this.&labeling as MethodClosure, { User u ->
        u ?= new User()
        indexField SolrFieldType.TXT_NO_ACCENT, u.username_
        indexField SolrFieldType.TXT_GENERAL, u.username_
        indexField SolrFieldType.TXT_NO_ACCENT, u.firstName_
        indexField SolrFieldType.TXT_NO_ACCENT, u.lastName_
        indexField SolrFieldType.POINT_STRING, "mainSubsidiary", true, u.subsidiary?.toString()
        indexField SolrFieldType.POINT_STRING, "businessUnit", true, u.businessUnit?.toString()
        indexField SolrFieldType.DATE, 0.5f, true, u.dateCreated_
        indexField SolrFieldType.POINT_STRING, "userCreated", 0.5f, true, u.userCreated?.username
    }))
}

0.4.0 版本

  • 表格中不再有 paginate. 详情见 iterate 用法

  • 没有 list, 但有 iterate, 用closure作为参数,并使用构建器传递参数

  • 菜单自动标记 (用URL中的 lang=test 翻译). 详情见 新的 menu 代码

  • 表格中不再有 isAjax 参数…​ 详情见 新的 rowAction 代码

  • 将 rowLink 替换为为 rowAction [i18n_isAjax]

  • 表格中的 rowAction 不需要标签. 详情见 新的 rowAction 代码

  • 表格、表单、tableFilter 不再需要 ajaxBlock

  • formAction 不再有 isAjax 参数

  • formAction 不再强制使用 i18n 参数

  • 表单不再有强制的 i18n 参数,i18n 会基于当前 action 名称

  • block action 不再有强制的 i18n 参数,i18n 会基于目标动作

  • block action 不再强制使用 isAjax 参数

iterate 用法
iterate(taackFilterService.getBuilder(Role)                     (1)
        .setMaxNumberOfLine(20)                                 (2)
        .setSortOrder(TaackFilter.Order.DESC, u.authority_)     (3)
        .build()) { Role r, Long counter ->
            row {
                rowColumn {
                    rowField r.authority
                    if (hasSelect)
                        rowAction
                            ActionIcon.SELECT * IconStyle.SCALE_DOWN,
                            CrewController.&selectRole as MC
                            r.id                                (4)
                }
            }
        }
1 迭代
2 如果有更多行,定义 max 来触发分页
3 替换旧的低效模式来描述初始排序和顺序
4 不再有 i18n 和 isAjax 参数
新的 menu 代码
private UiMenuSpecifier buildMenu(String q = null) {
    UiMenuSpecifier m = new UiMenuSpecifier()
    m.ui {
        menu CrewController.&index as MC        (1)
        menu CrewController.&listRoles as MC
        menu CrewController.&hierarchy as MC
        menuSearch this.&search as MethodClosure, q
    }
    m
}
1 没有 i18n 参数
新的 rowAction 代码
if (hasActions) {
    rowColumn {
        rowAction ActionIcon.EDIT * IconStyle.SCALE_DOWN, this.&roleForm as MC, r.id (1)
    }
}
1 没有 i18n 参数,没有 isAjax 参数

0.3.9 版本

此版本提供:

  • Grails 6.2.0

  • Groovy 3.0.21

  • Bumping Various deps …​ (详情见 Changelog)