vxe-table 3.20.4 → 3.20.6

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 (155) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +106 -106
  3. package/es/grid/style.css +4 -0
  4. package/es/grid/style.min.css +1 -1
  5. package/es/index.css +1 -1
  6. package/es/index.esm.js +1 -2
  7. package/es/index.min.css +1 -1
  8. package/es/style.css +1 -1
  9. package/es/style.min.css +1 -1
  10. package/es/table/src/methods.js +51 -22
  11. package/es/table/src/table.js +36 -0
  12. package/es/table/src/util.js +3 -4
  13. package/es/table/style.css +48 -18
  14. package/es/ui/index.js +1 -1
  15. package/es/ui/src/log.js +1 -1
  16. package/es/vxe-grid/style.css +4 -0
  17. package/es/vxe-grid/style.min.css +1 -1
  18. package/es/vxe-table/style.css +48 -18
  19. package/lib/grid/style/style.css +4 -0
  20. package/lib/grid/style/style.min.css +1 -1
  21. package/lib/index.common.js +1 -2
  22. package/lib/index.css +1 -1
  23. package/lib/index.min.css +1 -1
  24. package/lib/index.umd.js +3252 -1877
  25. package/lib/index.umd.min.js +1 -1
  26. package/lib/style.css +1 -1
  27. package/lib/style.min.css +1 -1
  28. package/lib/table/src/methods.js +4 -3
  29. package/lib/table/src/methods.min.js +1 -1
  30. package/lib/table/src/table.js +44 -0
  31. package/lib/table/src/table.min.js +1 -1
  32. package/lib/table/src/util.js +4 -6
  33. package/lib/table/src/util.min.js +1 -1
  34. package/lib/table/style/style.css +48 -18
  35. package/lib/ui/index.js +1 -1
  36. package/lib/ui/index.min.js +1 -1
  37. package/lib/ui/src/log.js +1 -1
  38. package/lib/ui/src/log.min.js +1 -1
  39. package/lib/v-x-e-table/index.js +1 -2
  40. package/lib/v-x-e-table/index.min.js +1 -1
  41. package/lib/vxe-colgroup/index.js +1 -2
  42. package/lib/vxe-colgroup/index.min.js +1 -1
  43. package/lib/vxe-column/index.js +1 -2
  44. package/lib/vxe-column/index.min.js +1 -1
  45. package/lib/vxe-grid/index.js +1 -2
  46. package/lib/vxe-grid/index.min.js +1 -1
  47. package/lib/vxe-grid/style/style.css +4 -0
  48. package/lib/vxe-grid/style/style.min.css +1 -1
  49. package/lib/vxe-table/index.js +1 -2
  50. package/lib/vxe-table/index.min.js +1 -1
  51. package/lib/vxe-table/style/style.css +48 -18
  52. package/lib/vxe-toolbar/index.js +1 -2
  53. package/lib/vxe-toolbar/index.min.js +1 -1
  54. package/lib/vxe-ui/index.js +1 -2
  55. package/lib/vxe-ui/index.min.js +1 -1
  56. package/lib/vxe-v-x-e-table/index.js +1 -2
  57. package/lib/vxe-v-x-e-table/index.min.js +1 -1
  58. package/package.json +93 -93
  59. package/packages/colgroup/index.ts +22 -22
  60. package/packages/column/index.ts +22 -22
  61. package/packages/components.ts +42 -42
  62. package/packages/grid/index.ts +22 -22
  63. package/packages/grid/src/grid.ts +1935 -1935
  64. package/packages/index.ts +4 -4
  65. package/packages/locale/lang/ar-EG.ts +832 -832
  66. package/packages/locale/lang/de-DE.ts +832 -832
  67. package/packages/locale/lang/en-US.ts +832 -832
  68. package/packages/locale/lang/es-ES.ts +832 -832
  69. package/packages/locale/lang/fr-FR.ts +832 -832
  70. package/packages/locale/lang/hu-HU.ts +832 -832
  71. package/packages/locale/lang/hy-AM.ts +832 -832
  72. package/packages/locale/lang/id-ID.ts +832 -832
  73. package/packages/locale/lang/it-IT.ts +832 -832
  74. package/packages/locale/lang/ja-JP.ts +832 -832
  75. package/packages/locale/lang/ko-KR.ts +832 -832
  76. package/packages/locale/lang/ms-MY.ts +832 -832
  77. package/packages/locale/lang/nb-NO.ts +832 -832
  78. package/packages/locale/lang/pt-BR.ts +832 -832
  79. package/packages/locale/lang/ru-RU.ts +832 -832
  80. package/packages/locale/lang/th-TH.ts +832 -832
  81. package/packages/locale/lang/ug-CN.ts +832 -832
  82. package/packages/locale/lang/uk-UA.ts +832 -832
  83. package/packages/locale/lang/uz-UZ.ts +832 -832
  84. package/packages/locale/lang/vi-VN.ts +832 -832
  85. package/packages/locale/lang/zh-CHT.ts +832 -832
  86. package/packages/locale/lang/zh-CN.ts +832 -832
  87. package/packages/locale/lang/zh-HK.ts +3 -3
  88. package/packages/locale/lang/zh-MO.ts +3 -3
  89. package/packages/locale/lang/zh-TC.ts +3 -3
  90. package/packages/locale/lang/zh-TW.ts +3 -3
  91. package/packages/table/index.ts +49 -49
  92. package/packages/table/module/custom/mixin.ts +369 -369
  93. package/packages/table/module/custom/panel.ts +1461 -1461
  94. package/packages/table/module/edit/mixin.ts +1123 -1123
  95. package/packages/table/module/export/export-panel.ts +658 -658
  96. package/packages/table/module/export/import-panel.ts +319 -319
  97. package/packages/table/module/export/mixin.ts +1693 -1693
  98. package/packages/table/module/export/util.ts +24 -24
  99. package/packages/table/module/filter/mixin.ts +507 -507
  100. package/packages/table/module/filter/panel.ts +329 -329
  101. package/packages/table/module/keyboard/mixin.ts +513 -513
  102. package/packages/table/module/menu/mixin.ts +329 -329
  103. package/packages/table/module/menu/panel.ts +212 -212
  104. package/packages/table/module/validator/mixin.ts +626 -626
  105. package/packages/table/render/index.ts +1456 -1456
  106. package/packages/table/src/body.ts +969 -969
  107. package/packages/table/src/cell.ts +1285 -1285
  108. package/packages/table/src/column.ts +205 -205
  109. package/packages/table/src/columnInfo.ts +228 -228
  110. package/packages/table/src/footer.ts +388 -388
  111. package/packages/table/src/group.ts +51 -51
  112. package/packages/table/src/header.ts +602 -602
  113. package/packages/table/src/methods.ts +12939 -12912
  114. package/packages/table/src/props.ts +311 -311
  115. package/packages/table/src/store.ts +15 -15
  116. package/packages/table/src/table.ts +2502 -2460
  117. package/packages/table/src/util.ts +1012 -1012
  118. package/packages/toolbar/index.ts +18 -18
  119. package/packages/toolbar/src/toolbar.ts +856 -856
  120. package/packages/ui/index.ts +530 -530
  121. package/packages/ui/src/anime.ts +52 -52
  122. package/packages/ui/src/comp.ts +3 -3
  123. package/packages/ui/src/dom.ts +236 -236
  124. package/packages/ui/src/log.ts +8 -8
  125. package/packages/ui/src/utils.ts +56 -56
  126. package/packages/ui/src/vn.ts +65 -65
  127. package/packages/v-x-e-table/index.ts +4 -4
  128. package/styles/all.scss +7 -7
  129. package/styles/base.scss +16 -16
  130. package/styles/components/grid.scss +89 -85
  131. package/styles/components/icon.scss +225 -225
  132. package/styles/components/old-icon.scss +715 -715
  133. package/styles/components/table-module/all.scss +6 -6
  134. package/styles/components/table-module/custom.scss +527 -527
  135. package/styles/components/table-module/export.scss +130 -130
  136. package/styles/components/table-module/filter.scss +130 -130
  137. package/styles/components/table-module/menu.scss +81 -81
  138. package/styles/components/table.scss +2679 -2679
  139. package/styles/components/toolbar.scss +119 -119
  140. package/styles/default.scss +2 -2
  141. package/styles/helpers/baseMixin.scss +95 -95
  142. package/styles/index.scss +3 -3
  143. package/styles/modules.scss +5 -5
  144. package/styles/theme/base.scss +93 -93
  145. package/styles/theme/dark.scss +49 -49
  146. package/styles/theme/light.scss +44 -44
  147. package/styles/variable.scss +43 -43
  148. package/types/all.d.ts +53 -53
  149. package/types/index.d.ts +4 -4
  150. /package/es/{iconfont.1773644050430.ttf → iconfont.1773972972913.ttf} +0 -0
  151. /package/es/{iconfont.1773644050430.woff → iconfont.1773972972913.woff} +0 -0
  152. /package/es/{iconfont.1773644050430.woff2 → iconfont.1773972972913.woff2} +0 -0
  153. /package/lib/{iconfont.1773644050430.ttf → iconfont.1773972972913.ttf} +0 -0
  154. /package/lib/{iconfont.1773644050430.woff → iconfont.1773972972913.woff} +0 -0
  155. /package/lib/{iconfont.1773644050430.woff2 → iconfont.1773972972913.woff2} +0 -0
