vxe-table 4.23.0-beta.3 → 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 (56) hide show
  1. package/dist/all.esm.js +114 -101
  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/filter/hook.js +4 -7
  10. package/es/table/module/filter/panel.js +42 -46
  11. package/es/table/src/table.js +63 -45
  12. package/es/table/src/util.js +1 -2
  13. package/es/table/style.css +31 -12
  14. package/es/table/style.min.css +1 -1
  15. package/es/ui/index.js +2 -2
  16. package/es/ui/src/log.js +1 -1
  17. package/es/vxe-table/style.css +31 -12
  18. package/es/vxe-table/style.min.css +1 -1
  19. package/lib/grid/src/grid.js +5 -0
  20. package/lib/grid/src/grid.min.js +1 -1
  21. package/lib/index.css +1 -1
  22. package/lib/index.min.css +1 -1
  23. package/lib/index.umd.js +61 -58
  24. package/lib/index.umd.min.js +1 -1
  25. package/lib/style.css +1 -1
  26. package/lib/style.min.css +1 -1
  27. package/lib/table/module/filter/hook.js +5 -7
  28. package/lib/table/module/filter/hook.min.js +1 -1
  29. package/lib/table/module/filter/panel.js +34 -33
  30. package/lib/table/module/filter/panel.min.js +1 -1
  31. package/lib/table/src/table.js +13 -13
  32. package/lib/table/src/table.min.js +1 -1
  33. package/lib/table/src/util.js +1 -2
  34. package/lib/table/src/util.min.js +1 -1
  35. package/lib/table/style/style.css +31 -12
  36. package/lib/table/style/style.min.css +1 -1
  37. package/lib/ui/index.js +2 -2
  38. package/lib/ui/index.min.js +1 -1
  39. package/lib/ui/src/log.js +1 -1
  40. package/lib/ui/src/log.min.js +1 -1
  41. package/lib/vxe-table/style/style.css +31 -12
  42. package/lib/vxe-table/style/style.min.css +1 -1
  43. package/package.json +2 -2
  44. package/packages/grid/src/grid.ts +3 -0
  45. package/packages/table/module/filter/hook.ts +4 -7
  46. package/packages/table/module/filter/panel.ts +45 -46
  47. package/packages/table/src/table.ts +64 -45
  48. package/packages/table/src/util.ts +1 -2
  49. package/packages/ui/index.ts +1 -1
  50. package/styles/components/table-module/filter.scss +25 -14
  51. /package/es/{iconfont.1792117711657.ttf → iconfont.1792139865095.ttf} +0 -0
  52. /package/es/{iconfont.1792117711657.woff → iconfont.1792139865095.woff} +0 -0
  53. /package/es/{iconfont.1792117711657.woff2 → iconfont.1792139865095.woff2} +0 -0
  54. /package/lib/{iconfont.1792117711657.ttf → iconfont.1792139865095.ttf} +0 -0
  55. /package/lib/{iconfont.1792117711657.woff → iconfont.1792139865095.woff} +0 -0
  56. /package/lib/{iconfont.1792117711657.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",
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.8"
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,
@@ -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
  * 是否显示筛选按钮图标
@@ -85,7 +83,7 @@ hooks.add('tableFilterModule', {
85
83
  const centerWidth = targetEl ? filterWidth / 2 : ((filterWidth - column.renderWidth) / 2)
86
84
  left = btnRect.left - tableRect.left - centerWidth
87
85
  top = btnRect.top - tableRect.top + currEl.clientHeight
88
- 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)
89
87
  if (left < 1) {
90
88
  left = 1
91
89
  } else if (left > (tableEl.clientWidth - filterWidth - 1)) {
@@ -106,7 +104,6 @@ hooks.add('tableFilterModule', {
106
104
  if (zIndex) {
107
105
  panelStyle.zIndex = zIndex
108
106
  }
109
- filterStore.style = panelStyle
110
107
  // 筛选面板是自适应表格高度
111
108
  if (compConf ? !compConf.tableFilterAutoHeight : false) {
112
109
  maxHeight = 0
@@ -115,8 +112,8 @@ hooks.add('tableFilterModule', {
115
112
  maxHeight = customMaxHeight > maxHeight ? maxHeight : customMaxHeight
116
113
  }
117
114
  }
118
- // 判断面板不能大于表格高度
119
- filterStore.maxHeight = maxHeight
115
+ panelStyle['--vxe-ui-vxe-table-filter-default-max-height'] = maxHeight ? toCssUnit(maxHeight) : 'none'
116
+ filterStore.style = panelStyle
120
117
  }
121
118
  handleStyle()
122
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
 
@@ -77,6 +77,7 @@ export default defineVxeComponent({
77
77
  const $xeGGWrapper = $xeGrid || $xeGantt
78
78
 
79
79
  const { computeSize } = useFns.useSize(props)
80
+ const { computeIsVScrollbar } = useFns.useVScrollbar(props)
80
81
 
81
82
  const crossTableDragRowInfo = getCrossTableDragRowInfo()
82
83
 
@@ -426,8 +427,8 @@ export default defineVxeComponent({
426
427
  })
427
428
 
428
429
  const computeTooltipOpts = computed(() => {
429
- const { useScrollbar } = props
430
- return Object.assign({ useScrollbar }, 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)
431
432
  })
432
433
 
433
434
  const computeHeaderTooltipOpts = computed(() => {
@@ -470,7 +471,8 @@ export default defineVxeComponent({
470
471
  })
471
472
 
472
473
  const computeFilterOpts = computed(() => {
473
- 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
474
476
  })
475
477
 
476
478
  const computeFloatingFilterOpts = computed(() => {
@@ -915,6 +917,7 @@ export default defineVxeComponent({
915
917
 
916
918
  const computeMaps: VxeTablePrivateComputed = {
917
919
  computeSize,
920
+ computeIsVScrollbar,
918
921
  computeTableId,
919
922
  computeValidOpts,
920
923
  computeRowField,
@@ -3618,6 +3621,7 @@ export default defineVxeComponent({
3618
3621
  if (reFull) {
3619
3622
  updateTreeLineStyle()
3620
3623
  }
3624
+ updateScrollbar()
3621
3625
  internalData.rceRunTime = Date.now()
3622
3626
  if (reFull) {
3623
3627
  return computeScrollLoad()
@@ -3626,8 +3630,14 @@ export default defineVxeComponent({
3626
3630
  }
3627
3631
 
3628
3632
  const updateScrollbar = () => {
3629
- updateThumbSize()
3630
- updateThumbOffset()
3633
+ const isVScrollbar = computeIsVScrollbar.value
3634
+ if (isVScrollbar) {
3635
+ return nextTick().then(() => {
3636
+ updateThumbSize()
3637
+ updateThumbOffset()
3638
+ })
3639
+ }
3640
+ return Promise.resolve()
3631
3641
  }
3632
3642
 
3633
3643
  const defaultMinRunDelay = 50
@@ -12957,8 +12967,8 @@ export default defineVxeComponent({
12957
12967
  }
12958
12968
  },
12959
12969
  triggerBodyScrollEvent (evnt, fixedType) {
12960
- const { useScrollbar } = props
12961
12970
  const { scrollYLoad, scrollXLoad } = reactData
12971
+ const isVScrollbar = computeIsVScrollbar.value
12962
12972
  const { elemStore, intoRunScroll, lastScrollTop, lastScrollLeft, inWheelScroll, inVirtualScroll, inHeaderScroll, inBodyScroll, scrollRenderType, inFooterScroll } = internalData
12963
12973
  if (inWheelScroll || inVirtualScroll || inHeaderScroll || inFooterScroll) {
12964
12974
  return
@@ -12977,7 +12987,7 @@ export default defineVxeComponent({
12977
12987
  if (!bodyScrollElem) {
12978
12988
  return
12979
12989
  }
12980
- if (!useScrollbar) {
12990
+ if (!isVScrollbar) {
12981
12991
  if (!xHandleEl) {
12982
12992
  return
12983
12993
  }
@@ -13739,6 +13749,25 @@ export default defineVxeComponent({
13739
13749
  }
13740
13750
  }
13741
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
+
13742
13771
  const updateThumbSize = () => {
13743
13772
  const { elemStore } = internalData
13744
13773
 
@@ -14354,8 +14383,8 @@ export default defineVxeComponent({
14354
14383
  const renderVirtualBody = () => {
14355
14384
  const $xeGanttView = internalData.xeGanttView
14356
14385
 
14357
- const { useScrollbar } = props
14358
14386
  const { xThumbWidth, yThumbHeight } = reactData
14387
+ const isVScrollbar = computeIsVScrollbar.value
14359
14388
  const scrollbarOpts = computeScrollbarOpts.value
14360
14389
  const scrollXAutoHide = computeScrollXAutoHide.value
14361
14390
  const scrollYAutoHide = computeScrollYAutoHide.value
@@ -14370,10 +14399,10 @@ export default defineVxeComponent({
14370
14399
  return h('div', {
14371
14400
  key: 'lvb',
14372
14401
  class: ['vxe-table--layout-wrapper', `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`, `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`, {
14373
- 'is--virtual-scrollbar': useScrollbar,
14374
- 'ov-padding': useScrollbar && scrollbarOpts.padding,
14375
- 'ov-x--auto-hide': useScrollbar && scrollXAutoHide,
14376
- '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,
14377
14406
  'overflow-y': yThumbHeight,
14378
14407
  'overflow-x': xThumbWidth
14379
14408
  }]
@@ -14421,10 +14450,11 @@ export default defineVxeComponent({
14421
14450
  }
14422
14451
 
14423
14452
  const renderVN = () => {
14424
- 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
14425
14454
  const { isGroup, overflowX, overflowY, scrollXLoad, scrollYLoad, tableData, initStore, isRowGroupStatus, columnStore, filterStore, customStore, tooltipStore } = reactData
14426
14455
  const { teleportToWrapperElem, popupToWrapperElem, customPopupToElem } = internalData
14427
14456
  const { leftList, rightList } = columnStore
14457
+ const isVScrollbar = computeIsVScrollbar.value
14428
14458
  const loadingSlot = slots.loading
14429
14459
  const tipSlots = {
14430
14460
  header: slots.headerTooltip || slots['header-tooltip'],
@@ -14470,7 +14500,7 @@ export default defineVxeComponent({
14470
14500
  }
14471
14501
  return h('div', {
14472
14502
  ref: refElem,
14473
- 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'}`, {
14474
14504
  [`size--${vSize}`]: vSize,
14475
14505
  [`valid-msg--${validOpts.msgMode}`]: !!editRules,
14476
14506
  'vxe-editable': !!editConfig,
@@ -14535,7 +14565,7 @@ export default defineVxeComponent({
14535
14565
  h('div', {
14536
14566
  key: 'tw',
14537
14567
  class: 'vxe-table--render-wrapper'
14538
- }, useScrollbar
14568
+ }, isVScrollbar
14539
14569
  ? [renderVirtualBody()]
14540
14570
  : (scrollbarXToTop
14541
14571
  ? [
@@ -14722,7 +14752,7 @@ export default defineVxeComponent({
14722
14752
  ref: refCommTooltip,
14723
14753
  isArrow: false,
14724
14754
  enterable: false,
14725
- useScrollbar
14755
+ useScrollbar: isVScrollbar
14726
14756
  }),
14727
14757
  /**
14728
14758
  * 工具提示
@@ -14786,7 +14816,7 @@ export default defineVxeComponent({
14786
14816
  enterable: validTipConfig.enterable,
14787
14817
  enterDelay: validTipConfig.enterDelay,
14788
14818
  leaveDelay: validTipConfig.leaveDelay,
14789
- useScrollbar
14819
+ useScrollbar: validTipConfig.useScrollbar
14790
14820
  })
14791
14821
  : renderEmptyElement($xeTable)
14792
14822
  ])
@@ -14897,43 +14927,44 @@ export default defineVxeComponent({
14897
14927
  watch(() => VxeUI.getLanguage(), () => {
14898
14928
  reLayoutFlag.value++
14899
14929
  })
14930
+ watch(computeIsVScrollbar, () => {
14931
+ nextTick(() => {
14932
+ bindScrollbarResize()
14933
+ nextTick(() => {
14934
+ reLayoutFlag.value++
14935
+ })
14936
+ })
14937
+ })
14900
14938
  watch(computeScrollbarXToTop, () => {
14901
- reScrollFlag.value++
14902
14939
  reLayoutFlag.value++
14903
14940
  })
14904
14941
  watch(computeScrollbarYToLeft, () => {
14905
- reScrollFlag.value++
14906
14942
  reLayoutFlag.value++
14907
14943
  })
14908
14944
  watch(computeScrollXVisible, () => {
14909
- reScrollFlag.value++
14910
14945
  reLayoutFlag.value++
14911
14946
  })
14912
14947
  watch(computeScrollYVisible, () => {
14913
- reScrollFlag.value++
14914
14948
  reLayoutFlag.value++
14915
14949
  })
14916
14950
  watch(computeScrollXHeight, () => {
14917
- reScrollFlag.value++
14918
14951
  reLayoutFlag.value++
14919
14952
  })
14920
14953
  watch(computeScrollYWidth, () => {
14921
- reScrollFlag.value++
14922
14954
  reLayoutFlag.value++
14923
14955
  })
14924
14956
  watch(computeCellHeitht, () => {
14925
14957
  reLayoutFlag.value++
14926
14958
  })
14927
14959
  watch(reLayoutFlag, () => {
14928
- $xeTable.recalculate(true)
14960
+ nextTick().then(() => {
14961
+ $xeTable.recalculate(true)
14962
+ })
14929
14963
  })
14930
14964
 
14931
14965
  watch(reScrollFlag, () => {
14932
- nextTick(() => {
14933
- $xeTable.updateScrollbar()
14934
- nextTick(() => {
14935
- $xeTable.updateScrollbar()
14936
- })
14966
+ updateScrollbar().then(() => {
14967
+ updateScrollbar()
14937
14968
  })
14938
14969
  })
14939
14970
 
@@ -15082,7 +15113,7 @@ export default defineVxeComponent({
15082
15113
 
15083
15114
  onMounted(() => {
15084
15115
  const { editConfig, exportConfig, importConfig, treeConfig, minHeight, keepSource, areaConfig } = props
15085
- const { elemStore, scrollXStore, scrollYStore } = internalData
15116
+ const { scrollXStore, scrollYStore } = internalData
15086
15117
  const columnOpts = computeColumnOpts.value
15087
15118
  const columnDragOpts = computeColumnDragOpts.value
15088
15119
  const aggregateOpts = computeAggregateOpts.value
@@ -15369,22 +15400,9 @@ export default defineVxeComponent({
15369
15400
  initData()
15370
15401
 
15371
15402
  nextTick(() => {
15372
- const { useScrollbar, autoResize } = props
15373
- const el = refElem.value
15374
- if (useScrollbar) {
15375
- const viewInnerEl = getRefElem(elemStore['main-body-table'])
15376
- const scrollObserver = globalResize.create(() => {
15377
- reScrollFlag.value++
15378
- })
15379
- if (el) {
15380
- scrollObserver.observe(el)
15381
- }
15382
- if (viewInnerEl) {
15383
- scrollObserver.observe(viewInnerEl)
15384
- }
15385
- internalData.scrollObserver = scrollObserver
15386
- }
15403
+ const { autoResize } = props
15387
15404
  if (autoResize) {
15405
+ const el = refElem.value
15388
15406
  const parentEl = $xeTable.getParentElem()
15389
15407
  const resizeObserver = globalResize.create(() => {
15390
15408
  if (props.autoResize) {
@@ -15399,6 +15417,7 @@ export default defineVxeComponent({
15399
15417
  }
15400
15418
  internalData.resizeObserver = resizeObserver
15401
15419
  }
15420
+ bindScrollbarResize()
15402
15421
  })
15403
15422
 
15404
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
@@ -31,6 +31,7 @@
31
31
  .vxe-table--filter-wrapper {
32
32
  display: none;
33
33
  position: absolute;
34
+ flex-direction: column;
34
35
  top: 0;
35
36
  min-width: 100px;
36
37
  font-size: var(--vxe-ui-font-size-default);
@@ -40,6 +41,7 @@
40
41
  color: var(--vxe-ui-font-color);
41
42
  box-shadow: var(--vxe-ui-base-popup-box-shadow);
42
43
  z-index: 15;
44
+ max-height: var(--vxe-ui-vxe-table-filter-default-max-height);
43
45
  &:not(.is--multiple) {
44
46
  .vxe-table--filter-header,
45
47
  .vxe-table--filter-body {
@@ -47,11 +49,24 @@
47
49
  }
48
50
  }
49
51
  &.is--active {
50
- display: block;
52
+ display: flex;
53
+ }
54
+ .vxe-table--filter-body,
55
+ .vxe-table--scrollbar-filter-body {
56
+ overflow: auto;
57
+ flex-grow: 1;
58
+ }
59
+ .vxe-table--scrollbar-filter-body {
60
+ display: flex;
61
+ flex-direction: column;
62
+ .vxe-table--scrollbar-filter-body-view {
63
+ flex-grow: 1;
64
+ }
51
65
  }
52
66
  .vxe-table--filter-header,
53
- .vxe-table--filter-body {
54
- & > li {
67
+ .vxe-table--filter-body,
68
+ .vxe-table--scrollbar-filter-body {
69
+ .vxe-table--filter-option {
55
70
  overflow: hidden;
56
71
  text-overflow: ellipsis;
57
72
  white-space: nowrap;
@@ -69,11 +84,12 @@
69
84
  .vxe-table--filter-header {
70
85
  padding-top: 0.2em;
71
86
  }
72
- .vxe-table--filter-body {
73
- max-height: var(--vxe-ui-vxe-table-filter-default-max-height);
87
+ .vxe-table--filter-body,
88
+ .vxe-table--scrollbar-filter-body {
74
89
  padding-bottom: 0.2em;
75
90
  }
76
- & > ul {
91
+ .vxe-table--filter-header,
92
+ .vxe-table--filter-body {
77
93
  list-style-type: none;
78
94
  padding: 0;
79
95
  margin: 0;
@@ -81,12 +97,9 @@
81
97
  overflow: auto;
82
98
  user-select: none;
83
99
  }
84
- &.is--multiple {
85
- & > ul {
86
- & > li {
87
- padding: 0.25em 0.8em 0.25em 1em;
88
- }
89
- }
100
+ .vxe-table--filter-header,
101
+ .vxe-table--filter-footer {
102
+ flex-shrink: 0;
90
103
  }
91
104
  .vxe-table--filter-footer {
92
105
  border-top: 1px solid var(--vxe-ui-base-popup-border-color);
@@ -116,8 +129,6 @@
116
129
  @include baseMixin.createCheckboxIcon();
117
130
  }
118
131
 
119
-
120
-
121
132
  .vxe-table--filter-wrapper {
122
133
  &.size--medium {
123
134
  font-size: var(--vxe-ui-font-size-medium);