vxe-table 4.23.7 → 4.23.9

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 (148) hide show
  1. package/dist/all.esm.js +5859 -4018
  2. package/es/colgroup/index.js +1 -1
  3. package/es/column/index.js +1 -1
  4. package/es/components.d.ts +3 -0
  5. package/es/components.js +4 -8
  6. package/es/grid/index.js +1 -1
  7. package/es/grid/src/emits.js +1 -15
  8. package/es/grid/src/grid.js +398 -121
  9. package/es/grid/src/props.js +1 -1
  10. package/es/index.esm.js +6 -0
  11. package/es/index.js +6 -0
  12. package/es/table/index.js +1 -1
  13. package/es/table/module/custom/hook.js +50 -43
  14. package/es/table/module/custom/panel.js +778 -528
  15. package/es/table/module/edit/hook.js +141 -63
  16. package/es/table/module/export/export-panel.js +400 -317
  17. package/es/table/module/export/hook.js +396 -338
  18. package/es/table/module/export/import-panel.js +153 -124
  19. package/es/table/module/filter/hook.js +17 -3
  20. package/es/table/module/filter/panel.js +147 -85
  21. package/es/table/module/keyboard/hook.js +9 -5
  22. package/es/table/module/menu/hook.js +1 -1
  23. package/es/table/module/menu/panel.js +198 -127
  24. package/es/table/module/validator/hook.js +1 -1
  25. package/es/table/render/index.js +152 -99
  26. package/es/table/src/body.js +356 -234
  27. package/es/table/src/cell.js +427 -270
  28. package/es/table/src/columnInfo.js +2 -1
  29. package/es/table/src/footer.js +145 -100
  30. package/es/table/src/group.js +7 -3
  31. package/es/table/src/header.js +230 -173
  32. package/es/table/src/props.js +1 -1
  33. package/es/table/src/table.js +1504 -1031
  34. package/es/table/src/util.js +15 -19
  35. package/es/toolbar/index.js +1 -1
  36. package/es/toolbar/src/toolbar.js +133 -76
  37. package/es/ui/index.d.ts +0 -1
  38. package/es/ui/index.js +1 -2
  39. package/es/ui/src/dom.js +9 -6
  40. package/es/ui/src/log.js +1 -1
  41. package/es/ui/src/utils.d.ts +1 -1
  42. package/es/v-x-e-table/index.d.ts +0 -1
  43. package/es/v-x-e-table/index.js +0 -1
  44. package/lib/colgroup/index.js +5 -5
  45. package/lib/column/index.js +5 -5
  46. package/lib/components.js +8 -12
  47. package/lib/grid/index.js +4 -4
  48. package/lib/grid/src/emits.js +1 -15
  49. package/lib/grid/src/grid.js +419 -142
  50. package/lib/grid/src/props.js +2 -2
  51. package/lib/index.common.js +6 -0
  52. package/lib/index.js +6 -0
  53. package/lib/index.umd.js +5825 -3945
  54. package/lib/index.umd.min.js +3 -3
  55. package/lib/table/index.js +5 -5
  56. package/lib/table/module/custom/hook.js +51 -44
  57. package/lib/table/module/custom/panel.js +790 -540
  58. package/lib/table/module/edit/hook.js +142 -64
  59. package/lib/table/module/export/export-panel.js +406 -323
  60. package/lib/table/module/export/hook.js +419 -361
  61. package/lib/table/module/export/import-panel.js +157 -128
  62. package/lib/table/module/filter/hook.js +18 -4
  63. package/lib/table/module/filter/panel.js +149 -87
  64. package/lib/table/module/keyboard/hook.js +10 -6
  65. package/lib/table/module/menu/hook.js +2 -2
  66. package/lib/table/module/menu/panel.js +199 -128
  67. package/lib/table/module/validator/hook.js +2 -2
  68. package/lib/table/render/index.js +153 -100
  69. package/lib/table/src/body.js +357 -235
  70. package/lib/table/src/cell.js +428 -271
  71. package/lib/table/src/columnInfo.js +3 -2
  72. package/lib/table/src/footer.js +146 -101
  73. package/lib/table/src/group.js +7 -3
  74. package/lib/table/src/header.js +231 -174
  75. package/lib/table/src/props.js +2 -2
  76. package/lib/table/src/table.js +1487 -1045
  77. package/lib/table/src/util.js +15 -19
  78. package/lib/toolbar/index.js +4 -4
  79. package/lib/toolbar/src/toolbar.js +135 -78
  80. package/lib/ui/index.js +1 -3
  81. package/lib/ui/src/dom.js +9 -6
  82. package/lib/ui/src/log.js +1 -1
  83. package/lib/v-x-e-table/index.js +0 -2
  84. package/package.json +8 -3
  85. package/packages/colgroup/index.ts +22 -22
  86. package/packages/column/index.ts +22 -22
  87. package/packages/components.ts +41 -43
  88. package/packages/grid/index.ts +18 -18
  89. package/packages/grid/src/emits.ts +5 -19
  90. package/packages/grid/src/grid.ts +2229 -1925
  91. package/packages/grid/src/props.ts +22 -23
  92. package/packages/index.ts +11 -4
  93. package/packages/locale/lang/fr-FR.ts +15 -15
  94. package/packages/locale/lang/it-IT.ts +4 -4
  95. package/packages/locale/lang/uk-UA.ts +1 -1
  96. package/packages/locale/lang/uz-UZ.ts +13 -13
  97. package/packages/locale/lang/zh-CN.ts +907 -907
  98. package/packages/table/index.ts +26 -26
  99. package/packages/table/module/custom/hook.ts +510 -503
  100. package/packages/table/module/custom/panel.ts +2002 -1743
  101. package/packages/table/module/edit/hook.ts +1224 -1131
  102. package/packages/table/module/export/export-panel.ts +697 -611
  103. package/packages/table/module/export/hook.ts +2160 -2059
  104. package/packages/table/module/export/import-panel.ts +319 -279
  105. package/packages/table/module/export/util.ts +25 -24
  106. package/packages/table/module/filter/hook.ts +519 -501
  107. package/packages/table/module/filter/panel.ts +368 -304
  108. package/packages/table/module/keyboard/hook.ts +498 -494
  109. package/packages/table/module/menu/hook.ts +330 -330
  110. package/packages/table/module/menu/panel.ts +272 -201
  111. package/packages/table/module/validator/hook.ts +653 -635
  112. package/packages/table/render/index.ts +1819 -1744
  113. package/packages/table/src/body.ts +1078 -955
  114. package/packages/table/src/cell.ts +1524 -1359
  115. package/packages/table/src/column.ts +192 -192
  116. package/packages/table/src/columnInfo.ts +232 -232
  117. package/packages/table/src/emits.ts +134 -134
  118. package/packages/table/src/footer.ts +425 -380
  119. package/packages/table/src/group.ts +67 -63
  120. package/packages/table/src/header.ts +642 -581
  121. package/packages/table/src/props.ts +336 -336
  122. package/packages/table/src/store.ts +14 -14
  123. package/packages/table/src/table.ts +16011 -15454
  124. package/packages/table/src/use/cell-view.ts +41 -44
  125. package/packages/table/src/use/index.ts +1 -1
  126. package/packages/table/src/util.ts +1206 -1216
  127. package/packages/toolbar/index.ts +18 -18
  128. package/packages/toolbar/src/toolbar.ts +768 -706
  129. package/packages/ui/index.ts +519 -521
  130. package/packages/ui/src/anime.ts +51 -52
  131. package/packages/ui/src/comp.ts +3 -3
  132. package/packages/ui/src/dom.ts +466 -463
  133. package/packages/ui/src/log.ts +19 -19
  134. package/packages/ui/src/utils.ts +66 -66
  135. package/packages/ui/src/vn.ts +55 -55
  136. package/packages/v-x-e-table/index.d.ts +3 -4
  137. package/packages/v-x-e-table/index.ts +3 -4
  138. package/types/all.d.ts +76 -76
  139. package/types/index.d.ts +4 -4
  140. /package/dist/{iconfont.1792979665397.ttf → iconfont.1793009263429.ttf} +0 -0
  141. /package/dist/{iconfont.1792979665397.woff → iconfont.1793009263429.woff} +0 -0
  142. /package/dist/{iconfont.1792979665397.woff2 → iconfont.1793009263429.woff2} +0 -0
  143. /package/es/{iconfont.1792979665397.ttf → iconfont.1793009263429.ttf} +0 -0
  144. /package/es/{iconfont.1792979665397.woff → iconfont.1793009263429.woff} +0 -0
  145. /package/es/{iconfont.1792979665397.woff2 → iconfont.1793009263429.woff2} +0 -0
  146. /package/lib/{iconfont.1792979665397.ttf → iconfont.1793009263429.ttf} +0 -0
  147. /package/lib/{iconfont.1792979665397.woff → iconfont.1793009263429.woff} +0 -0
  148. /package/lib/{iconfont.1792979665397.woff2 → iconfont.1793009263429.woff2} +0 -0
