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
@@ -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
  * 如果不存在图标,则相对单元格居中显示
@@ -75,7 +73,7 @@ hooks.add('tableFilterModule', {
75
73
  const centerWidth = targetEl ? filterWidth / 2 : ((filterWidth - column.renderWidth) / 2);
76
74
  left = btnRect.left - tableRect.left - centerWidth;
77
75
  top = btnRect.top - tableRect.top + currEl.clientHeight;
78
- 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);
79
77
  if (left < 1) {
80
78
  left = 1;
81
79
  }
@@ -97,7 +95,6 @@ hooks.add('tableFilterModule', {
97
95
  if (zIndex) {
98
96
  panelStyle.zIndex = zIndex;
99
97
  }
100
- filterStore.style = panelStyle;
101
98
  // 筛选面板是自适应表格高度
102
99
  if (compConf ? !compConf.tableFilterAutoHeight : false) {
103
100
  maxHeight = 0;
@@ -107,8 +104,8 @@ hooks.add('tableFilterModule', {
107
104
  maxHeight = customMaxHeight > maxHeight ? maxHeight : customMaxHeight;
108
105
  }
109
106
  }
110
- // 判断面板不能大于表格高度
111
- filterStore.maxHeight = maxHeight;
107
+ panelStyle['--vxe-ui-vxe-table-filter-default-max-height'] = maxHeight ? toCssUnit(maxHeight) : 'none';
108
+ filterStore.style = panelStyle;
112
109
  };
113
110
  handleStyle();
114
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 = () => {
@@ -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,8 +351,8 @@ export default defineVxeComponent({
350
351
  return Object.assign({}, getConfig().table.checkboxConfig, props.checkboxConfig);
351
352
  });
352
353
  const computeTooltipOpts = computed(() => {
353
- const { useScrollbar } = props;
354
- return Object.assign({ useScrollbar }, 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);
355
356
  });
356
357
  const computeHeaderTooltipOpts = computed(() => {
357
358
  const tooltipOpts = computeTooltipOpts.value;
@@ -386,7 +387,8 @@ export default defineVxeComponent({
386
387
  return Object.assign({ orders: ['asc', 'desc', null] }, getConfig().table.sortConfig, props.sortConfig);
387
388
  });
388
389
  const computeFilterOpts = computed(() => {
389
- return Object.assign({}, getConfig().table.filterConfig, props.filterConfig);
390
+ const isVScrollbar = computeIsVScrollbar.value;
391
+ return Object.assign({ useScrollbar: isVScrollbar }, getConfig().table.filterConfig, props.filterConfig);
390
392
  });
391
393
  const computeFloatingFilterOpts = computed(() => {
392
394
  return Object.assign({}, getConfig().table.floatingFilterConfig, props.floatingFilterConfig);
@@ -787,6 +789,7 @@ export default defineVxeComponent({
787
789
  };
788
790
  const computeMaps = {
789
791
  computeSize,
792
+ computeIsVScrollbar,
790
793
  computeTableId,
791
794
  computeValidOpts,
792
795
  computeRowField,
@@ -3442,6 +3445,7 @@ export default defineVxeComponent({
3442
3445
  if (reFull) {
3443
3446
  updateTreeLineStyle();
3444
3447
  }
3448
+ updateScrollbar();
3445
3449
  internalData.rceRunTime = Date.now();
3446
3450
  if (reFull) {
3447
3451
  return computeScrollLoad();
@@ -3449,8 +3453,14 @@ export default defineVxeComponent({
3449
3453
  });
3450
3454
  };
3451
3455
  const updateScrollbar = () => {
3452
- updateThumbSize();
3453
- updateThumbOffset();
3456
+ const isVScrollbar = computeIsVScrollbar.value;
3457
+ if (isVScrollbar) {
3458
+ return nextTick().then(() => {
3459
+ updateThumbSize();
3460
+ updateThumbOffset();
3461
+ });
3462
+ }
3463
+ return Promise.resolve();
3454
3464
  };
3455
3465
  const defaultMinRunDelay = 50;
3456
3466
  const handleLazyRecalculate = (reFull, reWidth, reHeight, options) => {
@@ -12769,8 +12779,8 @@ export default defineVxeComponent({
12769
12779
  }
12770
12780
  },
12771
12781
  triggerBodyScrollEvent(evnt, fixedType) {
12772
- const { useScrollbar } = props;
12773
12782
  const { scrollYLoad, scrollXLoad } = reactData;
12783
+ const isVScrollbar = computeIsVScrollbar.value;
12774
12784
  const { elemStore, intoRunScroll, lastScrollTop, lastScrollLeft, inWheelScroll, inVirtualScroll, inHeaderScroll, inBodyScroll, scrollRenderType, inFooterScroll } = internalData;
12775
12785
  if (inWheelScroll || inVirtualScroll || inHeaderScroll || inFooterScroll) {
12776
12786
  return;
@@ -12789,7 +12799,7 @@ export default defineVxeComponent({
12789
12799
  if (!bodyScrollElem) {
12790
12800
  return;
12791
12801
  }
12792
- if (!useScrollbar) {
12802
+ if (!isVScrollbar) {
12793
12803
  if (!xHandleEl) {
12794
12804
  return;
12795
12805
  }
@@ -13540,6 +13550,24 @@ export default defineVxeComponent({
13540
13550
  return nextTick();
13541
13551
  }
13542
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
+ };
13543
13571
  const updateThumbSize = () => {
13544
13572
  const { elemStore } = internalData;
13545
13573
  const viewEl = getRefElem(elemStore['main-body-scroll']);
@@ -14119,8 +14147,8 @@ export default defineVxeComponent({
14119
14147
  };
14120
14148
  const renderVirtualBody = () => {
14121
14149
  const $xeGanttView = internalData.xeGanttView;
14122
- const { useScrollbar } = props;
14123
14150
  const { xThumbWidth, yThumbHeight } = reactData;
14151
+ const isVScrollbar = computeIsVScrollbar.value;
14124
14152
  const scrollbarOpts = computeScrollbarOpts.value;
14125
14153
  const scrollXAutoHide = computeScrollXAutoHide.value;
14126
14154
  const scrollYAutoHide = computeScrollYAutoHide.value;
@@ -14134,10 +14162,10 @@ export default defineVxeComponent({
14134
14162
  return h('div', {
14135
14163
  key: 'lvb',
14136
14164
  class: ['vxe-table--layout-wrapper', `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`, `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`, {
14137
- 'is--virtual-scrollbar': useScrollbar,
14138
- 'ov-padding': useScrollbar && scrollbarOpts.padding,
14139
- 'ov-x--auto-hide': useScrollbar && scrollXAutoHide,
14140
- '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,
14141
14169
  'overflow-y': yThumbHeight,
14142
14170
  'overflow-x': xThumbWidth
14143
14171
  }]
@@ -14184,10 +14212,11 @@ export default defineVxeComponent({
14184
14212
  ]);
14185
14213
  };
14186
14214
  const renderVN = () => {
14187
- 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;
14188
14216
  const { isGroup, overflowX, overflowY, scrollXLoad, scrollYLoad, tableData, initStore, isRowGroupStatus, columnStore, filterStore, customStore, tooltipStore } = reactData;
14189
14217
  const { teleportToWrapperElem, popupToWrapperElem, customPopupToElem } = internalData;
14190
14218
  const { leftList, rightList } = columnStore;
14219
+ const isVScrollbar = computeIsVScrollbar.value;
14191
14220
  const loadingSlot = slots.loading;
14192
14221
  const tipSlots = {
14193
14222
  header: slots.headerTooltip || slots['header-tooltip'],
@@ -14227,7 +14256,7 @@ export default defineVxeComponent({
14227
14256
  if (isCrossTableDrag && !tableData.length) {
14228
14257
  tbOns.onDragover = $xeTable.handleCrossTableRowDragoverEmptyEvent;
14229
14258
  }
14230
- 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'}`, {
14231
14260
  [`size--${vSize}`]: vSize,
14232
14261
  [`valid-msg--${validOpts.msgMode}`]: !!editRules,
14233
14262
  'vxe-editable': !!editConfig,
@@ -14288,7 +14317,7 @@ export default defineVxeComponent({
14288
14317
  h('div', {
14289
14318
  key: 'tw',
14290
14319
  class: 'vxe-table--render-wrapper'
14291
- }, useScrollbar
14320
+ }, isVScrollbar
14292
14321
  ? [renderVirtualBody()]
14293
14322
  : (scrollbarXToTop
14294
14323
  ? [
@@ -14475,7 +14504,7 @@ export default defineVxeComponent({
14475
14504
  ref: refCommTooltip,
14476
14505
  isArrow: false,
14477
14506
  enterable: false,
14478
- useScrollbar
14507
+ useScrollbar: isVScrollbar
14479
14508
  }),
14480
14509
  /**
14481
14510
  * 工具提示
@@ -14539,7 +14568,7 @@ export default defineVxeComponent({
14539
14568
  enterable: validTipConfig.enterable,
14540
14569
  enterDelay: validTipConfig.enterDelay,
14541
14570
  leaveDelay: validTipConfig.leaveDelay,
14542
- useScrollbar
14571
+ useScrollbar: validTipConfig.useScrollbar
14543
14572
  })
14544
14573
  : renderEmptyElement($xeTable)
14545
14574
  ])
@@ -14644,42 +14673,43 @@ export default defineVxeComponent({
14644
14673
  watch(() => VxeUI.getLanguage(), () => {
14645
14674
  reLayoutFlag.value++;
14646
14675
  });
14676
+ watch(computeIsVScrollbar, () => {
14677
+ nextTick(() => {
14678
+ bindScrollbarResize();
14679
+ nextTick(() => {
14680
+ reLayoutFlag.value++;
14681
+ });
14682
+ });
14683
+ });
14647
14684
  watch(computeScrollbarXToTop, () => {
14648
- reScrollFlag.value++;
14649
14685
  reLayoutFlag.value++;
14650
14686
  });
14651
14687
  watch(computeScrollbarYToLeft, () => {
14652
- reScrollFlag.value++;
14653
14688
  reLayoutFlag.value++;
14654
14689
  });
14655
14690
  watch(computeScrollXVisible, () => {
14656
- reScrollFlag.value++;
14657
14691
  reLayoutFlag.value++;
14658
14692
  });
14659
14693
  watch(computeScrollYVisible, () => {
14660
- reScrollFlag.value++;
14661
14694
  reLayoutFlag.value++;
14662
14695
  });
14663
14696
  watch(computeScrollXHeight, () => {
14664
- reScrollFlag.value++;
14665
14697
  reLayoutFlag.value++;
14666
14698
  });
14667
14699
  watch(computeScrollYWidth, () => {
14668
- reScrollFlag.value++;
14669
14700
  reLayoutFlag.value++;
14670
14701
  });
14671
14702
  watch(computeCellHeitht, () => {
14672
14703
  reLayoutFlag.value++;
14673
14704
  });
14674
14705
  watch(reLayoutFlag, () => {
14675
- $xeTable.recalculate(true);
14706
+ nextTick().then(() => {
14707
+ $xeTable.recalculate(true);
14708
+ });
14676
14709
  });
14677
14710
  watch(reScrollFlag, () => {
14678
- nextTick(() => {
14679
- $xeTable.updateScrollbar();
14680
- nextTick(() => {
14681
- $xeTable.updateScrollbar();
14682
- });
14711
+ updateScrollbar().then(() => {
14712
+ updateScrollbar();
14683
14713
  });
14684
14714
  });
14685
14715
  const footFlag = ref(0);
@@ -14812,7 +14842,7 @@ export default defineVxeComponent({
14812
14842
  });
14813
14843
  onMounted(() => {
14814
14844
  const { editConfig, exportConfig, importConfig, treeConfig, minHeight, keepSource, areaConfig } = props;
14815
- const { elemStore, scrollXStore, scrollYStore } = internalData;
14845
+ const { scrollXStore, scrollYStore } = internalData;
14816
14846
  const columnOpts = computeColumnOpts.value;
14817
14847
  const columnDragOpts = computeColumnDragOpts.value;
14818
14848
  const aggregateOpts = computeAggregateOpts.value;
@@ -15085,22 +15115,9 @@ export default defineVxeComponent({
15085
15115
  handleUpdateRowGroup(groupFields);
15086
15116
  initData();
15087
15117
  nextTick(() => {
15088
- const { useScrollbar, autoResize } = props;
15089
- const el = refElem.value;
15090
- if (useScrollbar) {
15091
- const viewInnerEl = getRefElem(elemStore['main-body-table']);
15092
- const scrollObserver = globalResize.create(() => {
15093
- reScrollFlag.value++;
15094
- });
15095
- if (el) {
15096
- scrollObserver.observe(el);
15097
- }
15098
- if (viewInnerEl) {
15099
- scrollObserver.observe(viewInnerEl);
15100
- }
15101
- internalData.scrollObserver = scrollObserver;
15102
- }
15118
+ const { autoResize } = props;
15103
15119
  if (autoResize) {
15120
+ const el = refElem.value;
15104
15121
  const parentEl = $xeTable.getParentElem();
15105
15122
  const resizeObserver = globalResize.create(() => {
15106
15123
  if (props.autoResize) {
@@ -15115,6 +15132,7 @@ export default defineVxeComponent({
15115
15132
  }
15116
15133
  internalData.resizeObserver = resizeObserver;
15117
15134
  }
15135
+ bindScrollbarResize();
15118
15136
  });
15119
15137
  if (virtualYOpts.mode !== 'scroll') {
15120
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);