@@ -1,602 +1,602 @@
1
- import { PropType, CreateElement } from 'vue'
2
- import XEUtils from 'xe-utils'
3
- import { VxeUI } from '../../ui'
4
- import { isEnableConf, getClass } from '../../ui/src/utils'
5
- import { getCalcHeight, convertHeaderColumnToRows, convertHeaderToGridRows } from './util'
6
- import { getSlotVNs } from '../../ui/src/vn'
7
-
8
- import type { VxeTableDefines, VxeTableConstructor, VxeTablePrivateMethods, VxeColumnPropTypes, TableReactData, TableInternalData, VxeComponentStyleType, VxeGlobalRendererHandles } from '../../../types'
9
-
10
- const { renderer, renderEmptyElement } = VxeUI
11
-
12
- const sourceType = 'table'
13
- const renderType = 'header'
14
-
15
- function renderRows (h: CreateElement, _vm: any, isGroup: boolean, isOptimizeMode: boolean, headerGroups: VxeTableDefines.ColumnInfo[][], $rowIndex: number, cols: VxeTableDefines.ColumnInfo[]) {
16
- const props = _vm
17
- const $xeTable = _vm.$parent as VxeTableConstructor & VxeTablePrivateMethods
18
- const $xeGrid = $xeTable.$xeGrid
19
- const $xeGantt = $xeTable.$xeGantt
20
- const tableProps = $xeTable
21
- const tableReactData = $xeTable as unknown as TableReactData
22
- const tableInternalData = $xeTable as unknown as TableInternalData
23
-
24
- const { fixedType } = props
25
- const { resizable: allResizable, columnKey, showCustomHeader, headerCellClassName, headerCellStyle, showHeaderOverflow: allColumnHeaderOverflow, headerAlign: allHeaderAlign, align: allAlign, mouseConfig } = tableProps
26
- const { currentColumn, dragCol, scrollXLoad, scrollYLoad, overflowX, mergeHeadFlag, tableColumn } = tableReactData
27
- const { fullColumnIdData, scrollXStore, mergeHeaderList, mergeHeaderCellMaps } = tableInternalData
28
- const virtualXOpts = $xeTable.computeVirtualXOpts
29
- const columnOpts = $xeTable.computeColumnOpts
30
- const columnDragOpts = $xeTable.computeColumnDragOpts
31
- const cellOpts = $xeTable.computeCellOpts
32
- const defaultRowHeight = $xeTable.computeDefaultRowHeight
33
- const headerCellOpts = $xeTable.computeHeaderCellOpts
34
- const currCellHeight = getCalcHeight(headerCellOpts.height) || defaultRowHeight
35
- const { disabledMethod: dragDisabledMethod, isCrossDrag, isPeerDrag } = columnDragOpts
36
- const isLastRow = $rowIndex === headerGroups.length - 1
37
-
38
- return cols.map((column, $columnIndex) => {
39
- const { type, showHeaderOverflow, headerAlign, align, filters, headerClassName, editRender, cellRender } = column
40
- // const { enabled } = tooltipOpts
41
- const colid = column.id
42
- const colRest = fullColumnIdData[colid] || {}
43
- const renderOpts = editRender || cellRender
44
- const compConf = renderOpts ? renderer.get(renderOpts.name) : null
45
- const isColGroup = column.children && column.children.length
46
- const fixedHiddenColumn = overflowX && !isColGroup && (fixedType ? column.fixed !== fixedType : !!column.fixed)
47
- const isPadding = XEUtils.isBoolean(headerCellOpts.padding) ? headerCellOpts.padding : cellOpts.padding
48
- const headOverflow = XEUtils.isUndefined(showHeaderOverflow) || XEUtils.isNull(showHeaderOverflow) ? allColumnHeaderOverflow : showHeaderOverflow
49
- const headAlign = headerAlign || (compConf ? compConf.tableHeaderCellAlign : '') || allHeaderAlign || align || (compConf ? compConf.tableCellAlign : '') || allAlign
50
- const showEllipsis = headOverflow === 'ellipsis'
51
- const showTitle = headOverflow === 'title'
52
- const showTooltip = headOverflow === true || headOverflow === 'tooltip'
53
- const hasEllipsis = showTitle || showTooltip || showEllipsis
54
- let hasFilter = false
55
- let firstFilterOption: VxeColumnPropTypes.FilterItem | null = null
56
- if (filters) {
57
- firstFilterOption = filters[0]
58
- hasFilter = filters.some((item: VxeColumnPropTypes.FilterItem) => item.checked)
59
- }
60
- const columnIndex = colRest.index
61
- const _columnIndex = showCustomHeader ? $columnIndex : colRest._index
62
- const cellParams: VxeTableDefines.CellRenderHeaderParams & {
63
- $table: VxeTableConstructor & VxeTablePrivateMethods
64
- } = {
65
- $table: $xeTable,
66
- $grid: $xeGrid,
67
- $gantt: $xeGantt,
68
- $rowIndex,
69
- column,
70
- columnIndex,
71
- $columnIndex,
72
- _columnIndex,
73
- firstFilterOption: firstFilterOption as VxeTableDefines.FilterOption,
74
- fixed: fixedType,
75
- source: sourceType,
76
- type: renderType,
77
- isHidden: fixedHiddenColumn,
78
- hasFilter
79
- }
80
- const thAttrs: Record<string, string | number | null> = {
81
- colid
82
- }
83
- let isMergeCell = false
84
- // 合并行或列
85
- if (!showCustomHeader) {
86
- thAttrs.colspan = column.colSpan > 1 ? column.colSpan : null
87
- thAttrs.rowspan = column.rowSpan > 1 ? column.rowSpan : null
88
- }
89
- if (mergeHeadFlag && mergeHeaderList.length && (showCustomHeader || isLastRow)) {
90
- const spanRest = mergeHeaderCellMaps[`${$rowIndex}:${showCustomHeader ? $columnIndex : _columnIndex}`]
91
- if (spanRest) {
92
- const { rowspan, colspan } = spanRest
93
- if (!rowspan || !colspan) {
94
- return null
95
- }
96
- if (rowspan > 1) {
97
- isMergeCell = true
98
- thAttrs.rowspan = rowspan
99
- }
100
- if (colspan > 1) {
101
- isMergeCell = true
102
- thAttrs.colspan = colspan
103
- }
104
- }
105
- }
106
- const thOns: any = {
107
- click: (evnt: MouseEvent) => $xeTable.triggerHeaderCellClickEvent(evnt, cellParams),
108
- dblclick: (evnt: MouseEvent) => $xeTable.triggerHeaderCellDblclickEvent(evnt, cellParams)
109
- }
110
- const isColDragCell = columnOpts.drag && columnDragOpts.trigger === 'cell'
111
- let isDisabledDrag = false
112
- if (isColDragCell) {
113
- isDisabledDrag = !!(dragDisabledMethod && dragDisabledMethod(cellParams))
114
- }
115
- // 按下事件处理
116
- if (mouseConfig || isColDragCell) {
117
- thOns.mousedown = (evnt: any) => $xeTable.triggerHeaderCellMousedownEvent(evnt, cellParams)
118
- }
119
- // 拖拽列事件
120
- if (columnOpts.drag) {
121
- thOns.dragstart = $xeTable.handleHeaderCellDragDragstartEvent
122
- thOns.dragend = $xeTable.handleHeaderCellDragDragendEvent
123
- thOns.dragover = $xeTable.handleHeaderCellDragDragoverEvent
124
- if (isColDragCell) {
125
- thOns.mouseup = $xeTable.handleHeaderCellDragMouseupEvent
126
- }
127
- }
128
- const isLastColumn = $columnIndex === cols.length - 1
129
- const showResizable = (XEUtils.isBoolean(column.resizable) ? column.resizable : (columnOpts.resizable || allResizable))
130
- const isAutoCellWidth = !column.resizeWidth && (column.minWidth === 'auto' || column.width === 'auto')
131
-
132
- let isVNPreEmptyStatus = false
133
- if (isOptimizeMode && overflowX && !isGroup && !isMergeCell) {
134
- if (!dragCol || dragCol.id !== colid) {
135
- if (scrollXLoad && tableColumn.length > 10 && !column.fixed && !virtualXOpts.immediate && (_columnIndex < scrollXStore.visibleStartIndex - scrollXStore.preloadSize || _columnIndex > scrollXStore.visibleEndIndex + scrollXStore.preloadSize)) {
136
- isVNPreEmptyStatus = true
137
- }
138
- }
139
- }
140
-
141
- const tcStyle: Record<string, string> = {}
142
- if (hasEllipsis) {
143
- tcStyle.height = `${currCellHeight}px`
144
- } else {
145
- tcStyle.minHeight = `${currCellHeight}px`
146
- }
147
-
148
- if (showCustomHeader) {
149
- // custom
150
- } else if (isColGroup && !isLastRow) {
151
- let childWidth = 0
152
- XEUtils.eachTree(column.children, (childRow) => {
153
- if (childRow.visible && (!childRow.children || !childRow.children.length)) {
154
- childWidth += childRow.renderWidth
155
- }
156
- })
157
- tcStyle.width = `${childWidth}px`
158
- }
159
-
160
- return h('th', {
161
- class: ['vxe-table--column vxe-header--column', colid, fixedHiddenColumn ? 'fixed--hidden' : 'fixed--visible', {
162
- [`col--${headAlign}`]: headAlign,
163
- [`col--${type}`]: type,
164
- 'col--last': isLastColumn,
165
- 'col--fixed': column.fixed,
166
- 'col--group': isColGroup,
167
- 'col--ellipsis': hasEllipsis,
168
- 'fixed--width': !isAutoCellWidth,
169
- 'is--padding': isPadding,
170
- 'is--sortable': column.sortable,
171
- 'col--filter': !!filters,
172
- 'is--filter-active': hasFilter,
173
- 'is--drag-active': columnOpts.drag && !column.fixed && !isDisabledDrag && (isCrossDrag || isPeerDrag || !column.parentId),
174
- 'is--drag-disabled': columnOpts.drag && isDisabledDrag,
175
- 'col--current': currentColumn === column
176
- }, getClass(headerClassName, cellParams), getClass(headerCellClassName, cellParams)],
177
- attrs: thAttrs,
178
- style: headerCellStyle ? (XEUtils.isFunction(headerCellStyle) ? headerCellStyle(cellParams) : headerCellStyle) as VxeComponentStyleType : undefined,
179
- on: thOns,
180
- key: showCustomHeader ? `${colid}${$columnIndex}` : (columnKey || scrollXLoad || scrollYLoad || columnOpts.useKey || columnOpts.drag || isColGroup ? colid : $columnIndex)
181
- }, [
182
- h('div', {
183
- class: ['vxe-cell', {
184
- 'c--title': showTitle,
185
- 'c--tooltip': showTooltip,
186
- 'c--ellipsis': showEllipsis
187
- }],
188
- style: tcStyle
189
- }, isVNPreEmptyStatus || (isOptimizeMode && fixedHiddenColumn)
190
- ? []
191
- : [
192
- h('div', {
193
- attrs: {
194
- colid
195
- },
196
- class: 'vxe-cell--wrapper vxe-header-cell--wrapper'
197
- }, column.renderHeader(h, cellParams))
198
- ]),
199
- /**
200
- * 列宽拖动
201
- */
202
- !fixedHiddenColumn && showResizable && (!showCustomHeader || isLastRow)
203
- ? h('div', {
204
- class: 'vxe-cell--col-resizable',
205
- on: {
206
- mousedown: (evnt: MouseEvent) => $xeTable.handleColResizeMousedownEvent(evnt, fixedType, cellParams),
207
- dblclick: (evnt: MouseEvent) => $xeTable.handleColResizeDblclickEvent(evnt, cellParams)
208
- }
209
- })
210
- : renderEmptyElement($xeTable)
211
- ])
212
- })
213
- }
214
-
215
- function renderFilterRows (h: CreateElement, _vm: any, isOptimizeMode: boolean, cols: VxeTableDefines.ColumnInfo[]) {
216
- const props = _vm
217
- const $xeTable = _vm.$parent as VxeTableConstructor & VxeTablePrivateMethods
218
- const $xeGrid = $xeTable.$xeGrid
219
- const $xeGantt = $xeTable.$xeGantt
220
- const tableProps = $xeTable
221
- const tableReactData = $xeTable as unknown as TableReactData
222
- const tableInternalData = $xeTable as unknown as TableInternalData
223
-
224
- const { fixedType } = props
225
- const { showHeaderOverflow: allColumnHeaderOverflow, headerAlign: allHeaderAlign, align: allAlign } = tableProps
226
- const { currentColumn, overflowX } = tableReactData
227
- const { fullColumnIdData } = tableInternalData
228
- const cellOpts = $xeTable.computeCellOpts
229
- const defaultRowHeight = $xeTable.computeDefaultRowHeight
230
- const headerCellOpts = $xeTable.computeHeaderCellOpts
231
- const currCellHeight = getCalcHeight(headerCellOpts.height) || defaultRowHeight
232
-
233
- return cols.map((column, $columnIndex) => {
234
- const { type, showHeaderOverflow, headerAlign, align, filters, editRender, cellRender, floatingFilters, filterRender, slots } = column
235
- const colid = column.id
236
- const colRest = fullColumnIdData[colid] || {}
237
- const renderOpts = editRender || cellRender
238
- const compConf = renderOpts ? renderer.get(renderOpts.name) : null
239
- const flCompConf = isEnableConf(filterRender) ? renderer.get(filterRender.name) : null
240
- const rtFloatingFilter = flCompConf ? flCompConf.renderTableFloatingFilter : null
241
- const flSlot = slots ? (slots.floatingFilter || slots['floating-filter']) : null
242
- const fixedHiddenColumn = overflowX && (fixedType ? column.fixed !== fixedType : !!column.fixed)
243
- const isPadding = XEUtils.isBoolean(headerCellOpts.padding) ? headerCellOpts.padding : cellOpts.padding
244
- const headOverflow = XEUtils.eqNull(showHeaderOverflow) ? allColumnHeaderOverflow : showHeaderOverflow
245
- const headAlign = headerAlign || (compConf ? compConf.tableHeaderCellAlign : '') || allHeaderAlign || align || (compConf ? compConf.tableCellAlign : '') || allAlign
246
- const showEllipsis = headOverflow === 'ellipsis'
247
- const showTitle = headOverflow === 'title'
248
- const showTooltip = headOverflow === true || headOverflow === 'tooltip'
249
- const hasEllipsis = showTitle || showTooltip || showEllipsis
250
- let hasFilter = false
251
- let firstFilterOption: VxeTableDefines.FilterOption | null = null
252
- if (filters) {
253
- firstFilterOption = filters[0] as VxeTableDefines.FilterOption
254
- hasFilter = filters.some((item) => item.checked)
255
- }
256
- const columnIndex = colRest.index
257
- const _columnIndex = colRest._index
258
- const cellParams: VxeTableDefines.CellFloatingFilterParams & {
259
- $table: VxeTableConstructor & VxeTablePrivateMethods
260
- } = {
261
- $table: $xeTable,
262
- $grid: $xeGrid,
263
- $gantt: $xeGantt,
264
- column: column,
265
- columnIndex,
266
- $columnIndex,
267
- _columnIndex,
268
- option: firstFilterOption as VxeTableDefines.FilterOption,
269
- fixed: fixedType,
270
- source: sourceType,
271
- type: renderType,
272
- isHidden: fixedHiddenColumn,
273
- hasFilter
274
- }
275
- const thAttrs: Record<string, string | number | null> = {
276
- colid
277
- }
278
-
279
- const isLastColumn = $columnIndex === cols.length - 1
280
- const isAutoCellWidth = !column.resizeWidth && (column.minWidth === 'auto' || column.width === 'auto')
281
-
282
- const tcStyle: Record<string, string> = {}
283
- if (hasEllipsis) {
284
- tcStyle.height = `${currCellHeight}px`
285
- } else {
286
- tcStyle.minHeight = `${currCellHeight}px`
287
- }
288
-
289
- return h('th', {
290
- class: ['vxe-table--column vxe-header--column', colid, fixedHiddenColumn ? 'fixed--hidden' : 'fixed--visible', {
291
- [`col--${headAlign}`]: headAlign,
292
- [`col--${type}`]: type,
293
- 'col--last': isLastColumn,
294
- 'col--fixed': column.fixed,
295
- 'col--ellipsis': hasEllipsis,
296
- 'fixed--width': !isAutoCellWidth,
297
- 'is--padding': isPadding,
298
- 'is--sortable': column.sortable,
299
- 'col--current': currentColumn === column
300
- }
301
- ],
302
- key: colid,
303
- attrs: thAttrs
304
- }, [
305
- h('div', {
306
- class: ['vxe-cell', {
307
- 'c--title': showTitle,
308
- 'c--tooltip': showTooltip,
309
- 'c--ellipsis': showEllipsis
310
- }],
311
- style: tcStyle
312
- }, isOptimizeMode && fixedHiddenColumn && !floatingFilters
313
- ? []
314
- : [
315
- h('div', {
316
- attrs: {
317
- colid
318
- },
319
- class: 'vxe-cell--wrapper vxe-header-cell--wrapper'
320
- }, flSlot
321
- ? $xeTable.callSlot(flSlot, cellParams, h)
322
- : (rtFloatingFilter && firstFilterOption
323
- ? getSlotVNs(rtFloatingFilter.call($xeTable, h, filterRender, cellParams as unknown as VxeGlobalRendererHandles.RenderTableFloatingFilterParams))
324
- : []))
325
- ])
326
- ])
327
- })
328
- }
329
-
330
- function renderHeads (h: CreateElement, _vm: any, isGroup: boolean, isOptimizeMode: boolean, headerGroups: VxeTableDefines.ColumnInfo[][], renderColumnList: VxeTableDefines.ColumnInfo[]) {
331
- const props = _vm
332
- const $xeTable = _vm.$parent as VxeTableConstructor & VxeTablePrivateMethods
333
- const tableProps = $xeTable
334
-
335
- const { fixedType } = props
336
-
337
- const { headerRowClassName, headerRowStyle } = tableProps
338
- const floatingFilterOpts = $xeTable.computeFloatingFilterOpts
339
- const rowVNs = headerGroups.map((cols, $rowIndex) => {
340
- const params = { $table: $xeTable, $rowIndex, fixed: fixedType, type: renderType }
341
- return h('tr', {
342
- key: $rowIndex,
343
- class: [
344
- 'vxe-header--row',
345
- headerRowClassName ? XEUtils.isFunction(headerRowClassName) ? headerRowClassName(params) : headerRowClassName : ''
346
- ],
347
- style: headerRowStyle ? (XEUtils.isFunction(headerRowStyle) ? headerRowStyle(params) : headerRowStyle) as VxeComponentStyleType : undefined
348
- }, renderRows(h, _vm, isGroup, isOptimizeMode, headerGroups, $rowIndex, cols))
349
- })
350
-
351
- if (floatingFilterOpts.enabled) {
352
- rowVNs.push(
353
- h('tr', {
354
- key: 'ff',
355
- class: [
356
- 'vxe-header--row'
357
- ]
358
- }, renderFilterRows(h, _vm, isOptimizeMode, renderColumnList))
359
- )
360
- }
361
-
362
- return rowVNs
363
- }
364
-
365
- export default {
366
- name: 'VxeTableHeader',
367
- props: {
368
- tableData: Array as PropType<any[]>,
369
- tableColumn: Array as PropType<VxeTableDefines.ColumnInfo[]>,
370
- tableGroupColumn: Array as PropType<VxeTableDefines.ColumnInfo[]>,
371
- fixedColumn: Array as PropType<VxeTableDefines.ColumnInfo[]>,
372
- fixedType: {
373
- type: String as PropType<'right' | 'left' | ''>,
374
- default: null
375
- }
376
- },
377
- data () {
378
- return {
379
- headerColumn: []
380
- }
381
- },
382
- watch: {
383
- tableColumn () {
384
- const _vm = this as any
385
-
386
- _vm.uploadColumn()
387
- }
388
- },
389
- created () {
390
- const _vm = this as any
391
- _vm.uploadColumn()
392
- },
393
- mounted () {
394
- const _vm = this as any
395
- const props = _vm
396
- const $xeTable = _vm.$parent as VxeTableConstructor & VxeTablePrivateMethods
397
- const internalData = $xeTable as unknown as TableInternalData
398
-
399
- const { fixedType } = props
400
- const { elemStore } = internalData
401
- const prefix = `${fixedType || 'main'}-header-`
402
- elemStore[`${prefix}wrapper`] = _vm.$refs.refElem
403
- elemStore[`${prefix}scroll`] = _vm.$refs.refHeaderScroll
404
- elemStore[`${prefix}table`] = _vm.$refs.refHeaderTable
405
- elemStore[`${prefix}colgroup`] = _vm.$refs.refHeaderColgroup
406
- elemStore[`${prefix}list`] = _vm.$refs.refHeaderTHead
407
- elemStore[`${prefix}xSpace`] = _vm.$refs.refHeaderXSpace
408
- elemStore[`${prefix}repair`] = _vm.$refs.refHeaderBorderRepair
409
- },
410
- destroyed () {
411
- const _vm = this as any
412
- const props = _vm
413
- const $xeTable = _vm.$parent as VxeTableConstructor & VxeTablePrivateMethods
414
- const internalData = $xeTable as unknown as TableInternalData
415
-
416
- const { fixedType } = props
417
- const { elemStore } = internalData
418
- const prefix = `${fixedType || 'main'}-header-`
419
- elemStore[`${prefix}wrapper`] = null
420
- elemStore[`${prefix}scroll`] = null
421
- elemStore[`${prefix}table`] = null
422
- elemStore[`${prefix}colgroup`] = null
423
- elemStore[`${prefix}list`] = null
424
- elemStore[`${prefix}xSpace`] = null
425
- elemStore[`${prefix}repair`] = null
426
- },
427
- render (h: CreateElement) {
428
- const _vm = this as any
429
- const props = _vm
430
- const $xeTable = _vm.$parent as VxeTableConstructor & VxeTablePrivateMethods
431
- const tableProps = $xeTable
432
- const tableReactData = $xeTable as unknown as TableReactData
433
- const tableInternalData = $xeTable as unknown as TableInternalData
434
-
435
- const { xID } = $xeTable
436
- const { fixedType, fixedColumn, tableColumn } = props
437
- const { headerColumn } = _vm
438
-
439
- const { mouseConfig } = tableProps
440
- const { isGroup, isColLoading, overflowX, scrollXLoad, dragCol } = tableReactData
441
- const { visibleColumn, fullColumnIdData } = tableInternalData
442
-
443
- const mouseOpts = $xeTable.computeMouseOpts
444
- const isHeaderRenderOptimize = $xeTable.computeIsHeaderRenderOptimize
445
- let renderHeaderList = headerColumn as VxeTableDefines.ColumnInfo[][]
446
- let renderColumnList = tableColumn as VxeTableDefines.ColumnInfo[]
447
- const isOptimizeMode = isHeaderRenderOptimize
448
-
449
- if (isGroup) {
450
- renderColumnList = visibleColumn
451
- } else {
452
- if (!isOptimizeMode || (!isColLoading && (fixedType || !overflowX))) {
453
- renderColumnList = visibleColumn
454
- }
455
-
456
- if (fixedType) {
457
- // 如果是使用优化模式
458
- if (isOptimizeMode) {
459
- renderColumnList = fixedColumn || []
460
- }
461
- }
462
- renderHeaderList = [renderColumnList]
463
- }
464
-
465
- if (!fixedType && !isGroup) {
466
- // 列拖拽
467
- if (scrollXLoad && dragCol) {
468
- if (renderColumnList.length > 2) {
469
- const dCowRest = fullColumnIdData[dragCol.id]
470
- if (dCowRest) {
471
- const dcIndex = dCowRest._index
472
- const firstCol = renderColumnList[0]
473
- const lastCol = renderColumnList[renderColumnList.length - 1]
474
- const firstColRest = fullColumnIdData[firstCol.id]
475
- const lastColRest = fullColumnIdData[lastCol.id]
476
- if (firstColRest && lastColRest) {
477
- const fcIndex = firstColRest._index
478
- const lcIndex = lastColRest._index
479
- if (dcIndex < fcIndex) {
480
- renderColumnList = [dragCol].concat(renderColumnList)
481
- renderHeaderList = [[dragCol].concat(renderHeaderList[0])].concat(renderHeaderList.slice(1))
482
- } else if (dcIndex > lcIndex) {
483
- renderColumnList = renderColumnList.concat([dragCol])
484
- renderHeaderList = [renderHeaderList[0].concat([dragCol])].concat(renderHeaderList.slice(1))
485
- }
486
- }
487
- }
488
- }
489
- }
490
- }
491
-
492
- return h('div', {
493
- ref: 'refElem',
494
- class: ['vxe-table--header-wrapper', fixedType ? `fixed-${fixedType}--wrapper` : 'body--wrapper'],
495
- attrs: {
496
- xid: xID
497
- }
498
- }, [
499
- h('div', {
500
- ref: 'refHeaderScroll',
501
- class: 'vxe-table--header-inner-wrapper',
502
- on: {
503
- scroll (evnt: Event) {
504
- $xeTable.triggerHeaderScrollEvent(evnt, fixedType)
505
- }
506
- }
507
- }, [
508
- fixedType
509
- ? renderEmptyElement($xeTable)
510
- : h('div', {
511
- ref: 'refHeaderXSpace',
512
- class: 'vxe-body--x-space'
513
- }),
514
- h('table', {
515
- ref: 'refHeaderTable',
516
- class: 'vxe-table--header',
517
- attrs: {
518
- xid: xID,
519
- cellspacing: 0,
520
- cellpadding: 0,
521
- border: 0,
522
- xvm: isOptimizeMode ? '1' : null
523
- }
524
- }, [
525
- /**
526
- * 列宽
527
- */
528
- h('colgroup', {
529
- ref: 'refHeaderColgroup'
530
- }, renderColumnList.map((column, $columnIndex) => {
531
- return h('col', {
532
- attrs: {
533
- name: column.id
534
- },
535
- key: $columnIndex,
536
- style: {
537
- width: `${column.renderWidth}px`
538
- }
539
- })
540
- })),
541
- /**
542
- * 头部
543
- */
544
- h('thead', {
545
- ref: 'refHeaderTHead'
546
- }, renderHeads(h, _vm, isGroup, isOptimizeMode, renderHeaderList, renderColumnList))
547
- ]),
548
- mouseConfig && mouseOpts.area
549
- ? h('div', {
550
- class: 'vxe-table--cell-area',
551
- attrs: {
552
- xid: xID
553
- }
554
- }, [
555
- h('span', {
556
- class: 'vxe-table--cell-main-area'
557
- }),
558
- h('span', {
559
- class: 'vxe-table--cell-clip-area'
560
- }),
561
- h('span', {
562
- class: 'vxe-table--cell-extend-area'
563
- }),
564
- h('span', {
565
- class: 'vxe-table--cell-multi-area'
566
- }),
567
- h('span', {
568
- class: 'vxe-table--cell-active-area'
569
- }),
570
- h('span', {
571
- class: 'vxe-table--cell-col-status-area'
572
- })
573
- ])
574
- : renderEmptyElement($xeTable)
575
- ])
576
- ])
577
- },
578
- methods: {
579
- uploadColumn () {
580
- const _vm = this as any
581
- const $xeTable = _vm.$parent as VxeTableConstructor & VxeTablePrivateMethods
582
- const tableProps = $xeTable
583
- const tableReactData = $xeTable as unknown as TableReactData
584
- const tableInternalData = $xeTable as unknown as TableInternalData
585
-
586
- const props = _vm
587
-
588
- const { showCustomHeader } = tableProps
589
- const { collectColumn, visibleColumn } = tableInternalData
590
- const { tableGroupColumn } = props
591
- const { isGroup } = tableReactData
592
- let spanColumns: VxeTableDefines.ColumnInfo[][] = isGroup ? convertHeaderColumnToRows(tableGroupColumn) : []
593
- let visibleColgroups: VxeTableDefines.ColumnInfo[][] = []
594
- if (showCustomHeader && spanColumns.length > 1) {
595
- visibleColgroups = convertHeaderToGridRows(spanColumns)
596
- spanColumns = visibleColgroups
597
- }
598
- _vm.headerColumn = spanColumns
599
- $xeTable.dispatchEvent('columns-change', { visibleColgroups, collectColumn, visibleColumn }, null)
600
- }
601
- }
602
- }
1
+ import { PropType, CreateElement } from 'vue'
2
+ import XEUtils from 'xe-utils'
3
+ import { VxeUI } from '../../ui'
4
+ import { isEnableConf, getClass } from '../../ui/src/utils'
5
+ import { getCalcHeight, convertHeaderColumnToRows, convertHeaderToGridRows } from './util'
6
+ import { getSlotVNs } from '../../ui/src/vn'
7
+
8
+ import type { VxeTableDefines, VxeTableConstructor, VxeTablePrivateMethods, VxeColumnPropTypes, TableReactData, TableInternalData, VxeComponentStyleType, VxeGlobalRendererHandles } from '../../../types'
9
+
10
+ const { renderer, renderEmptyElement } = VxeUI
11
+
12
+ const sourceType = 'table'
13
+ const renderType = 'header'
14
+
15
+ function renderRows (h: CreateElement, _vm: any, isGroup: boolean, isOptimizeMode: boolean, headerGroups: VxeTableDefines.ColumnInfo[][], $rowIndex: number, cols: VxeTableDefines.ColumnInfo[]) {
16
+ const props = _vm
17
+ const $xeTable = _vm.$parent as VxeTableConstructor & VxeTablePrivateMethods
18
+ const $xeGrid = $xeTable.$xeGrid
19
+ const $xeGantt = $xeTable.$xeGantt
20
+ const tableProps = $xeTable
21
+ const tableReactData = $xeTable as unknown as TableReactData
22
+ const tableInternalData = $xeTable as unknown as TableInternalData
23
+
24
+ const { fixedType } = props
25
+ const { resizable: allResizable, columnKey, showCustomHeader, headerCellClassName, headerCellStyle, showHeaderOverflow: allColumnHeaderOverflow, headerAlign: allHeaderAlign, align: allAlign, mouseConfig } = tableProps
26
+ const { currentColumn, dragCol, scrollXLoad, scrollYLoad, overflowX, mergeHeadFlag, tableColumn } = tableReactData
27
+ const { fullColumnIdData, scrollXStore, mergeHeaderList, mergeHeaderCellMaps } = tableInternalData
28
+ const virtualXOpts = $xeTable.computeVirtualXOpts
29
+ const columnOpts = $xeTable.computeColumnOpts
30
+ const columnDragOpts = $xeTable.computeColumnDragOpts
31
+ const cellOpts = $xeTable.computeCellOpts
32
+ const defaultRowHeight = $xeTable.computeDefaultRowHeight
33
+ const headerCellOpts = $xeTable.computeHeaderCellOpts
34
+ const currCellHeight = getCalcHeight(headerCellOpts.height) || defaultRowHeight
35
+ const { disabledMethod: dragDisabledMethod, isCrossDrag, isPeerDrag } = columnDragOpts
36
+ const isLastRow = $rowIndex === headerGroups.length - 1
37
+
38
+ return cols.map((column, $columnIndex) => {
39
+ const { type, showHeaderOverflow, headerAlign, align, filters, headerClassName, editRender, cellRender } = column
40
+ // const { enabled } = tooltipOpts
41
+ const colid = column.id
42
+ const colRest = fullColumnIdData[colid] || {}
43
+ const renderOpts = editRender || cellRender
44
+ const compConf = renderOpts ? renderer.get(renderOpts.name) : null
45
+ const isColGroup = column.children && column.children.length
46
+ const fixedHiddenColumn = overflowX && !isColGroup && (fixedType ? column.fixed !== fixedType : !!column.fixed)
47
+ const isPadding = XEUtils.isBoolean(headerCellOpts.padding) ? headerCellOpts.padding : cellOpts.padding
48
+ const headOverflow = XEUtils.isUndefined(showHeaderOverflow) || XEUtils.isNull(showHeaderOverflow) ? allColumnHeaderOverflow : showHeaderOverflow
49
+ const headAlign = headerAlign || (compConf ? compConf.tableHeaderCellAlign : '') || allHeaderAlign || align || (compConf ? compConf.tableCellAlign : '') || allAlign
50
+ const showEllipsis = headOverflow === 'ellipsis'
51
+ const showTitle = headOverflow === 'title'
52
+ const showTooltip = headOverflow === true || headOverflow === 'tooltip'
53
+ const hasEllipsis = showTitle || showTooltip || showEllipsis
54
+ let hasFilter = false
55
+ let firstFilterOption: VxeColumnPropTypes.FilterItem | null = null
56
+ if (filters) {
57
+ firstFilterOption = filters[0]
58
+ hasFilter = filters.some((item: VxeColumnPropTypes.FilterItem) => item.checked)
59
+ }
60
+ const columnIndex = colRest.index
61
+ const _columnIndex = showCustomHeader ? $columnIndex : colRest._index
62
+ const cellParams: VxeTableDefines.CellRenderHeaderParams & {
63
+ $table: VxeTableConstructor & VxeTablePrivateMethods
64
+ } = {
65
+ $table: $xeTable,
66
+ $grid: $xeGrid,
67
+ $gantt: $xeGantt,
68
+ $rowIndex,
69
+ column,
70
+ columnIndex,
71
+ $columnIndex,
72
+ _columnIndex,
73
+ firstFilterOption: firstFilterOption as VxeTableDefines.FilterOption,
74
+ fixed: fixedType,
75
+ source: sourceType,
76
+ type: renderType,
77
+ isHidden: fixedHiddenColumn,
78
+ hasFilter
79
+ }
80
+ const thAttrs: Record<string, string | number | null> = {
81
+ colid
82
+ }
83
+ let isMergeCell = false
84
+ // 合并行或列
85
+ if (!showCustomHeader) {
86
+ thAttrs.colspan = column.colSpan > 1 ? column.colSpan : null
87
+ thAttrs.rowspan = column.rowSpan > 1 ? column.rowSpan : null
88
+ }
89
+ if (mergeHeadFlag && mergeHeaderList.length && (showCustomHeader || isLastRow)) {
90
+ const spanRest = mergeHeaderCellMaps[`${$rowIndex}:${showCustomHeader ? $columnIndex : _columnIndex}`]
91
+ if (spanRest) {
92
+ const { rowspan, colspan } = spanRest
93
+ if (!rowspan || !colspan) {
94
+ return null
95
+ }
96
+ if (rowspan > 1) {
97
+ isMergeCell = true
98
+ thAttrs.rowspan = rowspan
99
+ }
100
+ if (colspan > 1) {
101
+ isMergeCell = true
102
+ thAttrs.colspan = colspan
103
+ }
104
+ }
105
+ }
106
+ const thOns: any = {
107
+ click: (evnt: MouseEvent) => $xeTable.triggerHeaderCellClickEvent(evnt, cellParams),
108
+ dblclick: (evnt: MouseEvent) => $xeTable.triggerHeaderCellDblclickEvent(evnt, cellParams)
109
+ }
110
+ const isColDragCell = columnOpts.drag && columnDragOpts.trigger === 'cell'
111
+ let isDisabledDrag = false
112
+ if (isColDragCell) {
113
+ isDisabledDrag = !!(dragDisabledMethod && dragDisabledMethod(cellParams))
114
+ }
115
+ // 按下事件处理
116
+ if (mouseConfig || isColDragCell) {
117
+ thOns.mousedown = (evnt: any) => $xeTable.triggerHeaderCellMousedownEvent(evnt, cellParams)
118
+ }
119
+ // 拖拽列事件
120
+ if (columnOpts.drag) {
121
+ thOns.dragstart = $xeTable.handleHeaderCellDragDragstartEvent
122
+ thOns.dragend = $xeTable.handleHeaderCellDragDragendEvent
123
+ thOns.dragover = $xeTable.handleHeaderCellDragDragoverEvent
124
+ if (isColDragCell) {
125
+ thOns.mouseup = $xeTable.handleHeaderCellDragMouseupEvent
126
+ }
127
+ }
128
+ const isLastColumn = $columnIndex === cols.length - 1
129
+ const showResizable = (XEUtils.isBoolean(column.resizable) ? column.resizable : (columnOpts.resizable || allResizable))
130
+ const isAutoCellWidth = !column.resizeWidth && (column.minWidth === 'auto' || column.width === 'auto')
131
+
132
+ let isVNPreEmptyStatus = false
133
+ if (isOptimizeMode && overflowX && !isGroup && !isMergeCell) {
134
+ if (!dragCol || dragCol.id !== colid) {
135
+ if (scrollXLoad && tableColumn.length > 10 && !column.fixed && !virtualXOpts.immediate && (_columnIndex < scrollXStore.visibleStartIndex - scrollXStore.preloadSize || _columnIndex > scrollXStore.visibleEndIndex + scrollXStore.preloadSize)) {
136
+ isVNPreEmptyStatus = true
137
+ }
138
+ }
139
+ }
140
+
141
+ const tcStyle: Record<string, string> = {}
142
+ if (hasEllipsis) {
143
+ tcStyle.height = `${currCellHeight}px`
144
+ } else {
145
+ tcStyle.minHeight = `${currCellHeight}px`
146
+ }
147
+
148
+ if (showCustomHeader) {
149
+ // custom
150
+ } else if (isColGroup && !isLastRow) {
151
+ let childWidth = 0
152
+ XEUtils.eachTree(column.children, (childRow) => {
153
+ if (childRow.visible && (!childRow.children || !childRow.children.length)) {
154
+ childWidth += childRow.renderWidth
155
+ }
156
+ })
157
+ tcStyle.width = `${childWidth}px`
158
+ }
159
+
160
+ return h('th', {
161
+ class: ['vxe-table--column vxe-header--column', colid, fixedHiddenColumn ? 'fixed--hidden' : 'fixed--visible', {
162
+ [`col--${headAlign}`]: headAlign,
163
+ [`col--${type}`]: type,
164
+ 'col--last': isLastColumn,
165
+ 'col--fixed': column.fixed,
166
+ 'col--group': isColGroup,
167
+ 'col--ellipsis': hasEllipsis,
168
+ 'fixed--width': !isAutoCellWidth,
169
+ 'is--padding': isPadding,
170
+ 'is--sortable': column.sortable,
171
+ 'col--filter': !!filters,
172
+ 'is--filter-active': hasFilter,
173
+ 'is--drag-active': columnOpts.drag && !column.fixed && !isDisabledDrag && (isCrossDrag || isPeerDrag || !column.parentId),
174
+ 'is--drag-disabled': columnOpts.drag && isDisabledDrag,
175
+ 'col--current': currentColumn === column
176
+ }, getClass(headerClassName, cellParams), getClass(headerCellClassName, cellParams)],
177
+ attrs: thAttrs,
178
+ style: headerCellStyle ? (XEUtils.isFunction(headerCellStyle) ? headerCellStyle(cellParams) : headerCellStyle) as VxeComponentStyleType : undefined,
179
+ on: thOns,
180
+ key: showCustomHeader ? `${colid}${$columnIndex}` : (columnKey || scrollXLoad || scrollYLoad || columnOpts.useKey || columnOpts.drag || isColGroup ? colid : $columnIndex)
181
+ }, [
182
+ h('div', {
183
+ class: ['vxe-cell', {
184
+ 'c--title': showTitle,
185
+ 'c--tooltip': showTooltip,
186
+ 'c--ellipsis': showEllipsis
187
+ }],
188
+ style: tcStyle
189
+ }, isVNPreEmptyStatus || (isOptimizeMode && fixedHiddenColumn)
190
+ ? []
191
+ : [
192
+ h('div', {
193
+ attrs: {
194
+ colid
195
+ },
196
+ class: 'vxe-cell--wrapper vxe-header-cell--wrapper'
197
+ }, column.renderHeader(h, cellParams))
198
+ ]),
199
+ /**
200
+ * 列宽拖动
201
+ */
202
+ !fixedHiddenColumn && showResizable && (!showCustomHeader || isLastRow)
203
+ ? h('div', {
204
+ class: 'vxe-cell--col-resizable',
205
+ on: {
206
+ mousedown: (evnt: MouseEvent) => $xeTable.handleColResizeMousedownEvent(evnt, fixedType, cellParams),
207
+ dblclick: (evnt: MouseEvent) => $xeTable.handleColResizeDblclickEvent(evnt, cellParams)
208
+ }
209
+ })
210
+ : renderEmptyElement($xeTable)
211
+ ])
212
+ })
213
+ }
214
+
215
+ function renderFilterRows (h: CreateElement, _vm: any, isOptimizeMode: boolean, cols: VxeTableDefines.ColumnInfo[]) {
216
+ const props = _vm
217
+ const $xeTable = _vm.$parent as VxeTableConstructor & VxeTablePrivateMethods
218
+ const $xeGrid = $xeTable.$xeGrid
219
+ const $xeGantt = $xeTable.$xeGantt
220
+ const tableProps = $xeTable
221
+ const tableReactData = $xeTable as unknown as TableReactData
222
+ const tableInternalData = $xeTable as unknown as TableInternalData
223
+
224
+ const { fixedType } = props
225
+ const { showHeaderOverflow: allColumnHeaderOverflow, headerAlign: allHeaderAlign, align: allAlign } = tableProps
226
+ const { currentColumn, overflowX } = tableReactData
227
+ const { fullColumnIdData } = tableInternalData
228
+ const cellOpts = $xeTable.computeCellOpts
229
+ const defaultRowHeight = $xeTable.computeDefaultRowHeight
230
+ const headerCellOpts = $xeTable.computeHeaderCellOpts
231
+ const currCellHeight = getCalcHeight(headerCellOpts.height) || defaultRowHeight
232
+
233
+ return cols.map((column, $columnIndex) => {
234
+ const { type, showHeaderOverflow, headerAlign, align, filters, editRender, cellRender, floatingFilters, filterRender, slots } = column
235
+ const colid = column.id
236
+ const colRest = fullColumnIdData[colid] || {}
237
+ const renderOpts = editRender || cellRender
238
+ const compConf = renderOpts ? renderer.get(renderOpts.name) : null
239
+ const flCompConf = isEnableConf(filterRender) ? renderer.get(filterRender.name) : null
240
+ const rtFloatingFilter = flCompConf ? flCompConf.renderTableFloatingFilter : null
241
+ const flSlot = slots ? (slots.floatingFilter || slots['floating-filter']) : null
242
+ const fixedHiddenColumn = overflowX && (fixedType ? column.fixed !== fixedType : !!column.fixed)
243
+ const isPadding = XEUtils.isBoolean(headerCellOpts.padding) ? headerCellOpts.padding : cellOpts.padding
244
+ const headOverflow = XEUtils.eqNull(showHeaderOverflow) ? allColumnHeaderOverflow : showHeaderOverflow
245
+ const headAlign = headerAlign || (compConf ? compConf.tableHeaderCellAlign : '') || allHeaderAlign || align || (compConf ? compConf.tableCellAlign : '') || allAlign
246
+ const showEllipsis = headOverflow === 'ellipsis'
247
+ const showTitle = headOverflow === 'title'
248
+ const showTooltip = headOverflow === true || headOverflow === 'tooltip'
249
+ const hasEllipsis = showTitle || showTooltip || showEllipsis
250
+ let hasFilter = false
251
+ let firstFilterOption: VxeTableDefines.FilterOption | null = null
252
+ if (filters) {
253
+ firstFilterOption = filters[0] as VxeTableDefines.FilterOption
254
+ hasFilter = filters.some((item) => item.checked)
255
+ }
256
+ const columnIndex = colRest.index
257
+ const _columnIndex = colRest._index
258
+ const cellParams: VxeTableDefines.CellFloatingFilterParams & {
259
+ $table: VxeTableConstructor & VxeTablePrivateMethods
260
+ } = {
261
+ $table: $xeTable,
262
+ $grid: $xeGrid,
263
+ $gantt: $xeGantt,
264
+ column: column,
265
+ columnIndex,
266
+ $columnIndex,
267
+ _columnIndex,
268
+ option: firstFilterOption as VxeTableDefines.FilterOption,
269
+ fixed: fixedType,
270
+ source: sourceType,
271
+ type: renderType,
272
+ isHidden: fixedHiddenColumn,
273
+ hasFilter
274
+ }
275
+ const thAttrs: Record<string, string | number | null> = {
276
+ colid
277
+ }
278
+
279
+ const isLastColumn = $columnIndex === cols.length - 1
280
+ const isAutoCellWidth = !column.resizeWidth && (column.minWidth === 'auto' || column.width === 'auto')
281
+
282
+ const tcStyle: Record<string, string> = {}
283
+ if (hasEllipsis) {
284
+ tcStyle.height = `${currCellHeight}px`
285
+ } else {
286
+ tcStyle.minHeight = `${currCellHeight}px`
287
+ }
288
+
289
+ return h('th', {
290
+ class: ['vxe-table--column vxe-header--column', colid, fixedHiddenColumn ? 'fixed--hidden' : 'fixed--visible', {
291
+ [`col--${headAlign}`]: headAlign,
292
+ [`col--${type}`]: type,
293
+ 'col--last': isLastColumn,
294
+ 'col--fixed': column.fixed,
295
+ 'col--ellipsis': hasEllipsis,
296
+ 'fixed--width': !isAutoCellWidth,
297
+ 'is--padding': isPadding,
298
+ 'is--sortable': column.sortable,
299
+ 'col--current': currentColumn === column
300
+ }
301
+ ],
302
+ key: colid,
303
+ attrs: thAttrs
304
+ }, [
305
+ h('div', {
306
+ class: ['vxe-cell', {
307
+ 'c--title': showTitle,
308
+ 'c--tooltip': showTooltip,
309
+ 'c--ellipsis': showEllipsis
310
+ }],
311
+ style: tcStyle
312
+ }, isOptimizeMode && fixedHiddenColumn && !floatingFilters
313
+ ? []
314
+ : [
315
+ h('div', {
316
+ attrs: {
317
+ colid
318
+ },
319
+ class: 'vxe-cell--wrapper vxe-header-cell--wrapper'
320
+ }, flSlot
321
+ ? $xeTable.callSlot(flSlot, cellParams, h)
322
+ : (rtFloatingFilter && firstFilterOption
323
+ ? getSlotVNs(rtFloatingFilter.call($xeTable, h, filterRender, cellParams as unknown as VxeGlobalRendererHandles.RenderTableFloatingFilterParams))
324
+ : []))
325
+ ])
326
+ ])
327
+ })
328
+ }
329
+
330
+ function renderHeads (h: CreateElement, _vm: any, isGroup: boolean, isOptimizeMode: boolean, headerGroups: VxeTableDefines.ColumnInfo[][], renderColumnList: VxeTableDefines.ColumnInfo[]) {
331
+ const props = _vm
332
+ const $xeTable = _vm.$parent as VxeTableConstructor & VxeTablePrivateMethods
333
+ const tableProps = $xeTable
334
+
335
+ const { fixedType } = props
336
+
337
+ const { headerRowClassName, headerRowStyle } = tableProps
338
+ const floatingFilterOpts = $xeTable.computeFloatingFilterOpts
339
+ const rowVNs = headerGroups.map((cols, $rowIndex) => {
340
+ const params = { $table: $xeTable, $rowIndex, fixed: fixedType, type: renderType }
341
+ return h('tr', {
342
+ key: $rowIndex,
343
+ class: [
344
+ 'vxe-header--row',
345
+ headerRowClassName ? XEUtils.isFunction(headerRowClassName) ? headerRowClassName(params) : headerRowClassName : ''
346
+ ],
347
+ style: headerRowStyle ? (XEUtils.isFunction(headerRowStyle) ? headerRowStyle(params) : headerRowStyle) as VxeComponentStyleType : undefined
348
+ }, renderRows(h, _vm, isGroup, isOptimizeMode, headerGroups, $rowIndex, cols))
349
+ })
350
+
351
+ if (floatingFilterOpts.enabled) {
352
+ rowVNs.push(
353
+ h('tr', {
354
+ key: 'ff',
355
+ class: [
356
+ 'vxe-header--row'
357
+ ]
358
+ }, renderFilterRows(h, _vm, isOptimizeMode, renderColumnList))
359
+ )
360
+ }
361
+
362
+ return rowVNs
363
+ }
364
+
365
+ export default {
366
+ name: 'VxeTableHeader',
367
+ props: {
368
+ tableData: Array as PropType<any[]>,
369
+ tableColumn: Array as PropType<VxeTableDefines.ColumnInfo[]>,
370
+ tableGroupColumn: Array as PropType<VxeTableDefines.ColumnInfo[]>,
371
+ fixedColumn: Array as PropType<VxeTableDefines.ColumnInfo[]>,
372
+ fixedType: {
373
+ type: String as PropType<'right' | 'left' | ''>,
374
+ default: null
375
+ }
376
+ },
377
+ data () {
378
+ return {
379
+ headerColumn: []
380
+ }
381
+ },
382
+ watch: {
383
+ tableColumn () {
384
+ const _vm = this as any
385
+
386
+ _vm.uploadColumn()
387
+ }
388
+ },
389
+ created () {
390
+ const _vm = this as any
391
+ _vm.uploadColumn()
392
+ },
393
+ mounted () {
394
+ const _vm = this as any
395
+ const props = _vm
396
+ const $xeTable = _vm.$parent as VxeTableConstructor & VxeTablePrivateMethods
397
+ const internalData = $xeTable as unknown as TableInternalData
398
+
399
+ const { fixedType } = props
400
+ const { elemStore } = internalData
401
+ const prefix = `${fixedType || 'main'}-header-`
402
+ elemStore[`${prefix}wrapper`] = _vm.$refs.refElem
403
+ elemStore[`${prefix}scroll`] = _vm.$refs.refHeaderScroll
404
+ elemStore[`${prefix}table`] = _vm.$refs.refHeaderTable
405
+ elemStore[`${prefix}colgroup`] = _vm.$refs.refHeaderColgroup
406
+ elemStore[`${prefix}list`] = _vm.$refs.refHeaderTHead
407
+ elemStore[`${prefix}xSpace`] = _vm.$refs.refHeaderXSpace
408
+ elemStore[`${prefix}repair`] = _vm.$refs.refHeaderBorderRepair
409
+ },
410
+ destroyed () {
411
+ const _vm = this as any
412
+ const props = _vm
413
+ const $xeTable = _vm.$parent as VxeTableConstructor & VxeTablePrivateMethods
414
+ const internalData = $xeTable as unknown as TableInternalData
415
+
416
+ const { fixedType } = props
417
+ const { elemStore } = internalData
418
+ const prefix = `${fixedType || 'main'}-header-`
419
+ elemStore[`${prefix}wrapper`] = null
420
+ elemStore[`${prefix}scroll`] = null
421
+ elemStore[`${prefix}table`] = null
422
+ elemStore[`${prefix}colgroup`] = null
423
+ elemStore[`${prefix}list`] = null
424
+ elemStore[`${prefix}xSpace`] = null
425
+ elemStore[`${prefix}repair`] = null
426
+ },
427
+ render (h: CreateElement) {
428
+ const _vm = this as any
429
+ const props = _vm
430
+ const $xeTable = _vm.$parent as VxeTableConstructor & VxeTablePrivateMethods
431
+ const tableProps = $xeTable
432
+ const tableReactData = $xeTable as unknown as TableReactData
433
+ const tableInternalData = $xeTable as unknown as TableInternalData
434
+
435
+ const { xID } = $xeTable
436
+ const { fixedType, fixedColumn, tableColumn } = props
437
+ const { headerColumn } = _vm
438
+
439
+ const { mouseConfig } = tableProps
440
+ const { isGroup, isColLoading, overflowX, scrollXLoad, dragCol } = tableReactData
441
+ const { visibleColumn, fullColumnIdData } = tableInternalData
442
+
443
+ const mouseOpts = $xeTable.computeMouseOpts
444
+ const isHeaderRenderOptimize = $xeTable.computeIsHeaderRenderOptimize
445
+ let renderHeaderList = headerColumn as VxeTableDefines.ColumnInfo[][]
446
+ let renderColumnList = tableColumn as VxeTableDefines.ColumnInfo[]
447
+ const isOptimizeMode = isHeaderRenderOptimize
448
+
449
+ if (isGroup) {
450
+ renderColumnList = visibleColumn
451
+ } else {
452
+ if (!isOptimizeMode || (!isColLoading && (fixedType || !overflowX))) {
453
+ renderColumnList = visibleColumn
454
+ }
455
+
456
+ if (fixedType) {
457
+ // 如果是使用优化模式
458
+ if (isOptimizeMode) {
459
+ renderColumnList = fixedColumn || []
460
+ }
461
+ }
462
+ renderHeaderList = [renderColumnList]
463
+ }
464
+
465
+ if (!fixedType && !isGroup) {
466
+ // 列拖拽
467
+ if (scrollXLoad && dragCol) {
468
+ if (renderColumnList.length > 2) {
469
+ const dCowRest = fullColumnIdData[dragCol.id]
470
+ if (dCowRest) {
471
+ const dcIndex = dCowRest._index
472
+ const firstCol = renderColumnList[0]
473
+ const lastCol = renderColumnList[renderColumnList.length - 1]
474
+ const firstColRest = fullColumnIdData[firstCol.id]
475
+ const lastColRest = fullColumnIdData[lastCol.id]
476
+ if (firstColRest && lastColRest) {
477
+ const fcIndex = firstColRest._index
478
+ const lcIndex = lastColRest._index
479
+ if (dcIndex < fcIndex) {
480
+ renderColumnList = [dragCol].concat(renderColumnList)
481
+ renderHeaderList = [[dragCol].concat(renderHeaderList[0])].concat(renderHeaderList.slice(1))
482
+ } else if (dcIndex > lcIndex) {
483
+ renderColumnList = renderColumnList.concat([dragCol])
484
+ renderHeaderList = [renderHeaderList[0].concat([dragCol])].concat(renderHeaderList.slice(1))
485
+ }
486
+ }
487
+ }
488
+ }
489
+ }
490
+ }
491
+
492
+ return h('div', {
493
+ ref: 'refElem',
494
+ class: ['vxe-table--header-wrapper', fixedType ? `fixed-${fixedType}--wrapper` : 'body--wrapper'],
495
+ attrs: {
496
+ xid: xID
497
+ }
498
+ }, [
499
+ h('div', {
500
+ ref: 'refHeaderScroll',
501
+ class: 'vxe-table--header-inner-wrapper',
502
+ on: {
503
+ scroll (evnt: Event) {
504
+ $xeTable.triggerHeaderScrollEvent(evnt, fixedType)
505
+ }
506
+ }
507
+ }, [
508
+ fixedType
509
+ ? renderEmptyElement($xeTable)
510
+ : h('div', {
511
+ ref: 'refHeaderXSpace',
512
+ class: 'vxe-body--x-space'
513
+ }),
514
+ h('table', {
515
+ ref: 'refHeaderTable',
516
+ class: 'vxe-table--header',
517
+ attrs: {
518
+ xid: xID,
519
+ cellspacing: 0,
520
+ cellpadding: 0,
521
+ border: 0,
522
+ xvm: isOptimizeMode ? '1' : null
523
+ }
524
+ }, [
525
+ /**
526
+ * 列宽
527
+ */
528
+ h('colgroup', {
529
+ ref: 'refHeaderColgroup'
530
+ }, renderColumnList.map((column, $columnIndex) => {
531
+ return h('col', {
532
+ attrs: {
533
+ name: column.id
534
+ },
535
+ key: $columnIndex,
536
+ style: {
537
+ width: `${column.renderWidth}px`
538
+ }
539
+ })
540
+ })),
541
+ /**
542
+ * 头部
543
+ */
544
+ h('thead', {
545
+ ref: 'refHeaderTHead'
546
+ }, renderHeads(h, _vm, isGroup, isOptimizeMode, renderHeaderList, renderColumnList))
547
+ ]),
548
+ mouseConfig && mouseOpts.area
549
+ ? h('div', {
550
+ class: 'vxe-table--cell-area',
551
+ attrs: {
552
+ xid: xID
553
+ }
554
+ }, [
555
+ h('span', {
556
+ class: 'vxe-table--cell-main-area'
557
+ }),
558
+ h('span', {
559
+ class: 'vxe-table--cell-clip-area'
560
+ }),
561
+ h('span', {
562
+ class: 'vxe-table--cell-extend-area'
563
+ }),
564
+ h('span', {
565
+ class: 'vxe-table--cell-multi-area'
566
+ }),
567
+ h('span', {
568
+ class: 'vxe-table--cell-active-area'
569
+ }),
570
+ h('span', {
571
+ class: 'vxe-table--cell-col-status-area'
572
+ })
573
+ ])
574
+ : renderEmptyElement($xeTable)
575
+ ])
576
+ ])
577
+ },
578
+ methods: {
579
+ uploadColumn () {
580
+ const _vm = this as any
581
+ const $xeTable = _vm.$parent as VxeTableConstructor & VxeTablePrivateMethods
582
+ const tableProps = $xeTable
583
+ const tableReactData = $xeTable as unknown as TableReactData
584
+ const tableInternalData = $xeTable as unknown as TableInternalData
585
+
586
+ const props = _vm
587
+
588
+ const { showCustomHeader } = tableProps
589
+ const { collectColumn, visibleColumn } = tableInternalData
590
+ const { tableGroupColumn } = props
591
+ const { isGroup } = tableReactData
592
+ let spanColumns: VxeTableDefines.ColumnInfo[][] = isGroup ? convertHeaderColumnToRows(tableGroupColumn) : []
593
+ let visibleColgroups: VxeTableDefines.ColumnInfo[][] = []
594
+ if (showCustomHeader && spanColumns.length > 1) {
595
+ visibleColgroups = convertHeaderToGridRows(spanColumns)
596
+ spanColumns = visibleColgroups
597
+ }
598
+ _vm.headerColumn = spanColumns
599
+ $xeTable.dispatchEvent('columns-change', { visibleColgroups, collectColumn, visibleColumn }, null)
600
+ }
601
+ }
602
+ }