vxe-table 4.23.0-beta.2 → 4.23.0-beta.4
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/dist/all.esm.js +145 -167
- package/dist/style.css +1 -1
- package/dist/style.min.css +1 -1
- package/es/grid/src/grid.js +3 -0
- package/es/index.css +1 -1
- package/es/index.min.css +1 -1
- package/es/style.css +1 -1
- package/es/style.min.css +1 -1
- package/es/table/module/custom/panel.js +2 -2
- package/es/table/module/filter/hook.js +5 -7
- package/es/table/module/filter/panel.js +42 -46
- package/es/table/src/table.js +69 -47
- package/es/table/src/util.js +1 -2
- package/es/table/style.css +31 -12
- package/es/table/style.min.css +1 -1
- package/es/ui/index.js +2 -2
- package/es/ui/src/dom.js +11 -8
- package/es/ui/src/log.js +1 -1
- package/es/vxe-table/style.css +31 -12
- package/es/vxe-table/style.min.css +1 -1
- package/lib/grid/src/grid.js +5 -0
- package/lib/grid/src/grid.min.js +1 -1
- package/lib/index.css +1 -1
- package/lib/index.min.css +1 -1
- package/lib/index.umd.js +79 -127
- package/lib/index.umd.min.js +1 -1
- package/lib/style.css +1 -1
- package/lib/style.min.css +1 -1
- package/lib/table/module/custom/panel.js +2 -2
- package/lib/table/module/custom/panel.min.js +1 -1
- package/lib/table/module/filter/hook.js +6 -7
- package/lib/table/module/filter/hook.min.js +1 -1
- package/lib/table/module/filter/panel.js +34 -33
- package/lib/table/module/filter/panel.min.js +1 -1
- package/lib/table/src/table.js +19 -19
- package/lib/table/src/table.min.js +1 -1
- package/lib/table/src/util.js +1 -2
- package/lib/table/src/util.min.js +1 -1
- package/lib/table/style/style.css +31 -12
- package/lib/table/style/style.min.css +1 -1
- package/lib/ui/index.js +2 -2
- package/lib/ui/index.min.js +1 -1
- package/lib/ui/src/dom.js +11 -7
- 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/vxe-table/style/style.css +31 -12
- package/lib/vxe-table/style/style.min.css +1 -1
- package/package.json +2 -2
- package/packages/grid/src/grid.ts +3 -0
- package/packages/table/module/custom/panel.ts +2 -2
- package/packages/table/module/filter/hook.ts +5 -7
- package/packages/table/module/filter/panel.ts +45 -46
- package/packages/table/src/table.ts +71 -47
- package/packages/table/src/util.ts +1 -2
- package/packages/ui/index.ts +1 -1
- package/packages/ui/src/dom.ts +12 -8
- package/styles/components/table-module/filter.scss +25 -14
- package/es/table/src/scrollbar.js +0 -54
- package/lib/table/src/scrollbar.js +0 -63
- package/lib/table/src/scrollbar.min.js +0 -1
- package/packages/table/src/scrollbar.ts +0 -57
- /package/es/{iconfont.1792035024476.ttf → iconfont.1792139865095.ttf} +0 -0
- /package/es/{iconfont.1792035024476.woff → iconfont.1792139865095.woff} +0 -0
- /package/es/{iconfont.1792035024476.woff2 → iconfont.1792139865095.woff2} +0 -0
- /package/lib/{iconfont.1792035024476.ttf → iconfont.1792139865095.ttf} +0 -0
- /package/lib/{iconfont.1792035024476.woff → iconfont.1792139865095.woff} +0 -0
- /package/lib/{iconfont.1792035024476.woff2 → iconfont.1792139865095.woff2} +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vxe-table",
|
|
3
|
-
"version": "4.23.0-beta.
|
|
3
|
+
"version": "4.23.0-beta.4",
|
|
4
4
|
"description": "A PC-end table component based on Vxe UI, supporting copy-paste, data pivot table, and high-performance virtual list table solution.",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"update": "npm install --legacy-peer-deps",
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
"typescript": "~5.9.3",
|
|
67
67
|
"vue": "3.4.27",
|
|
68
68
|
"vue-router": "~4.5.1",
|
|
69
|
-
"vxe-pc-ui": "4.20.
|
|
69
|
+
"vxe-pc-ui": "4.20.9"
|
|
70
70
|
},
|
|
71
71
|
"vetur": {
|
|
72
72
|
"tags": "helper/vetur/tags.json",
|
|
@@ -64,6 +64,7 @@ export default defineVxeComponent({
|
|
|
64
64
|
const defaultLayouts: VxeGridPropTypes.Layouts = [['Form'], ['Toolbar', 'Top', 'Table', 'Bottom', 'Pager']]
|
|
65
65
|
|
|
66
66
|
const { computeSize } = useFns.useSize(props)
|
|
67
|
+
const { computeIsVScrollbar } = useFns.useVScrollbar(props)
|
|
67
68
|
|
|
68
69
|
const reactData = reactive(createReactData())
|
|
69
70
|
|
|
@@ -268,6 +269,8 @@ export default defineVxeComponent({
|
|
|
268
269
|
}
|
|
269
270
|
|
|
270
271
|
const computeMaps: VxeGridPrivateComputed = {
|
|
272
|
+
computeSize,
|
|
273
|
+
computeIsVScrollbar,
|
|
271
274
|
computeProxyOpts,
|
|
272
275
|
computePagerOpts,
|
|
273
276
|
computeFormOpts,
|
|
@@ -378,8 +378,8 @@ export default defineVxeComponent({
|
|
|
378
378
|
const dragOffsetIndex = prevDragPos === 'bottom' ? 1 : 0
|
|
379
379
|
|
|
380
380
|
if (prevDragGroupField || prevDragAggFnColid) {
|
|
381
|
-
if ($xeTable.
|
|
382
|
-
$xeTable.
|
|
381
|
+
if ($xeTable.handlePivotTableAggPanelDragendEvent) {
|
|
382
|
+
$xeTable.handlePivotTableAggPanelDragendEvent(evnt)
|
|
383
383
|
}
|
|
384
384
|
} else if (prevDragCol && dragCol) {
|
|
385
385
|
// 判断是否有拖动
|
|
@@ -24,7 +24,7 @@ hooks.add('tableFilterModule', {
|
|
|
24
24
|
const { computeFilterOpts, computeMouseOpts, computeRendererOpts } = $xeTable.getComputeMaps()
|
|
25
25
|
|
|
26
26
|
const updatePopupStyle = () => {
|
|
27
|
-
const { filterStore } = reactData
|
|
27
|
+
const { filterStore, scrollbarHeight } = reactData
|
|
28
28
|
const { elemStore } = internalData
|
|
29
29
|
const { column, targetEl } = filterStore
|
|
30
30
|
if (!column) {
|
|
@@ -46,8 +46,6 @@ hooks.add('tableFilterModule', {
|
|
|
46
46
|
if (!filterWrapperElem) {
|
|
47
47
|
return nextTick()
|
|
48
48
|
}
|
|
49
|
-
const filterHeadElem = filterWrapperElem.querySelector<HTMLDivElement>('.vxe-table--filter-header')
|
|
50
|
-
const filterFootElem = filterWrapperElem.querySelector<HTMLDivElement>('.vxe-table--filter-footer')
|
|
51
49
|
|
|
52
50
|
/**
|
|
53
51
|
* 是否显示筛选按钮图标
|
|
@@ -75,6 +73,7 @@ hooks.add('tableFilterModule', {
|
|
|
75
73
|
if (transfer) {
|
|
76
74
|
const ppObj = updatePanelPlacement(currEl, filterWrapperElem, {
|
|
77
75
|
defaultPlacement: 'bottom',
|
|
76
|
+
appendTo: '',
|
|
78
77
|
isMinWidth: false,
|
|
79
78
|
teleportTo: transfer
|
|
80
79
|
})
|
|
@@ -84,7 +83,7 @@ hooks.add('tableFilterModule', {
|
|
|
84
83
|
const centerWidth = targetEl ? filterWidth / 2 : ((filterWidth - column.renderWidth) / 2)
|
|
85
84
|
left = btnRect.left - tableRect.left - centerWidth
|
|
86
85
|
top = btnRect.top - tableRect.top + currEl.clientHeight
|
|
87
|
-
maxHeight = Math.max(40, tableEl.clientHeight - top -
|
|
86
|
+
maxHeight = Math.max(40, tableEl.clientHeight - top - scrollbarHeight)
|
|
88
87
|
if (left < 1) {
|
|
89
88
|
left = 1
|
|
90
89
|
} else if (left > (tableEl.clientWidth - filterWidth - 1)) {
|
|
@@ -105,7 +104,6 @@ hooks.add('tableFilterModule', {
|
|
|
105
104
|
if (zIndex) {
|
|
106
105
|
panelStyle.zIndex = zIndex
|
|
107
106
|
}
|
|
108
|
-
filterStore.style = panelStyle
|
|
109
107
|
// 筛选面板是自适应表格高度
|
|
110
108
|
if (compConf ? !compConf.tableFilterAutoHeight : false) {
|
|
111
109
|
maxHeight = 0
|
|
@@ -114,8 +112,8 @@ hooks.add('tableFilterModule', {
|
|
|
114
112
|
maxHeight = customMaxHeight > maxHeight ? maxHeight : customMaxHeight
|
|
115
113
|
}
|
|
116
114
|
}
|
|
117
|
-
|
|
118
|
-
filterStore.
|
|
115
|
+
panelStyle['--vxe-ui-vxe-table-filter-default-max-height'] = maxHeight ? toCssUnit(maxHeight) : 'none'
|
|
116
|
+
filterStore.style = panelStyle
|
|
119
117
|
}
|
|
120
118
|
handleStyle()
|
|
121
119
|
return nextTick().then(() => {
|
|
@@ -2,7 +2,7 @@ import { h, ref, computed, inject, Teleport, PropType } from 'vue'
|
|
|
2
2
|
import { defineVxeComponent } from '../../../ui/src/comp'
|
|
3
3
|
import { VxeUI } from '../../../ui'
|
|
4
4
|
import { formatText, isEnableConf } from '../../../ui/src/utils'
|
|
5
|
-
import { getPropClass
|
|
5
|
+
import { getPropClass } from '../../../ui/src/dom'
|
|
6
6
|
import { getSlotVNs } from '../../../ui/src/vn'
|
|
7
7
|
import { createComponentLog } from '../../../ui/src/log'
|
|
8
8
|
import XEUtils from 'xe-utils'
|
|
@@ -25,6 +25,8 @@ export default defineVxeComponent({
|
|
|
25
25
|
setup (props, context) {
|
|
26
26
|
const xID = XEUtils.uniqueId()
|
|
27
27
|
|
|
28
|
+
const VxeUIScrollbarComponent = VxeUI.getComponent('VxeScrollbar')
|
|
29
|
+
|
|
28
30
|
const $xeTable = inject('$xeTable', {} as VxeTableConstructor & VxeTableMethods & VxeTablePrivateMethods)
|
|
29
31
|
const { reactData: tableReactData, internalData: tableInternalData, getComputeMaps } = $xeTable
|
|
30
32
|
const { computeFilterOpts, computeRendererOpts } = getComputeMaps()
|
|
@@ -124,10 +126,12 @@ export default defineVxeComponent({
|
|
|
124
126
|
|
|
125
127
|
const renderOptions = (filterRender: VxeColumnPropTypes.FilterRender | null, compConf: VxeGlobalRendererOptions | null) => {
|
|
126
128
|
const { filterStore } = props
|
|
127
|
-
const { column
|
|
129
|
+
const { column } = filterStore
|
|
128
130
|
if (!column) {
|
|
129
131
|
return []
|
|
130
132
|
}
|
|
133
|
+
const filterOpts = computeFilterOpts.value
|
|
134
|
+
const { useScrollbar } = filterOpts
|
|
131
135
|
const { filterMultiple, filters, slots } = column
|
|
132
136
|
const filterOptions = (filters || []) as VxeTableDefines.FilterOption[]
|
|
133
137
|
const filterSlot = slots ? slots.filter : null
|
|
@@ -136,33 +140,48 @@ export default defineVxeComponent({
|
|
|
136
140
|
if (filterSlot) {
|
|
137
141
|
return [
|
|
138
142
|
h('div', {
|
|
139
|
-
class: 'vxe-table--filter-template'
|
|
140
|
-
style: maxHeight
|
|
141
|
-
? {
|
|
142
|
-
maxHeight: toCssUnit(maxHeight)
|
|
143
|
-
}
|
|
144
|
-
: {}
|
|
143
|
+
class: 'vxe-table--filter-template'
|
|
145
144
|
}, $xeTable.callSlot(filterSlot, params))
|
|
146
145
|
]
|
|
147
146
|
} else if (filterRender && rtFilter) {
|
|
148
147
|
return [
|
|
149
148
|
h('div', {
|
|
150
|
-
class: 'vxe-table--filter-template'
|
|
151
|
-
style: maxHeight
|
|
152
|
-
? {
|
|
153
|
-
maxHeight: toCssUnit(maxHeight)
|
|
154
|
-
}
|
|
155
|
-
: {}
|
|
149
|
+
class: 'vxe-table--filter-template'
|
|
156
150
|
}, getSlotVNs(rtFilter(filterRender, params)))
|
|
157
151
|
]
|
|
158
152
|
}
|
|
159
153
|
const isAllChecked = filterMultiple ? filterStore.isAllSelected : !filterOptions.some((item) => item._checked)
|
|
160
154
|
const isAllIndeterminate = filterMultiple && filterStore.isIndeterminate
|
|
155
|
+
|
|
156
|
+
const optVNs = filterOptions.map((item: any) => {
|
|
157
|
+
const isChecked = item._checked
|
|
158
|
+
const isIndeterminate = false
|
|
159
|
+
return h('div', {
|
|
160
|
+
class: ['vxe-table--filter-option', {
|
|
161
|
+
'is--checked': item._checked
|
|
162
|
+
}],
|
|
163
|
+
title: item.label,
|
|
164
|
+
onClick: (evnt: MouseEvent) => {
|
|
165
|
+
changeOption(evnt, !item._checked, item)
|
|
166
|
+
}
|
|
167
|
+
}, (filterMultiple
|
|
168
|
+
? [
|
|
169
|
+
h('span', {
|
|
170
|
+
class: ['vxe-checkbox--icon', isIndeterminate ? getIcon().TABLE_CHECKBOX_INDETERMINATE : (isChecked ? getIcon().TABLE_CHECKBOX_CHECKED : getIcon().TABLE_CHECKBOX_UNCHECKED)]
|
|
171
|
+
})
|
|
172
|
+
]
|
|
173
|
+
: []).concat([
|
|
174
|
+
h('span', {
|
|
175
|
+
class: 'vxe-checkbox--label'
|
|
176
|
+
}, formatText(item.label, 1))
|
|
177
|
+
]))
|
|
178
|
+
})
|
|
179
|
+
|
|
161
180
|
return [
|
|
162
|
-
h('
|
|
181
|
+
h('div', {
|
|
163
182
|
class: 'vxe-table--filter-header'
|
|
164
183
|
}, [
|
|
165
|
-
h('
|
|
184
|
+
h('div', {
|
|
166
185
|
class: ['vxe-table--filter-option', {
|
|
167
186
|
'is--checked': isAllChecked,
|
|
168
187
|
'is--indeterminate': isAllIndeterminate
|
|
@@ -183,36 +202,16 @@ export default defineVxeComponent({
|
|
|
183
202
|
}, getI18n('vxe.table.allFilter'))
|
|
184
203
|
]))
|
|
185
204
|
]),
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
return h('li', {
|
|
197
|
-
class: ['vxe-table--filter-option', {
|
|
198
|
-
'is--checked': item._checked
|
|
199
|
-
}],
|
|
200
|
-
title: item.label,
|
|
201
|
-
onClick: (evnt: MouseEvent) => {
|
|
202
|
-
changeOption(evnt, !item._checked, item)
|
|
203
|
-
}
|
|
204
|
-
}, (filterMultiple
|
|
205
|
-
? [
|
|
206
|
-
h('span', {
|
|
207
|
-
class: ['vxe-checkbox--icon', isIndeterminate ? getIcon().TABLE_CHECKBOX_INDETERMINATE : (isChecked ? getIcon().TABLE_CHECKBOX_CHECKED : getIcon().TABLE_CHECKBOX_UNCHECKED)]
|
|
208
|
-
})
|
|
209
|
-
]
|
|
210
|
-
: []).concat([
|
|
211
|
-
h('span', {
|
|
212
|
-
class: 'vxe-checkbox--label'
|
|
213
|
-
}, formatText(item.label, 1))
|
|
214
|
-
]))
|
|
215
|
-
}))
|
|
205
|
+
useScrollbar
|
|
206
|
+
? h(VxeUIScrollbarComponent, {
|
|
207
|
+
class: 'vxe-table--scrollbar-filter-body',
|
|
208
|
+
viewClassName: 'vxe-table--scrollbar-filter-body-view'
|
|
209
|
+
}, {
|
|
210
|
+
default: () => optVNs
|
|
211
|
+
})
|
|
212
|
+
: h('div', {
|
|
213
|
+
class: 'vxe-table--filter-body'
|
|
214
|
+
}, optVNs)
|
|
216
215
|
]
|
|
217
216
|
}
|
|
218
217
|
|
|
@@ -7,7 +7,6 @@ import { VxeUI } from '../../ui'
|
|
|
7
7
|
import { createReactData, createInternalData, getRowUniqueId, createRowId, clearTableAllStatus, getColumnList, toFilters, hasDeepKey, getRowkey, getRowid, rowToVisible, colToVisible, getCellValue, setCellValue, handleRowidOrRow, handleFieldOrColumn, toTreePathSeq, restoreScrollLocation, getRootColumn, getRefElem, getColReMinWidth, getColReMaxWidth, createHandleUpdateRowId, createHandleGetRowId, getCalcHeight, getCellRestHeight, getLastChildColumn, getRowMaxHeight, handleCustomStoreConfig, encodeRowid } from './util'
|
|
8
8
|
import { getSlotVNs } from '../../ui/src/vn'
|
|
9
9
|
import { moveRowAnimateToTb, clearRowAnimate, moveColAnimateToLr, clearColAnimate } from '../../ui/src/anime'
|
|
10
|
-
import { getThumbOffsetSize, getThumbSize, getScrollFromClick, getScrollFromDrag } from './scrollbar'
|
|
11
10
|
import { createComponentLog } from '../../ui/src/log'
|
|
12
11
|
import { getCrossTableDragRowInfo } from './store'
|
|
13
12
|
import Cell from './cell'
|
|
@@ -36,7 +35,9 @@ import type { VxeGridConstructor, VxeGridPrivateMethods, VxeTableConstructor, Vx
|
|
|
36
35
|
|
|
37
36
|
const { warnLog, errLog } = createComponentLog('table')
|
|
38
37
|
|
|
39
|
-
const { getConfig, getIcon, getI18n, renderer, formats, createEvent, globalResize, interceptor, hooks, domUtils, globalEvents, GLOBAL_EVENT_KEYS, useFns, renderEmptyElement } = VxeUI
|
|
38
|
+
const { getConfig, getIcon, getI18n, renderer, formats, scrollbarUtils, createEvent, globalResize, interceptor, hooks, domUtils, globalEvents, GLOBAL_EVENT_KEYS, useFns, renderEmptyElement } = VxeUI
|
|
39
|
+
|
|
40
|
+
const { getThumbOffsetSize, getThumbSize, getScrollFromClick, getScrollFromDrag } = scrollbarUtils || {}
|
|
40
41
|
|
|
41
42
|
const supportMaxRow = 5e6
|
|
42
43
|
const customStorageKey = 'VXE_CUSTOM_STORE'
|
|
@@ -76,6 +77,7 @@ export default defineVxeComponent({
|
|
|
76
77
|
const $xeGGWrapper = $xeGrid || $xeGantt
|
|
77
78
|
|
|
78
79
|
const { computeSize } = useFns.useSize(props)
|
|
80
|
+
const { computeIsVScrollbar } = useFns.useVScrollbar(props)
|
|
79
81
|
|
|
80
82
|
const crossTableDragRowInfo = getCrossTableDragRowInfo()
|
|
81
83
|
|
|
@@ -425,7 +427,8 @@ export default defineVxeComponent({
|
|
|
425
427
|
})
|
|
426
428
|
|
|
427
429
|
const computeTooltipOpts = computed(() => {
|
|
428
|
-
|
|
430
|
+
const isVScrollbar = computeIsVScrollbar.value
|
|
431
|
+
return Object.assign({ useScrollbar: isVScrollbar }, getConfig().tooltip, getConfig().table.tooltipConfig, props.tooltipConfig)
|
|
429
432
|
})
|
|
430
433
|
|
|
431
434
|
const computeHeaderTooltipOpts = computed(() => {
|
|
@@ -468,7 +471,8 @@ export default defineVxeComponent({
|
|
|
468
471
|
})
|
|
469
472
|
|
|
470
473
|
const computeFilterOpts = computed(() => {
|
|
471
|
-
|
|
474
|
+
const isVScrollbar = computeIsVScrollbar.value
|
|
475
|
+
return Object.assign({ useScrollbar: isVScrollbar }, getConfig().table.filterConfig, props.filterConfig) as VxeTablePropTypes.FilterOpts
|
|
472
476
|
})
|
|
473
477
|
|
|
474
478
|
const computeFloatingFilterOpts = computed(() => {
|
|
@@ -913,6 +917,7 @@ export default defineVxeComponent({
|
|
|
913
917
|
|
|
914
918
|
const computeMaps: VxeTablePrivateComputed = {
|
|
915
919
|
computeSize,
|
|
920
|
+
computeIsVScrollbar,
|
|
916
921
|
computeTableId,
|
|
917
922
|
computeValidOpts,
|
|
918
923
|
computeRowField,
|
|
@@ -3616,6 +3621,7 @@ export default defineVxeComponent({
|
|
|
3616
3621
|
if (reFull) {
|
|
3617
3622
|
updateTreeLineStyle()
|
|
3618
3623
|
}
|
|
3624
|
+
updateScrollbar()
|
|
3619
3625
|
internalData.rceRunTime = Date.now()
|
|
3620
3626
|
if (reFull) {
|
|
3621
3627
|
return computeScrollLoad()
|
|
@@ -3624,8 +3630,14 @@ export default defineVxeComponent({
|
|
|
3624
3630
|
}
|
|
3625
3631
|
|
|
3626
3632
|
const updateScrollbar = () => {
|
|
3627
|
-
|
|
3628
|
-
|
|
3633
|
+
const isVScrollbar = computeIsVScrollbar.value
|
|
3634
|
+
if (isVScrollbar) {
|
|
3635
|
+
return nextTick().then(() => {
|
|
3636
|
+
updateThumbSize()
|
|
3637
|
+
updateThumbOffset()
|
|
3638
|
+
})
|
|
3639
|
+
}
|
|
3640
|
+
return Promise.resolve()
|
|
3629
3641
|
}
|
|
3630
3642
|
|
|
3631
3643
|
const defaultMinRunDelay = 50
|
|
@@ -12955,8 +12967,8 @@ export default defineVxeComponent({
|
|
|
12955
12967
|
}
|
|
12956
12968
|
},
|
|
12957
12969
|
triggerBodyScrollEvent (evnt, fixedType) {
|
|
12958
|
-
const { useScrollbar } = props
|
|
12959
12970
|
const { scrollYLoad, scrollXLoad } = reactData
|
|
12971
|
+
const isVScrollbar = computeIsVScrollbar.value
|
|
12960
12972
|
const { elemStore, intoRunScroll, lastScrollTop, lastScrollLeft, inWheelScroll, inVirtualScroll, inHeaderScroll, inBodyScroll, scrollRenderType, inFooterScroll } = internalData
|
|
12961
12973
|
if (inWheelScroll || inVirtualScroll || inHeaderScroll || inFooterScroll) {
|
|
12962
12974
|
return
|
|
@@ -12975,7 +12987,7 @@ export default defineVxeComponent({
|
|
|
12975
12987
|
if (!bodyScrollElem) {
|
|
12976
12988
|
return
|
|
12977
12989
|
}
|
|
12978
|
-
if (!
|
|
12990
|
+
if (!isVScrollbar) {
|
|
12979
12991
|
if (!xHandleEl) {
|
|
12980
12992
|
return
|
|
12981
12993
|
}
|
|
@@ -13737,6 +13749,25 @@ export default defineVxeComponent({
|
|
|
13737
13749
|
}
|
|
13738
13750
|
}
|
|
13739
13751
|
|
|
13752
|
+
const bindScrollbarResize = () => {
|
|
13753
|
+
const { elemStore } = internalData
|
|
13754
|
+
const isVScrollbar = computeIsVScrollbar.value
|
|
13755
|
+
if (isVScrollbar) {
|
|
13756
|
+
const el = refElem.value
|
|
13757
|
+
const viewInnerEl = getRefElem(elemStore['main-body-table'])
|
|
13758
|
+
const scrollObserver = globalResize.create(() => {
|
|
13759
|
+
reScrollFlag.value++
|
|
13760
|
+
})
|
|
13761
|
+
if (el) {
|
|
13762
|
+
scrollObserver.observe(el)
|
|
13763
|
+
}
|
|
13764
|
+
if (viewInnerEl) {
|
|
13765
|
+
scrollObserver.observe(viewInnerEl)
|
|
13766
|
+
}
|
|
13767
|
+
internalData.scrollObserver = scrollObserver
|
|
13768
|
+
}
|
|
13769
|
+
}
|
|
13770
|
+
|
|
13740
13771
|
const updateThumbSize = () => {
|
|
13741
13772
|
const { elemStore } = internalData
|
|
13742
13773
|
|
|
@@ -14352,8 +14383,8 @@ export default defineVxeComponent({
|
|
|
14352
14383
|
const renderVirtualBody = () => {
|
|
14353
14384
|
const $xeGanttView = internalData.xeGanttView
|
|
14354
14385
|
|
|
14355
|
-
const { useScrollbar } = props
|
|
14356
14386
|
const { xThumbWidth, yThumbHeight } = reactData
|
|
14387
|
+
const isVScrollbar = computeIsVScrollbar.value
|
|
14357
14388
|
const scrollbarOpts = computeScrollbarOpts.value
|
|
14358
14389
|
const scrollXAutoHide = computeScrollXAutoHide.value
|
|
14359
14390
|
const scrollYAutoHide = computeScrollYAutoHide.value
|
|
@@ -14368,10 +14399,10 @@ export default defineVxeComponent({
|
|
|
14368
14399
|
return h('div', {
|
|
14369
14400
|
key: 'lvb',
|
|
14370
14401
|
class: ['vxe-table--layout-wrapper', `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`, `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`, {
|
|
14371
|
-
'is--virtual-scrollbar':
|
|
14372
|
-
'ov-padding':
|
|
14373
|
-
'ov-x--auto-hide':
|
|
14374
|
-
'ov-y--auto-hide':
|
|
14402
|
+
'is--virtual-scrollbar': isVScrollbar,
|
|
14403
|
+
'ov-padding': isVScrollbar && scrollbarOpts.padding,
|
|
14404
|
+
'ov-x--auto-hide': isVScrollbar && scrollXAutoHide,
|
|
14405
|
+
'ov-y--auto-hide': isVScrollbar && scrollYAutoHide,
|
|
14375
14406
|
'overflow-y': yThumbHeight,
|
|
14376
14407
|
'overflow-x': xThumbWidth
|
|
14377
14408
|
}]
|
|
@@ -14419,10 +14450,11 @@ export default defineVxeComponent({
|
|
|
14419
14450
|
}
|
|
14420
14451
|
|
|
14421
14452
|
const renderVN = () => {
|
|
14422
|
-
const { loading, stripe,
|
|
14453
|
+
const { loading, stripe, showHeader, height, treeConfig, mouseConfig, showFooter, highlightCell, highlightHoverRow, highlightHoverColumn, editConfig, editRules, importConfig, exportConfig, printConfig } = props
|
|
14423
14454
|
const { isGroup, overflowX, overflowY, scrollXLoad, scrollYLoad, tableData, initStore, isRowGroupStatus, columnStore, filterStore, customStore, tooltipStore } = reactData
|
|
14424
14455
|
const { teleportToWrapperElem, popupToWrapperElem, customPopupToElem } = internalData
|
|
14425
14456
|
const { leftList, rightList } = columnStore
|
|
14457
|
+
const isVScrollbar = computeIsVScrollbar.value
|
|
14426
14458
|
const loadingSlot = slots.loading
|
|
14427
14459
|
const tipSlots = {
|
|
14428
14460
|
header: slots.headerTooltip || slots['header-tooltip'],
|
|
@@ -14468,7 +14500,7 @@ export default defineVxeComponent({
|
|
|
14468
14500
|
}
|
|
14469
14501
|
return h('div', {
|
|
14470
14502
|
ref: refElem,
|
|
14471
|
-
class: ['vxe-table', 'vxe-table--render-default', `tid_${xID}`, `border--${tableBorder}`,
|
|
14503
|
+
class: ['vxe-table', 'vxe-table--render-default', `tid_${xID}`, `border--${tableBorder}`, isVScrollbar ? 'is--virtual-scrollbar' : 'is--native-scrollbar', `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`, `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`, {
|
|
14472
14504
|
[`size--${vSize}`]: vSize,
|
|
14473
14505
|
[`valid-msg--${validOpts.msgMode}`]: !!editRules,
|
|
14474
14506
|
'vxe-editable': !!editConfig,
|
|
@@ -14533,7 +14565,7 @@ export default defineVxeComponent({
|
|
|
14533
14565
|
h('div', {
|
|
14534
14566
|
key: 'tw',
|
|
14535
14567
|
class: 'vxe-table--render-wrapper'
|
|
14536
|
-
},
|
|
14568
|
+
}, isVScrollbar
|
|
14537
14569
|
? [renderVirtualBody()]
|
|
14538
14570
|
: (scrollbarXToTop
|
|
14539
14571
|
? [
|
|
@@ -14719,7 +14751,8 @@ export default defineVxeComponent({
|
|
|
14719
14751
|
key: 'ctp',
|
|
14720
14752
|
ref: refCommTooltip,
|
|
14721
14753
|
isArrow: false,
|
|
14722
|
-
enterable: false
|
|
14754
|
+
enterable: false,
|
|
14755
|
+
useScrollbar: isVScrollbar
|
|
14723
14756
|
}),
|
|
14724
14757
|
/**
|
|
14725
14758
|
* 工具提示
|
|
@@ -14742,7 +14775,8 @@ export default defineVxeComponent({
|
|
|
14742
14775
|
maxHeight: tableTipConfig.maxHeight,
|
|
14743
14776
|
placement: tableTipConfig.placement,
|
|
14744
14777
|
defaultPlacement: tableTipConfig.defaultPlacement,
|
|
14745
|
-
popupClassName: tableTipConfig.popupClassName
|
|
14778
|
+
popupClassName: tableTipConfig.popupClassName,
|
|
14779
|
+
useScrollbar: tableTipConfig.useScrollbar
|
|
14746
14780
|
}, currTooltipSlot
|
|
14747
14781
|
? {
|
|
14748
14782
|
content: () => {
|
|
@@ -14781,7 +14815,8 @@ export default defineVxeComponent({
|
|
|
14781
14815
|
theme: validTipConfig.theme,
|
|
14782
14816
|
enterable: validTipConfig.enterable,
|
|
14783
14817
|
enterDelay: validTipConfig.enterDelay,
|
|
14784
|
-
leaveDelay: validTipConfig.leaveDelay
|
|
14818
|
+
leaveDelay: validTipConfig.leaveDelay,
|
|
14819
|
+
useScrollbar: validTipConfig.useScrollbar
|
|
14785
14820
|
})
|
|
14786
14821
|
: renderEmptyElement($xeTable)
|
|
14787
14822
|
])
|
|
@@ -14892,43 +14927,44 @@ export default defineVxeComponent({
|
|
|
14892
14927
|
watch(() => VxeUI.getLanguage(), () => {
|
|
14893
14928
|
reLayoutFlag.value++
|
|
14894
14929
|
})
|
|
14930
|
+
watch(computeIsVScrollbar, () => {
|
|
14931
|
+
nextTick(() => {
|
|
14932
|
+
bindScrollbarResize()
|
|
14933
|
+
nextTick(() => {
|
|
14934
|
+
reLayoutFlag.value++
|
|
14935
|
+
})
|
|
14936
|
+
})
|
|
14937
|
+
})
|
|
14895
14938
|
watch(computeScrollbarXToTop, () => {
|
|
14896
|
-
reScrollFlag.value++
|
|
14897
14939
|
reLayoutFlag.value++
|
|
14898
14940
|
})
|
|
14899
14941
|
watch(computeScrollbarYToLeft, () => {
|
|
14900
|
-
reScrollFlag.value++
|
|
14901
14942
|
reLayoutFlag.value++
|
|
14902
14943
|
})
|
|
14903
14944
|
watch(computeScrollXVisible, () => {
|
|
14904
|
-
reScrollFlag.value++
|
|
14905
14945
|
reLayoutFlag.value++
|
|
14906
14946
|
})
|
|
14907
14947
|
watch(computeScrollYVisible, () => {
|
|
14908
|
-
reScrollFlag.value++
|
|
14909
14948
|
reLayoutFlag.value++
|
|
14910
14949
|
})
|
|
14911
14950
|
watch(computeScrollXHeight, () => {
|
|
14912
|
-
reScrollFlag.value++
|
|
14913
14951
|
reLayoutFlag.value++
|
|
14914
14952
|
})
|
|
14915
14953
|
watch(computeScrollYWidth, () => {
|
|
14916
|
-
reScrollFlag.value++
|
|
14917
14954
|
reLayoutFlag.value++
|
|
14918
14955
|
})
|
|
14919
14956
|
watch(computeCellHeitht, () => {
|
|
14920
14957
|
reLayoutFlag.value++
|
|
14921
14958
|
})
|
|
14922
14959
|
watch(reLayoutFlag, () => {
|
|
14923
|
-
|
|
14960
|
+
nextTick().then(() => {
|
|
14961
|
+
$xeTable.recalculate(true)
|
|
14962
|
+
})
|
|
14924
14963
|
})
|
|
14925
14964
|
|
|
14926
14965
|
watch(reScrollFlag, () => {
|
|
14927
|
-
|
|
14928
|
-
|
|
14929
|
-
nextTick(() => {
|
|
14930
|
-
$xeTable.updateScrollbar()
|
|
14931
|
-
})
|
|
14966
|
+
updateScrollbar().then(() => {
|
|
14967
|
+
updateScrollbar()
|
|
14932
14968
|
})
|
|
14933
14969
|
})
|
|
14934
14970
|
|
|
@@ -15077,7 +15113,7 @@ export default defineVxeComponent({
|
|
|
15077
15113
|
|
|
15078
15114
|
onMounted(() => {
|
|
15079
15115
|
const { editConfig, exportConfig, importConfig, treeConfig, minHeight, keepSource, areaConfig } = props
|
|
15080
|
-
const {
|
|
15116
|
+
const { scrollXStore, scrollYStore } = internalData
|
|
15081
15117
|
const columnOpts = computeColumnOpts.value
|
|
15082
15118
|
const columnDragOpts = computeColumnDragOpts.value
|
|
15083
15119
|
const aggregateOpts = computeAggregateOpts.value
|
|
@@ -15364,22 +15400,9 @@ export default defineVxeComponent({
|
|
|
15364
15400
|
initData()
|
|
15365
15401
|
|
|
15366
15402
|
nextTick(() => {
|
|
15367
|
-
const {
|
|
15368
|
-
const el = refElem.value
|
|
15369
|
-
if (useScrollbar) {
|
|
15370
|
-
const viewInnerEl = getRefElem(elemStore['main-body-table'])
|
|
15371
|
-
const scrollObserver = globalResize.create(() => {
|
|
15372
|
-
reScrollFlag.value++
|
|
15373
|
-
})
|
|
15374
|
-
if (el) {
|
|
15375
|
-
scrollObserver.observe(el)
|
|
15376
|
-
}
|
|
15377
|
-
if (viewInnerEl) {
|
|
15378
|
-
scrollObserver.observe(viewInnerEl)
|
|
15379
|
-
}
|
|
15380
|
-
internalData.scrollObserver = scrollObserver
|
|
15381
|
-
}
|
|
15403
|
+
const { autoResize } = props
|
|
15382
15404
|
if (autoResize) {
|
|
15405
|
+
const el = refElem.value
|
|
15383
15406
|
const parentEl = $xeTable.getParentElem()
|
|
15384
15407
|
const resizeObserver = globalResize.create(() => {
|
|
15385
15408
|
if (props.autoResize) {
|
|
@@ -15394,6 +15417,7 @@ export default defineVxeComponent({
|
|
|
15394
15417
|
}
|
|
15395
15418
|
internalData.resizeObserver = resizeObserver
|
|
15396
15419
|
}
|
|
15420
|
+
bindScrollbarResize()
|
|
15397
15421
|
})
|
|
15398
15422
|
|
|
15399
15423
|
if (virtualYOpts.mode !== 'scroll') {
|
package/packages/ui/index.ts
CHANGED
package/packages/ui/src/dom.ts
CHANGED
|
@@ -288,6 +288,7 @@ interface PanelPlacementOptions {
|
|
|
288
288
|
defaultLeft?: number
|
|
289
289
|
placement?: '' | 'top' | 'bottom' | null
|
|
290
290
|
defaultPlacement?: '' | 'top' | 'bottom' | null
|
|
291
|
+
appendTo?: string | HTMLElement | ((params: any) => string | HTMLElement)
|
|
291
292
|
teleportTo?: boolean
|
|
292
293
|
marginSize?: number
|
|
293
294
|
isMinWidth?: boolean
|
|
@@ -297,7 +298,8 @@ interface PanelPlacementOptions {
|
|
|
297
298
|
* 通用定位计算
|
|
298
299
|
*/
|
|
299
300
|
export function updatePanelPlacement (targetElem: HTMLElement | null | undefined, panelElem: HTMLElement | null | undefined, options: PanelPlacementOptions) {
|
|
300
|
-
const { defaultTop, defaultLeft, placement, defaultPlacement, teleportTo, marginSize, isMinWidth } = Object.assign({
|
|
301
|
+
const { defaultTop, defaultLeft, placement, defaultPlacement, appendTo, teleportTo, marginSize, isMinWidth } = Object.assign({
|
|
302
|
+
appendTo: '',
|
|
301
303
|
teleportTo: false,
|
|
302
304
|
marginSize: 18,
|
|
303
305
|
isMinWidth: true
|
|
@@ -311,7 +313,7 @@ export function updatePanelPlacement (targetElem: HTMLElement | null | undefined
|
|
|
311
313
|
const stys: Record<string, string> = {}
|
|
312
314
|
if (panelElem && targetElem) {
|
|
313
315
|
const bodyEl = document.body
|
|
314
|
-
const parentWrapperEl = getPopupWrapperElement(panelElem)
|
|
316
|
+
const parentWrapperEl = getPopupWrapperElement(teleportTo ? getPopupAppendElement(appendTo) : panelElem)
|
|
315
317
|
if (parentWrapperEl) {
|
|
316
318
|
const targetWidth = targetElem.offsetWidth
|
|
317
319
|
const targetHeight = targetElem.offsetHeight
|
|
@@ -324,16 +326,18 @@ export function updatePanelPlacement (targetElem: HTMLElement | null | undefined
|
|
|
324
326
|
const visibleHeight = bodyEl.clientHeight
|
|
325
327
|
const visibleWidth = bodyEl.clientWidth
|
|
326
328
|
|
|
327
|
-
const
|
|
328
|
-
const
|
|
329
|
+
const parentWrapperScrollLeft = parentWrapperEl.scrollLeft
|
|
330
|
+
const parentWrapperScrollTop = parentWrapperEl.scrollTop
|
|
331
|
+
const parentWrapperOffsetLeft = parentWrapperRect.left
|
|
332
|
+
const parentWrapperOffsetTop = parentWrapperRect.top
|
|
329
333
|
const targetLeft = targetRect.left
|
|
330
334
|
const targetTop = targetRect.top
|
|
331
335
|
|
|
332
336
|
minWidth = targetElem.offsetWidth
|
|
333
337
|
|
|
334
338
|
if (teleportTo) {
|
|
335
|
-
left = defaultLeft || (targetLeft - (panelWidth - targetWidth) / 2)
|
|
336
|
-
top = defaultTop || (targetTop + targetHeight)
|
|
339
|
+
left = (defaultLeft || (targetLeft - (panelWidth - targetWidth) / 2)) - parentWrapperScrollLeft
|
|
340
|
+
top = (defaultTop || (targetTop + targetHeight)) - parentWrapperScrollTop
|
|
337
341
|
if (placement === 'top') {
|
|
338
342
|
panelPlacement = 'top'
|
|
339
343
|
top = targetTop - panelHeight
|
|
@@ -376,8 +380,8 @@ export function updatePanelPlacement (targetElem: HTMLElement | null | undefined
|
|
|
376
380
|
}
|
|
377
381
|
|
|
378
382
|
// 偏移
|
|
379
|
-
top -=
|
|
380
|
-
left -=
|
|
383
|
+
top -= parentWrapperOffsetTop
|
|
384
|
+
left -= parentWrapperOffsetLeft
|
|
381
385
|
} else {
|
|
382
386
|
if (placement === 'top') {
|
|
383
387
|
panelPlacement = 'top'
|