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
@@ -350,8 +350,8 @@ export default defineVxeComponent({
350
350
  const { prevDragCol, prevDragGroupField, prevDragAggFnColid, prevDragPos, prevDragToChild } = customPanelInternalData;
351
351
  const dragOffsetIndex = prevDragPos === 'bottom' ? 1 : 0;
352
352
  if (prevDragGroupField || prevDragAggFnColid) {
353
- if ($xeTable.handlePivotTableAggregatePanelDragendEvent) {
354
- $xeTable.handlePivotTableAggregatePanelDragendEvent(evnt);
353
+ if ($xeTable.handlePivotTableAggPanelDragendEvent) {
354
+ $xeTable.handlePivotTableAggPanelDragendEvent(evnt);
355
355
  }
356
356
  }
357
357
  else if (prevDragCol && dragCol) {
@@ -16,7 +16,7 @@ hooks.add('tableFilterModule', {
16
16
  const { refElem, refTableFilter } = $xeTable.getRefMaps();
17
17
  const { computeFilterOpts, computeMouseOpts, computeRendererOpts } = $xeTable.getComputeMaps();
18
18
  const updatePopupStyle = () => {
19
- const { filterStore } = reactData;
19
+ const { filterStore, scrollbarHeight } = reactData;
20
20
  const { elemStore } = internalData;
21
21
  const { column, targetEl } = filterStore;
22
22
  if (!column) {
@@ -37,8 +37,6 @@ hooks.add('tableFilterModule', {
37
37
  if (!filterWrapperElem) {
38
38
  return nextTick();
39
39
  }
40
- const filterHeadElem = filterWrapperElem.querySelector('.vxe-table--filter-header');
41
- const filterFootElem = filterWrapperElem.querySelector('.vxe-table--filter-footer');
42
40
  /**
43
41
  * 是否显示筛选按钮图标
44
42
  * 如果不存在图标,则相对单元格居中显示
@@ -64,6 +62,7 @@ hooks.add('tableFilterModule', {
64
62
  if (transfer) {
65
63
  const ppObj = updatePanelPlacement(currEl, filterWrapperElem, {
66
64
  defaultPlacement: 'bottom',
65
+ appendTo: '',
67
66
  isMinWidth: false,
68
67
  teleportTo: transfer
69
68
  });
@@ -74,7 +73,7 @@ hooks.add('tableFilterModule', {
74
73
  const centerWidth = targetEl ? filterWidth / 2 : ((filterWidth - column.renderWidth) / 2);
75
74
  left = btnRect.left - tableRect.left - centerWidth;
76
75
  top = btnRect.top - tableRect.top + currEl.clientHeight;
77
- maxHeight = Math.max(40, tableEl.clientHeight - top - (filterHeadElem ? filterHeadElem.clientHeight : 0) - (filterFootElem ? filterFootElem.clientHeight : 0) - 14);
76
+ maxHeight = Math.max(40, tableEl.clientHeight - top - scrollbarHeight);
78
77
  if (left < 1) {
79
78
  left = 1;
80
79
  }
@@ -96,7 +95,6 @@ hooks.add('tableFilterModule', {
96
95
  if (zIndex) {
97
96
  panelStyle.zIndex = zIndex;
98
97
  }
99
- filterStore.style = panelStyle;
100
98
  // 筛选面板是自适应表格高度
101
99
  if (compConf ? !compConf.tableFilterAutoHeight : false) {
102
100
  maxHeight = 0;
@@ -106,8 +104,8 @@ hooks.add('tableFilterModule', {
106
104
  maxHeight = customMaxHeight > maxHeight ? maxHeight : customMaxHeight;
107
105
  }
108
106
  }
109
- // 判断面板不能大于表格高度
110
- filterStore.maxHeight = maxHeight;
107
+ panelStyle['--vxe-ui-vxe-table-filter-default-max-height'] = maxHeight ? toCssUnit(maxHeight) : 'none';
108
+ filterStore.style = panelStyle;
111
109
  };
112
110
  handleStyle();
113
111
  return nextTick().then(() => {
@@ -2,7 +2,7 @@ import { h, ref, computed, inject, Teleport } 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';
@@ -18,6 +18,7 @@ export default defineVxeComponent({
18
18
  },
19
19
  setup(props, context) {
20
20
  const xID = XEUtils.uniqueId();
21
+ const VxeUIScrollbarComponent = VxeUI.getComponent('VxeScrollbar');
21
22
  const $xeTable = inject('$xeTable', {});
22
23
  const { reactData: tableReactData, internalData: tableInternalData, getComputeMaps } = $xeTable;
23
24
  const { computeFilterOpts, computeRendererOpts } = getComputeMaps();
@@ -105,10 +106,12 @@ export default defineVxeComponent({
105
106
  Object.assign($xeFilterPanel, filterPanelMethods);
106
107
  const renderOptions = (filterRender, compConf) => {
107
108
  const { filterStore } = props;
108
- const { column, maxHeight } = filterStore;
109
+ const { column } = filterStore;
109
110
  if (!column) {
110
111
  return [];
111
112
  }
113
+ const filterOpts = computeFilterOpts.value;
114
+ const { useScrollbar } = filterOpts;
112
115
  const { filterMultiple, filters, slots } = column;
113
116
  const filterOptions = (filters || []);
114
117
  const filterSlot = slots ? slots.filter : null;
@@ -117,34 +120,47 @@ export default defineVxeComponent({
117
120
  if (filterSlot) {
118
121
  return [
119
122
  h('div', {
120
- class: 'vxe-table--filter-template',
121
- style: maxHeight
122
- ? {
123
- maxHeight: toCssUnit(maxHeight)
124
- }
125
- : {}
123
+ class: 'vxe-table--filter-template'
126
124
  }, $xeTable.callSlot(filterSlot, params))
127
125
  ];
128
126
  }
129
127
  else if (filterRender && rtFilter) {
130
128
  return [
131
129
  h('div', {
132
- class: 'vxe-table--filter-template',
133
- style: maxHeight
134
- ? {
135
- maxHeight: toCssUnit(maxHeight)
136
- }
137
- : {}
130
+ class: 'vxe-table--filter-template'
138
131
  }, getSlotVNs(rtFilter(filterRender, params)))
139
132
  ];
140
133
  }
141
134
  const isAllChecked = filterMultiple ? filterStore.isAllSelected : !filterOptions.some((item) => item._checked);
142
135
  const isAllIndeterminate = filterMultiple && filterStore.isIndeterminate;
136
+ const optVNs = filterOptions.map((item) => {
137
+ const isChecked = item._checked;
138
+ const isIndeterminate = false;
139
+ return h('div', {
140
+ class: ['vxe-table--filter-option', {
141
+ 'is--checked': item._checked
142
+ }],
143
+ title: item.label,
144
+ onClick: (evnt) => {
145
+ changeOption(evnt, !item._checked, item);
146
+ }
147
+ }, (filterMultiple
148
+ ? [
149
+ h('span', {
150
+ class: ['vxe-checkbox--icon', isIndeterminate ? getIcon().TABLE_CHECKBOX_INDETERMINATE : (isChecked ? getIcon().TABLE_CHECKBOX_CHECKED : getIcon().TABLE_CHECKBOX_UNCHECKED)]
151
+ })
152
+ ]
153
+ : []).concat([
154
+ h('span', {
155
+ class: 'vxe-checkbox--label'
156
+ }, formatText(item.label, 1))
157
+ ]));
158
+ });
143
159
  return [
144
- h('ul', {
160
+ h('div', {
145
161
  class: 'vxe-table--filter-header'
146
162
  }, [
147
- h('li', {
163
+ h('div', {
148
164
  class: ['vxe-table--filter-option', {
149
165
  'is--checked': isAllChecked,
150
166
  'is--indeterminate': isAllIndeterminate
@@ -165,36 +181,16 @@ export default defineVxeComponent({
165
181
  }, getI18n('vxe.table.allFilter'))
166
182
  ]))
167
183
  ]),
168
- h('ul', {
169
- class: 'vxe-table--filter-body',
170
- style: maxHeight
171
- ? {
172
- maxHeight: toCssUnit(maxHeight)
173
- }
174
- : {}
175
- }, filterOptions.map((item) => {
176
- const isChecked = item._checked;
177
- const isIndeterminate = false;
178
- return h('li', {
179
- class: ['vxe-table--filter-option', {
180
- 'is--checked': item._checked
181
- }],
182
- title: item.label,
183
- onClick: (evnt) => {
184
- changeOption(evnt, !item._checked, item);
185
- }
186
- }, (filterMultiple
187
- ? [
188
- h('span', {
189
- class: ['vxe-checkbox--icon', isIndeterminate ? getIcon().TABLE_CHECKBOX_INDETERMINATE : (isChecked ? getIcon().TABLE_CHECKBOX_CHECKED : getIcon().TABLE_CHECKBOX_UNCHECKED)]
190
- })
191
- ]
192
- : []).concat([
193
- h('span', {
194
- class: 'vxe-checkbox--label'
195
- }, formatText(item.label, 1))
196
- ]));
197
- }))
184
+ useScrollbar
185
+ ? h(VxeUIScrollbarComponent, {
186
+ class: 'vxe-table--scrollbar-filter-body',
187
+ viewClassName: 'vxe-table--scrollbar-filter-body-view'
188
+ }, {
189
+ default: () => optVNs
190
+ })
191
+ : h('div', {
192
+ class: 'vxe-table--filter-body'
193
+ }, optVNs)
198
194
  ];
199
195
  };
200
196
  const renderFooters = () => {
@@ -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';
@@ -30,7 +29,8 @@ import '../module/validator/hook';
30
29
  import '../module/custom/hook';
31
30
  import '../render';
32
31
  const { warnLog, errLog } = createComponentLog('table');
33
- const { getConfig, getIcon, getI18n, renderer, formats, createEvent, globalResize, interceptor, hooks, domUtils, globalEvents, GLOBAL_EVENT_KEYS, useFns, renderEmptyElement } = VxeUI;
32
+ const { getConfig, getIcon, getI18n, renderer, formats, scrollbarUtils, createEvent, globalResize, interceptor, hooks, domUtils, globalEvents, GLOBAL_EVENT_KEYS, useFns, renderEmptyElement } = VxeUI;
33
+ const { getThumbOffsetSize, getThumbSize, getScrollFromClick, getScrollFromDrag } = scrollbarUtils || {};
34
34
  const supportMaxRow = 5e6;
35
35
  const customStorageKey = 'VXE_CUSTOM_STORE';
36
36
  const maxYHeight = 5e6;
@@ -57,6 +57,7 @@ export default defineVxeComponent({
57
57
  const $xeGantt = inject('$xeGantt', null);
58
58
  const $xeGGWrapper = $xeGrid || $xeGantt;
59
59
  const { computeSize } = useFns.useSize(props);
60
+ const { computeIsVScrollbar } = useFns.useVScrollbar(props);
60
61
  const crossTableDragRowInfo = getCrossTableDragRowInfo();
61
62
  const reactData = reactive(createReactData());
62
63
  const internalData = createInternalData();
@@ -350,7 +351,8 @@ export default defineVxeComponent({
350
351
  return Object.assign({}, getConfig().table.checkboxConfig, props.checkboxConfig);
351
352
  });
352
353
  const computeTooltipOpts = computed(() => {
353
- return Object.assign({}, getConfig().tooltip, getConfig().table.tooltipConfig, props.tooltipConfig);
354
+ const isVScrollbar = computeIsVScrollbar.value;
355
+ return Object.assign({ useScrollbar: isVScrollbar }, getConfig().tooltip, getConfig().table.tooltipConfig, props.tooltipConfig);
354
356
  });
355
357
  const computeHeaderTooltipOpts = computed(() => {
356
358
  const tooltipOpts = computeTooltipOpts.value;
@@ -385,7 +387,8 @@ export default defineVxeComponent({
385
387
  return Object.assign({ orders: ['asc', 'desc', null] }, getConfig().table.sortConfig, props.sortConfig);
386
388
  });
387
389
  const computeFilterOpts = computed(() => {
388
- return Object.assign({}, getConfig().table.filterConfig, props.filterConfig);
390
+ const isVScrollbar = computeIsVScrollbar.value;
391
+ return Object.assign({ useScrollbar: isVScrollbar }, getConfig().table.filterConfig, props.filterConfig);
389
392
  });
390
393
  const computeFloatingFilterOpts = computed(() => {
391
394
  return Object.assign({}, getConfig().table.floatingFilterConfig, props.floatingFilterConfig);
@@ -786,6 +789,7 @@ export default defineVxeComponent({
786
789
  };
787
790
  const computeMaps = {
788
791
  computeSize,
792
+ computeIsVScrollbar,
789
793
  computeTableId,
790
794
  computeValidOpts,
791
795
  computeRowField,
@@ -3441,6 +3445,7 @@ export default defineVxeComponent({
3441
3445
  if (reFull) {
3442
3446
  updateTreeLineStyle();
3443
3447
  }
3448
+ updateScrollbar();
3444
3449
  internalData.rceRunTime = Date.now();
3445
3450
  if (reFull) {
3446
3451
  return computeScrollLoad();
@@ -3448,8 +3453,14 @@ export default defineVxeComponent({
3448
3453
  });
3449
3454
  };
3450
3455
  const updateScrollbar = () => {
3451
- updateThumbSize();
3452
- updateThumbOffset();
3456
+ const isVScrollbar = computeIsVScrollbar.value;
3457
+ if (isVScrollbar) {
3458
+ return nextTick().then(() => {
3459
+ updateThumbSize();
3460
+ updateThumbOffset();
3461
+ });
3462
+ }
3463
+ return Promise.resolve();
3453
3464
  };
3454
3465
  const defaultMinRunDelay = 50;
3455
3466
  const handleLazyRecalculate = (reFull, reWidth, reHeight, options) => {
@@ -12768,8 +12779,8 @@ export default defineVxeComponent({
12768
12779
  }
12769
12780
  },
12770
12781
  triggerBodyScrollEvent(evnt, fixedType) {
12771
- const { useScrollbar } = props;
12772
12782
  const { scrollYLoad, scrollXLoad } = reactData;
12783
+ const isVScrollbar = computeIsVScrollbar.value;
12773
12784
  const { elemStore, intoRunScroll, lastScrollTop, lastScrollLeft, inWheelScroll, inVirtualScroll, inHeaderScroll, inBodyScroll, scrollRenderType, inFooterScroll } = internalData;
12774
12785
  if (inWheelScroll || inVirtualScroll || inHeaderScroll || inFooterScroll) {
12775
12786
  return;
@@ -12788,7 +12799,7 @@ export default defineVxeComponent({
12788
12799
  if (!bodyScrollElem) {
12789
12800
  return;
12790
12801
  }
12791
- if (!useScrollbar) {
12802
+ if (!isVScrollbar) {
12792
12803
  if (!xHandleEl) {
12793
12804
  return;
12794
12805
  }
@@ -13539,6 +13550,24 @@ export default defineVxeComponent({
13539
13550
  return nextTick();
13540
13551
  }
13541
13552
  };
13553
+ const bindScrollbarResize = () => {
13554
+ const { elemStore } = internalData;
13555
+ const isVScrollbar = computeIsVScrollbar.value;
13556
+ if (isVScrollbar) {
13557
+ const el = refElem.value;
13558
+ const viewInnerEl = getRefElem(elemStore['main-body-table']);
13559
+ const scrollObserver = globalResize.create(() => {
13560
+ reScrollFlag.value++;
13561
+ });
13562
+ if (el) {
13563
+ scrollObserver.observe(el);
13564
+ }
13565
+ if (viewInnerEl) {
13566
+ scrollObserver.observe(viewInnerEl);
13567
+ }
13568
+ internalData.scrollObserver = scrollObserver;
13569
+ }
13570
+ };
13542
13571
  const updateThumbSize = () => {
13543
13572
  const { elemStore } = internalData;
13544
13573
  const viewEl = getRefElem(elemStore['main-body-scroll']);
@@ -14118,8 +14147,8 @@ export default defineVxeComponent({
14118
14147
  };
14119
14148
  const renderVirtualBody = () => {
14120
14149
  const $xeGanttView = internalData.xeGanttView;
14121
- const { useScrollbar } = props;
14122
14150
  const { xThumbWidth, yThumbHeight } = reactData;
14151
+ const isVScrollbar = computeIsVScrollbar.value;
14123
14152
  const scrollbarOpts = computeScrollbarOpts.value;
14124
14153
  const scrollXAutoHide = computeScrollXAutoHide.value;
14125
14154
  const scrollYAutoHide = computeScrollYAutoHide.value;
@@ -14133,10 +14162,10 @@ export default defineVxeComponent({
14133
14162
  return h('div', {
14134
14163
  key: 'lvb',
14135
14164
  class: ['vxe-table--layout-wrapper', `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`, `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`, {
14136
- 'is--virtual-scrollbar': useScrollbar,
14137
- 'ov-padding': useScrollbar && scrollbarOpts.padding,
14138
- 'ov-x--auto-hide': useScrollbar && scrollXAutoHide,
14139
- 'ov-y--auto-hide': useScrollbar && scrollYAutoHide,
14165
+ 'is--virtual-scrollbar': isVScrollbar,
14166
+ 'ov-padding': isVScrollbar && scrollbarOpts.padding,
14167
+ 'ov-x--auto-hide': isVScrollbar && scrollXAutoHide,
14168
+ 'ov-y--auto-hide': isVScrollbar && scrollYAutoHide,
14140
14169
  'overflow-y': yThumbHeight,
14141
14170
  'overflow-x': xThumbWidth
14142
14171
  }]
@@ -14183,10 +14212,11 @@ export default defineVxeComponent({
14183
14212
  ]);
14184
14213
  };
14185
14214
  const renderVN = () => {
14186
- const { loading, stripe, useScrollbar, showHeader, height, treeConfig, mouseConfig, showFooter, highlightCell, highlightHoverRow, highlightHoverColumn, editConfig, editRules, importConfig, exportConfig, printConfig } = props;
14215
+ const { loading, stripe, showHeader, height, treeConfig, mouseConfig, showFooter, highlightCell, highlightHoverRow, highlightHoverColumn, editConfig, editRules, importConfig, exportConfig, printConfig } = props;
14187
14216
  const { isGroup, overflowX, overflowY, scrollXLoad, scrollYLoad, tableData, initStore, isRowGroupStatus, columnStore, filterStore, customStore, tooltipStore } = reactData;
14188
14217
  const { teleportToWrapperElem, popupToWrapperElem, customPopupToElem } = internalData;
14189
14218
  const { leftList, rightList } = columnStore;
14219
+ const isVScrollbar = computeIsVScrollbar.value;
14190
14220
  const loadingSlot = slots.loading;
14191
14221
  const tipSlots = {
14192
14222
  header: slots.headerTooltip || slots['header-tooltip'],
@@ -14226,7 +14256,7 @@ export default defineVxeComponent({
14226
14256
  if (isCrossTableDrag && !tableData.length) {
14227
14257
  tbOns.onDragover = $xeTable.handleCrossTableRowDragoverEmptyEvent;
14228
14258
  }
14229
- return h('div', Object.assign({ ref: refElem, 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'}`, {
14259
+ return h('div', Object.assign({ ref: refElem, 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'}`, {
14230
14260
  [`size--${vSize}`]: vSize,
14231
14261
  [`valid-msg--${validOpts.msgMode}`]: !!editRules,
14232
14262
  'vxe-editable': !!editConfig,
@@ -14287,7 +14317,7 @@ export default defineVxeComponent({
14287
14317
  h('div', {
14288
14318
  key: 'tw',
14289
14319
  class: 'vxe-table--render-wrapper'
14290
- }, useScrollbar
14320
+ }, isVScrollbar
14291
14321
  ? [renderVirtualBody()]
14292
14322
  : (scrollbarXToTop
14293
14323
  ? [
@@ -14473,7 +14503,8 @@ export default defineVxeComponent({
14473
14503
  key: 'ctp',
14474
14504
  ref: refCommTooltip,
14475
14505
  isArrow: false,
14476
- enterable: false
14506
+ enterable: false,
14507
+ useScrollbar: isVScrollbar
14477
14508
  }),
14478
14509
  /**
14479
14510
  * 工具提示
@@ -14496,7 +14527,8 @@ export default defineVxeComponent({
14496
14527
  maxHeight: tableTipConfig.maxHeight,
14497
14528
  placement: tableTipConfig.placement,
14498
14529
  defaultPlacement: tableTipConfig.defaultPlacement,
14499
- popupClassName: tableTipConfig.popupClassName
14530
+ popupClassName: tableTipConfig.popupClassName,
14531
+ useScrollbar: tableTipConfig.useScrollbar
14500
14532
  }, currTooltipSlot
14501
14533
  ? {
14502
14534
  content: () => {
@@ -14535,7 +14567,8 @@ export default defineVxeComponent({
14535
14567
  theme: validTipConfig.theme,
14536
14568
  enterable: validTipConfig.enterable,
14537
14569
  enterDelay: validTipConfig.enterDelay,
14538
- leaveDelay: validTipConfig.leaveDelay
14570
+ leaveDelay: validTipConfig.leaveDelay,
14571
+ useScrollbar: validTipConfig.useScrollbar
14539
14572
  })
14540
14573
  : renderEmptyElement($xeTable)
14541
14574
  ])
@@ -14640,42 +14673,43 @@ export default defineVxeComponent({
14640
14673
  watch(() => VxeUI.getLanguage(), () => {
14641
14674
  reLayoutFlag.value++;
14642
14675
  });
14676
+ watch(computeIsVScrollbar, () => {
14677
+ nextTick(() => {
14678
+ bindScrollbarResize();
14679
+ nextTick(() => {
14680
+ reLayoutFlag.value++;
14681
+ });
14682
+ });
14683
+ });
14643
14684
  watch(computeScrollbarXToTop, () => {
14644
- reScrollFlag.value++;
14645
14685
  reLayoutFlag.value++;
14646
14686
  });
14647
14687
  watch(computeScrollbarYToLeft, () => {
14648
- reScrollFlag.value++;
14649
14688
  reLayoutFlag.value++;
14650
14689
  });
14651
14690
  watch(computeScrollXVisible, () => {
14652
- reScrollFlag.value++;
14653
14691
  reLayoutFlag.value++;
14654
14692
  });
14655
14693
  watch(computeScrollYVisible, () => {
14656
- reScrollFlag.value++;
14657
14694
  reLayoutFlag.value++;
14658
14695
  });
14659
14696
  watch(computeScrollXHeight, () => {
14660
- reScrollFlag.value++;
14661
14697
  reLayoutFlag.value++;
14662
14698
  });
14663
14699
  watch(computeScrollYWidth, () => {
14664
- reScrollFlag.value++;
14665
14700
  reLayoutFlag.value++;
14666
14701
  });
14667
14702
  watch(computeCellHeitht, () => {
14668
14703
  reLayoutFlag.value++;
14669
14704
  });
14670
14705
  watch(reLayoutFlag, () => {
14671
- $xeTable.recalculate(true);
14706
+ nextTick().then(() => {
14707
+ $xeTable.recalculate(true);
14708
+ });
14672
14709
  });
14673
14710
  watch(reScrollFlag, () => {
14674
- nextTick(() => {
14675
- $xeTable.updateScrollbar();
14676
- nextTick(() => {
14677
- $xeTable.updateScrollbar();
14678
- });
14711
+ updateScrollbar().then(() => {
14712
+ updateScrollbar();
14679
14713
  });
14680
14714
  });
14681
14715
  const footFlag = ref(0);
@@ -14808,7 +14842,7 @@ export default defineVxeComponent({
14808
14842
  });
14809
14843
  onMounted(() => {
14810
14844
  const { editConfig, exportConfig, importConfig, treeConfig, minHeight, keepSource, areaConfig } = props;
14811
- const { elemStore, scrollXStore, scrollYStore } = internalData;
14845
+ const { scrollXStore, scrollYStore } = internalData;
14812
14846
  const columnOpts = computeColumnOpts.value;
14813
14847
  const columnDragOpts = computeColumnDragOpts.value;
14814
14848
  const aggregateOpts = computeAggregateOpts.value;
@@ -15081,22 +15115,9 @@ export default defineVxeComponent({
15081
15115
  handleUpdateRowGroup(groupFields);
15082
15116
  initData();
15083
15117
  nextTick(() => {
15084
- const { useScrollbar, autoResize } = props;
15085
- const el = refElem.value;
15086
- if (useScrollbar) {
15087
- const viewInnerEl = getRefElem(elemStore['main-body-table']);
15088
- const scrollObserver = globalResize.create(() => {
15089
- reScrollFlag.value++;
15090
- });
15091
- if (el) {
15092
- scrollObserver.observe(el);
15093
- }
15094
- if (viewInnerEl) {
15095
- scrollObserver.observe(viewInnerEl);
15096
- }
15097
- internalData.scrollObserver = scrollObserver;
15098
- }
15118
+ const { autoResize } = props;
15099
15119
  if (autoResize) {
15120
+ const el = refElem.value;
15100
15121
  const parentEl = $xeTable.getParentElem();
15101
15122
  const resizeObserver = globalResize.create(() => {
15102
15123
  if (props.autoResize) {
@@ -15111,6 +15132,7 @@ export default defineVxeComponent({
15111
15132
  }
15112
15133
  internalData.resizeObserver = resizeObserver;
15113
15134
  }
15135
+ bindScrollbarResize();
15114
15136
  });
15115
15137
  if (virtualYOpts.mode !== 'scroll') {
15116
15138
  const tableViewportEl = refTableViewportElem.value;
@@ -244,8 +244,7 @@ export function createReactData() {
244
244
  isIndeterminate: false,
245
245
  style: null,
246
246
  column: null,
247
- visible: false,
248
- maxHeight: null
247
+ visible: false
249
248
  },
250
249
  // 存放列相关的信息
251
250
  columnStore: {
@@ -1606,6 +1606,7 @@
1606
1606
  .vxe-table--filter-wrapper {
1607
1607
  display: none;
1608
1608
  position: absolute;
1609
+ flex-direction: column;
1609
1610
  top: 0;
1610
1611
  min-width: 100px;
1611
1612
  font-size: var(--vxe-ui-font-size-default);
@@ -1615,16 +1616,30 @@
1615
1616
  color: var(--vxe-ui-font-color);
1616
1617
  box-shadow: var(--vxe-ui-base-popup-box-shadow);
1617
1618
  z-index: 15;
1619
+ max-height: var(--vxe-ui-vxe-table-filter-default-max-height);
1618
1620
  }
1619
1621
  .vxe-table--filter-wrapper:not(.is--multiple) .vxe-table--filter-header,
1620
1622
  .vxe-table--filter-wrapper:not(.is--multiple) .vxe-table--filter-body {
1621
1623
  text-align: center;
1622
1624
  }
1623
1625
  .vxe-table--filter-wrapper.is--active {
1624
- display: block;
1626
+ display: flex;
1625
1627
  }
1626
- .vxe-table--filter-wrapper .vxe-table--filter-header > li,
1627
- .vxe-table--filter-wrapper .vxe-table--filter-body > li {
1628
+ .vxe-table--filter-wrapper .vxe-table--filter-body,
1629
+ .vxe-table--filter-wrapper .vxe-table--scrollbar-filter-body {
1630
+ overflow: auto;
1631
+ flex-grow: 1;
1632
+ }
1633
+ .vxe-table--filter-wrapper .vxe-table--scrollbar-filter-body {
1634
+ display: flex;
1635
+ flex-direction: column;
1636
+ }
1637
+ .vxe-table--filter-wrapper .vxe-table--scrollbar-filter-body .vxe-table--scrollbar-filter-body-view {
1638
+ flex-grow: 1;
1639
+ }
1640
+ .vxe-table--filter-wrapper .vxe-table--filter-header .vxe-table--filter-option,
1641
+ .vxe-table--filter-wrapper .vxe-table--filter-body .vxe-table--filter-option,
1642
+ .vxe-table--filter-wrapper .vxe-table--scrollbar-filter-body .vxe-table--filter-option {
1628
1643
  overflow: hidden;
1629
1644
  text-overflow: ellipsis;
1630
1645
  white-space: nowrap;
@@ -1632,22 +1647,25 @@
1632
1647
  padding: 0.25em 0.8em;
1633
1648
  cursor: pointer;
1634
1649
  }
1635
- .vxe-table--filter-wrapper .vxe-table--filter-header > li.is--checked,
1636
- .vxe-table--filter-wrapper .vxe-table--filter-body > li.is--checked {
1650
+ .vxe-table--filter-wrapper .vxe-table--filter-header .vxe-table--filter-option.is--checked,
1651
+ .vxe-table--filter-wrapper .vxe-table--filter-body .vxe-table--filter-option.is--checked,
1652
+ .vxe-table--filter-wrapper .vxe-table--scrollbar-filter-body .vxe-table--filter-option.is--checked {
1637
1653
  color: var(--vxe-ui-font-primary-color);
1638
1654
  }
1639
- .vxe-table--filter-wrapper .vxe-table--filter-header > li:hover,
1640
- .vxe-table--filter-wrapper .vxe-table--filter-body > li:hover {
1655
+ .vxe-table--filter-wrapper .vxe-table--filter-header .vxe-table--filter-option:hover,
1656
+ .vxe-table--filter-wrapper .vxe-table--filter-body .vxe-table--filter-option:hover,
1657
+ .vxe-table--filter-wrapper .vxe-table--scrollbar-filter-body .vxe-table--filter-option:hover {
1641
1658
  background-color: var(--vxe-ui-table-row-hover-background-color);
1642
1659
  }
1643
1660
  .vxe-table--filter-wrapper .vxe-table--filter-header {
1644
1661
  padding-top: 0.2em;
1645
1662
  }
1646
- .vxe-table--filter-wrapper .vxe-table--filter-body {
1647
- max-height: var(--vxe-ui-vxe-table-filter-default-max-height);
1663
+ .vxe-table--filter-wrapper .vxe-table--filter-body,
1664
+ .vxe-table--filter-wrapper .vxe-table--scrollbar-filter-body {
1648
1665
  padding-bottom: 0.2em;
1649
1666
  }
1650
- .vxe-table--filter-wrapper > ul {
1667
+ .vxe-table--filter-wrapper .vxe-table--filter-header,
1668
+ .vxe-table--filter-wrapper .vxe-table--filter-body {
1651
1669
  list-style-type: none;
1652
1670
  padding: 0;
1653
1671
  margin: 0;
@@ -1657,8 +1675,9 @@
1657
1675
  -moz-user-select: none;
1658
1676
  user-select: none;
1659
1677
  }
1660
- .vxe-table--filter-wrapper.is--multiple > ul > li {
1661
- padding: 0.25em 0.8em 0.25em 1em;
1678
+ .vxe-table--filter-wrapper .vxe-table--filter-header,
1679
+ .vxe-table--filter-wrapper .vxe-table--filter-footer {
1680
+ flex-shrink: 0;
1662
1681
  }
1663
1682
  .vxe-table--filter-wrapper .vxe-table--filter-footer {
1664
1683
  border-top: 1px solid var(--vxe-ui-base-popup-border-color);