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.
Files changed (68) hide show
  1. package/dist/all.esm.js +145 -167
  2. package/dist/style.css +1 -1
  3. package/dist/style.min.css +1 -1
  4. package/es/grid/src/grid.js +3 -0
  5. package/es/index.css +1 -1
  6. package/es/index.min.css +1 -1
  7. package/es/style.css +1 -1
  8. package/es/style.min.css +1 -1
  9. package/es/table/module/custom/panel.js +2 -2
  10. package/es/table/module/filter/hook.js +5 -7
  11. package/es/table/module/filter/panel.js +42 -46
  12. package/es/table/src/table.js +69 -47
  13. package/es/table/src/util.js +1 -2
  14. package/es/table/style.css +31 -12
  15. package/es/table/style.min.css +1 -1
  16. package/es/ui/index.js +2 -2
  17. package/es/ui/src/dom.js +11 -8
  18. package/es/ui/src/log.js +1 -1
  19. package/es/vxe-table/style.css +31 -12
  20. package/es/vxe-table/style.min.css +1 -1
  21. package/lib/grid/src/grid.js +5 -0
  22. package/lib/grid/src/grid.min.js +1 -1
  23. package/lib/index.css +1 -1
  24. package/lib/index.min.css +1 -1
  25. package/lib/index.umd.js +79 -127
  26. package/lib/index.umd.min.js +1 -1
  27. package/lib/style.css +1 -1
  28. package/lib/style.min.css +1 -1
  29. package/lib/table/module/custom/panel.js +2 -2
  30. package/lib/table/module/custom/panel.min.js +1 -1
  31. package/lib/table/module/filter/hook.js +6 -7
  32. package/lib/table/module/filter/hook.min.js +1 -1
  33. package/lib/table/module/filter/panel.js +34 -33
  34. package/lib/table/module/filter/panel.min.js +1 -1
  35. package/lib/table/src/table.js +19 -19
  36. package/lib/table/src/table.min.js +1 -1
  37. package/lib/table/src/util.js +1 -2
  38. package/lib/table/src/util.min.js +1 -1
  39. package/lib/table/style/style.css +31 -12
  40. package/lib/table/style/style.min.css +1 -1
  41. package/lib/ui/index.js +2 -2
  42. package/lib/ui/index.min.js +1 -1
  43. package/lib/ui/src/dom.js +11 -7
  44. package/lib/ui/src/dom.min.js +1 -1
  45. package/lib/ui/src/log.js +1 -1
  46. package/lib/ui/src/log.min.js +1 -1
  47. package/lib/vxe-table/style/style.css +31 -12
  48. package/lib/vxe-table/style/style.min.css +1 -1
  49. package/package.json +2 -2
  50. package/packages/grid/src/grid.ts +3 -0
  51. package/packages/table/module/custom/panel.ts +2 -2
  52. package/packages/table/module/filter/hook.ts +5 -7
  53. package/packages/table/module/filter/panel.ts +45 -46
  54. package/packages/table/src/table.ts +71 -47
  55. package/packages/table/src/util.ts +1 -2
  56. package/packages/ui/index.ts +1 -1
  57. package/packages/ui/src/dom.ts +12 -8
  58. package/styles/components/table-module/filter.scss +25 -14
  59. package/es/table/src/scrollbar.js +0 -54
  60. package/lib/table/src/scrollbar.js +0 -63
  61. package/lib/table/src/scrollbar.min.js +0 -1
  62. package/packages/table/src/scrollbar.ts +0 -57
  63. /package/es/{iconfont.1792035024476.ttf → iconfont.1792139865095.ttf} +0 -0
  64. /package/es/{iconfont.1792035024476.woff → iconfont.1792139865095.woff} +0 -0
  65. /package/es/{iconfont.1792035024476.woff2 → iconfont.1792139865095.woff2} +0 -0
  66. /package/lib/{iconfont.1792035024476.ttf → iconfont.1792139865095.ttf} +0 -0
  67. /package/lib/{iconfont.1792035024476.woff → iconfont.1792139865095.woff} +0 -0
  68. /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.2",
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.2"
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.handlePivotTableAggregatePanelDragendEvent) {
382
- $xeTable.handlePivotTableAggregatePanelDragendEvent(evnt)
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 - (filterHeadElem ? filterHeadElem.clientHeight : 0) - (filterFootElem ? filterFootElem.clientHeight : 0) - 14)
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.maxHeight = maxHeight
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, toCssUnit } from '../../../ui/src/dom'
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, maxHeight } = filterStore
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('ul', {
181
+ h('div', {
163
182
  class: 'vxe-table--filter-header'
164
183
  }, [
165
- h('li', {
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
- h('ul', {
187
- class: 'vxe-table--filter-body',
188
- style: maxHeight
189
- ? {
190
- maxHeight: toCssUnit(maxHeight)
191
- }
192
- : {}
193
- }, filterOptions.map((item: any) => {
194
- const isChecked = item._checked
195
- const isIndeterminate = false
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
- return Object.assign({}, getConfig().tooltip, getConfig().table.tooltipConfig, props.tooltipConfig)
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
- return Object.assign({}, getConfig().table.filterConfig, props.filterConfig) as VxeTablePropTypes.FilterOpts
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
- updateThumbSize()
3628
- updateThumbOffset()
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 (!useScrollbar) {
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': useScrollbar,
14372
- 'ov-padding': useScrollbar && scrollbarOpts.padding,
14373
- 'ov-x--auto-hide': useScrollbar && scrollXAutoHide,
14374
- 'ov-y--auto-hide': useScrollbar && scrollYAutoHide,
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, useScrollbar, showHeader, height, treeConfig, mouseConfig, showFooter, highlightCell, highlightHoverRow, highlightHoverColumn, editConfig, editRules, importConfig, exportConfig, printConfig } = props
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}`, useScrollbar ? 'is--virtual-scrollbar' : 'is--native-scrollbar', `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`, `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`, {
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
- }, useScrollbar
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
- $xeTable.recalculate(true)
14960
+ nextTick().then(() => {
14961
+ $xeTable.recalculate(true)
14962
+ })
14924
14963
  })
14925
14964
 
14926
14965
  watch(reScrollFlag, () => {
14927
- nextTick(() => {
14928
- $xeTable.updateScrollbar()
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 { elemStore, scrollXStore, scrollYStore } = internalData
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 { useScrollbar, autoResize } = props
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') {
@@ -270,8 +270,7 @@ export function createReactData (): TableReactData {
270
270
  isIndeterminate: false,
271
271
  style: null,
272
272
  column: null,
273
- visible: false,
274
- maxHeight: null
273
+ visible: false
275
274
  },
276
275
  // 存放列相关的信息
277
276
  columnStore: {
@@ -169,7 +169,7 @@ VxeUI.setConfig({
169
169
  destroyOnClose: true,
170
170
  multiple: true,
171
171
  showIcon: true,
172
- maxHeight: 280
172
+ maxHeight: 320
173
173
  },
174
174
  floatingFilterConfig: {
175
175
  // enabled: false
@@ -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 offsetLeft = parentWrapperRect.left
328
- const offsetTop = parentWrapperRect.top
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 -= offsetTop
380
- left -= offsetLeft
383
+ top -= parentWrapperOffsetTop
384
+ left -= parentWrapperOffsetLeft
381
385
  } else {
382
386
  if (placement === 'top') {
383
387
  panelPlacement = 'top'