table.d.ts 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497
  1. import type {
  2. ButtonProps,
  3. ButtonType,
  4. ColProps,
  5. ElTooltipProps,
  6. FormInstance,
  7. ImageProps,
  8. PopconfirmProps,
  9. SwitchProps,
  10. TableColumnCtx,
  11. TagProps,
  12. } from 'element-plus'
  13. import type { Component, ComponentPublicInstance } from 'vue'
  14. import Icon from '/@/components/icon/index.vue'
  15. import Table from '/@/components/table/index.vue'
  16. declare global {
  17. interface BaTable {
  18. /**
  19. * 表格数据,通过 baTable.getData 获取
  20. * 刷新数据可使用 baTable.onTableHeaderAction('refresh', { event: 'custom' })
  21. */
  22. data?: TableRow[]
  23. /**
  24. * 表格列定义
  25. */
  26. column: TableColumn[]
  27. /**
  28. * 获取表格数据时的过滤条件(含公共搜索、快速搜索、分页、排序等数据)
  29. * 公共搜索数据可使用 baTable.setComSearchData 和 baTable.getComSearchData 进行管理
  30. */
  31. filter?: {
  32. page?: number
  33. limit?: number
  34. order?: string
  35. quickSearch?: string
  36. search?: comSearchData[]
  37. [key: string]: any
  38. }
  39. /**
  40. * 不需要双击编辑的字段,type=selection 的列为 undefined
  41. * 禁用全部列的双击编辑,可使用 ['all']
  42. */
  43. dblClickNotEditColumn?: (string | undefined)[]
  44. /**
  45. * 表格扩展数据,随意定义,以便一些自定义数据可以随 baTable 实例传递
  46. */
  47. extend?: anyObj
  48. // 表格 ref,通常在 页面 onMounted 时赋值,可选的
  49. ref?: InstanceType<typeof Table> | null
  50. // 表格对应数据表的主键字段
  51. pk?: string
  52. // 路由 remark,后台菜单规则备注信息
  53. remark?: string | null
  54. // 表格加载状态
  55. loading?: boolean
  56. // 当前选中行
  57. selection?: TableRow[]
  58. // 数据总量
  59. total?: number
  60. // 默认排序字段和排序方式
  61. defaultOrder?: { prop: string; order: string }
  62. // 拖动排序限位字段,例如拖动行 pid=1,那么拖动目的行 pid 也需要为 1
  63. dragSortLimitField?: string
  64. // 接受 url 的 query 参数并自动触发公共搜索
  65. acceptQuery?: boolean
  66. // 显示公共搜索
  67. showComSearch?: boolean
  68. // 是否展开所有子项,树状表格专用属性
  69. expandAll?: boolean
  70. // 当前表格所在页面的路由 path
  71. routePath?: string
  72. }
  73. interface BaTableForm {
  74. /**
  75. * 当前表单项数据
  76. */
  77. items?: anyObj
  78. /**
  79. * 当前操作标识:Add=添加,Edit=编辑
  80. */
  81. operate?: string
  82. /**
  83. * 添加表单字段默认值,打开表单时会使用 cloneDeep 赋值给 this.form.items 对象
  84. */
  85. defaultItems?: anyObj
  86. /**
  87. * 表单扩展数据,可随意定义,以便一些自定义数据可以随 baTable 实例传递
  88. */
  89. extend?: anyObj
  90. // 表单 ref,实例化表格时通常无需传递
  91. ref?: FormInstance | undefined
  92. // 表单项 label 的宽度
  93. labelWidth?: number
  94. // 被操作数据ID,支持批量编辑:add=[0],edit=[1,2,n]
  95. operateIds?: string[]
  96. // 提交按钮状态
  97. submitLoading?: boolean
  98. // 表单加载状态
  99. loading?: boolean
  100. }
  101. /**
  102. * BaTable 前置处理函数(前置埋点)
  103. */
  104. interface BaTableBefore {
  105. /**
  106. * 获取表格数据前的钩子(返回 false 可取消原操作)
  107. */
  108. getData?: () => boolean | void
  109. /**
  110. * 删除前的钩子(返回 false 可取消原操作)
  111. * @param object.ids 被删除数据的主键集合
  112. */
  113. postDel?: ({ ids }: { ids: string[] }) => boolean | void
  114. /**
  115. * 获取被编辑行数据前的钩子(返回 false 可取消原操作)
  116. * @param object.id 被编辑行主键
  117. */
  118. getEditData?: ({ id }: { id: string }) => boolean | void
  119. /**
  120. * 双击表格具体操作执行前钩子(返回 false 可取消原操作)
  121. * @param object.row 被双击行数据
  122. * @param object.column 被双击列数据
  123. */
  124. onTableDblclick?: ({ row, column }: { row: TableRow; column: TableColumn }) => boolean | void
  125. /**
  126. * 表单切换前钩子(返回 false 可取消默认行为)
  127. * @param object.operate 当前操作标识:Add=添加,Edit=编辑
  128. * @param object.operateIds 被操作的行 ID 集合
  129. */
  130. toggleForm?: ({ operate, operateIds }: { operate: string; operateIds: string[] }) => boolean | void
  131. /**
  132. * 表单提交前钩子(返回 false 可取消原操作)
  133. * @param object.formEl 表单组件ref
  134. * @param object.operate 当前操作标识:Add=添加,Edit=编辑
  135. * @param object.items 表单数据
  136. */
  137. onSubmit?: ({ formEl, operate, items }: { formEl?: FormInstance | null; operate: string; items: anyObj }) => boolean | void
  138. /**
  139. * 表格内事件响应前钩子(返回 false 可取消原操作)
  140. * @param object.event 事件名称
  141. * @param object.data 事件携带的数据
  142. */
  143. onTableAction?: ({ event, data }: { event: string; data: anyObj }) => boolean | void
  144. /**
  145. * 表格顶部菜单事件响应前钩子(返回 false 可取消原操作)
  146. * @param object.event 事件名称
  147. * @param object.data 事件携带的数据
  148. */
  149. onTableHeaderAction?: ({ event, data }: { event: string; data: anyObj }) => boolean | void
  150. /**
  151. * 表格初始化前钩子
  152. */
  153. mount?: () => boolean | void
  154. /** getData 的别名 */
  155. getIndex?: () => boolean | void
  156. /** getEditData 的别名 */
  157. requestEdit?: ({ id }: { id: string }) => boolean | void
  158. // 可自定义其他钩子
  159. [key: string]: Function | undefined
  160. }
  161. /**
  162. * BaTable 后置处理函数(后置埋点)
  163. */
  164. interface BaTableAfter {
  165. /**
  166. * 请求到表格数据后钩子
  167. * 此时 baTable.table.data 已赋值
  168. * @param object.res 请求完整响应
  169. */
  170. getData?: ({ res }: { res: ApiResponse }) => void
  171. /**
  172. * 删除请求后钩子
  173. * @param object.res 请求完整响应
  174. */
  175. postDel?: ({ res }: { res: ApiResponse }) => void
  176. /**
  177. * 获取到编辑行数据后钩子
  178. * 此时 baTable.form.items 已赋值
  179. * @param object.res 请求完整响应
  180. */
  181. getEditData?: ({ res }: { res: ApiResponse }) => void
  182. /**
  183. * 双击单元格操作执行后钩子
  184. * @param object.row 当前行数据
  185. * @param object.column 当前列数据
  186. */
  187. onTableDblclick?: ({ row, column }: { row: TableRow; column: TableColumn }) => void
  188. /**
  189. * 表单切换后钩子
  190. * @param object.operate 当前操作标识:Add=添加,Edit=编辑
  191. * @param object.operateIds 被操作的 ID 集合
  192. */
  193. toggleForm?: ({ operate, operateIds }: { operate: string; operateIds: string[] }) => void
  194. /**
  195. * 表单提交后钩子
  196. * @param object.res 请求完整响应
  197. */
  198. onSubmit?: ({ res }: { res: ApiResponse }) => void
  199. /**
  200. * 表格内事件响应后钩子
  201. * @param object.event 事件名称
  202. * @param object.data 事件携带的数据
  203. */
  204. onTableAction?: ({ event, data }: { event: string; data: anyObj }) => void
  205. /**
  206. * 表格顶部菜单事件响应后钩子
  207. * @param object.event 事件名称
  208. * @param object.data 事件携带的数据
  209. */
  210. onTableHeaderAction?: ({ event, data }: { event: string; data: anyObj }) => void
  211. /** getData 的别名 */
  212. getIndex?: ({ res }: { res: ApiResponse }) => void
  213. /** getEditData 的别名 */
  214. requestEdit?: ({ res }: { res: ApiResponse }) => void
  215. // 可自定义其他钩子
  216. [key: string]: Function | undefined
  217. }
  218. /**
  219. * 表格公共搜索数据
  220. */
  221. interface ComSearch {
  222. /** 表单项数据 */
  223. form: anyObj
  224. /** 字段搜索配置,搜索操作符(operator)、字段渲染方式(render)等 */
  225. fieldData: Map<string, any>
  226. }
  227. /**
  228. * 表格列
  229. */
  230. interface TableColumn extends Partial<TableColumnCtx<TableRow>> {
  231. // 是否于表格显示此列
  232. show?: boolean
  233. // 渲染器组件名,即 \src\components\table\fieldRender\ 中的组件之一,也可以查看 TableRenderer 类型定义
  234. render?: TableRenderer
  235. // 值替换数据(字典数据),同时用于单元格渲染时和作为公共搜索下拉框数据,格式如:{ open: '开', close: '关', disable: '已禁用' }
  236. replaceValue?: Record<string, any>
  237. // render=slot 时,slot 的名称
  238. slotName?: string
  239. // render=customRender 时,要渲染的组件或已注册组件名称的字符串
  240. customRender?: string | Component
  241. // render=customTemplate 时,自定义渲染 html,应谨慎使用:请返回 html 内容,务必确保返回内容是 xss 安全的
  242. customTemplate?: (row: TableRow, field: TableColumn, value: any, column: TableColumnCtx<TableRow>, index: number) => string
  243. // 渲染前对字段值的预处理函数(对 el-table 的 formatter 扩展)
  244. formatter?: (row: TableRow, column: TableColumnCtx<TableRow>, cellValue: any, index: number) => any
  245. /**
  246. * 自定义单元格渲染属性(比如单元格渲染器内部的 tag、button 组件的属性,设计上不仅是组件属性,也可以自定义其他渲染相关属性)
  247. * 直接定义对应组件的属性 object,或使用一个函数返回组件属性 object
  248. */
  249. customRenderAttr?: {
  250. tag?: TableContextDataFun<TagProps>
  251. icon?: TableContextDataFun<InstanceType<typeof Icon>['$props']>
  252. image?: TableContextDataFun<ImageProps>
  253. switch?: TableContextDataFun<SwitchProps>
  254. tooltip?: TableContextDataFun<ElTooltipProps>
  255. [key: string]: any
  256. }
  257. // render=tag 时,el-tag 组件的 effect
  258. effect?: TagProps['effect']
  259. // render=tag 时,el-tag 组件的 size
  260. size?: TagProps['size']
  261. // render=url 时,链接的打开方式
  262. target?: '_blank' | '_self'
  263. // render=datetime 时,时间日期的格式化方式,字母可以自由组合:y=年,m=月,d=日,h=时,M=分,s=秒,默认:yyyy-mm-dd hh:MM:ss
  264. timeFormat?: string
  265. // render=buttons 时,操作按钮数组
  266. buttons?: OptButton[]
  267. /**
  268. * 单元格渲染器需要的其他任意自定义数据
  269. * 1. render=tag 时,可单独指定每个不同的值 tag 的 type 属性 { open: 'success', close: 'info', disable: 'danger' }
  270. */
  271. custom?: any
  272. // 默认值(单元格值为 undefined,null,'' 时取默认值,仅使用了 render 时有效)
  273. default?: any
  274. // 是否允许动态控制字段是否显示,默认为 true
  275. enableColumnDisplayControl?: boolean
  276. // 单元格渲染组件的 key,默认将根据列配置等属性自动生成(此 key 值改变时单元格将自动重新渲染)
  277. getRenderKey?: (row: TableRow, field: TableColumn, column: TableColumnCtx<TableRow>, index: number) => string
  278. // 公共搜索操作符,默认值为 = ,值为 false 禁用此字段公共搜索,支持的操作符见下类型定义
  279. operator?: boolean | OperatorStr
  280. // 公共搜索框的 placeholder
  281. operatorPlaceholder?: string | string[]
  282. // 公共搜索渲染方式,render=tag|switch 时公共搜索也会渲染为下拉,数字会渲染为范围筛选,时间渲染为时间选择器等
  283. comSearchRender?: 'remoteSelect' | 'select' | 'date' | 'customRender' | 'slot'
  284. // 公共搜索自定义组件/函数渲染
  285. comSearchCustomRender?: string | Component
  286. // 公共搜索自定义渲染为 slot 时,slot 的名称
  287. comSearchSlotName?: string
  288. // 公共搜索自定义渲染时,外层 el-col 的属性(仅 customRender、slot 支持)
  289. comSearchColAttr?: Partial<ColProps>
  290. // 公共搜索是否显示字段的 label
  291. comSearchShowLabel?: boolean
  292. // 公共搜索渲染为远程下拉时,远程下拉组件的必要属性
  293. remote?: {
  294. pk?: string
  295. field?: string
  296. params?: anyObj
  297. multiple?: boolean
  298. remoteUrl: string
  299. }
  300. // 使用了 render 属性时,渲染前对字段值的预处理方法(即将废弃,请使用兼容 el-table 的 formatter 函数代替)
  301. renderFormatter?: (row: TableRow, field: TableColumn, value: any, column: TableColumnCtx<TableRow>, index: number) => any
  302. // 渲染为 url 时的点击事件(即将废弃,请使用 el-table 的 @cell-click 或单元格自定义渲染代替)
  303. click?: (row: TableRow, field: TableColumn, value: any, column: TableColumnCtx<TableRow>, index: number) => any
  304. }
  305. /**
  306. * 表格右侧操作按钮
  307. */
  308. interface OptButton {
  309. /**
  310. * 渲染方式:tipButton=带tip的按钮,confirmButton=带确认框的按钮,moveButton=移动按钮,basicButton=普通按钮
  311. */
  312. render: 'tipButton' | 'confirmButton' | 'moveButton' | 'basicButton'
  313. /**
  314. * 按钮名称,将作为触发表格内事件(onTableAction)时的事件名
  315. */
  316. name: string
  317. /**
  318. * 鼠标 hover 时的提示
  319. * 可使用多语言翻译 key,比如 user.group
  320. */
  321. title?: string
  322. /**
  323. * 直接在按钮内显示的文字,title 有值时可为空
  324. * 可使用多语言翻译 key,比如 user.group
  325. */
  326. text?: string
  327. /**
  328. * 自定义按钮的点击事件
  329. * @param row 当前行数据
  330. * @param field 当前列数据
  331. */
  332. click?: (row: TableRow, field: TableColumn) => void
  333. /**
  334. * 按钮是否显示(请返回布尔值,比如:display: auth('add'))
  335. * @param row 当前行数据
  336. * @param field 当前列数据
  337. */
  338. display?: (row: TableRow, field: TableColumn) => boolean
  339. /**
  340. * 按钮是否禁用(请返回布尔值)
  341. * @param row 当前行数据
  342. * @param field 当前列数据
  343. */
  344. disabled?: (row: TableRow, field: TableColumn) => boolean
  345. /**
  346. * 按钮是否正在加载中(请返回布尔值)
  347. * @param row 当前行数据
  348. * @param field 当前列数据
  349. */
  350. loading?: (row: TableRow, field: TableColumn) => boolean
  351. /**
  352. * 自定义 el-button 的其他属性(格式为属性 object 或一个返回属性 object 的函数)
  353. */
  354. attr?: TableContextDataFun<ButtonProps>
  355. // 按钮 class
  356. class?: string
  357. // 按钮 type
  358. type: ButtonType
  359. // 按钮 icon 的名称
  360. icon: string
  361. // 确认按钮的气泡确认框的属性(el-popconfirm 的属性,格式为属性 object 或一个返回属性 object 的函数)
  362. popconfirm?: TableContextDataFun<PopconfirmProps>
  363. // 是否禁用 title 提示,此值通常由系统动态调整以确保提示的显示效果
  364. disabledTip?: boolean
  365. }
  366. /**
  367. * 表格行
  368. */
  369. interface TableRow extends anyObj {
  370. children?: TableRow[]
  371. }
  372. /**
  373. * 表头支持的按钮
  374. */
  375. type HeaderOptButton = 'refresh' | 'add' | 'edit' | 'delete' | 'unfold' | 'comSearch' | 'quickSearch' | 'columnDisplay'
  376. /**
  377. * 公共搜索操作符支持的值
  378. */
  379. type OperatorStr =
  380. | 'eq' // 等于,默认值
  381. | 'ne' // 不等于
  382. | 'gt' // 大于
  383. | 'egt' // 大于等于
  384. | 'lt' // 小于
  385. | 'elt' // 小于等于
  386. | 'LIKE'
  387. | 'NOT LIKE'
  388. | 'IN'
  389. | 'NOT IN'
  390. | 'RANGE' // 范围,将生成两个输入框,可以输入最小值和最大值
  391. | 'NOT RANGE'
  392. | 'NULL' // 是否为NULL,将生成单个复选框
  393. | 'NOT NULL'
  394. | 'FIND_IN_SET'
  395. // 不推荐使用的,因为部分符号不利于网络传输
  396. | '='
  397. | '<>'
  398. | '>'
  399. | '>='
  400. | '<'
  401. | '<='
  402. /**
  403. * 公共搜索事件返回的 Data
  404. */
  405. interface comSearchData {
  406. field: string
  407. val: string | string[] | number | number[]
  408. operator: string
  409. render?: string
  410. }
  411. interface ElTreeData {
  412. label: string
  413. children?: ElTreeData[]
  414. }
  415. /**
  416. * 表格上下文数据
  417. */
  418. interface TableContextData {
  419. row?: TableRow
  420. field?: TableColumn
  421. cellValue?: any
  422. column?: TableColumnCtx<TableRow>
  423. index?: number
  424. }
  425. /**
  426. * 接受表格上下文数据的任意属性计算函数
  427. */
  428. type TableContextDataFun<T> = Partial<T> | ((context: TableContextData) => Partial<T>)
  429. interface TableRenderPublicInstance extends ComponentPublicInstance {
  430. $attrs: {
  431. renderValue: any
  432. renderRow: TableRow
  433. renderField: TableColumn
  434. renderColumn: TableColumnCtx<TableRow>
  435. renderIndex: number
  436. }
  437. }
  438. }