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