vxe-table 3.12.10-beta.8 → 3.12.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/es/index.css +1 -1
  2. package/es/index.min.css +1 -1
  3. package/es/locale/lang/ar-EG.js +2 -1
  4. package/es/locale/lang/de-DE.js +2 -1
  5. package/es/locale/lang/en-US.js +4 -3
  6. package/es/locale/lang/es-ES.js +2 -1
  7. package/es/locale/lang/fr-FR.js +2 -1
  8. package/es/locale/lang/hu-HU.js +2 -1
  9. package/es/locale/lang/hy-AM.js +2 -1
  10. package/es/locale/lang/it-IT.js +2 -1
  11. package/es/locale/lang/ja-JP.js +2 -1
  12. package/es/locale/lang/ko-KR.js +2 -1
  13. package/es/locale/lang/nb-NO.js +2 -1
  14. package/es/locale/lang/pt-BR.js +2 -1
  15. package/es/locale/lang/ru-RU.js +4 -3
  16. package/es/locale/lang/th-TH.js +2 -1
  17. package/es/locale/lang/ug-CN.js +2 -1
  18. package/es/locale/lang/uk-UA.js +518 -517
  19. package/es/locale/lang/vi-VN.js +2 -1
  20. package/es/locale/lang/zh-CHT.js +2 -1
  21. package/es/locale/lang/zh-CN.js +2 -1
  22. package/es/style.css +1 -1
  23. package/es/style.min.css +1 -1
  24. package/es/table/module/edit/mixin.js +7 -7
  25. package/es/table/module/export/mixin.js +105 -69
  26. package/es/table/module/keyboard/mixin.js +68 -25
  27. package/es/table/module/menu/mixin.js +3 -1
  28. package/es/table/src/body.js +135 -83
  29. package/es/table/src/cell.js +43 -57
  30. package/es/table/src/column.js +43 -8
  31. package/es/table/src/columnInfo.js +3 -0
  32. package/es/table/src/footer.js +50 -9
  33. package/es/table/src/header.js +70 -168
  34. package/es/table/src/methods.js +985 -502
  35. package/es/table/src/props.js +14 -4
  36. package/es/table/src/table.js +114 -33
  37. package/es/table/src/util.js +73 -57
  38. package/es/table/style.css +253 -189
  39. package/es/table/style.min.css +1 -1
  40. package/es/ui/index.js +26 -10
  41. package/es/ui/src/log.js +1 -1
  42. package/es/vxe-table/style.css +253 -189
  43. package/es/vxe-table/style.min.css +1 -1
  44. package/lib/index.css +1 -1
  45. package/lib/index.min.css +1 -1
  46. package/lib/index.umd.js +1782 -1056
  47. package/lib/index.umd.min.js +1 -1
  48. package/lib/locale/lang/ar-EG.js +2 -1
  49. package/lib/locale/lang/ar-EG.min.js +1 -1
  50. package/lib/locale/lang/de-DE.js +2 -1
  51. package/lib/locale/lang/de-DE.min.js +1 -1
  52. package/lib/locale/lang/en-US.js +4 -3
  53. package/lib/locale/lang/en-US.min.js +1 -1
  54. package/lib/locale/lang/en-US.umd.js +4 -3
  55. package/lib/locale/lang/es-ES.js +2 -1
  56. package/lib/locale/lang/es-ES.min.js +1 -1
  57. package/lib/locale/lang/es-ES.umd.js +2 -1
  58. package/lib/locale/lang/fr-FR.js +2 -1
  59. package/lib/locale/lang/fr-FR.min.js +1 -1
  60. package/lib/locale/lang/hu-HU.js +2 -1
  61. package/lib/locale/lang/hu-HU.min.js +1 -1
  62. package/lib/locale/lang/hu-HU.umd.js +2 -1
  63. package/lib/locale/lang/hy-AM.js +2 -1
  64. package/lib/locale/lang/hy-AM.min.js +1 -1
  65. package/lib/locale/lang/it-IT.js +2 -1
  66. package/lib/locale/lang/it-IT.min.js +1 -1
  67. package/lib/locale/lang/ja-JP.js +2 -1
  68. package/lib/locale/lang/ja-JP.min.js +1 -1
  69. package/lib/locale/lang/ja-JP.umd.js +2 -1
  70. package/lib/locale/lang/ko-KR.js +2 -1
  71. package/lib/locale/lang/ko-KR.min.js +1 -1
  72. package/lib/locale/lang/ko-KR.umd.js +2 -1
  73. package/lib/locale/lang/nb-NO.js +2 -1
  74. package/lib/locale/lang/nb-NO.min.js +1 -1
  75. package/lib/locale/lang/pt-BR.js +2 -1
  76. package/lib/locale/lang/pt-BR.min.js +1 -1
  77. package/lib/locale/lang/pt-BR.umd.js +2 -1
  78. package/lib/locale/lang/ru-RU.js +4 -3
  79. package/lib/locale/lang/ru-RU.min.js +1 -1
  80. package/lib/locale/lang/ru-RU.umd.js +4 -3
  81. package/lib/locale/lang/th-TH.js +2 -1
  82. package/lib/locale/lang/th-TH.min.js +1 -1
  83. package/lib/locale/lang/ug-CN.js +2 -1
  84. package/lib/locale/lang/ug-CN.min.js +1 -1
  85. package/lib/locale/lang/uk-UA.js +518 -517
  86. package/lib/locale/lang/uk-UA.min.js +1 -1
  87. package/lib/locale/lang/uk-UA.umd.js +518 -517
  88. package/lib/locale/lang/vi-VN.js +2 -1
  89. package/lib/locale/lang/vi-VN.min.js +1 -1
  90. package/lib/locale/lang/zh-CHT.js +2 -1
  91. package/lib/locale/lang/zh-CHT.min.js +1 -1
  92. package/lib/locale/lang/zh-CHT.umd.js +2 -1
  93. package/lib/locale/lang/zh-CN.js +2 -1
  94. package/lib/locale/lang/zh-CN.min.js +1 -1
  95. package/lib/locale/lang/zh-CN.umd.js +2 -1
  96. package/lib/style.css +1 -1
  97. package/lib/style.min.css +1 -1
  98. package/lib/table/module/edit/mixin.js +7 -2
  99. package/lib/table/module/edit/mixin.min.js +1 -1
  100. package/lib/table/module/export/mixin.js +105 -64
  101. package/lib/table/module/export/mixin.min.js +1 -1
  102. package/lib/table/module/keyboard/mixin.js +73 -27
  103. package/lib/table/module/keyboard/mixin.min.js +1 -1
  104. package/lib/table/module/menu/mixin.js +3 -1
  105. package/lib/table/src/body.js +132 -79
  106. package/lib/table/src/body.min.js +1 -1
  107. package/lib/table/src/cell.js +32 -42
  108. package/lib/table/src/cell.min.js +1 -1
  109. package/lib/table/src/column.js +12 -0
  110. package/lib/table/src/column.min.js +1 -1
  111. package/lib/table/src/columnInfo.js +3 -0
  112. package/lib/table/src/columnInfo.min.js +1 -1
  113. package/lib/table/src/footer.js +46 -7
  114. package/lib/table/src/footer.min.js +1 -1
  115. package/lib/table/src/header.js +52 -175
  116. package/lib/table/src/header.min.js +1 -1
  117. package/lib/table/src/methods.js +1096 -560
  118. package/lib/table/src/methods.min.js +1 -1
  119. package/lib/table/src/props.js +14 -4
  120. package/lib/table/src/props.min.js +1 -1
  121. package/lib/table/src/table.js +113 -36
  122. package/lib/table/src/table.min.js +1 -1
  123. package/lib/table/src/util.js +87 -70
  124. package/lib/table/src/util.min.js +1 -1
  125. package/lib/table/style/style.css +253 -189
  126. package/lib/table/style/style.min.css +1 -1
  127. package/lib/ui/index.js +26 -10
  128. package/lib/ui/index.min.js +1 -1
  129. package/lib/ui/src/log.js +1 -1
  130. package/lib/ui/src/log.min.js +1 -1
  131. package/lib/vxe-table/style/style.css +253 -189
  132. package/lib/vxe-table/style/style.min.css +1 -1
  133. package/package.json +2 -2
  134. package/packages/locale/lang/ar-EG.ts +2 -1
  135. package/packages/locale/lang/de-DE.ts +2 -1
  136. package/packages/locale/lang/en-US.ts +4 -3
  137. package/packages/locale/lang/es-ES.ts +2 -1
  138. package/packages/locale/lang/fr-FR.ts +2 -1
  139. package/packages/locale/lang/hu-HU.ts +2 -1
  140. package/packages/locale/lang/hy-AM.ts +2 -1
  141. package/packages/locale/lang/it-IT.ts +2 -1
  142. package/packages/locale/lang/ja-JP.ts +2 -1
  143. package/packages/locale/lang/ko-KR.ts +2 -1
  144. package/packages/locale/lang/nb-NO.ts +2 -1
  145. package/packages/locale/lang/pt-BR.ts +2 -1
  146. package/packages/locale/lang/ru-RU.ts +4 -3
  147. package/packages/locale/lang/th-TH.ts +2 -1
  148. package/packages/locale/lang/ug-CN.ts +2 -1
  149. package/packages/locale/lang/uk-UA.ts +518 -517
  150. package/packages/locale/lang/vi-VN.ts +2 -1
  151. package/packages/locale/lang/zh-CHT.ts +2 -1
  152. package/packages/locale/lang/zh-CN.ts +2 -1
  153. package/packages/table/module/edit/mixin.ts +7 -7
  154. package/packages/table/module/export/mixin.ts +138 -80
  155. package/packages/table/module/keyboard/mixin.ts +65 -24
  156. package/packages/table/module/menu/mixin.ts +4 -1
  157. package/packages/table/src/body.ts +148 -86
  158. package/packages/table/src/cell.ts +45 -67
  159. package/packages/table/src/column.ts +48 -10
  160. package/packages/table/src/columnInfo.ts +3 -0
  161. package/packages/table/src/footer.ts +53 -10
  162. package/packages/table/src/header.ts +70 -169
  163. package/packages/table/src/methods.ts +1031 -515
  164. package/packages/table/src/props.ts +16 -6
  165. package/packages/table/src/table.ts +124 -33
  166. package/packages/table/src/util.ts +82 -62
  167. package/packages/ui/index.ts +25 -9
  168. package/styles/components/table.scss +319 -271
  169. package/styles/theme/base.scss +4 -6
  170. package/styles/theme/dark.scss +1 -0
  171. package/styles/theme/light.scss +1 -0
  172. package/styles/variable.scss +1 -0
  173. /package/es/{iconfont.1736840896964.ttf → iconfont.1738985837413.ttf} +0 -0
  174. /package/es/{iconfont.1736840896964.woff → iconfont.1738985837413.woff} +0 -0
  175. /package/es/{iconfont.1736840896964.woff2 → iconfont.1738985837413.woff2} +0 -0
  176. /package/lib/{iconfont.1736840896964.ttf → iconfont.1738985837413.ttf} +0 -0
  177. /package/lib/{iconfont.1736840896964.woff → iconfont.1738985837413.woff} +0 -0
  178. /package/lib/{iconfont.1736840896964.woff2 → iconfont.1738985837413.woff2} +0 -0
