Files
webman-buildadmin-mall/web/types/table.d.ts
2026-03-18 17:19:03 +08:00

520 lines
18 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import type {
ButtonProps,
ButtonType,
ColProps,
ElTooltipProps,
FormInstance,
ImageProps,
PopconfirmProps,
SwitchProps,
TableColumnCtx,
TagProps,
} from 'element-plus'
import type { Component, ComponentPublicInstance } from 'vue'
import Icon from '/@/components/icon/index.vue'
import Table from '/@/components/table/index.vue'
declare global {
interface BaTable {
/**
* 表格数据,通过 baTable.getData 获取
* 刷新数据可使用 baTable.onTableHeaderAction('refresh', { event: 'custom' })
*/
data?: TableRow[]
/**
* 表格列定义
*/
column: TableColumn[]
/**
* 获取表格数据时的过滤条件(含公共搜索、快速搜索、分页、排序等数据)
* 公共搜索数据可使用 baTable.setComSearchData 和 baTable.getComSearchData 进行管理
*/
filter?: {
page?: number
limit?: number
order?: string
quickSearch?: string
search?: ComSearchData[]
[key: string]: any
}
/**
* 不需要双击编辑的字段type=selection 的列为 undefined
* 禁用全部列的双击编辑,可使用 ['all']
*/
dblClickNotEditColumn?: (string | undefined)[]
/**
* 表格扩展数据,随意定义,以便一些自定义数据可以随 baTable 实例传递
*/
extend?: anyObj
// 表格 ref通常在 页面 onMounted 时赋值,可选的
ref?: InstanceType<typeof Table> | null
// 表格对应数据表的主键字段
pk?: string
// 路由 remark后台菜单规则备注信息
remark?: string | null
// 表格加载状态
loading?: boolean
// 当前选中行
selection?: TableRow[]
// 数据总量
total?: number
// 默认排序字段和排序方式
defaultOrder?: { prop: string; order: string }
// 拖动排序限位字段,例如拖动行 pid=1那么拖动目的行 pid 也需要为 1
dragSortLimitField?: string
// 接受 url 的 query 参数并自动触发公共搜索
acceptQuery?: boolean
// 显示公共搜索
showComSearch?: boolean
// 是否展开所有子项,树状表格专用属性
expandAll?: boolean
// 当前表格所在页面的路由 path
routePath?: string
}
interface BaTableForm {
/**
* 当前表单项数据
*/
items?: anyObj
/**
* 当前操作标识:Add=添加,Edit=编辑
*/
operate?: string
/**
* 添加表单字段默认值,打开表单时会使用 cloneDeep 赋值给 this.form.items 对象
*/
defaultItems?: anyObj
/**
* 表单扩展数据,可随意定义,以便一些自定义数据可以随 baTable 实例传递
*/
extend?: anyObj
// 表单 ref实例化表格时通常无需传递
ref?: FormInstance | undefined
// 表单项 label 的宽度
labelWidth?: number
// 被操作数据ID支持批量编辑:add=[0],edit=[1,2,n]
operateIds?: string[]
// 提交按钮状态
submitLoading?: boolean
// 表单加载状态
loading?: boolean
}
/**
* BaTable 前置处理函数(前置埋点)
*/
interface BaTableBefore {
/**
* 获取表格数据前的钩子(返回 false 可取消原操作)
*/
getData?: () => boolean | void
/**
* 删除前的钩子(返回 false 可取消原操作)
* @param object.ids 被删除数据的主键集合
*/
postDel?: ({ ids }: { ids: string[] }) => boolean | void
/**
* 获取被编辑行数据前的钩子(返回 false 可取消原操作)
* @param object.id 被编辑行主键
*/
getEditData?: ({ id }: { id: string }) => boolean | void
/**
* 双击表格具体操作执行前钩子(返回 false 可取消原操作)
* @param object.row 被双击行数据
* @param object.column 被双击列数据
*/
onTableDblclick?: ({ row, column }: { row: TableRow; column: TableColumn }) => boolean | void
/**
* 表单切换前钩子(返回 false 可取消默认行为)
* @param object.operate 当前操作标识:Add=添加,Edit=编辑
* @param object.operateIds 被操作的行 ID 集合
*/
toggleForm?: ({ operate, operateIds }: { operate: string; operateIds: string[] }) => boolean | void
/**
* 表单提交前钩子(返回 false 可取消原操作)
* @param object.formEl 表单组件ref
* @param object.operate 当前操作标识:Add=添加,Edit=编辑
* @param object.items 表单数据
*/
onSubmit?: ({ formEl, operate, items }: { formEl?: FormInstance | null; operate: string; items: anyObj }) => boolean | void
/**
* 表格内事件响应前钩子(返回 false 可取消原操作)
* @param object.event 事件名称
* @param object.data 事件携带的数据
*/
onTableAction?: ({ event, data }: { event: BaTableActionEventName; data: anyObj }) => boolean | void
/**
* 表格顶部菜单事件响应前钩子(返回 false 可取消原操作)
* @param object.event 事件名称
* @param object.data 事件携带的数据
*/
onTableHeaderAction?: ({ event, data }: { event: BaTableHeaderActionEventName; data: anyObj }) => boolean | void
/**
* 表格初始化前钩子
*/
mount?: () => boolean | void
/** getData 的别名 */
getIndex?: () => boolean | void
/** getEditData 的别名 */
requestEdit?: ({ id }: { id: string }) => boolean | void
// 可自定义其他钩子
[key: string]: Function | undefined
}
/**
* BaTable 后置处理函数(后置埋点)
*/
interface BaTableAfter {
/**
* 请求到表格数据后钩子
* 此时 baTable.table.data 已赋值
* @param object.res 请求完整响应
*/
getData?: ({ res }: { res: ApiResponse }) => void
/**
* 删除请求后钩子
* @param object.res 请求完整响应
*/
postDel?: ({ res }: { res: ApiResponse }) => void
/**
* 获取到编辑行数据后钩子
* 此时 baTable.form.items 已赋值
* @param object.res 请求完整响应
*/
getEditData?: ({ res }: { res: ApiResponse }) => void
/**
* 双击单元格操作执行后钩子
* @param object.row 当前行数据
* @param object.column 当前列数据
*/
onTableDblclick?: ({ row, column }: { row: TableRow; column: TableColumn }) => void
/**
* 表单切换后钩子
* @param object.operate 当前操作标识:Add=添加,Edit=编辑
* @param object.operateIds 被操作的 ID 集合
*/
toggleForm?: ({ operate, operateIds }: { operate: string; operateIds: string[] }) => void
/**
* 表单提交后钩子
* @param object.res 请求完整响应
*/
onSubmit?: ({ res }: { res: ApiResponse }) => void
/**
* 表格内事件响应后钩子
* @param object.event 事件名称
* @param object.data 事件携带的数据
*/
onTableAction?: ({ event, data }: { event: BaTableActionEventName; data: anyObj }) => void
/**
* 表格顶部菜单事件响应后钩子
* @param object.event 事件名称
* @param object.data 事件携带的数据
*/
onTableHeaderAction?: ({ event, data }: { event: BaTableHeaderActionEventName; data: anyObj }) => void
/** getData 的别名 */
getIndex?: ({ res }: { res: ApiResponse }) => void
/** getEditData 的别名 */
requestEdit?: ({ res }: { res: ApiResponse }) => void
// 可自定义其他钩子
[key: string]: Function | undefined
}
/**
* baTable 表格内事件名称
* selection-change=选中项改变,page-size-change=每页数量改变,current-page-change=翻页,sort-change=排序,edit=编辑,delete=删除,field-change=单元格值改变,com-search=公共搜索
*/
type BaTableActionEventName =
| 'selection-change'
| 'page-size-change'
| 'current-page-change'
| 'sort-change'
| 'edit'
| 'delete'
| 'field-change'
| 'com-search'
/**
* baTable 表格头部事件名称
* refresh=刷新,add=添加,edit=编辑,delete=删除,quick-search=快速查询,unfold=折叠/展开,change-show-column=调整列显示状态
*/
type BaTableHeaderActionEventName = 'refresh' | 'add' | 'edit' | 'delete' | 'quick-search' | 'unfold' | 'change-show-column'
/**
* 表格公共搜索数据
*/
interface ComSearch {
/** 表单项数据 */
form: anyObj
/** 字段搜索配置搜索操作符operator、字段渲染方式render等 */
fieldData: Map<string, any>
}
/**
* 表格列
*/
interface TableColumn extends Partial<TableColumnCtx<TableRow>> {
// 是否于表格显示此列
show?: boolean
// 渲染器组件名,即 \src\components\table\fieldRender\ 中的组件之一,也可以查看 TableRenderer 类型定义
render?: TableRenderer
// 值替换数据(字典数据),同时用于单元格渲染时和作为公共搜索下拉框数据,格式如:{ open: '开', close: '关', disable: '已禁用' }
replaceValue?: Record<string, any>
// render=slot 时slot 的名称
slotName?: string
// render=customRender 时,要渲染的组件或已注册组件名称的字符串
customRender?: string | Component
// render=customTemplate 时,自定义渲染 html应谨慎使用请返回 html 内容,务必确保返回内容是 xss 安全的
customTemplate?: (row: TableRow, field: TableColumn, value: any, column: TableColumnCtx<TableRow>, index: number) => string
// 渲染前对字段值的预处理函数(对 el-table 的 formatter 扩展)
formatter?: (row: TableRow, column: TableColumnCtx<TableRow>, cellValue: any, index: number) => any
/**
* 自定义单元格渲染属性(比如单元格渲染器内部的 tag、button 组件的属性,设计上不仅是组件属性,也可以自定义其他渲染相关属性)
* 直接定义对应组件的属性 object或使用一个函数返回组件属性 object
*/
customRenderAttr?: {
tag?: TableContextDataFun<TagProps>
icon?: TableContextDataFun<InstanceType<typeof Icon>['$props']>
image?: TableContextDataFun<ImageProps>
switch?: TableContextDataFun<SwitchProps>
tooltip?: TableContextDataFun<ElTooltipProps>
[key: string]: any
}
// render=tag 时el-tag 组件的 effect
effect?: TagProps['effect']
// render=tag 时el-tag 组件的 size
size?: TagProps['size']
// render=url 时,链接的打开方式
target?: '_blank' | '_self'
// render=datetime 时,时间日期的格式化方式,字母可以自由组合:y=年,m=月,d=日,h=时,M=分,s=秒默认yyyy-mm-dd hh:MM:ss
timeFormat?: string
// render=buttons 时,操作按钮数组
buttons?: OptButton[]
/**
* 单元格渲染器需要的其他任意自定义数据
* 1. render=tag 时,可单独指定每个不同的值 tag 的 type 属性 { open: 'success', close: 'info', disable: 'danger' }
*/
custom?: any
// 默认值(单元格值为 undefined,null,'' 时取默认值,仅使用了 render 时有效)
default?: any
// 是否允许动态控制字段是否显示,默认为 true
enableColumnDisplayControl?: boolean
// 单元格渲染组件的 key默认将根据列配置等属性自动生成此 key 值改变时单元格将自动重新渲染)
getRenderKey?: (row: TableRow, field: TableColumn, column: TableColumnCtx<TableRow>, index: number) => string
// 公共搜索操作符,默认值为 = ,值为 false 禁用此字段公共搜索,支持的操作符见下类型定义
operator?: boolean | OperatorStr
// 公共搜索框的 placeholder
operatorPlaceholder?: string | string[]
// 公共搜索渲染方式render=tag|switch 时公共搜索也会渲染为下拉,数字会渲染为范围筛选,时间渲染为时间选择器等
comSearchRender?: 'string' | 'remoteSelect' | 'select' | 'time' | 'date' | 'datetime' | 'customRender' | 'slot'
// 公共搜索自定义组件/函数渲染
comSearchCustomRender?: string | Component
// 公共搜索自定义渲染为 slot 时slot 的名称
comSearchSlotName?: string
// 公共搜索自定义渲染时,外层 el-col 的属性(仅 customRender、slot 支持)
comSearchColAttr?: Partial<ColProps>
// 公共搜索是否显示字段的 label
comSearchShowLabel?: boolean
// 公共搜索输入组件的扩展属性
comSearchInputAttr?: anyObj
// 公共搜索渲染为远程下拉时,远程下拉组件的必要属性
remote?: {
pk?: string
field?: string
params?: anyObj
multiple?: boolean
remoteUrl: string
}
// 使用了 render 属性时,渲染前对字段值的预处理方法(即将废弃,请使用兼容 el-table 的 formatter 函数代替)
renderFormatter?: (row: TableRow, field: TableColumn, value: any, column: TableColumnCtx<TableRow>, index: number) => any
// 渲染为 url 时的点击事件(即将废弃,请使用 el-table 的 @cell-click 或单元格自定义渲染代替)
click?: (row: TableRow, field: TableColumn, value: any, column: TableColumnCtx<TableRow>, index: number) => any
}
/**
* 表格右侧操作按钮
*/
interface OptButton {
/**
* 渲染方式:tipButton=带tip的按钮,confirmButton=带确认框的按钮,moveButton=移动按钮,basicButton=普通按钮
*/
render: 'tipButton' | 'confirmButton' | 'moveButton' | 'basicButton'
/**
* 按钮名称将作为触发表格内事件onTableAction时的事件名
*/
name: string
/**
* 鼠标 hover 时的提示
* 可使用多语言翻译 key比如 user.group
*/
title?: string
/**
* 直接在按钮内显示的文字title 有值时可为空
* 可使用多语言翻译 key比如 user.group
*/
text?: string
/**
* 自定义按钮的点击事件
* @param row 当前行数据
* @param field 当前列数据
*/
click?: (row: TableRow, field: TableColumn) => void
/**
* 按钮是否显示请返回布尔值比如display: auth('add')
* @param row 当前行数据
* @param field 当前列数据
*/
display?: (row: TableRow, field: TableColumn) => boolean
/**
* 按钮是否禁用(请返回布尔值)
* @param row 当前行数据
* @param field 当前列数据
*/
disabled?: (row: TableRow, field: TableColumn) => boolean
/**
* 按钮是否正在加载中(请返回布尔值)
* @param row 当前行数据
* @param field 当前列数据
*/
loading?: (row: TableRow, field: TableColumn) => boolean
/**
* 自定义 el-button 的其他属性(格式为属性 object 或一个返回属性 object 的函数)
*/
attr?: TableContextDataFun<ButtonProps>
// 按钮 class
class?: string
// 按钮 type
type: ButtonType
// 按钮 icon 的名称
icon: string
// 确认按钮的气泡确认框的属性el-popconfirm 的属性,格式为属性 object 或一个返回属性 object 的函数)
popconfirm?: TableContextDataFun<PopconfirmProps>
// 是否禁用 title 提示,此值通常由系统动态调整以确保提示的显示效果
disabledTip?: boolean
}
/**
* 表格行
*/
interface TableRow extends anyObj {
children?: TableRow[]
}
/**
* 表头支持的按钮
*/
type HeaderOptButton = 'refresh' | 'add' | 'edit' | 'delete' | 'unfold' | 'comSearch' | 'quickSearch' | 'columnDisplay'
/**
* 公共搜索操作符支持的值
*/
type OperatorStr =
| 'eq' // 等于,默认值
| 'ne' // 不等于
| 'gt' // 大于
| 'egt' // 大于等于
| 'lt' // 小于
| 'elt' // 小于等于
| 'LIKE'
| 'NOT LIKE'
| 'IN'
| 'NOT IN'
| 'RANGE' // 范围,将生成两个输入框,可以输入最小值和最大值
| 'NOT RANGE'
| 'NULL' // 是否为NULL将生成单个复选框
| 'NOT NULL'
| 'FIND_IN_SET'
// 不推荐使用的,因为部分符号不利于网络传输
| '='
| '<>'
| '>'
| '>='
| '<'
| '<='
/**
* 公共搜索事件返回的 Data
*/
interface ComSearchData {
field: string
val: string | string[] | number | number[]
operator: string
render?: string
}
interface ElTreeData {
label: string
children?: ElTreeData[]
}
/**
* 表格上下文数据
*/
interface TableContextData {
row?: TableRow
field?: TableColumn
cellValue?: any
column?: TableColumnCtx<TableRow>
index?: number
}
/**
* 接受表格上下文数据的任意属性计算函数
*/
type TableContextDataFun<T> = Partial<T> | ((context: TableContextData) => Partial<T>)
interface TableRenderPublicInstance extends ComponentPublicInstance {
$attrs: {
renderValue: any
renderRow: TableRow
renderField: TableColumn
renderColumn: TableColumnCtx<TableRow>
renderIndex: number
}
}
}