表格(Table)
一、视图特征
- 视图类型:表格(TABLE)
- 数据类型:列表(List)
- DSL 特征:仅表示元素间相对顺序,无布局功能。
- 数据结构通用行为:
- 查询行为:分页、排序、搜索。
- 交互行为:单选、多选。
- 表格行为:
- 交互行为:行内编辑、树形表格、展开行等。
- 常用接口:(默认数据管理器函数)
- queryPage:支持分页、排序、搜索等查询功能。
- create:行内编辑创建。(pk is null)
- update:行内编辑更新。(pk is not null)
- delete:删除动作。
二、DSL 结构
一个精简版视图可以是这样的:(“精简” 表示每个标签的属性数量少,而不是节点数量少。)
<view type="TABLE" model="demo.DemoModel" name="demo_table_view">
<template slot="searchFields">
<field data="code" />
<field data="name" />
</template>
<template slot="actions">
<action name="redirectCreatePage" label="创建" />
<action name="delete" label="删除" />
</template>
<template slot="fields">
<field data="id" invisible="true" />
<field data="code" />
<field data="name" />
</template>
<template slot="rowActions">
<action name="redirectUpdatePage" label="编辑" />
<action name="redirectDetailPage" label="详情" />
</template>
</view>
- 在这个
DSL
中,围绕着模型demo.DemoModel
定义了字段和动作,并通过布局提供的插槽将其放在对应的位置。 - 在插槽中的元素从上到下表示了其相对位置,改变先后顺序就可以改变其渲染在页面上的位置。
field
标签使用data
属性声明模型对应的字段,其对应ModelField#field
字段编码。action
标签使用name
属性声明模型对应的动作,其对应Action#name
动作名称。所有类型的动作,都继承自Action
模型。label
属性指定了动作在页面上展示的文本内容,在未定义的情况下,将按照顺序分别获取:label > displayName > name
。
提示
我们在 DSL 章节中对插槽以及布局和 DSL 的工作原理进行了详细的介绍,这里所有的插槽名称都来源于默认布局。
更多关于 布局 相关的内容请参考:Layout
更多关于 DSL 相关的内容请参考:DSL
三、默认字段组件
在上面的 DSL
中,我们并没有指定 widget
属性,那么在这种情况下,Widget 框架将根据字段元数据属性获取对应的默认组件。下面列举了目前表格视图中用到的所有默认组件:
字段类型 | 是否多值 | 默认组件 | 只读态 TypeScript Class | 编辑态 TypeScript Class |
---|---|---|---|---|
文本(STRING) | 否 | 文本(Input) | TableStringFieldWidget | FormStringInputFieldWidget |
是 | 标签(Tag) | TableStringTagFieldWidget | FormStringMultiTagFieldWidget | |
多行文本(TEXT) | 否 | 多行文本(TextArea) | TableTextFieldWidget | TableEditorTextFieldWidget |
富文本(HTML) | 否 | 富文本(RichText) | TableHtmlRichTextFieldWidget | FormHtmlRichTextFieldWidget |
手机(PHONE) | 否 | 手机(Phone) | TableStringFieldWidget | FormPhoneFieldWidget |
邮箱(EMAIL) | 否 | 邮箱(Email) | TableStringFieldWidget | FormEmailFieldWidget |
整数(INTEGER) | 否 | 整数(Integer) | TableNumberWidget | FormIntegerFieldWidget |
是 | 标签(Tag) | TableMultiNumberWidget | FormIntegerTagFieldWidget | |
浮点数(FLOAT) | 否 | 数字(Float) | TableNumberWidget | FormFloatFieldWidget |
是 | 标签(Tag) | TableMultiNumberWidget | - | |
金额(MONEY) | 否 | 货币(Currency) | TableCurrencyFieldWidget | FormMoneyFieldWidget |
布尔(BOOLEAN) | 否 | 文本(是/否) | TableBooleanFieldWidget | FormBooleanSwitchFieldWidget |
枚举(ENUM) | 否 | 下拉单选(Select) | TableEnumFieldWidget | FormEnumFieldWidget |
是 | 下拉多选(Select) | TableEnumFieldWidget | FormEnumMultiSelectFieldWidget | |
日期时间(DATETIME) | 否 | 日期时间(DateTimePicker) | TableDateTimeFieldWidget | FormDateTimeFieldWidget |
日期(DATE) | 否 | 日期(DatePicker) | TableDateFieldWidget | FormDateFieldWidget |
时间(TIME) | 否 | 时间(TimePicker) | TableTimeFieldWidget | FormTimeFieldWidget |
年份(YEAR) | 否 | 年份(YearPicker) | TableYearFieldWidget | FormYearFieldWidget |
键值对(MAP) | 否 | 键值对(Map) | TableMapFieldWidget | FormMapFieldWidget |
多对一(M2O) | 否 | 下拉单选(Select) | TableM2OFieldWidget | FormM2OSelectFieldWidget |
一对多(O2M) | 是 | 下拉多选(Select) | TableO2MFieldWidget | FormO2MSelectFieldWidget |
多对多(M2M) | 是 | 下拉多选(Select) | TableM2MFieldWidget | FormM2MFieldSelectWidget |
四、可选字段组件
针对每一种字段类型,除了上述对应的默认组件外,还有一些组件是通过指定 widget
属性进行使用的。下面列举了目前表格视图中现有的字段组件:
字段类型 | 是否多值 | 组件 | 只读态 TypeScript Class | 编辑态 TypeScript Class |
---|---|---|---|---|
文本(STRING) | 否 | 颜色(ColorPicker) | TableStringColorPickerFieldWidget | FormStringColorPickerFieldWidget |
文件(Upload) | TableStringUploadWidget | FormStringUploadFieldWidget | ||
图片(UploadImg) | TableStringUploadImageFieldWidget | FormStringUploadImgFieldWidget | ||
超链接(Hyperlinks) | TableStringHyperlinksFieldWidget | FormStringHyperlinksFieldWidget | ||
多媒体播放器(MediaPlayer) | TableStringMediaPlayerFieldWidget | FormStringMediaPlayerFieldWidget | ||
是 | 文件(Upload) | TableStringMultiUploadWidget | FormStringUploadFieldWidget | |
图片(UploadImg) | TableStringMultiUploadImageFieldWidget | FormStringUploadImgFieldWidget | ||
多行文本(TEXT) | 否 | 文件(Upload) | TableStringMultiUploadWidget | FormStringUploadFieldWidget |
图片(UploadImg) | TableStringMultiUploadImageFieldWidget | FormStringUploadImgFieldWidget | ||
布尔(BOOLEAN) | 否 | 开关(Switch) | TableBooleanSwitchFieldWidget | FormBooleanSwitchFieldWidget |
下拉单选(Select) | TableBooleanSelectFieldWidget | FormBooleanSelectFieldWidget | ||
单选框(Radio) | TableBooleanRadioFieldWidget | FormBooleanRadioFieldWidget | ||
枚举(ENUM) | 否 | 单选框(Radio) | TableEnumFieldWidget | FormEnumRadioWidget |
是 | 多选框(Checkbox) | TableEnumFieldWidget | FormEnumMultiCheckboxFieldWidget | |
多对一(M2O) | 否 | 树选择(TreeSelect) | TableM2OFieldWidget | FormM2OTreeSelectFieldWidget |
级联选择(Cascader) | TableM2OFieldWidget | FormM2OCascaderFieldWidget | ||
一对多(O2M) | 是 | 树选择(TreeSelect) | TableO2MFieldWidget | FormO2MTreeSelectFieldWidget |
级联选择(Cascader) | TableO2MFieldWidget | FormO2MCascaderFieldWidget | ||
多对多(M2M) | 是 | 树选择(TreeSelect) | TableM2MFieldWidget | FormM2MTreeSelectFieldWidget |
级联选择(Cascader) | TableM2MFieldWidget | FormM2MCascaderFieldWidget |
五、DSL 属性配置
(一)表格属性配置
<element widget="Table">
......
</element>
1、外观属性
- emptyText:空数据提示文本(
string
) - emptyImage:空数据提示图片(
url
) - height:高度(
string | number
) - minHeight:最小高度(
string | number
) - maxHeight:最大高度(
string | number
) - lineHeight:行高(
number
) - minLineHeight:最小行高(
number
) - autoLineHeight:自动行高(
boolean
) - activeCount:行内动作数量(
number
) - operatorColumnDirection:操作列动作排列方向(
'horizontal' | 'vertical'
) - operatorColumnWidth:操作列宽度(
string | number
) - operatorColumnButtonType:操作列动作类型(
ButtonType
) - usingSimpleUserPrefer:使用简易风格用户偏好(
boolean
)
2、控制属性
交互属性
- sortable:允许排序(
boolean
) - ordering:排序规则(
string
)eg:'field1 asc, field2 desc'
- showPagination:显示分页(
boolean
) - paginationStyle:分页样式(
'STANDARD' | 'SIMPLE'
) - pageSizeOptions:分页数可选项(
number[]
)eg:'10,15,30,50,100,200'
- defaultPageSize:默认分页数,应出现在分页数可选项中(
number
) - filter:不可视过滤条件(
rsql
) - domain:可视过滤条件(
rsql
) - load:加载函数函数编码,
FunctionDefinition#fun
(string
) - selectMode:选择模式,需配合对应列类型使用(
'checkbox' | 'radio'
)
行内编辑
- editable:允许行内编辑(
boolean
) - editorTrigger:行内编辑触发方式(
'manual' | 'click' | 'dblclick'
) - editorMode:行内编辑模式(
'row' | 'cell'
) - editorCloseTrigger:行内编辑关闭触发方式(
'manual' | 'auto'
) - editorShowIcon:表头是否显示可编辑图标(
boolean
) - rowEditorCreateFun:行内编辑创建函数函数编码,
FunctionDefinition#fun
(string
) - rowEditorUpdateFun:行内编辑更新函数函数编码,
FunctionDefinition#fun
(string
)
统计
- showFooter:显示表尾统计行,需配合字段统计属性使用(
boolean
) - statisticsLabel:表尾统计标题文本(
string
) - emptyStatisticsText:空统计内容(
string
) - statisticsFun:指定服务端统计函数函数编码,
FunctionDefinition#fun
(string
) - refreshRemoteStatistics:搜索或分页时刷新统计行数据(
boolean
)
展开行
(需配合展开列使用)
- expandAccordion:展开行使用手风琴模式(
boolean
) - expandAll:展开行首次加载时是否全部展开(
boolean
) - expandOperationField:指定展开行展开图标所在字段名(
string
)
行点击
- allowRowClick:启用行点击(
boolean
) - rowClickMode:行点击模式(
('click' | dblclick)[]
)eg:'click,dblclick'
- rowClickActionName:指定单击行动作名称,需配合
click
插槽配置action
标签使用(string
) - rowDblClickActionName:指定双击行动作名称,需配合
click
插槽配置action
标签使用(string
)
树形表格
- enabledTreeConfig:启用树形表格(
boolean
) - treeRelationField:树形表格关联字段(
string
) - treeExpandAll:树形表格首次加载时是否展开全部(
boolean
) - treeLazy:树形表格启用懒加载(
boolean
) - treeHasChildField:树形表格判断是否有子节点的字段名(
string
)eg:hasChild
- expandTreeField:指定树形表格展开图标所在字段名(
string
)
(二)通用列属性配置
- label:标题(
string
) - columnType:列类型(
'checkbox' | 'radio' | 'seq' | 'expand'
) - width:宽度(
string | number
) - minWidth:最小宽度(
string | number
) - resizable:允许拖动调整列宽(
boolean
) - align:水平对齐方式(
'left' | 'center' | 'right'
) - headerAlign:表头对齐方式(
'left' | 'center' | 'right'
) - footerAlign:表尾对齐方式(
'left' | 'center' | 'right'
) - fixed:固定列(
'left' | 'right'
) - className:单元格附加 className(
string
) - headerClassName:表头单元格附加 className(
string
) - footerClassName:表尾单元格附加 className(
string
)
(三)功能列属性配置
1、复选框列(checkbox)
<element widget="Table" checkbox="false">
<element widget="checkbox-column" />
</element>
继承自 通用列属性配置,columnType
固定为 checkbox
。
提示
由于历史原因,表格上 checkbox
属性在之前的设计中会自动追加复选框列,在 DSL 中显式声明复选框列时,需要将 checkbox
属性设置为 false
,否则会出现多个复选框列。
2、单选框列(radio)
<element widget="Table" checkbox="false">
<element widget="radio-column" />
</element>
继承自 通用列属性配置,columnType
固定为 radio
。
3、序号列(seq)
<element widget="sequence-column" />
继承自 通用列属性配置,columnType
固定为 seq
。
4、操作列(operation)
<element widget="operation-column" />
继承自 通用列属性配置
提示
默认布局提供的 rowActions
实际上与上述提到的 operation-column
找到的 TypeScript Class
都是 TableOperationColumnWidget
组件。rowActions
有计划将在未来高版本中移除。
5、展开行列(expand)
<element widget="expand-column" />
继承自 通用列属性配置
示例:展开行设置当前视图
使用 fields
和 expandRow
插槽进行配置:
<view type="TABLE" model="demo.DemoModel" name="demo_table_view">
<template slot="fields">
<field data="id" invisible="true" />
<field data="code" />
<field data="name" />
</template>
<template slot="expandRow">
<view type="DETAIL">
<template slot="fields">
<field data="id" invisible="true" />
<field data="code" />
<field data="name" />
</template>
</view>
</template>
</view>
使用 table
和 expandRow
插槽进行配置:
<view type="TABLE" model="demo.DemoModel" name="demo_table_view">
<template slot="table">
<template slot="expandRow">
<view type="DETAIL">
<template slot="fields">
<field data="id" invisible="true" />
<field data="code" />
<field data="name" />
</template>
</view>
</template>
<field data="id" invisible="true" />
<field data="code" />
<field data="name" />
</template>
</view>
提示
这两种方式最终渲染的结果是完全相同的,对布局和 DSL 插槽不熟悉的读者可参考:DSL
示例:展开行设置关联模型
使用多对一字段配置展开行视图时,只能配置表单或详情这类使用对象(Object)数据结构的视图类型。这样展开行视图就会自动通过多对一字段的关联关系发起 queryOne
查询。如下所示:
<view type="TABLE" model="demo.DemoModel" name="demo_table_view">
<template slot="table" expandOperationField="code">
<template slot="expandRow" />
<field data="id" invisible="true" />
<field data="code" />
<field data="name" />
<field data="m2o">
<view type="DETAIL">
<template slot="fields">
<field data="id" invisible="true" />
<field data="code" />
<field data="name" />
</template>
</view>
</field>
</template>
</view>
使用一对多字段配置展开行视图时,只能配置表格这类使用列表(List)数据结构的视图类型。这样展开行视图就会自动通过一对多字段的关联关系发起 queryPage
查询。如下所示:
<view type="TABLE" model="demo.DemoModel" name="demo_table_view">
<template slot="table" expandOperationField="code">
<template slot="expandRow" />
<field data="id" invisible="true" />
<field data="code" />
<field data="name" />
<field data="o2m">
<view type="TABLE">
<template slot="fields">
<field data="id" invisible="true" />
<field data="code" />
<field data="name" />
</template>
</view>
</field>
</template>
</view>
提示
在这两个示例中,我们使用了 expandOperationField
属性来配置展开行展开图标所在字段名,由于我们使用了 table
插槽,因此还需要保留 expandRow
插槽用来保证展开行组件在合并布局和 DSL 后还可以正常运行。
(四)字段通用属性配置
1、外观属性
- label:标题(
string
) - width:宽度(
string | number
) - minWidth:最小宽度(
string | number
) - resizable:允许拖动调整列宽(
boolean
) - align:水平对齐方式(
'left' | 'center' | 'right'
) - headerAlign:表头对齐方式(
'left' | 'center' | 'right'
) - footerAlign:表尾对齐方式(
'left' | 'center' | 'right'
) - fixed:固定列(
'left' | 'right'
) - className:单元格附加 className(
string
) - headerClassName:表头单元格附加 className(
string
) - footerClassName:表尾单元格附加 className(
string
)
2、控制属性
只读态控制属性
- sortable:允许排序(
boolean
) - invisible:列隐藏(
boolean | expression
) - invisibleContent:单元格内容隐藏(
boolean | expression
) - enableClick:启用单元格内容点击功能(
boolean
) - clickMethod:单元格内容点击方式(
'click' | 'dblclick'
) - clickActionName:指定单元格内容点击的行内动作名称(
string
)
编辑态控制属性
- editable:允许行内编辑(
boolean
) - required:必填(
boolean | expression
) - editorConfirm:二次确认文本内容(
string
) - editorConfirmType:二次确认类型(
'popper' | 'modal'
) - editorConfirmPosition:二次确认弹出气泡位置(
PopconfirmPlacement
) - editorEnterText:二次确认【确定】按钮文本(
string
) - editorCancelText:二次确认【取消】按钮文本(
string
)
(五)字段组件属性配置
1、文本(STRING)
TableStringFieldWidget
<field data="stringField" />
- type:字符串类型(
'text' | 'password'
)
TableStringColorPickerFieldWidget
<field data="stringField" widget="ColorPicker" />
TableStringUploadWidget
<field data="stringField" widget="Upload" />
- cdnKey:指定上传 cdnKey,配合后端 OSS 配置使用(
string
) - privateLink:使用后端上传/下载文件,当 OSS 无法通过客户端直传时使用(
boolean
)
TableStringUploadImageFieldWidget
<field data="stringField" widget="UploadImg" />
TableStringHyperlinksFieldWidget
<field data="stringField" widget="Hyperlinks" />
- target:链接打开方式(
'OPEN_WINDOW' | 'ROUTER'
) - text:链接显示文本(
string
) - defaultValue:链接显示默认文本(
string
)
TableStringMediaPlayerFieldWidget
<field data="stringField" widget="MediaPlayer" />
TableStringTagFieldWidget
<field data="stringMultiField" />
TableStringMultiUploadWidget
<field data="stringMultiField" widget="Upload" />
TableStringMultiUploadImageFieldWidget
<field data="stringMultiField" widget="UploadImg" />
2、多行文本(TEXT)
TableTextFieldWidget
<field data="textField" />
TableStringMultiUploadWidget
<field data="textMultiField" widget="Upload" />
TableStringMultiUploadImageFieldWidget
<field data="textMultiField" widget="UploadImg" />
3、富文本(HTML)
TableHtmlRichTextFieldWidget
<field data="htmlField" />
4、手机(PHONE)
TableStringFieldWidget
<field data="phoneField" />
5、邮箱(EMAIL)
TableStringFieldWidget
<field data="emailField" />
6、整数(INTEGER)
TableNumberWidget
<field data="integerField" />
- showThousandth:显示千分位(
boolean | expression
)
TableMultiNumberWidget
<field data="integerMultiField" />
7、浮点数(FLOAT)
TableNumberWidget
<field data="floatField" />
- showThousandth:显示千分位(
boolean | expression
) - decimal:小数位数(
number | expression
)
TableMultiNumberWidget
<field data="floatMultiField" />
8、金额(MONEY)
TableCurrencyFieldWidget
<field data="moneyField" />
9、布尔(BOOLEAN)
TableBooleanFieldWidget
<field data="booleanField" />
TableBooleanSwitchFieldWidget
<field data="booleanField" widget="Switch" />
- truthyAction:切换为打开时执行的提交动作名称(
string
) - falsyAction:切换为关闭时执行的提交动作名称(
string
)
TableBooleanSelectFieldWidget
<field data="booleanField" widget="Select" />
- optionColorStyle:可选项颜色样式(
'COLORFUL' | 'SIMPLICITY'
) - option.name:固定值(
'true' | 'false'
) - option.label:显示文本(
string
) - option.color:字体色(
color
) - option.backgroundColor:背景色(
color
) - option.borderColor:边框色(
color
)
示例:可选项添加颜色配置
<field data="booleanField" widget="Select">
<options>
<option name="true" label="是" color="#035dff" backgroundColor="#035dff1a" />
<option name="false" label="否" color="#6dd400" backgroundColor="#6dd4001a" />
</options>
</field>
TableBooleanRadioFieldWidget
<field data="booleanField" widget="Radio" />
- optionColorStyle:可选项颜色样式(
'COLORFUL' | 'SIMPLICITY'
) - option.name:固定值(
'true' | 'false'
) - option.label:显示文本(
string
) - option.color:字体色(
color
) - option.backgroundColor:背景色(
color
) - option.borderColor:边框色(
color
)
10、枚举(ENUM)
TableEnumFieldWidget
<field data="enumField" />
- optionColorStyle:可选项颜色样式(
'COLORFUL' | 'SIMPLICITY'
) - option.name:枚举名称(
string
) - option.label:显示文本(
string
) - option.color:字体色(
color
) - option.backgroundColor:背景色(
color
) - option.borderColor:边框色(
color
)
11、日期时间类
TableDateTimeFieldWidget
<field data="datetimeField" />
- format:日期时间格式化文本(
string
)
TableDateFieldWidget
<field data="dateField" />
- format:日期格式化文本(
string
)
TableTimeFieldWidget
<field data="timeField" />
- format:时间格式化文本(
string
)
TableYearFieldWidget
<field data="yearField" />
- format:年份格式化文本(
string
)
12、键值对(MAP)
TableMapFieldWidget
<field data="mapField" />
13、多对一(M2O)
TableM2OFieldWidget
<field data="m2oField" />
- optionLabel:显示文本(
string | expression
)
14、一对多(O2M)
TableO2MFieldWidget
<field data="o2mField" />
- optionLabel:显示文本(
string | expression
) - separator:分隔符,未配置 optionLabel 时拼接 labelFields 有效(
string
)
15、多对多(M2M)
TableM2MFieldWidget
<field data="m2mField" />
- optionLabel:显示文本(
string | expression
) - separator:分隔符,未配置 optionLabel 时拼接 labelFields 有效(
string
)
(六)复合列属性配置
1、TableDateTimeRangeFieldWidget
<element widget="DateTimeRangePicker">
<field data="start" />
<field data="end" />
</element>
- separator:分隔符(
string
)
2、TableDateRangeFieldWidget
<element widget="DateRangePicker">
<field data="start" />
<field data="end" />
</element>
- separator:分隔符(
string
)
3、TableTimeRangeFieldWidget
<element widget="TimeRangePicker">
<field data="start" />
<field data="end" />
</element>
- separator:分隔符(
string
)
4、TableYearRangeFieldWidget
<element widget="YearRangePicker">
<field data="start" />
<field data="end" />
</element>
- separator:分隔符(
string
)