@@ -1,494 +1,498 @@
1
- import XEUtils from 'xe-utils'
2
- import { VxeUI } from '../../../ui'
3
- import { getRefElem } from '../../src/util'
4
- import { getAbsolutePos, addClass, removeClass, hasControlKey } from '../../../ui/src/dom'
5
- import { hasEnableConf } from '../../../ui/src/utils'
6
-
7
- import type { TableKeyboardPrivateMethods, VxeTableDefines } from '../../../../types'
8
-
9
- const { hooks } = VxeUI
10
-
11
- hooks.add('tableKeyboardModule', {
12
- setupTable ($xeTable) {
13
- const { props, reactData, internalData } = $xeTable
14
- const { refElem, refTableBody } = $xeTable.getRefMaps()
15
- const { computeEditOpts, computeCheckboxOpts, computeMouseOpts, computeTreeOpts, computeRowOpts, computeColumnOpts, computeCellOpts, computeDefaultRowHeight, computeCurrentRowOpts, computeCurrentColumnOpts } = $xeTable.getComputeMaps()
16
-
17
- function getCheckboxRangeRows (evnt: MouseEvent, params: any, targetTrElem: HTMLElement, trRect: DOMRect, offsetClientTop: number, moveRange: number) {
18
- const { showOverflow } = props
19
- const { fullAllDataRowIdData, isResizeCellHeight } = internalData
20
- const rowOpts = computeRowOpts.value
21
- const cellOpts = computeCellOpts.value
22
- const defaultRowHeight = computeDefaultRowHeight.value
23
- const { row } = params
24
- let countHeight = 0
25
- let rangeRows: any[] = []
26
- let moveSize = 0
27
- const isDown = moveRange > 0
28
- const { scrollYLoad } = reactData
29
- const { afterFullData } = internalData
30
- if (isDown) {
31
- moveSize = offsetClientTop + moveRange
32
- } else {
33
- moveSize = (trRect.height - offsetClientTop) + Math.abs(moveRange)
34
- }
35
- if (scrollYLoad) {
36
- const _rowIndex = $xeTable.getVTRowIndex(row)
37
- const isCustomCellHeight = isResizeCellHeight || cellOpts.height || rowOpts.height
38
- if (!isCustomCellHeight && showOverflow) {
39
- if (isDown) {
40
- rangeRows = afterFullData.slice(_rowIndex, _rowIndex + Math.ceil(moveSize / defaultRowHeight))
41
- } else {
42
- rangeRows = afterFullData.slice(_rowIndex - Math.floor(moveSize / defaultRowHeight), _rowIndex + 1)
43
- }
44
- } else {
45
- if (isDown) {
46
- for (let i = _rowIndex; i < afterFullData.length; i++) {
47
- const item = afterFullData[i]
48
- const rowid = $xeTable.getRowid(item)
49
- const rowRest = fullAllDataRowIdData[rowid] || {}
50
- countHeight += rowRest.resizeHeight || cellOpts.height || rowOpts.height || rowRest.height || defaultRowHeight
51
- rangeRows.push(item)
52
- if (countHeight > moveSize) {
53
- return rangeRows
54
- }
55
- }
56
- } else {
57
- for (let len = _rowIndex; len >= 0; len--) {
58
- const item = afterFullData[len]
59
- const rowid = $xeTable.getRowid(item)
60
- const rowRest = fullAllDataRowIdData[rowid] || {}
61
- countHeight += rowRest.resizeHeight || cellOpts.height || rowOpts.height || rowRest.height || defaultRowHeight
62
- rangeRows.push(item)
63
- if (countHeight > moveSize) {
64
- return rangeRows
65
- }
66
- }
67
- }
68
- }
69
- } else {
70
- const siblingProp = isDown ? 'next' : 'previous'
71
- while (targetTrElem && countHeight < moveSize) {
72
- const rowNodeRest = $xeTable.getRowNode(targetTrElem)
73
- if (rowNodeRest) {
74
- rangeRows.push(rowNodeRest.item)
75
- countHeight += targetTrElem.offsetHeight
76
- targetTrElem = targetTrElem[`${siblingProp}ElementSibling`] as HTMLElement
77
- }
78
- }
79
- }
80
- return rangeRows
81
- }
82
-
83
- const handleCheckboxRangeEvent = (evnt: any, params: any) => {
84
- const { elemStore } = internalData
85
- const bodyScrollElem = getRefElem(elemStore['main-body-scroll'])
86
- const leftScrollElem = getRefElem(elemStore['left-body-scroll'])
87
- const rightScrollElem = getRefElem(elemStore['right-body-scroll'])
88
- const { column, cell } = params
89
- if (column.type === 'checkbox') {
90
- let bodyWrapperElem = bodyScrollElem as HTMLElement
91
- if (leftScrollElem && column.fixed === 'left') {
92
- bodyWrapperElem = leftScrollElem
93
- } else if (rightScrollElem && column.fixed === 'right') {
94
- bodyWrapperElem = rightScrollElem
95
- }
96
- if (!bodyWrapperElem) {
97
- return
98
- }
99
- const bodyRect = bodyWrapperElem.getBoundingClientRect()
100
- const el = refElem.value
101
- const disX = evnt.clientX
102
- const disY = evnt.clientY
103
- const checkboxRangeElem = bodyWrapperElem.querySelector('.vxe-table--checkbox-range') as HTMLElement
104
- const trElem = cell.parentElement as HTMLElement
105
- const selectRecords = $xeTable.getCheckboxRecords()
106
- let lastRangeRows: any[] = []
107
- const marginSize = 1
108
- const startTop = evnt.clientY - bodyRect.y + bodyWrapperElem.scrollTop
109
- const startLeft = evnt.clientX - bodyRect.x + bodyWrapperElem.scrollLeft
110
- const startScrollTop = bodyWrapperElem.scrollTop
111
- const rowHeight = trElem.offsetHeight
112
- const trRect = trElem.getBoundingClientRect()
113
- const offsetClientTop = disY - trRect.y
114
- let mouseScrollTimeout: any = null
115
- let isMouseScrollDown: any = false
116
- let mouseScrollSpaceSize = 1
117
- const triggerEvent = (type: 'change' | 'start' | 'end', evnt: MouseEvent) => {
118
- $xeTable.dispatchEvent(`checkbox-range-${type}` as 'checkbox-range-change' | 'checkbox-range-start' | 'checkbox-range-end', {
119
- records: () => $xeTable.getCheckboxRecords(),
120
- reserves: () => $xeTable.getCheckboxReserveRecords()
121
- }, evnt)
122
- }
123
- const handleChecked = (evnt: MouseEvent) => {
124
- const { clientX, clientY } = evnt
125
- const offsetLeft = clientX - disX
126
- const offsetTop = clientY - disY + (bodyWrapperElem.scrollTop - startScrollTop)
127
- let rangeHeight = Math.abs(offsetTop)
128
- let rangeWidth = Math.abs(offsetLeft)
129
- let rangeTop = startTop
130
- let rangeLeft = startLeft
131
-
132
- if (offsetTop < marginSize) {
133
- // 向上
134
- rangeTop += offsetTop
135
- if (rangeTop < marginSize) {
136
- rangeTop = marginSize
137
- rangeHeight = startTop
138
- }
139
- } else {
140
- // 向下
141
- rangeHeight = Math.min(rangeHeight, bodyWrapperElem.scrollHeight - startTop - marginSize)
142
- }
143
- if (offsetLeft < marginSize) {
144
- // 向左
145
- rangeLeft += offsetLeft
146
- if (rangeWidth > startLeft) {
147
- rangeLeft = marginSize
148
- rangeWidth = startLeft
149
- }
150
- } else {
151
- // 向右
152
- rangeWidth = Math.min(rangeWidth, bodyWrapperElem.clientWidth - startLeft - marginSize)
153
- }
154
- checkboxRangeElem.style.height = `${rangeHeight}px`
155
- checkboxRangeElem.style.width = `${rangeWidth}px`
156
- checkboxRangeElem.style.left = `${rangeLeft}px`
157
- checkboxRangeElem.style.top = `${rangeTop}px`
158
- checkboxRangeElem.style.display = 'block'
159
- const rangeRows = getCheckboxRangeRows(evnt, params, trElem, trRect, offsetClientTop, offsetTop < marginSize ? -rangeHeight : rangeHeight)
160
- // 至少滑动 10px 才能有效匹配
161
- if (rangeHeight > 10 && rangeRows.length !== lastRangeRows.length) {
162
- const isControlKey = hasControlKey(evnt)
163
- lastRangeRows = rangeRows
164
- if (isControlKey) {
165
- rangeRows.forEach((row: any) => {
166
- $xeTable.handleBatchSelectRows([row], selectRecords.indexOf(row) === -1)
167
- })
168
- } else {
169
- $xeTable.setAllCheckboxRow(false)
170
- $xeTable.handleCheckedCheckboxRow(rangeRows, true, false)
171
- }
172
- triggerEvent('change', evnt)
173
- }
174
- }
175
- // 停止鼠标滚动
176
- const stopMouseScroll = () => {
177
- clearTimeout(mouseScrollTimeout)
178
- mouseScrollTimeout = null
179
- }
180
- // 开始鼠标滚动
181
- const startMouseScroll = (evnt: MouseEvent) => {
182
- stopMouseScroll()
183
- mouseScrollTimeout = setTimeout(() => {
184
- if (mouseScrollTimeout) {
185
- const { scrollLeft, scrollTop, clientHeight, scrollHeight } = bodyWrapperElem
186
- const topSize = Math.ceil(mouseScrollSpaceSize * 50 / rowHeight)
187
- if (isMouseScrollDown) {
188
- if (scrollTop + clientHeight < scrollHeight) {
189
- $xeTable.scrollTo(scrollLeft, scrollTop + topSize)
190
- startMouseScroll(evnt)
191
- handleChecked(evnt)
192
- } else {
193
- stopMouseScroll()
194
- }
195
- } else {
196
- if (scrollTop) {
197
- $xeTable.scrollTo(scrollLeft, scrollTop - topSize)
198
- startMouseScroll(evnt)
199
- handleChecked(evnt)
200
- } else {
201
- stopMouseScroll()
202
- }
203
- }
204
- }
205
- }, 50)
206
- }
207
- addClass(el, 'drag--range')
208
- document.onmousemove = evnt => {
209
- evnt.preventDefault()
210
- evnt.stopPropagation()
211
- const { clientY } = evnt
212
- const { boundingTop } = getAbsolutePos(bodyWrapperElem)
213
- // 如果超过可视区,触发滚动
214
- if (clientY < boundingTop) {
215
- isMouseScrollDown = false
216
- mouseScrollSpaceSize = boundingTop - clientY
217
- if (!mouseScrollTimeout) {
218
- startMouseScroll(evnt)
219
- }
220
- } else if (clientY > boundingTop + bodyWrapperElem.clientHeight) {
221
- isMouseScrollDown = true
222
- mouseScrollSpaceSize = clientY - boundingTop - bodyWrapperElem.clientHeight
223
- if (!mouseScrollTimeout) {
224
- startMouseScroll(evnt)
225
- }
226
- } else if (mouseScrollTimeout) {
227
- stopMouseScroll()
228
- }
229
- handleChecked(evnt)
230
- }
231
- document.onmouseup = (evnt) => {
232
- stopMouseScroll()
233
- removeClass(el, 'drag--range')
234
- checkboxRangeElem.removeAttribute('style')
235
- document.onmousemove = null
236
- document.onmouseup = null
237
- triggerEvent('end', evnt)
238
- }
239
- triggerEvent('start', evnt)
240
- }
241
- }
242
-
243
- const handleCellMousedownEvent = (evnt: any, params: any) => {
244
- const { editConfig, checkboxConfig, mouseConfig } = props
245
- const checkboxOpts = computeCheckboxOpts.value
246
- const mouseOpts = computeMouseOpts.value
247
- const editOpts = computeEditOpts.value
248
- if (hasEnableConf(mouseConfig, mouseOpts) && mouseOpts.area && $xeTable.triggerClAaMnEvent) {
249
- return $xeTable.triggerClAaMnEvent(evnt, params)
250
- } else {
251
- if (checkboxConfig && checkboxOpts.range) {
252
- handleCheckboxRangeEvent(evnt, params)
253
- }
254
- if (hasEnableConf(mouseConfig, mouseOpts) && mouseOpts.selected) {
255
- if (!editConfig || editOpts.mode === 'cell') {
256
- $xeTable.handleSelected(params, evnt)
257
- }
258
- }
259
- }
260
- }
261
-
262
- const handleMoveSelected = (evnt: any, args: any, isLeftArrow: boolean, isUpArrow: boolean, isRightArrow: boolean, isDwArrow: boolean) => {
263
- const { afterFullData, visibleColumn } = internalData
264
- const params = Object.assign({}, args)
265
- const { row, column } = params
266
- const _rowIndex = $xeTable.getVTRowIndex(row)
267
- const _columnIndex = $xeTable.getVTColumnIndex(column)
268
- const tableBody = refTableBody.value
269
- const tableBodyElem = tableBody ? tableBody.$el as HTMLDivElement : null
270
- const tableWidth = tableBodyElem ? tableBodyElem.clientWidth : 0
271
- let colAlign = isLeftArrow || isRightArrow || (column.renderWidth < tableWidth)
272
- if ((isLeftArrow && _columnIndex >= 0) || (isRightArrow && _columnIndex <= visibleColumn.length - 1)) {
273
- colAlign = false
274
- } else {
275
- evnt.preventDefault()
276
- }
277
- if (isUpArrow && _rowIndex > 0) {
278
- // 移动到上一行
279
- params.rowIndex = _rowIndex - 1
280
- params.row = afterFullData[params.rowIndex]
281
- } else if (isDwArrow && _rowIndex < afterFullData.length - 1) {
282
- // 移动到下一行
283
- params.rowIndex = _rowIndex + 1
284
- params.row = afterFullData[params.rowIndex]
285
- } else if (isLeftArrow && _columnIndex) {
286
- // 移动到左侧单元格
287
- params.columnIndex = _columnIndex - 1
288
- params.column = visibleColumn[params.columnIndex]
289
- } else if (isRightArrow && _columnIndex < visibleColumn.length - 1) {
290
- // 移动到右侧单元格
291
- params.columnIndex = _columnIndex + 1
292
- params.column = visibleColumn[params.columnIndex]
293
- }
294
- $xeTable.scrollToRow(params.row, params.column, {
295
- colAlign
296
- }).then(() => {
297
- params.cell = $xeTable.getCellElement(params.row, params.column)
298
- $xeTable.handleSelected(params, evnt)
299
- })
300
- return params
301
- }
302
-
303
- const keyboardMethods: TableKeyboardPrivateMethods = {
304
- // 处理 Tab 键移动
305
- moveTabSelected (args, isLeft, evnt) {
306
- const { editConfig } = props
307
- const { afterFullData, visibleColumn } = internalData
308
- const editOpts = computeEditOpts.value
309
- const rowOpts = computeRowOpts.value
310
- const currentRowOpts = computeCurrentRowOpts.value
311
- const columnOpts = computeColumnOpts.value
312
- const currentColumnOpts = computeCurrentColumnOpts.value
313
- let targetRow: any
314
- let targetRowIndex: any
315
- let targetColumnIndex: any
316
- const params = Object.assign({}, args)
317
- const _rowIndex = $xeTable.getVTRowIndex(params.row)
318
- const _columnIndex = $xeTable.getVTColumnIndex(params.column)
319
- evnt.preventDefault()
320
- if (isLeft) {
321
- // 向左
322
- if (_columnIndex <= 0) {
323
- // 如果已经是第一列,则移动到上一行
324
- if (_rowIndex > 0) {
325
- targetRowIndex = _rowIndex - 1
326
- targetRow = afterFullData[targetRowIndex]
327
- targetColumnIndex = visibleColumn.length - 1
328
- }
329
- } else {
330
- targetColumnIndex = _columnIndex - 1
331
- }
332
- } else {
333
- if (_columnIndex >= visibleColumn.length - 1) {
334
- // 如果已经是第一列,则移动到上一行
335
- if (_rowIndex < afterFullData.length - 1) {
336
- targetRowIndex = _rowIndex + 1
337
- targetRow = afterFullData[targetRowIndex]
338
- targetColumnIndex = 0
339
- }
340
- } else {
341
- targetColumnIndex = _columnIndex + 1
342
- }
343
- }
344
- const targetColumn = visibleColumn[targetColumnIndex]
345
- if (targetColumn) {
346
- if (targetRow) {
347
- params.rowIndex = targetRowIndex
348
- params.row = targetRow
349
- } else {
350
- params.rowIndex = _rowIndex
351
- }
352
- params.columnIndex = targetColumnIndex
353
- params.column = targetColumn
354
- params.cell = $xeTable.getCellElement(params.row, params.column)
355
- if (rowOpts.isCurrent && currentRowOpts.isFollowSelected) {
356
- $xeTable.triggerCurrentRowEvent(evnt, params)
357
- }
358
- if (columnOpts.isCurrent && currentColumnOpts.isFollowSelected) {
359
- $xeTable.triggerCurrentColumnEvent(evnt, params)
360
- }
361
- if (editConfig) {
362
- if (editOpts.trigger === 'click' || editOpts.trigger === 'dblclick') {
363
- if (editOpts.mode === 'row') {
364
- $xeTable.handleEdit(params, evnt)
365
- } else {
366
- $xeTable.scrollToRow(params.row, params.column).then(() => {
367
- $xeTable.handleSelected(params, evnt)
368
- })
369
- }
370
- }
371
- } else {
372
- $xeTable.scrollToRow(params.row, params.column).then(() => {
373
- $xeTable.handleSelected(params, evnt)
374
- })
375
- }
376
- }
377
- },
378
- // 处理当前行方向键移动
379
- moveCurrentRow (isUpArrow, isDwArrow, evnt) {
380
- const { treeConfig } = props
381
- const { afterFullData, currentRow } = internalData
382
- const treeOpts = computeTreeOpts.value
383
- const childrenField = treeOpts.children || treeOpts.childrenField
384
- let targetRow
385
- if (currentRow) {
386
- if (treeConfig) {
387
- const { index, items } = XEUtils.findTree(afterFullData, item => item === currentRow, { children: childrenField })
388
- if (isUpArrow && index > 0) {
389
- targetRow = items[index - 1]
390
- } else if (isDwArrow && index < items.length - 1) {
391
- targetRow = items[index + 1]
392
- }
393
- } else {
394
- const _rowIndex = $xeTable.getVTRowIndex(currentRow)
395
- if (isUpArrow && _rowIndex > 0) {
396
- targetRow = afterFullData[_rowIndex - 1]
397
- } else if (isDwArrow && _rowIndex < afterFullData.length - 1) {
398
- targetRow = afterFullData[_rowIndex + 1]
399
- }
400
- }
401
- } else {
402
- targetRow = afterFullData[0]
403
- }
404
- if (targetRow) {
405
- evnt.preventDefault()
406
- const params = {
407
- $table: $xeTable,
408
- row: targetRow,
409
- rowIndex: $xeTable.getRowIndex(targetRow),
410
- $rowIndex: $xeTable.getVMRowIndex(targetRow)
411
- }
412
- $xeTable.scrollToRow(targetRow)
413
- .then(() => $xeTable.triggerCurrentRowEvent(evnt, params))
414
- }
415
- },
416
- // 处理当前列方向键移动
417
- moveCurrentColumn (isLeftArrow, isRightArrow, evnt) {
418
- const { currentCol, visibleColumn } = internalData
419
- let targetCol: VxeTableDefines.ColumnInfo | null = null
420
- if (currentCol) {
421
- const _columnIndex = $xeTable.getVTColumnIndex(currentCol)
422
- if (isLeftArrow && _columnIndex > 0) {
423
- targetCol = visibleColumn[_columnIndex - 1]
424
- } else if (isRightArrow && _columnIndex < visibleColumn.length - 1) {
425
- targetCol = visibleColumn[_columnIndex + 1]
426
- }
427
- } else {
428
- targetCol = visibleColumn[0]
429
- }
430
- if (targetCol) {
431
- evnt.preventDefault()
432
- const params = {
433
- $table: $xeTable,
434
- column: targetCol,
435
- columnIndex: $xeTable.getColumnIndex(targetCol),
436
- $columnIndex: $xeTable.getVMColumnIndex(targetCol)
437
- }
438
- $xeTable.scrollToColumn(targetCol)
439
- .then(() => $xeTable.triggerCurrentColumnEvent(evnt, params))
440
- }
441
- },
442
- // 处理可编辑方向键移动
443
- moveArrowSelected (args, isLeftArrow, isUpArrow, isRightArrow, isDwArrow, evnt) {
444
- const { highlightCurrentRow, highlightCurrentColumn } = props
445
- const rowOpts = computeRowOpts.value
446
- const currentRowOpts = computeCurrentRowOpts.value
447
- const columnOpts = computeColumnOpts.value
448
- const currentColumnOpts = computeCurrentColumnOpts.value
449
- const params = handleMoveSelected(evnt, args, isLeftArrow, isUpArrow, isRightArrow, isDwArrow)
450
- if (rowOpts.isCurrent || highlightCurrentRow) {
451
- if (currentRowOpts.isFollowSelected) {
452
- $xeTable.triggerCurrentRowEvent(evnt, params)
453
- } else {
454
- // 当前行按键上下移动
455
- if ((isUpArrow || isDwArrow) && (rowOpts.isCurrent || highlightCurrentRow)) {
456
- $xeTable.moveCurrentRow(isUpArrow, isDwArrow, evnt)
457
- }
458
- }
459
- }
460
- if (columnOpts.isCurrent || highlightCurrentColumn) {
461
- if (currentColumnOpts.isFollowSelected) {
462
- $xeTable.triggerCurrentColumnEvent(evnt, params)
463
- } else {
464
- // 当前行按键左右移动
465
- if ((isLeftArrow || isRightArrow) && (columnOpts.isCurrent || highlightCurrentColumn)) {
466
- $xeTable.moveCurrentColumn(isLeftArrow, isRightArrow, evnt)
467
- }
468
- }
469
- }
470
- },
471
- moveEnterSelected (args, isLeftArrow, isUpArrow, isRightArrow, isDwArrow, evnt) {
472
- const { highlightCurrentRow, highlightCurrentColumn } = props
473
- const rowOpts = computeRowOpts.value
474
- const currentRowOpts = computeCurrentRowOpts.value
475
- const columnOpts = computeColumnOpts.value
476
- const currentColumnOpts = computeCurrentColumnOpts.value
477
- const params = handleMoveSelected(evnt, args, isLeftArrow, isUpArrow, isRightArrow, isDwArrow)
478
- if (((rowOpts.isCurrent || highlightCurrentRow) && currentRowOpts.isFollowSelected)) {
479
- $xeTable.triggerCurrentRowEvent(evnt, params)
480
- }
481
- if ((columnOpts.isCurrent || highlightCurrentColumn) && currentColumnOpts.isFollowSelected) {
482
- $xeTable.triggerCurrentColumnEvent(evnt, params)
483
- }
484
- },
485
- // 已废弃,待删除
486
- moveSelected (args, isLeftArrow, isUpArrow, isRightArrow, isDwArrow, evnt) {
487
- handleMoveSelected(evnt, args, isLeftArrow, isUpArrow, isRightArrow, isDwArrow)
488
- },
489
- handleCellMousedownEvent
490
- }
491
-
492
- return keyboardMethods
493
- }
494
- })
1
+ import XEUtils from 'xe-utils'
2
+ import { VxeUI } from '@vxe-ui/core'
3
+ import { getRefElem } from '../../src/util'
4
+ import { getAbsolutePos, addClass, removeClass, hasControlKey } from '../../../ui/src/dom'
5
+ import { hasEnableConf } from '../../../ui/src/utils'
6
+
7
+ import type { TableKeyboardPrivateMethods, VxeTableDefines } from '../../../../types'
8
+
9
+ const { hooks } = VxeUI
10
+
11
+ hooks.add('tableKeyboardModule', {
12
+ setupTable($xeTable) {
13
+ const { props, reactData, internalData } = $xeTable
14
+ const { refElem, refTableBody } = $xeTable.getRefMaps()
15
+ const { computeEditOpts, computeCheckboxOpts, computeMouseOpts, computeTreeOpts, computeRowOpts, computeColumnOpts, computeCellOpts, computeDefaultRowHeight, computeCurrentRowOpts, computeCurrentColumnOpts } = $xeTable.getComputeMaps()
16
+
17
+ function getCheckboxRangeRows(evnt: MouseEvent, params: any, targetTrElem: HTMLElement, trRect: DOMRect, offsetClientTop: number, moveRange: number) {
18
+ const { showOverflow } = props
19
+ const { fullAllDataRowIdData, isResizeCellHeight } = internalData
20
+ const rowOpts = computeRowOpts.value
21
+ const cellOpts = computeCellOpts.value
22
+ const defaultRowHeight = computeDefaultRowHeight.value
23
+ const { row } = params
24
+ let countHeight = 0
25
+ let rangeRows: any[] = []
26
+ let moveSize = 0
27
+ const isDown = moveRange > 0
28
+ const { scrollYLoad } = reactData
29
+ const { afterFullData } = internalData
30
+ if (isDown) {
31
+ moveSize = offsetClientTop + moveRange
32
+ } else {
33
+ moveSize = trRect.height - offsetClientTop + Math.abs(moveRange)
34
+ }
35
+ if (scrollYLoad) {
36
+ const _rowIndex = $xeTable.getVTRowIndex(row)
37
+ const isCustomCellHeight = isResizeCellHeight || cellOpts.height || rowOpts.height
38
+ if (!isCustomCellHeight && showOverflow) {
39
+ if (isDown) {
40
+ rangeRows = afterFullData.slice(_rowIndex, _rowIndex + Math.ceil(moveSize / defaultRowHeight))
41
+ } else {
42
+ rangeRows = afterFullData.slice(_rowIndex - Math.floor(moveSize / defaultRowHeight), _rowIndex + 1)
43
+ }
44
+ } else {
45
+ if (isDown) {
46
+ for (let i = _rowIndex; i < afterFullData.length; i++) {
47
+ const item = afterFullData[i]
48
+ const rowid = $xeTable.getRowid(item)
49
+ const rowRest = fullAllDataRowIdData[rowid] || {}
50
+ countHeight += rowRest.resizeHeight || cellOpts.height || rowOpts.height || rowRest.height || defaultRowHeight
51
+ rangeRows.push(item)
52
+ if (countHeight > moveSize) {
53
+ return rangeRows
54
+ }
55
+ }
56
+ } else {
57
+ for (let len = _rowIndex; len >= 0; len--) {
58
+ const item = afterFullData[len]
59
+ const rowid = $xeTable.getRowid(item)
60
+ const rowRest = fullAllDataRowIdData[rowid] || {}
61
+ countHeight += rowRest.resizeHeight || cellOpts.height || rowOpts.height || rowRest.height || defaultRowHeight
62
+ rangeRows.push(item)
63
+ if (countHeight > moveSize) {
64
+ return rangeRows
65
+ }
66
+ }
67
+ }
68
+ }
69
+ } else {
70
+ const siblingProp = isDown ? 'next' : 'previous'
71
+ while (targetTrElem && countHeight < moveSize) {
72
+ const rowNodeRest = $xeTable.getRowNode(targetTrElem)
73
+ if (rowNodeRest) {
74
+ rangeRows.push(rowNodeRest.item)
75
+ countHeight += targetTrElem.offsetHeight
76
+ targetTrElem = targetTrElem[`${siblingProp}ElementSibling`] as HTMLElement
77
+ }
78
+ }
79
+ }
80
+ return rangeRows
81
+ }
82
+
83
+ const handleCheckboxRangeEvent = (evnt: any, params: any) => {
84
+ const { elemStore } = internalData
85
+ const bodyScrollElem = getRefElem(elemStore['main-body-scroll'])
86
+ const leftScrollElem = getRefElem(elemStore['left-body-scroll'])
87
+ const rightScrollElem = getRefElem(elemStore['right-body-scroll'])
88
+ const { column, cell } = params
89
+ if (column.type === 'checkbox') {
90
+ let bodyWrapperElem = bodyScrollElem as HTMLElement
91
+ if (leftScrollElem && column.fixed === 'left') {
92
+ bodyWrapperElem = leftScrollElem
93
+ } else if (rightScrollElem && column.fixed === 'right') {
94
+ bodyWrapperElem = rightScrollElem
95
+ }
96
+ if (!bodyWrapperElem) {
97
+ return
98
+ }
99
+ const bodyRect = bodyWrapperElem.getBoundingClientRect()
100
+ const el = refElem.value
101
+ const disX = evnt.clientX
102
+ const disY = evnt.clientY
103
+ const checkboxRangeElem = bodyWrapperElem.querySelector('.vxe-table--checkbox-range') as HTMLElement
104
+ const trElem = cell.parentElement as HTMLElement
105
+ const selectRecords = $xeTable.getCheckboxRecords()
106
+ let lastRangeRows: any[] = []
107
+ const marginSize = 1
108
+ const startTop = evnt.clientY - bodyRect.y + bodyWrapperElem.scrollTop
109
+ const startLeft = evnt.clientX - bodyRect.x + bodyWrapperElem.scrollLeft
110
+ const startScrollTop = bodyWrapperElem.scrollTop
111
+ const rowHeight = trElem.offsetHeight
112
+ const trRect = trElem.getBoundingClientRect()
113
+ const offsetClientTop = disY - trRect.y
114
+ let mouseScrollTimeout: any = null
115
+ let isMouseScrollDown: any = false
116
+ let mouseScrollSpaceSize = 1
117
+ const triggerEvent = (type: 'change' | 'start' | 'end', evnt: MouseEvent) => {
118
+ $xeTable.dispatchEvent(
119
+ `checkbox-range-${type}` as 'checkbox-range-change' | 'checkbox-range-start' | 'checkbox-range-end',
120
+ {
121
+ records: () => $xeTable.getCheckboxRecords(),
122
+ reserves: () => $xeTable.getCheckboxReserveRecords()
123
+ },
124
+ evnt
125
+ )
126
+ }
127
+ const handleChecked = (evnt: MouseEvent) => {
128
+ const { clientX, clientY } = evnt
129
+ const offsetLeft = clientX - disX
130
+ const offsetTop = clientY - disY + (bodyWrapperElem.scrollTop - startScrollTop)
131
+ let rangeHeight = Math.abs(offsetTop)
132
+ let rangeWidth = Math.abs(offsetLeft)
133
+ let rangeTop = startTop
134
+ let rangeLeft = startLeft
135
+
136
+ if (offsetTop < marginSize) {
137
+ // 向上
138
+ rangeTop += offsetTop
139
+ if (rangeTop < marginSize) {
140
+ rangeTop = marginSize
141
+ rangeHeight = startTop
142
+ }
143
+ } else {
144
+ // 向下
145
+ rangeHeight = Math.min(rangeHeight, bodyWrapperElem.scrollHeight - startTop - marginSize)
146
+ }
147
+ if (offsetLeft < marginSize) {
148
+ // 向左
149
+ rangeLeft += offsetLeft
150
+ if (rangeWidth > startLeft) {
151
+ rangeLeft = marginSize
152
+ rangeWidth = startLeft
153
+ }
154
+ } else {
155
+ // 向右
156
+ rangeWidth = Math.min(rangeWidth, bodyWrapperElem.clientWidth - startLeft - marginSize)
157
+ }
158
+ checkboxRangeElem.style.height = `${rangeHeight}px`
159
+ checkboxRangeElem.style.width = `${rangeWidth}px`
160
+ checkboxRangeElem.style.left = `${rangeLeft}px`
161
+ checkboxRangeElem.style.top = `${rangeTop}px`
162
+ checkboxRangeElem.style.display = 'block'
163
+ const rangeRows = getCheckboxRangeRows(evnt, params, trElem, trRect, offsetClientTop, offsetTop < marginSize ? -rangeHeight : rangeHeight)
164
+ // 至少滑动 10px 才能有效匹配
165
+ if (rangeHeight > 10 && rangeRows.length !== lastRangeRows.length) {
166
+ const isControlKey = hasControlKey(evnt)
167
+ lastRangeRows = rangeRows
168
+ if (isControlKey) {
169
+ rangeRows.forEach((row: any) => {
170
+ $xeTable.handleBatchSelectRows([row], selectRecords.indexOf(row) === -1)
171
+ })
172
+ } else {
173
+ $xeTable.setAllCheckboxRow(false)
174
+ $xeTable.handleCheckedCheckboxRow(rangeRows, true, false)
175
+ }
176
+ triggerEvent('change', evnt)
177
+ }
178
+ }
179
+ // 停止鼠标滚动
180
+ const stopMouseScroll = () => {
181
+ clearTimeout(mouseScrollTimeout)
182
+ mouseScrollTimeout = null
183
+ }
184
+ // 开始鼠标滚动
185
+ const startMouseScroll = (evnt: MouseEvent) => {
186
+ stopMouseScroll()
187
+ mouseScrollTimeout = setTimeout(() => {
188
+ if (mouseScrollTimeout) {
189
+ const { scrollLeft, scrollTop, clientHeight, scrollHeight } = bodyWrapperElem
190
+ const topSize = Math.ceil((mouseScrollSpaceSize * 50) / rowHeight)
191
+ if (isMouseScrollDown) {
192
+ if (scrollTop + clientHeight < scrollHeight) {
193
+ $xeTable.scrollTo(scrollLeft, scrollTop + topSize)
194
+ startMouseScroll(evnt)
195
+ handleChecked(evnt)
196
+ } else {
197
+ stopMouseScroll()
198
+ }
199
+ } else {
200
+ if (scrollTop) {
201
+ $xeTable.scrollTo(scrollLeft, scrollTop - topSize)
202
+ startMouseScroll(evnt)
203
+ handleChecked(evnt)
204
+ } else {
205
+ stopMouseScroll()
206
+ }
207
+ }
208
+ }
209
+ }, 50)
210
+ }
211
+ addClass(el, 'drag--range')
212
+ document.onmousemove = (evnt) => {
213
+ evnt.preventDefault()
214
+ evnt.stopPropagation()
215
+ const { clientY } = evnt
216
+ const { boundingTop } = getAbsolutePos(bodyWrapperElem)
217
+ // 如果超过可视区,触发滚动
218
+ if (clientY < boundingTop) {
219
+ isMouseScrollDown = false
220
+ mouseScrollSpaceSize = boundingTop - clientY
221
+ if (!mouseScrollTimeout) {
222
+ startMouseScroll(evnt)
223
+ }
224
+ } else if (clientY > boundingTop + bodyWrapperElem.clientHeight) {
225
+ isMouseScrollDown = true
226
+ mouseScrollSpaceSize = clientY - boundingTop - bodyWrapperElem.clientHeight
227
+ if (!mouseScrollTimeout) {
228
+ startMouseScroll(evnt)
229
+ }
230
+ } else if (mouseScrollTimeout) {
231
+ stopMouseScroll()
232
+ }
233
+ handleChecked(evnt)
234
+ }
235
+ document.onmouseup = (evnt) => {
236
+ stopMouseScroll()
237
+ removeClass(el, 'drag--range')
238
+ checkboxRangeElem.removeAttribute('style')
239
+ document.onmousemove = null
240
+ document.onmouseup = null
241
+ triggerEvent('end', evnt)
242
+ }
243
+ triggerEvent('start', evnt)
244
+ }
245
+ }
246
+
247
+ const handleCellMousedownEvent = (evnt: any, params: any) => {
248
+ const { editConfig, checkboxConfig, mouseConfig } = props
249
+ const checkboxOpts = computeCheckboxOpts.value
250
+ const mouseOpts = computeMouseOpts.value
251
+ const editOpts = computeEditOpts.value
252
+ if (hasEnableConf(mouseConfig, mouseOpts) && mouseOpts.area && $xeTable.triggerClAaMnEvent) {
253
+ return $xeTable.triggerClAaMnEvent(evnt, params)
254
+ } else {
255
+ if (checkboxConfig && checkboxOpts.range) {
256
+ handleCheckboxRangeEvent(evnt, params)
257
+ }
258
+ if (hasEnableConf(mouseConfig, mouseOpts) && mouseOpts.selected) {
259
+ if (!editConfig || editOpts.mode === 'cell') {
260
+ $xeTable.handleSelected(params, evnt)
261
+ }
262
+ }
263
+ }
264
+ }
265
+
266
+ const handleMoveSelected = (evnt: any, args: any, isLeftArrow: boolean, isUpArrow: boolean, isRightArrow: boolean, isDwArrow: boolean) => {
267
+ const { afterFullData, visibleColumn } = internalData
268
+ const params = Object.assign({}, args)
269
+ const { row, column } = params
270
+ const _rowIndex = $xeTable.getVTRowIndex(row)
271
+ const _columnIndex = $xeTable.getVTColumnIndex(column)
272
+ const tableBody = refTableBody.value
273
+ const tableBodyElem = tableBody ? (tableBody.$el as HTMLDivElement) : null
274
+ const tableWidth = tableBodyElem ? tableBodyElem.clientWidth : 0
275
+ let colAlign = isLeftArrow || isRightArrow || column.renderWidth < tableWidth
276
+ if ((isLeftArrow && _columnIndex >= 0) || (isRightArrow && _columnIndex <= visibleColumn.length - 1)) {
277
+ colAlign = false
278
+ } else {
279
+ evnt.preventDefault()
280
+ }
281
+ if (isUpArrow && _rowIndex > 0) {
282
+ // 移动到上一行
283
+ params.rowIndex = _rowIndex - 1
284
+ params.row = afterFullData[params.rowIndex]
285
+ } else if (isDwArrow && _rowIndex < afterFullData.length - 1) {
286
+ // 移动到下一行
287
+ params.rowIndex = _rowIndex + 1
288
+ params.row = afterFullData[params.rowIndex]
289
+ } else if (isLeftArrow && _columnIndex) {
290
+ // 移动到左侧单元格
291
+ params.columnIndex = _columnIndex - 1
292
+ params.column = visibleColumn[params.columnIndex]
293
+ } else if (isRightArrow && _columnIndex < visibleColumn.length - 1) {
294
+ // 移动到右侧单元格
295
+ params.columnIndex = _columnIndex + 1
296
+ params.column = visibleColumn[params.columnIndex]
297
+ }
298
+ $xeTable
299
+ .scrollToRow(params.row, params.column, {
300
+ colAlign
301
+ })
302
+ .then(() => {
303
+ params.cell = $xeTable.getCellElement(params.row, params.column)
304
+ $xeTable.handleSelected(params, evnt)
305
+ })
306
+ return params
307
+ }
308
+
309
+ const keyboardMethods: TableKeyboardPrivateMethods = {
310
+ // 处理 Tab 键移动
311
+ moveTabSelected(args, isLeft, evnt) {
312
+ const { editConfig } = props
313
+ const { afterFullData, visibleColumn } = internalData
314
+ const editOpts = computeEditOpts.value
315
+ const rowOpts = computeRowOpts.value
316
+ const currentRowOpts = computeCurrentRowOpts.value
317
+ const columnOpts = computeColumnOpts.value
318
+ const currentColumnOpts = computeCurrentColumnOpts.value
319
+ let targetRow: any
320
+ let targetRowIndex: any
321
+ let targetColumnIndex: any
322
+ const params = Object.assign({}, args)
323
+ const _rowIndex = $xeTable.getVTRowIndex(params.row)
324
+ const _columnIndex = $xeTable.getVTColumnIndex(params.column)
325
+ evnt.preventDefault()
326
+ if (isLeft) {
327
+ // 向左
328
+ if (_columnIndex <= 0) {
329
+ // 如果已经是第一列,则移动到上一行
330
+ if (_rowIndex > 0) {
331
+ targetRowIndex = _rowIndex - 1
332
+ targetRow = afterFullData[targetRowIndex]
333
+ targetColumnIndex = visibleColumn.length - 1
334
+ }
335
+ } else {
336
+ targetColumnIndex = _columnIndex - 1
337
+ }
338
+ } else {
339
+ if (_columnIndex >= visibleColumn.length - 1) {
340
+ // 如果已经是第一列,则移动到上一行
341
+ if (_rowIndex < afterFullData.length - 1) {
342
+ targetRowIndex = _rowIndex + 1
343
+ targetRow = afterFullData[targetRowIndex]
344
+ targetColumnIndex = 0
345
+ }
346
+ } else {
347
+ targetColumnIndex = _columnIndex + 1
348
+ }
349
+ }
350
+ const targetColumn = visibleColumn[targetColumnIndex]
351
+ if (targetColumn) {
352
+ if (targetRow) {
353
+ params.rowIndex = targetRowIndex
354
+ params.row = targetRow
355
+ } else {
356
+ params.rowIndex = _rowIndex
357
+ }
358
+ params.columnIndex = targetColumnIndex
359
+ params.column = targetColumn
360
+ params.cell = $xeTable.getCellElement(params.row, params.column)
361
+ if (rowOpts.isCurrent && currentRowOpts.isFollowSelected) {
362
+ $xeTable.triggerCurrentRowEvent(evnt, params)
363
+ }
364
+ if (columnOpts.isCurrent && currentColumnOpts.isFollowSelected) {
365
+ $xeTable.triggerCurrentColumnEvent(evnt, params)
366
+ }
367
+ if (editConfig) {
368
+ if (editOpts.trigger === 'click' || editOpts.trigger === 'dblclick') {
369
+ if (editOpts.mode === 'row') {
370
+ $xeTable.handleEdit(params, evnt)
371
+ } else {
372
+ $xeTable.scrollToRow(params.row, params.column).then(() => {
373
+ $xeTable.handleSelected(params, evnt)
374
+ })
375
+ }
376
+ }
377
+ } else {
378
+ $xeTable.scrollToRow(params.row, params.column).then(() => {
379
+ $xeTable.handleSelected(params, evnt)
380
+ })
381
+ }
382
+ }
383
+ },
384
+ // 处理当前行方向键移动
385
+ moveCurrentRow(isUpArrow, isDwArrow, evnt) {
386
+ const { treeConfig } = props
387
+ const { afterFullData, currentRow } = internalData
388
+ const treeOpts = computeTreeOpts.value
389
+ const childrenField = treeOpts.children || treeOpts.childrenField
390
+ let targetRow
391
+ if (currentRow) {
392
+ if (treeConfig) {
393
+ const { index, items } = XEUtils.findTree(afterFullData, (item) => item === currentRow, { children: childrenField })
394
+ if (isUpArrow && index > 0) {
395
+ targetRow = items[index - 1]
396
+ } else if (isDwArrow && index < items.length - 1) {
397
+ targetRow = items[index + 1]
398
+ }
399
+ } else {
400
+ const _rowIndex = $xeTable.getVTRowIndex(currentRow)
401
+ if (isUpArrow && _rowIndex > 0) {
402
+ targetRow = afterFullData[_rowIndex - 1]
403
+ } else if (isDwArrow && _rowIndex < afterFullData.length - 1) {
404
+ targetRow = afterFullData[_rowIndex + 1]
405
+ }
406
+ }
407
+ } else {
408
+ targetRow = afterFullData[0]
409
+ }
410
+ if (targetRow) {
411
+ evnt.preventDefault()
412
+ const params = {
413
+ $table: $xeTable,
414
+ row: targetRow,
415
+ rowIndex: $xeTable.getRowIndex(targetRow),
416
+ $rowIndex: $xeTable.getVMRowIndex(targetRow)
417
+ }
418
+ $xeTable.scrollToRow(targetRow).then(() => $xeTable.triggerCurrentRowEvent(evnt, params))
419
+ }
420
+ },
421
+ // 处理当前列方向键移动
422
+ moveCurrentColumn(isLeftArrow, isRightArrow, evnt) {
423
+ const { currentCol, visibleColumn } = internalData
424
+ let targetCol: VxeTableDefines.ColumnInfo | null = null
425
+ if (currentCol) {
426
+ const _columnIndex = $xeTable.getVTColumnIndex(currentCol)
427
+ if (isLeftArrow && _columnIndex > 0) {
428
+ targetCol = visibleColumn[_columnIndex - 1]
429
+ } else if (isRightArrow && _columnIndex < visibleColumn.length - 1) {
430
+ targetCol = visibleColumn[_columnIndex + 1]
431
+ }
432
+ } else {
433
+ targetCol = visibleColumn[0]
434
+ }
435
+ if (targetCol) {
436
+ evnt.preventDefault()
437
+ const params = {
438
+ $table: $xeTable,
439
+ column: targetCol,
440
+ columnIndex: $xeTable.getColumnIndex(targetCol),
441
+ $columnIndex: $xeTable.getVMColumnIndex(targetCol)
442
+ }
443
+ $xeTable.scrollToColumn(targetCol).then(() => $xeTable.triggerCurrentColumnEvent(evnt, params))
444
+ }
445
+ },
446
+ // 处理可编辑方向键移动
447
+ moveArrowSelected(args, isLeftArrow, isUpArrow, isRightArrow, isDwArrow, evnt) {
448
+ const { highlightCurrentRow, highlightCurrentColumn } = props
449
+ const rowOpts = computeRowOpts.value
450
+ const currentRowOpts = computeCurrentRowOpts.value
451
+ const columnOpts = computeColumnOpts.value
452
+ const currentColumnOpts = computeCurrentColumnOpts.value
453
+ const params = handleMoveSelected(evnt, args, isLeftArrow, isUpArrow, isRightArrow, isDwArrow)
454
+ if (rowOpts.isCurrent || highlightCurrentRow) {
455
+ if (currentRowOpts.isFollowSelected) {
456
+ $xeTable.triggerCurrentRowEvent(evnt, params)
457
+ } else {
458
+ // 当前行按键上下移动
459
+ if ((isUpArrow || isDwArrow) && (rowOpts.isCurrent || highlightCurrentRow)) {
460
+ $xeTable.moveCurrentRow(isUpArrow, isDwArrow, evnt)
461
+ }
462
+ }
463
+ }
464
+ if (columnOpts.isCurrent || highlightCurrentColumn) {
465
+ if (currentColumnOpts.isFollowSelected) {
466
+ $xeTable.triggerCurrentColumnEvent(evnt, params)
467
+ } else {
468
+ // 当前行按键左右移动
469
+ if ((isLeftArrow || isRightArrow) && (columnOpts.isCurrent || highlightCurrentColumn)) {
470
+ $xeTable.moveCurrentColumn(isLeftArrow, isRightArrow, evnt)
471
+ }
472
+ }
473
+ }
474
+ },
475
+ moveEnterSelected(args, isLeftArrow, isUpArrow, isRightArrow, isDwArrow, evnt) {
476
+ const { highlightCurrentRow, highlightCurrentColumn } = props
477
+ const rowOpts = computeRowOpts.value
478
+ const currentRowOpts = computeCurrentRowOpts.value
479
+ const columnOpts = computeColumnOpts.value
480
+ const currentColumnOpts = computeCurrentColumnOpts.value
481
+ const params = handleMoveSelected(evnt, args, isLeftArrow, isUpArrow, isRightArrow, isDwArrow)
482
+ if ((rowOpts.isCurrent || highlightCurrentRow) && currentRowOpts.isFollowSelected) {
483
+ $xeTable.triggerCurrentRowEvent(evnt, params)
484
+ }
485
+ if ((columnOpts.isCurrent || highlightCurrentColumn) && currentColumnOpts.isFollowSelected) {
486
+ $xeTable.triggerCurrentColumnEvent(evnt, params)
487
+ }
488
+ },
489
+ // 已废弃,待删除
490
+ moveSelected(args, isLeftArrow, isUpArrow, isRightArrow, isDwArrow, evnt) {
491
+ handleMoveSelected(evnt, args, isLeftArrow, isUpArrow, isRightArrow, isDwArrow)
492
+ },
493
+ handleCellMousedownEvent
494
+ }
495
+
496
+ return keyboardMethods
497
+ }
498
+ })