@@ -1,7 +1,10 @@
1
+ import { PropType } from 'vue'
1
2
  import Cell from './cell'
2
3
  import { defineVxeComponent } from '../../ui/src/comp'
3
4
  import { assembleColumn, destroyColumn } from './util'
4
5
 
6
+ import type { VxeColumnPropTypes } from '../../../types'
7
+
5
8
  export const columnProps = {
6
9
  // 列唯一主键
7
10
  colId: [String, Number],
@@ -18,7 +21,10 @@ export const columnProps = {
18
21
  // 列最大宽度
19
22
  maxWidth: [Number, String],
20
23
  // 是否允许拖动列宽调整大小
21
- resizable: { type: Boolean, default: null },
24
+ resizable: {
25
+ type: Boolean,
26
+ default: null
27
+ },
22
28
  // 将列固定在左侧或者右侧
23
29
  fixed: String,
24
30
  // 列对其方式
@@ -28,11 +34,20 @@ export const columnProps = {
28
34
  // 表尾列的对齐方式
29
35
  footerAlign: String,
30
36
  // 当内容过长时显示为省略号
31
- showOverflow: { type: [Boolean, String], default: null },
37
+ showOverflow: {
38
+ type: [Boolean, String],
39
+ default: null
40
+ },
32
41
  // 当表头内容过长时显示为省略号
33
- showHeaderOverflow: { type: [Boolean, String], default: null },
42
+ showHeaderOverflow: {
43
+ type: [Boolean, String],
44
+ default: null
45
+ },
34
46
  // 当表尾内容过长时显示为省略号
35
- showFooterOverflow: { type: [Boolean, String], default: null },
47
+ showFooterOverflow: {
48
+ type: [Boolean, String],
49
+ default: null
50
+ },
36
51
  // 给单元格附加 className
37
52
  className: [String, Function],
38
53
  // 给表头单元格附加 className
@@ -43,10 +58,23 @@ export const columnProps = {
43
58
  formatter: [Function, Array, String],
44
59
  // 格式化表尾显示内容
45
60
  footerFormatter: [Function, Array, String],
61
+ // 是否显示间距
62
+ padding: {
63
+ type: Boolean as PropType<VxeColumnPropTypes.Padding>,
64
+ default: null
65
+ },
66
+ // 垂直对齐方式
67
+ verticalAlign: {
68
+ type: String as PropType<VxeColumnPropTypes.VerticalAlign>,
69
+ default: null
70
+ },
46
71
  // 是否允许排序
47
72
  sortable: Boolean,
48
73
  // 在 v3 中废弃
49
- remoteSort: { type: Boolean, default: null },
74
+ remoteSort: {
75
+ type: Boolean,
76
+ default: null
77
+ },
50
78
  // 在 v3 中只支持字符串类型
51
79
  sortBy: [String, Function],
52
80
  // 排序的字段类型,比如字符串转数值等
@@ -54,9 +82,15 @@ export const columnProps = {
54
82
  // 在 v3 中废弃
55
83
  sortMethod: Function,
56
84
  // 配置筛选条件数组
57
- filters: { type: Array, default: null },
85
+ filters: {
86
+ type: Array,
87
+ default: null
88
+ },
58
89
  // 筛选是否允许多选
59
- filterMultiple: { type: Boolean, default: true },
90
+ filterMultiple: {
91
+ type: Boolean,
92
+ default: true
93
+ },
60
94
  // 自定义筛选方法
61
95
  filterMethod: Function,
62
96
  // 筛选重置方法
@@ -66,11 +100,15 @@ export const columnProps = {
66
100
  // 筛选模板配置项
67
101
  filterRender: Object,
68
102
  // 设置为树节点
69
- treeNode: Boolean,
103
+ treeNode: Boolean as PropType<VxeColumnPropTypes.TreeNode>,
70
104
  // 设置为拖拽排序
71
- dragSort: Boolean,
105
+ dragSort: Boolean as PropType<VxeColumnPropTypes.DragSort>,
106
+ // 设置为行高拖拽
107
+ rowResize: Boolean as PropType<VxeColumnPropTypes.RowResize>,
72
108
  // 是否可视
73
- visible: { type: Boolean, default: null },
109
+ visible: {
110
+ type: Boolean, default: null
111
+ },
74
112
  // 表头单元格数据导出方法
75
113
  headerExportMethod: Function,
76
114
  // 单元格数据导出方法
@@ -78,6 +78,8 @@ export class ColumnInfo {
78
78
  footerClassName: _vm.footerClassName,
79
79
  formatter,
80
80
  footerFormatter: _vm.footerFormatter,
81
+ padding: _vm.padding,
82
+ verticalAlign: _vm.verticalAlign,
81
83
  sortable: _vm.sortable,
82
84
  sortBy: _vm.sortBy,
83
85
  sortType: _vm.sortType,
@@ -91,6 +93,7 @@ export class ColumnInfo {
91
93
  filterRender: _vm.filterRender,
92
94
  treeNode: _vm.treeNode,
93
95
  dragSort: _vm.dragSort,
96
+ rowResize: _vm.rowResize,
94
97
  cellType: _vm.cellType,
95
98
  cellRender: _vm.cellRender,
96
99
  editRender: _vm.editRender,
@@ -3,6 +3,7 @@ import XEUtils from 'xe-utils'
3
3
  import { VxeUI } from '../../ui'
4
4
  import { getClass } from '../../ui/src/utils'
5
5
  import { updateCellTitle } from '../../ui/src/dom'
6
+ import { getCellHeight } from './util'
6
7
 
7
8
  import type { VxeTableDefines, VxeTableConstructor, VxeTablePrivateMethods, TableReactData, TableInternalData, VxeComponentStyleType } from '../../../types'
8
9
 
@@ -32,31 +33,41 @@ function renderRows (h: CreateElement, _vm: any, tableColumn: VxeTableDefines.Co
32
33
  const tableInternalData = $xeTable as unknown as TableInternalData
33
34
 
34
35
  const { fixedType } = props
35
- const { footerCellClassName, footerCellStyle, footerAlign: allFooterAlign, footerSpanMethod, align: allAlign, columnKey, showFooterOverflow: allColumnFooterOverflow } = tableProps
36
+ const { resizable: allResizable, border, footerCellClassName, footerCellStyle, footerAlign: allFooterAlign, footerSpanMethod, align: allAlign, columnKey, showFooterOverflow: allColumnFooterOverflow } = tableProps
36
37
  const { scrollXLoad, scrollYLoad, overflowX, currentColumn, mergeFooterList } = tableReactData
37
38
  const { scrollXStore } = tableInternalData
38
39
  const tooltipOpts = $xeTable.computeTooltipOpts
40
+ const { isAllColumnDrag } = $xeTable.resizableOpts
39
41
  const columnOpts = $xeTable.computeColumnOpts
42
+ const defaultRowHeight = $xeTable.computeDefaultRowHeight
43
+ const cellOpts = $xeTable.computeCellOpts
44
+ const footerCellOpts = $xeTable.computeFooterCellOpts
45
+ const currCellHeight = getCellHeight(footerCellOpts.height || cellOpts.height) || defaultRowHeight
40
46
 
41
47
  return tableColumn.map((column: any, $columnIndex: any) => {
42
48
  const { type, showFooterOverflow, footerAlign, align, footerClassName, editRender, cellRender } = column
49
+ const colid = column.id
43
50
  const renderOpts = editRender || cellRender
44
51
  const compConf = renderOpts ? renderer.get(renderOpts.name) : null
45
52
  const showAllTip = tooltipOpts.showAll
46
53
  const isColGroup = column.children && column.children.length
47
54
  const fixedHiddenColumn = fixedType ? column.fixed !== fixedType && !isColGroup : column.fixed && overflowX
55
+ const isPadding = XEUtils.isBoolean(footerCellOpts.padding) ? footerCellOpts.padding : cellOpts.padding
48
56
  const footOverflow = XEUtils.eqNull(showFooterOverflow) ? allColumnFooterOverflow : showFooterOverflow
49
57
  const footAlign = footerAlign || (compConf ? compConf.tableFooterCellAlign : '') || allFooterAlign || align || (compConf ? compConf.tableCellAlign : '') || allAlign
50
58
  let showEllipsis = footOverflow === 'ellipsis'
51
59
  const showTitle = footOverflow === 'title'
52
60
  const showTooltip = footOverflow === true || footOverflow === 'tooltip'
53
61
  let hasEllipsis = showTitle || showTooltip || showEllipsis
54
- const attrs: any = { colid: column.id }
62
+ const showResizable = (XEUtils.isBoolean(column.resizable) ? column.resizable : (columnOpts.resizable || allResizable))
63
+ const attrs: any = { colid }
55
64
  const tfOns: any = {}
56
65
  const columnIndex = $xeTable.getColumnIndex(column)
57
66
  const _columnIndex = $xeTable.getVTColumnIndex(column)
58
67
  const itemIndex = _columnIndex
59
- const cellParams: VxeTableDefines.CellRenderFooterParams = {
68
+ const cellParams: VxeTableDefines.CellRenderFooterParams & {
69
+ $table: VxeTableConstructor<any> & VxeTablePrivateMethods
70
+ } = {
60
71
  $table: $xeTable,
61
72
  $grid: $xeTable.xegrid,
62
73
  row,
@@ -130,9 +141,16 @@ function renderRows (h: CreateElement, _vm: any, tableColumn: VxeTableDefines.Co
130
141
  const isLastColumn = $columnIndex === tableColumn.length - 1
131
142
  const isAutoCellWidth = !column.resizeWidth && (column.minWidth === 'auto' || column.width === 'auto')
132
143
 
133
- let isPreLoadStatus = false
134
- if (scrollXLoad && !column.fixed && (_columnIndex < scrollXStore.visibleStartIndex || _columnIndex > scrollXStore.visibleEndIndex)) {
135
- isPreLoadStatus = true
144
+ let isVNPreEmptyStatus = false
145
+ if (scrollXLoad && !column.fixed && (_columnIndex < scrollXStore.visibleStartIndex - scrollXStore.preloadSize || _columnIndex > scrollXStore.visibleEndIndex + scrollXStore.preloadSize)) {
146
+ isVNPreEmptyStatus = true
147
+ }
148
+
149
+ const tcStyle: Record<string, string> = {}
150
+ if (hasEllipsis) {
151
+ tcStyle.height = `${currCellHeight}px`
152
+ } else {
153
+ tcStyle.minHeight = `${currCellHeight}px`
136
154
  }
137
155
 
138
156
  return h('td', {
@@ -142,6 +160,7 @@ function renderRows (h: CreateElement, _vm: any, tableColumn: VxeTableDefines.Co
142
160
  'col--last': isLastColumn,
143
161
  'fixed--width': !isAutoCellWidth,
144
162
  'fixed--hidden': fixedHiddenColumn,
163
+ 'is--padding': isPadding,
145
164
  'col--ellipsis': hasEllipsis,
146
165
  'col--current': currentColumn === column
147
166
  }, getClass(footerClassName, cellParams), getClass(footerCellClassName, cellParams)],
@@ -155,8 +174,32 @@ function renderRows (h: CreateElement, _vm: any, tableColumn: VxeTableDefines.Co
155
174
  'c--title': showTitle,
156
175
  'c--tooltip': showTooltip,
157
176
  'c--ellipsis': showEllipsis
158
- }]
159
- }, isPreLoadStatus ? [] : column.renderFooter(h, cellParams))
177
+ }],
178
+ style: tcStyle
179
+ }, isVNPreEmptyStatus
180
+ ? []
181
+ : [
182
+ h('div', {
183
+ attrs: {
184
+ colid
185
+ },
186
+ class: 'vxe-cell--wrapper'
187
+ }, column.renderFooter(h, cellParams))
188
+ ]),
189
+ /**
190
+ * 列宽拖动
191
+ */
192
+ !fixedHiddenColumn && showResizable && isAllColumnDrag
193
+ ? h('div', {
194
+ class: ['vxe-cell--col-resizable', {
195
+ 'is--line': !border || border === 'none'
196
+ }],
197
+ on: {
198
+ mousedown: (evnt: MouseEvent) => $xeTable.handleColResizeMousedownEvent(evnt, fixedType, cellParams),
199
+ dblclick: (evnt: MouseEvent) => $xeTable.handleColResizeDblclickEvent(evnt, cellParams)
200
+ }
201
+ })
202
+ : renderEmptyElement($xeTable)
160
203
  ])
161
204
  })
162
205
  }
@@ -170,7 +213,7 @@ function renderHeads (h: CreateElement, _vm: any, renderColumnList: VxeTableDefi
170
213
  const { fixedType, footerTableData } = props
171
214
 
172
215
  const { footerRowClassName, footerRowStyle } = tableProps
173
- const { isDragColMove } = tableReactData
216
+ const { isColLoading, isDragColMove } = tableReactData
174
217
  const columnOpts = $xeTable.computeColumnOpts
175
218
  const columnDragOpts = $xeTable.computeColumnDragOpts
176
219
 
@@ -178,7 +221,7 @@ function renderHeads (h: CreateElement, _vm: any, renderColumnList: VxeTableDefi
178
221
  const _rowIndex = $rowIndex
179
222
  const rowParams = { $table: $xeTable, row, _rowIndex, $rowIndex, fixed: fixedType, type: renderType }
180
223
 
181
- if (columnOpts.drag && columnDragOpts.animation) {
224
+ if (!isColLoading && columnOpts.drag && columnDragOpts.animation) {
182
225
  return h('transition-group', {
183
226
  key: $rowIndex,
184
227
  props: {
@@ -2,12 +2,11 @@ import { PropType, CreateElement } from 'vue'
2
2
  import XEUtils from 'xe-utils'
3
3
  import { VxeUI } from '../../ui'
4
4
  import { getClass } from '../../ui/src/utils'
5
- import { getOffsetPos, hasClass, addClass, removeClass } from '../../ui/src/dom'
6
- import { convertHeaderColumnToRows, getColReMinWidth, getRefElem } from './util'
5
+ import { getCellHeight, convertHeaderColumnToRows } from './util'
7
6
 
8
7
  import type { VxeTableDefines, VxeTableConstructor, VxeTablePrivateMethods, VxeColumnPropTypes, TableReactData, TableInternalData, VxeComponentStyleType } from '../../../types'
9
8
 
10
- const { getI18n, renderer, renderEmptyElement } = VxeUI
9
+ const { renderer, renderEmptyElement } = VxeUI
11
10
 
12
11
  const cellType = 'header'
13
12
 
@@ -25,6 +24,10 @@ const renderRows = (h: CreateElement, _vm: any, isGroup: boolean, isOptimizeMode
25
24
  const { scrollXStore } = tableInternalData
26
25
  const columnOpts = $xeTable.computeColumnOpts
27
26
  const columnDragOpts = $xeTable.computeColumnDragOpts
27
+ const cellOpts = $xeTable.computeCellOpts
28
+ const defaultRowHeight = $xeTable.computeDefaultRowHeight
29
+ const headerCellOpts = $xeTable.computeHeaderCellOpts
30
+ const currCellHeight = getCellHeight(headerCellOpts.height || cellOpts.height) || defaultRowHeight
28
31
  const { disabledMethod: dragDisabledMethod, isCrossDrag, isPeerDrag } = columnDragOpts
29
32
  return cols.map((column: any, $columnIndex: any) => {
30
33
  const { type, showHeaderOverflow, headerAlign, align, filters, headerClassName, editRender, cellRender } = column
@@ -34,6 +37,7 @@ const renderRows = (h: CreateElement, _vm: any, isGroup: boolean, isOptimizeMode
34
37
  const compConf = renderOpts ? renderer.get(renderOpts.name) : null
35
38
  const isColGroup = column.children && column.children.length
36
39
  const fixedHiddenColumn = fixedType ? column.fixed !== fixedType && !isColGroup : column.fixed && overflowX
40
+ const isPadding = XEUtils.isBoolean(headerCellOpts.padding) ? headerCellOpts.padding : cellOpts.padding
37
41
  const headOverflow = XEUtils.isUndefined(showHeaderOverflow) || XEUtils.isNull(showHeaderOverflow) ? allColumnHeaderOverflow : showHeaderOverflow
38
42
  const headAlign = headerAlign || (compConf ? compConf.tableHeaderCellAlign : '') || allHeaderAlign || align || (compConf ? compConf.tableCellAlign : '') || allAlign
39
43
  let showEllipsis = headOverflow === 'ellipsis'
@@ -48,15 +52,15 @@ const renderRows = (h: CreateElement, _vm: any, isGroup: boolean, isOptimizeMode
48
52
  }
49
53
  const columnIndex = $xeTable.getColumnIndex(column)
50
54
  const _columnIndex = $xeTable.getVTColumnIndex(column)
51
- const params = { $table: $xeTable, $grid: $xeGrid, $rowIndex, column, columnIndex, $columnIndex, _columnIndex, firstFilterOption, fixed: fixedType, type: cellType, isHidden: fixedHiddenColumn, hasFilter }
55
+ const cellParams = { $table: $xeTable, $grid: $xeGrid, $rowIndex, column, columnIndex, $columnIndex, _columnIndex, firstFilterOption, fixed: fixedType, type: cellType, isHidden: fixedHiddenColumn, hasFilter }
52
56
  const thAttrs: Record<string, string | number | null> = {
53
57
  colid,
54
58
  colspan: column.colSpan > 1 ? column.colSpan : null,
55
59
  rowspan: column.rowSpan > 1 ? column.rowSpan : null
56
60
  }
57
61
  const thOns: any = {
58
- click: (evnt: MouseEvent) => $xeTable.triggerHeaderCellClickEvent(evnt, params),
59
- dblclick: (evnt: MouseEvent) => $xeTable.triggerHeaderCellDblclickEvent(evnt, params)
62
+ click: (evnt: MouseEvent) => $xeTable.triggerHeaderCellClickEvent(evnt, cellParams),
63
+ dblclick: (evnt: MouseEvent) => $xeTable.triggerHeaderCellDblclickEvent(evnt, cellParams)
60
64
  }
61
65
  // 虚拟滚动不支持动态高度
62
66
  if (scrollXLoad && !hasEllipsis) {
@@ -65,11 +69,11 @@ const renderRows = (h: CreateElement, _vm: any, isGroup: boolean, isOptimizeMode
65
69
  const isColDragCell = columnOpts.drag && columnDragOpts.trigger === 'cell'
66
70
  let isDisabledDrag = false
67
71
  if (isColDragCell) {
68
- isDisabledDrag = !!(dragDisabledMethod && dragDisabledMethod(params))
72
+ isDisabledDrag = !!(dragDisabledMethod && dragDisabledMethod(cellParams))
69
73
  }
70
74
  // 按下事件处理
71
75
  if (mouseConfig || isColDragCell) {
72
- thOns.mousedown = (evnt: any) => $xeTable.triggerHeaderCellMousedownEvent(evnt, params)
76
+ thOns.mousedown = (evnt: any) => $xeTable.triggerHeaderCellMousedownEvent(evnt, cellParams)
73
77
  }
74
78
  // 拖拽列事件
75
79
  if (columnOpts.drag) {
@@ -84,9 +88,16 @@ const renderRows = (h: CreateElement, _vm: any, isGroup: boolean, isOptimizeMode
84
88
  const showResizable = (XEUtils.isBoolean(column.resizable) ? column.resizable : (columnOpts.resizable || allResizable))
85
89
  const isAutoCellWidth = !column.resizeWidth && (column.minWidth === 'auto' || column.width === 'auto')
86
90
 
87
- let isPreLoadStatus = false
88
- if (scrollXLoad && !isGroup && !column.fixed && (_columnIndex < scrollXStore.visibleStartIndex || _columnIndex > scrollXStore.visibleEndIndex)) {
89
- isPreLoadStatus = true
91
+ let isVNPreEmptyStatus = false
92
+ if (scrollXLoad && !column.fixed && (_columnIndex < scrollXStore.visibleStartIndex - scrollXStore.preloadSize || _columnIndex > scrollXStore.visibleEndIndex + scrollXStore.preloadSize)) {
93
+ isVNPreEmptyStatus = true
94
+ }
95
+
96
+ const tcStyle: Record<string, string> = {}
97
+ if (hasEllipsis) {
98
+ tcStyle.height = `${currCellHeight}px`
99
+ } else {
100
+ tcStyle.minHeight = `${currCellHeight}px`
90
101
  }
91
102
 
92
103
  return h('th', {
@@ -99,15 +110,16 @@ const renderRows = (h: CreateElement, _vm: any, isGroup: boolean, isOptimizeMode
99
110
  'col--ellipsis': hasEllipsis,
100
111
  'fixed--width': !isAutoCellWidth,
101
112
  'fixed--hidden': fixedHiddenColumn,
113
+ 'is--padding': isPadding,
102
114
  'is--sortable': column.sortable,
103
115
  'col--filter': !!filters,
104
116
  'is--filter-active': hasFilter,
105
117
  'is--drag-active': !column.fixed && !isDisabledDrag && (isCrossDrag || isPeerDrag || !column.parentId),
106
118
  'is--drag-disabled': isDisabledDrag,
107
119
  'col--current': currentColumn === column
108
- }, getClass(headerClassName, params), getClass(headerCellClassName, params)],
120
+ }, getClass(headerClassName, cellParams), getClass(headerCellClassName, cellParams)],
109
121
  attrs: thAttrs,
110
- style: headerCellStyle ? (XEUtils.isFunction(headerCellStyle) ? headerCellStyle(params) : headerCellStyle) as VxeComponentStyleType : undefined,
122
+ style: headerCellStyle ? (XEUtils.isFunction(headerCellStyle) ? headerCellStyle(cellParams) : headerCellStyle) as VxeComponentStyleType : undefined,
111
123
  on: thOns,
112
124
  key: columnKey || scrollXLoad || scrollYLoad || columnOpts.useKey || columnOpts.drag || isColGroup ? colid : $columnIndex
113
125
  }, [
@@ -116,19 +128,29 @@ const renderRows = (h: CreateElement, _vm: any, isGroup: boolean, isOptimizeMode
116
128
  'c--title': showTitle,
117
129
  'c--tooltip': showTooltip,
118
130
  'c--ellipsis': showEllipsis
119
- }]
120
- }, isPreLoadStatus || (isOptimizeMode && fixedHiddenColumn) ? [] : column.renderHeader(h, params)),
131
+ }],
132
+ style: tcStyle
133
+ }, isVNPreEmptyStatus || (isOptimizeMode && fixedHiddenColumn)
134
+ ? []
135
+ : [
136
+ h('div', {
137
+ attrs: {
138
+ colid
139
+ },
140
+ class: 'vxe-cell--wrapper'
141
+ }, column.renderHeader(h, cellParams))
142
+ ]),
121
143
  /**
122
144
  * 列宽拖动
123
145
  */
124
146
  !fixedHiddenColumn && showResizable
125
147
  ? h('div', {
126
- class: ['vxe-resizable', {
148
+ class: ['vxe-cell--col-resizable', {
127
149
  'is--line': !border || border === 'none'
128
150
  }],
129
151
  on: {
130
- mousedown: (evnt: MouseEvent) => _vm.resizeMousedownEvent(evnt, params),
131
- dblclick: (evnt: MouseEvent) => $xeTable.handleResizeDblclickEvent(evnt, params)
152
+ mousedown: (evnt: MouseEvent) => $xeTable.handleColResizeMousedownEvent(evnt, fixedType, cellParams),
153
+ dblclick: (evnt: MouseEvent) => $xeTable.handleColResizeDblclickEvent(evnt, cellParams)
132
154
  }
133
155
  })
134
156
  : renderEmptyElement($xeTable)
@@ -148,12 +170,12 @@ function renderHeads (h: CreateElement, _vm: any, isGroup: boolean, isOptimizeMo
148
170
  const columnDragOpts = $xeTable.computeColumnDragOpts
149
171
 
150
172
  const { headerRowClassName, headerRowStyle } = tableProps
151
- const { isDragColMove } = tableReactData
173
+ const { isColLoading, isDragColMove } = tableReactData
152
174
 
153
175
  return headerGroups.map((cols: any, $rowIndex: any) => {
154
176
  const params = { $table: $xeTable, $rowIndex, fixed: fixedType, type: cellType }
155
177
 
156
- if (columnOpts.drag && columnDragOpts.animation) {
178
+ if (!isColLoading && columnOpts.drag && columnDragOpts.animation) {
157
179
  return h('transition-group', {
158
180
  key: $rowIndex,
159
181
  props: {
@@ -247,10 +269,11 @@ export default {
247
269
  const { fixedType, fixedColumn, tableColumn } = props
248
270
  const { headerColumn } = this
249
271
 
250
- const { showHeaderOverflow: allColumnHeaderOverflow, spanMethod, footerSpanMethod } = tableProps
272
+ const { mouseConfig, showHeaderOverflow: allColumnHeaderOverflow, spanMethod, footerSpanMethod } = tableProps
251
273
  const { isGroup, scrollXLoad, scrollYLoad, dragCol } = tableReactData
252
274
  const { visibleColumn, fullColumnIdData } = tableInternalData
253
275
 
276
+ const mouseOpts = $xeTable.computeMouseOpts
254
277
  let renderHeaderList = headerColumn as VxeTableDefines.ColumnInfo[][]
255
278
  let renderColumnList = tableColumn as VxeTableDefines.ColumnInfo[]
256
279
  let isOptimizeMode = false
@@ -354,15 +377,32 @@ export default {
354
377
  */
355
378
  h('thead', {
356
379
  ref: 'refHeaderTHead'
357
- }, renderHeads(h, this, isGroup, isOptimizeMode, renderHeaderList))
358
- ]),
359
- /**
360
- * 其他
361
- */
362
- h('div', {
363
- ref: 'refHeaderBorderRepair',
364
- class: 'vxe-table--header-border-line'
365
- })
380
+ }, renderHeads(h, this, isGroup, isOptimizeMode, renderHeaderList)),
381
+ mouseConfig && mouseOpts.area
382
+ ? h('div', {
383
+ class: 'vxe-table--cell-area'
384
+ }, [
385
+ h('span', {
386
+ class: 'vxe-table--cell-main-area'
387
+ }),
388
+ h('span', {
389
+ class: 'vxe-table--cell-copy-area'
390
+ }),
391
+ h('span', {
392
+ class: 'vxe-table--cell-extend-area'
393
+ }),
394
+ h('span', {
395
+ class: 'vxe-table--cell-multi-area'
396
+ }),
397
+ h('span', {
398
+ class: 'vxe-table--cell-active-area'
399
+ }),
400
+ h('span', {
401
+ class: 'vxe-table--cell-col-status-area'
402
+ })
403
+ ])
404
+ : renderEmptyElement($xeTable)
405
+ ])
366
406
  ])
367
407
  ])
368
408
  },
@@ -370,145 +410,6 @@ export default {
370
410
  uploadColumn () {
371
411
  const { $parent: $xetable } = this
372
412
  this.headerColumn = $xetable.isGroup ? convertHeaderColumnToRows(this.tableGroupColumn) : []
373
- },
374
- resizeMousedownEvent (evnt: MouseEvent, params: VxeTableDefines.CellRenderHeaderParams & { $table: VxeTableConstructor & VxeTablePrivateMethods }) {
375
- const _vm = this
376
- const props = _vm
377
-
378
- const $xeTable = this.$parent as VxeTableConstructor & VxeTablePrivateMethods
379
- const tableReactData = $xeTable as unknown as TableReactData
380
- const tableInternalData = $xeTable as unknown as TableInternalData
381
-
382
- const { column } = params
383
- const { fixedType } = props
384
- const { scrollbarHeight } = tableReactData
385
- const { elemStore, visibleColumn } = tableInternalData
386
- const resizableOpts = $xeTable.computeResizableOpts
387
- const tableEl = $xeTable.$refs.refElem as HTMLDivElement
388
- const leftContainerElem = $xeTable.$refs.refLeftContainer as HTMLDivElement
389
- const rightContainerElem = $xeTable.$refs.refRightContainer as HTMLDivElement
390
- const resizeBarElem = $xeTable.$refs.refCellResizeBar as HTMLDivElement
391
- const resizeTipElem = $xeTable.$refs.refCellResizeTip as HTMLDivElement
392
- const scrollbarXToTop = $xeTable.computeScrollbarXToTop
393
- const { clientX: dragClientX } = evnt
394
- const wrapperElem = _vm.$el
395
- const dragBtnElem = evnt.target as HTMLDivElement
396
- let resizeColumn = column
397
- if (column.children && column.children.length) {
398
- XEUtils.eachTree(column.children, childColumn => {
399
- resizeColumn = childColumn
400
- })
401
- }
402
- const cell = dragBtnElem.parentNode as HTMLTableCellElement
403
- const cellParams = Object.assign(params, { cell })
404
- let dragLeft = 0
405
- const bodyScrollElem = getRefElem(elemStore['main-body-scroll'])
406
- if (!bodyScrollElem) {
407
- return
408
- }
409
- const pos = getOffsetPos(dragBtnElem, tableEl)
410
- const dragBtnWidth = dragBtnElem.clientWidth
411
- const dragBtnOffsetWidth = Math.floor(dragBtnWidth / 2)
412
- const minInterval = getColReMinWidth(cellParams) - dragBtnOffsetWidth // 列之间的最小间距
413
- let dragMinLeft = pos.left - cell.clientWidth + dragBtnWidth + minInterval
414
- let dragPosLeft = pos.left + dragBtnOffsetWidth
415
- const domMousemove = document.onmousemove
416
- const domMouseup = document.onmouseup
417
- const isLeftFixed = fixedType === 'left'
418
- const isRightFixed = fixedType === 'right'
419
-
420
- // 计算左右侧固定列偏移量
421
- let fixedOffsetWidth = 0
422
- if (isLeftFixed || isRightFixed) {
423
- const siblingProp = isLeftFixed ? 'nextElementSibling' : 'previousElementSibling'
424
- let tempCellElem = cell[siblingProp] as HTMLTableCellElement
425
- while (tempCellElem) {
426
- if (hasClass(tempCellElem, 'fixed--hidden')) {
427
- break
428
- } else if (!hasClass(tempCellElem, 'col--group')) {
429
- fixedOffsetWidth += tempCellElem.offsetWidth
430
- }
431
- tempCellElem = tempCellElem[siblingProp] as HTMLTableCellElement
432
- }
433
- if (isRightFixed && rightContainerElem) {
434
- dragPosLeft = rightContainerElem.offsetLeft + fixedOffsetWidth
435
- }
436
- }
437
-
438
- // 处理拖动事件
439
- const updateEvent = function (evnt: any) {
440
- evnt.stopPropagation()
441
- evnt.preventDefault()
442
- const tableHeight = tableEl.clientHeight
443
- const offsetX = evnt.clientX - dragClientX
444
- let left = dragPosLeft + offsetX
445
- const scrollLeft = fixedType ? 0 : bodyScrollElem.scrollLeft
446
- if (isLeftFixed) {
447
- // 左固定列(不允许超过右侧固定列、不允许超过右边距)
448
- left = Math.min(left, (rightContainerElem ? rightContainerElem.offsetLeft : bodyScrollElem.clientWidth) - fixedOffsetWidth - minInterval)
449
- } else if (isRightFixed) {
450
- // 右侧固定列(不允许超过左侧固定列、不允许超过左边距)
451
- dragMinLeft = (leftContainerElem ? leftContainerElem.clientWidth : 0) + fixedOffsetWidth + minInterval
452
- left = Math.min(left, dragPosLeft + cell.clientWidth - minInterval)
453
- } else {
454
- dragMinLeft = Math.max(bodyScrollElem.scrollLeft, dragMinLeft)
455
- // left = Math.min(left, bodyScrollElem.clientWidth + bodyScrollElem.scrollLeft - 40)
456
- }
457
- dragLeft = Math.max(left, dragMinLeft)
458
- const resizeBarLeft = Math.max(1, dragLeft - scrollLeft)
459
- resizeBarElem.style.left = `${resizeBarLeft}px`
460
- resizeBarElem.style.top = `${scrollbarXToTop ? scrollbarHeight : 0}px`
461
- resizeBarElem.style.height = `${scrollbarXToTop ? tableHeight - scrollbarHeight : tableHeight}px`
462
- if (resizableOpts.showDragTip && resizeTipElem) {
463
- const tableWidth = tableEl.clientWidth
464
- const wrapperRect = wrapperElem.getBoundingClientRect()
465
- const resizeBarWidth = resizeBarElem.clientWidth
466
- const resizeTipWidth = resizeTipElem.clientWidth
467
- const resizeTipHeight = resizeTipElem.clientHeight
468
- let resizeTipLeft = -resizeTipWidth
469
- if (resizeBarLeft < resizeTipWidth + resizeBarWidth) {
470
- resizeTipLeft = 0
471
- } else if (resizeBarLeft > tableWidth) {
472
- resizeTipLeft += tableWidth - resizeBarLeft
473
- }
474
- resizeTipElem.style.left = `${resizeTipLeft}px`
475
- resizeTipElem.style.top = `${Math.min(tableHeight - resizeTipHeight, Math.max(0, evnt.clientY - wrapperRect.y - resizeTipHeight / 2))}px`
476
- resizeTipElem.textContent = getI18n('vxe.table.resizeColTip', [resizeColumn.renderWidth + (isRightFixed ? dragPosLeft - dragLeft : dragLeft - dragPosLeft)])
477
- }
478
- }
479
-
480
- tableReactData._isResize = true
481
- addClass(tableEl, 'drag--resize')
482
- resizeBarElem.style.display = 'block'
483
- document.onmousemove = updateEvent
484
- document.onmouseup = function (evnt) {
485
- document.onmousemove = domMousemove
486
- document.onmouseup = domMouseup
487
- const resizeWidth = resizeColumn.renderWidth + (isRightFixed ? dragPosLeft - dragLeft : dragLeft - dragPosLeft)
488
- resizeColumn.resizeWidth = resizeWidth
489
- if (resizableOpts.dragMode === 'fixed') {
490
- visibleColumn.forEach((item: any) => {
491
- if (item.id !== resizeColumn.id) {
492
- if (!item.resizeWidth) {
493
- item.resizeWidth = item.renderWidth
494
- }
495
- }
496
- })
497
- }
498
- resizeBarElem.style.display = 'none'
499
- tableReactData._isResize = false
500
- tableInternalData._lastResizeTime = Date.now()
501
- $xeTable.analyColumnWidth()
502
- $xeTable.recalculate(true).then(() => {
503
- $xeTable.saveCustomStore('update:visible')
504
- $xeTable.updateCellAreas()
505
- $xeTable.dispatchEvent('resizable-change', { ...params, resizeWidth }, evnt)
506
- setTimeout(() => $xeTable.recalculate(true), 300)
507
- })
508
- removeClass(tableEl, 'drag--resize')
509
- }
510
- updateEvent(evnt)
511
- $xeTable.closeMenu()
512
413
  }
513
414
  } as any
514
415
  } as any