vxe-table 3.20.7 → 3.20.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 (144) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +106 -106
  3. package/es/index.esm.js +2 -1
  4. package/es/style.css +1 -1
  5. package/es/table/src/methods.js +81 -84
  6. package/es/table/src/table.js +20 -1
  7. package/es/table/src/util.js +6 -0
  8. package/es/table/style.css +18 -48
  9. package/es/ui/index.js +1 -1
  10. package/es/ui/src/dom.js +19 -20
  11. package/es/ui/src/log.js +1 -1
  12. package/es/vxe-table/style.css +18 -48
  13. package/lib/index.common.js +2 -1
  14. package/lib/index.umd.js +1985 -3291
  15. package/lib/index.umd.min.js +1 -1
  16. package/lib/style.css +1 -1
  17. package/lib/table/src/methods.js +17 -15
  18. package/lib/table/src/methods.min.js +1 -1
  19. package/lib/table/src/table.js +19 -1
  20. package/lib/table/src/table.min.js +1 -1
  21. package/lib/table/src/util.js +6 -0
  22. package/lib/table/src/util.min.js +1 -1
  23. package/lib/table/style/style.css +18 -48
  24. package/lib/ui/index.js +1 -1
  25. package/lib/ui/index.min.js +1 -1
  26. package/lib/ui/src/dom.js +21 -20
  27. package/lib/ui/src/dom.min.js +1 -1
  28. package/lib/ui/src/log.js +1 -1
  29. package/lib/ui/src/log.min.js +1 -1
  30. package/lib/v-x-e-table/index.js +2 -1
  31. package/lib/v-x-e-table/index.min.js +1 -1
  32. package/lib/vxe-colgroup/index.js +2 -1
  33. package/lib/vxe-colgroup/index.min.js +1 -1
  34. package/lib/vxe-column/index.js +2 -1
  35. package/lib/vxe-column/index.min.js +1 -1
  36. package/lib/vxe-grid/index.js +2 -1
  37. package/lib/vxe-grid/index.min.js +1 -1
  38. package/lib/vxe-table/index.js +2 -1
  39. package/lib/vxe-table/index.min.js +1 -1
  40. package/lib/vxe-table/style/style.css +18 -48
  41. package/lib/vxe-toolbar/index.js +2 -1
  42. package/lib/vxe-toolbar/index.min.js +1 -1
  43. package/lib/vxe-ui/index.js +2 -1
  44. package/lib/vxe-ui/index.min.js +1 -1
  45. package/lib/vxe-v-x-e-table/index.js +2 -1
  46. package/lib/vxe-v-x-e-table/index.min.js +1 -1
  47. package/package.json +93 -93
  48. package/packages/colgroup/index.ts +22 -22
  49. package/packages/column/index.ts +22 -22
  50. package/packages/components.ts +42 -42
  51. package/packages/grid/index.ts +22 -22
  52. package/packages/grid/src/grid.ts +1935 -1935
  53. package/packages/index.ts +4 -4
  54. package/packages/locale/lang/ar-EG.ts +832 -832
  55. package/packages/locale/lang/de-DE.ts +832 -832
  56. package/packages/locale/lang/en-US.ts +832 -832
  57. package/packages/locale/lang/es-ES.ts +832 -832
  58. package/packages/locale/lang/fr-FR.ts +832 -832
  59. package/packages/locale/lang/hu-HU.ts +832 -832
  60. package/packages/locale/lang/hy-AM.ts +832 -832
  61. package/packages/locale/lang/id-ID.ts +832 -832
  62. package/packages/locale/lang/it-IT.ts +832 -832
  63. package/packages/locale/lang/ja-JP.ts +832 -832
  64. package/packages/locale/lang/ko-KR.ts +832 -832
  65. package/packages/locale/lang/ms-MY.ts +832 -832
  66. package/packages/locale/lang/nb-NO.ts +832 -832
  67. package/packages/locale/lang/pt-BR.ts +832 -832
  68. package/packages/locale/lang/ru-RU.ts +832 -832
  69. package/packages/locale/lang/th-TH.ts +832 -832
  70. package/packages/locale/lang/ug-CN.ts +832 -832
  71. package/packages/locale/lang/uk-UA.ts +832 -832
  72. package/packages/locale/lang/uz-UZ.ts +832 -832
  73. package/packages/locale/lang/vi-VN.ts +832 -832
  74. package/packages/locale/lang/zh-CHT.ts +832 -832
  75. package/packages/locale/lang/zh-CN.ts +832 -832
  76. package/packages/locale/lang/zh-HK.ts +3 -3
  77. package/packages/locale/lang/zh-MO.ts +3 -3
  78. package/packages/locale/lang/zh-TC.ts +3 -3
  79. package/packages/locale/lang/zh-TW.ts +3 -3
  80. package/packages/table/index.ts +49 -49
  81. package/packages/table/module/custom/mixin.ts +369 -369
  82. package/packages/table/module/custom/panel.ts +1461 -1461
  83. package/packages/table/module/edit/mixin.ts +1123 -1123
  84. package/packages/table/module/export/export-panel.ts +658 -658
  85. package/packages/table/module/export/import-panel.ts +319 -319
  86. package/packages/table/module/export/mixin.ts +1693 -1693
  87. package/packages/table/module/export/util.ts +24 -24
  88. package/packages/table/module/filter/mixin.ts +507 -507
  89. package/packages/table/module/filter/panel.ts +329 -329
  90. package/packages/table/module/keyboard/mixin.ts +513 -513
  91. package/packages/table/module/menu/mixin.ts +329 -329
  92. package/packages/table/module/menu/panel.ts +212 -212
  93. package/packages/table/module/validator/mixin.ts +626 -626
  94. package/packages/table/render/index.ts +1456 -1456
  95. package/packages/table/src/body.ts +969 -969
  96. package/packages/table/src/cell.ts +1285 -1285
  97. package/packages/table/src/column.ts +205 -205
  98. package/packages/table/src/columnInfo.ts +228 -228
  99. package/packages/table/src/footer.ts +388 -388
  100. package/packages/table/src/group.ts +51 -51
  101. package/packages/table/src/header.ts +602 -602
  102. package/packages/table/src/methods.ts +12936 -12939
  103. package/packages/table/src/props.ts +311 -311
  104. package/packages/table/src/store.ts +15 -15
  105. package/packages/table/src/table.ts +2523 -2505
  106. package/packages/table/src/util.ts +1018 -1012
  107. package/packages/toolbar/index.ts +18 -18
  108. package/packages/toolbar/src/toolbar.ts +856 -856
  109. package/packages/ui/index.ts +530 -530
  110. package/packages/ui/src/anime.ts +52 -52
  111. package/packages/ui/src/comp.ts +3 -3
  112. package/packages/ui/src/dom.ts +237 -236
  113. package/packages/ui/src/log.ts +8 -8
  114. package/packages/ui/src/utils.ts +56 -56
  115. package/packages/ui/src/vn.ts +65 -65
  116. package/packages/v-x-e-table/index.ts +4 -4
  117. package/styles/all.scss +7 -7
  118. package/styles/base.scss +16 -16
  119. package/styles/components/grid.scss +89 -89
  120. package/styles/components/icon.scss +225 -225
  121. package/styles/components/old-icon.scss +715 -715
  122. package/styles/components/table-module/all.scss +6 -6
  123. package/styles/components/table-module/custom.scss +527 -527
  124. package/styles/components/table-module/export.scss +130 -130
  125. package/styles/components/table-module/filter.scss +130 -130
  126. package/styles/components/table-module/menu.scss +81 -81
  127. package/styles/components/table.scss +2679 -2679
  128. package/styles/components/toolbar.scss +119 -119
  129. package/styles/default.scss +2 -2
  130. package/styles/helpers/baseMixin.scss +95 -95
  131. package/styles/index.scss +3 -3
  132. package/styles/modules.scss +5 -5
  133. package/styles/theme/base.scss +93 -93
  134. package/styles/theme/dark.scss +49 -49
  135. package/styles/theme/light.scss +44 -44
  136. package/styles/variable.scss +43 -43
  137. package/types/all.d.ts +53 -53
  138. package/types/index.d.ts +4 -4
  139. /package/es/{iconfont.1773991883171.ttf → iconfont.1774420912543.ttf} +0 -0
  140. /package/es/{iconfont.1773991883171.woff → iconfont.1774420912543.woff} +0 -0
  141. /package/es/{iconfont.1773991883171.woff2 → iconfont.1774420912543.woff2} +0 -0
  142. /package/lib/{iconfont.1773991883171.ttf → iconfont.1774420912543.ttf} +0 -0
  143. /package/lib/{iconfont.1773991883171.woff → iconfont.1774420912543.woff} +0 -0
  144. /package/lib/{iconfont.1773991883171.woff2 → iconfont.1774420912543.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
+ }