vxe-table 3.20.7 → 3.20.8
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.
- package/LICENSE +20 -20
- package/README.md +106 -106
- package/es/index.esm.js +2 -1
- package/es/style.css +1 -1
- package/es/table/src/methods.js +75 -78
- package/es/table/src/table.js +10 -1
- package/es/table/src/util.js +6 -0
- package/es/table/style.css +18 -48
- package/es/ui/index.js +1 -1
- package/es/ui/src/dom.js +19 -20
- package/es/ui/src/log.js +1 -1
- package/es/vxe-table/style.css +18 -48
- package/lib/index.common.js +2 -1
- package/lib/index.umd.js +1912 -3228
- package/lib/index.umd.min.js +1 -1
- package/lib/style.css +1 -1
- package/lib/table/src/methods.js +12 -10
- package/lib/table/src/methods.min.js +1 -1
- package/lib/table/src/table.js +9 -1
- package/lib/table/src/table.min.js +1 -1
- package/lib/table/src/util.js +6 -0
- package/lib/table/src/util.min.js +1 -1
- package/lib/table/style/style.css +18 -48
- package/lib/ui/index.js +1 -1
- package/lib/ui/index.min.js +1 -1
- package/lib/ui/src/dom.js +21 -20
- package/lib/ui/src/dom.min.js +1 -1
- package/lib/ui/src/log.js +1 -1
- package/lib/ui/src/log.min.js +1 -1
- package/lib/v-x-e-table/index.js +2 -1
- package/lib/v-x-e-table/index.min.js +1 -1
- package/lib/vxe-colgroup/index.js +2 -1
- package/lib/vxe-colgroup/index.min.js +1 -1
- package/lib/vxe-column/index.js +2 -1
- package/lib/vxe-column/index.min.js +1 -1
- package/lib/vxe-grid/index.js +2 -1
- package/lib/vxe-grid/index.min.js +1 -1
- package/lib/vxe-table/index.js +2 -1
- package/lib/vxe-table/index.min.js +1 -1
- package/lib/vxe-table/style/style.css +18 -48
- package/lib/vxe-toolbar/index.js +2 -1
- package/lib/vxe-toolbar/index.min.js +1 -1
- package/lib/vxe-ui/index.js +2 -1
- package/lib/vxe-ui/index.min.js +1 -1
- package/lib/vxe-v-x-e-table/index.js +2 -1
- package/lib/vxe-v-x-e-table/index.min.js +1 -1
- package/package.json +93 -93
- package/packages/colgroup/index.ts +22 -22
- package/packages/column/index.ts +22 -22
- package/packages/components.ts +42 -42
- package/packages/grid/index.ts +22 -22
- package/packages/grid/src/grid.ts +1935 -1935
- package/packages/index.ts +4 -4
- package/packages/locale/lang/ar-EG.ts +832 -832
- package/packages/locale/lang/de-DE.ts +832 -832
- package/packages/locale/lang/en-US.ts +832 -832
- package/packages/locale/lang/es-ES.ts +832 -832
- package/packages/locale/lang/fr-FR.ts +832 -832
- package/packages/locale/lang/hu-HU.ts +832 -832
- package/packages/locale/lang/hy-AM.ts +832 -832
- package/packages/locale/lang/id-ID.ts +832 -832
- package/packages/locale/lang/it-IT.ts +832 -832
- package/packages/locale/lang/ja-JP.ts +832 -832
- package/packages/locale/lang/ko-KR.ts +832 -832
- package/packages/locale/lang/ms-MY.ts +832 -832
- package/packages/locale/lang/nb-NO.ts +832 -832
- package/packages/locale/lang/pt-BR.ts +832 -832
- package/packages/locale/lang/ru-RU.ts +832 -832
- package/packages/locale/lang/th-TH.ts +832 -832
- package/packages/locale/lang/ug-CN.ts +832 -832
- package/packages/locale/lang/uk-UA.ts +832 -832
- package/packages/locale/lang/uz-UZ.ts +832 -832
- package/packages/locale/lang/vi-VN.ts +832 -832
- package/packages/locale/lang/zh-CHT.ts +832 -832
- package/packages/locale/lang/zh-CN.ts +832 -832
- package/packages/locale/lang/zh-HK.ts +3 -3
- package/packages/locale/lang/zh-MO.ts +3 -3
- package/packages/locale/lang/zh-TC.ts +3 -3
- package/packages/locale/lang/zh-TW.ts +3 -3
- package/packages/table/index.ts +49 -49
- package/packages/table/module/custom/mixin.ts +369 -369
- package/packages/table/module/custom/panel.ts +1461 -1461
- package/packages/table/module/edit/mixin.ts +1123 -1123
- package/packages/table/module/export/export-panel.ts +658 -658
- package/packages/table/module/export/import-panel.ts +319 -319
- package/packages/table/module/export/mixin.ts +1693 -1693
- package/packages/table/module/export/util.ts +24 -24
- package/packages/table/module/filter/mixin.ts +507 -507
- package/packages/table/module/filter/panel.ts +329 -329
- package/packages/table/module/keyboard/mixin.ts +513 -513
- package/packages/table/module/menu/mixin.ts +329 -329
- package/packages/table/module/menu/panel.ts +212 -212
- package/packages/table/module/validator/mixin.ts +626 -626
- package/packages/table/render/index.ts +1456 -1456
- package/packages/table/src/body.ts +969 -969
- package/packages/table/src/cell.ts +1285 -1285
- package/packages/table/src/column.ts +205 -205
- package/packages/table/src/columnInfo.ts +228 -228
- package/packages/table/src/footer.ts +388 -388
- package/packages/table/src/group.ts +51 -51
- package/packages/table/src/header.ts +602 -602
- package/packages/table/src/methods.ts +12936 -12939
- package/packages/table/src/props.ts +311 -311
- package/packages/table/src/store.ts +15 -15
- package/packages/table/src/table.ts +2513 -2505
- package/packages/table/src/util.ts +1018 -1012
- package/packages/toolbar/index.ts +18 -18
- package/packages/toolbar/src/toolbar.ts +856 -856
- package/packages/ui/index.ts +530 -530
- package/packages/ui/src/anime.ts +52 -52
- package/packages/ui/src/comp.ts +3 -3
- package/packages/ui/src/dom.ts +237 -236
- package/packages/ui/src/log.ts +8 -8
- package/packages/ui/src/utils.ts +56 -56
- package/packages/ui/src/vn.ts +65 -65
- package/packages/v-x-e-table/index.ts +4 -4
- package/styles/all.scss +7 -7
- package/styles/base.scss +16 -16
- package/styles/components/grid.scss +89 -89
- package/styles/components/icon.scss +225 -225
- package/styles/components/old-icon.scss +715 -715
- package/styles/components/table-module/all.scss +6 -6
- package/styles/components/table-module/custom.scss +527 -527
- package/styles/components/table-module/export.scss +130 -130
- package/styles/components/table-module/filter.scss +130 -130
- package/styles/components/table-module/menu.scss +81 -81
- package/styles/components/table.scss +2679 -2679
- package/styles/components/toolbar.scss +119 -119
- package/styles/default.scss +2 -2
- package/styles/helpers/baseMixin.scss +95 -95
- package/styles/index.scss +3 -3
- package/styles/modules.scss +5 -5
- package/styles/theme/base.scss +93 -93
- package/styles/theme/dark.scss +49 -49
- package/styles/theme/light.scss +44 -44
- package/styles/variable.scss +43 -43
- package/types/all.d.ts +53 -53
- package/types/index.d.ts +4 -4
- /package/es/{iconfont.1773991883171.ttf → iconfont.1774240303597.ttf} +0 -0
- /package/es/{iconfont.1773991883171.woff → iconfont.1774240303597.woff} +0 -0
- /package/es/{iconfont.1773991883171.woff2 → iconfont.1774240303597.woff2} +0 -0
- /package/lib/{iconfont.1773991883171.ttf → iconfont.1774240303597.ttf} +0 -0
- /package/lib/{iconfont.1773991883171.woff → iconfont.1774240303597.woff} +0 -0
- /package/lib/{iconfont.1773991883171.woff2 → iconfont.1774240303597.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
|
+
}
|