vxe-table 3.25.0-beta.1 → 3.25.0-beta.2

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 (52) hide show
  1. package/es/index.css +1 -1
  2. package/es/index.min.css +1 -1
  3. package/es/style.css +1 -1
  4. package/es/style.min.css +1 -1
  5. package/es/table/src/methods.js +246 -44
  6. package/es/table/src/props.js +2 -1
  7. package/es/table/src/scrollbar.js +54 -0
  8. package/es/table/src/table.js +266 -64
  9. package/es/table/src/util.js +11 -2
  10. package/es/table/style.css +30 -0
  11. package/es/table/style.min.css +1 -1
  12. package/es/ui/index.js +1 -1
  13. package/es/ui/src/log.js +1 -1
  14. package/es/vxe-table/style.css +30 -0
  15. package/es/vxe-table/style.min.css +1 -1
  16. package/lib/index.css +1 -1
  17. package/lib/index.min.css +1 -1
  18. package/lib/index.umd.js +337 -66
  19. package/lib/index.umd.min.js +1 -1
  20. package/lib/style.css +1 -1
  21. package/lib/style.min.css +1 -1
  22. package/lib/table/src/methods.js +21 -11
  23. package/lib/table/src/methods.min.js +1 -1
  24. package/lib/table/src/props.js +2 -1
  25. package/lib/table/src/props.min.js +1 -1
  26. package/lib/table/src/scrollbar.js +63 -0
  27. package/lib/table/src/scrollbar.min.js +1 -0
  28. package/lib/table/src/table.js +249 -52
  29. package/lib/table/src/table.min.js +1 -1
  30. package/lib/table/src/util.js +11 -2
  31. package/lib/table/src/util.min.js +1 -1
  32. package/lib/table/style/style.css +30 -0
  33. package/lib/table/style/style.min.css +1 -1
  34. package/lib/ui/index.js +1 -1
  35. package/lib/ui/index.min.js +1 -1
  36. package/lib/ui/src/log.js +1 -1
  37. package/lib/ui/src/log.min.js +1 -1
  38. package/lib/vxe-table/style/style.css +30 -0
  39. package/lib/vxe-table/style/style.min.css +1 -1
  40. package/package.json +2 -2
  41. package/packages/table/src/methods.ts +258 -44
  42. package/packages/table/src/props.ts +2 -1
  43. package/packages/table/src/scrollbar.ts +57 -0
  44. package/packages/table/src/table.ts +300 -69
  45. package/packages/table/src/util.ts +15 -2
  46. package/styles/components/table.scss +65 -0
  47. /package/es/{iconfont.1791954189007.ttf → iconfont.1792035018941.ttf} +0 -0
  48. /package/es/{iconfont.1791954189007.woff → iconfont.1792035018941.woff} +0 -0
  49. /package/es/{iconfont.1791954189007.woff2 → iconfont.1792035018941.woff2} +0 -0
  50. /package/lib/{iconfont.1791954189007.ttf → iconfont.1792035018941.ttf} +0 -0
  51. /package/lib/{iconfont.1791954189007.woff → iconfont.1792035018941.woff} +0 -0
  52. /package/lib/{iconfont.1791954189007.woff2 → iconfont.1792035018941.woff2} +0 -0
@@ -1,11 +1,12 @@
1
1
  import XEUtils from 'xe-utils';
2
2
  import { getTpImg, isPx, isScale, hasClass, addClass, removeClass, wheelScrollLeftTo, wheelScrollTopTo, getEventTargetNode, getPaddingTopBottomSize, setScrollTop, setScrollLeft, toCssUnit, hasControlKey, checkTargetElement, hasAxternalInputTarget } from '../../ui/src/dom';
3
- import { getLastZIndex, nextZIndex, hasChildrenList, getFuncText, isEnableConf, formatText, eqEmptyValue, hasEnableConf, getDefaultConfig } from '../../ui/src/utils';
3
+ import { getLastZIndex, nextZIndex, hasChildrenList, getFuncText, isEnableConf, formatText, eqEmptyValue, hasEnableConf } from '../../ui/src/utils';
4
4
  import { VxeUI } from '../../ui';
5
5
  import Cell from './cell';
6
6
  import { getRowUniqueId, createRowId, clearTableAllStatus, getColumnList, toFilters, getRowkey, getRowid, rowToVisible, colToVisible, getCellValue, setCellValue, handleRowidOrRow, handleFieldOrColumn, toTreePathSeq, restoreScrollLocation, getRootColumn, getColReMinWidth, getColReMaxWidth, createHandleUpdateRowId, createHandleGetRowId, getRefElem, getCellRestHeight, getLastChildColumn, getRowMaxHeight, handleCustomStoreConfig, encodeRowid } from './util';
7
7
  import { getSlotVNs } from '../../ui/src/vn';
8
8
  import { moveRowAnimateToTb, clearRowAnimate, moveColAnimateToLr, clearColAnimate } from '../../ui/src/anime';
9
+ import { getThumbOffsetSize, getThumbSize, getScrollFromClick, getScrollFromDrag } from './scrollbar';
9
10
  import { createComponentLog } from '../../ui/src/log';
10
11
  import { getCrossTableDragRowInfo } from './store';
11
12
  const { warnLog, errLog } = createComponentLog('table');
@@ -1003,12 +1004,12 @@ function updateStyle($xeTable) {
1003
1004
  emptyPlaceholderElem.style.top = `${tHeaderHeight}px`;
1004
1005
  emptyPlaceholderElem.style.height = bodyWrapperElem ? `${bodyWrapperElem.offsetHeight - osbHeight}px` : '';
1005
1006
  }
1006
- const scrollbarXOpts = $xeTable.computeScrollbarXOpts;
1007
- const scrollbarYOpts = $xeTable.computeScrollbarYOpts;
1007
+ const scrollXVisible = $xeTable.computeScrollXVisible;
1008
+ const scrollYVisible = $xeTable.computeScrollYVisible;
1008
1009
  const scrollbarYToLeft = $xeTable.computeScrollbarYToLeft;
1009
1010
  let xScrollbarVisible = overflowX ? 'visible' : 'hidden';
1010
- const hideXScroll = scrollbarXOpts.visible === false || scrollbarXOpts.visible === 'hidden';
1011
- if (!hideXScroll || $xeGanttView) {
1011
+ const hideXScroll = scrollXVisible === false || scrollXVisible === 'hidden';
1012
+ if (scrollXVisible === 'visible' || $xeGanttView) {
1012
1013
  osbHeight = scrollbarHeight;
1013
1014
  xScrollbarVisible = 'visible';
1014
1015
  }
@@ -1017,12 +1018,12 @@ function updateStyle($xeTable) {
1017
1018
  xScrollbarVisible = 'hidden';
1018
1019
  }
1019
1020
  let yScrollbarVisible = overflowY ? 'visible' : 'hidden';
1020
- const showYScroll = !(scrollbarYOpts.visible === false || scrollbarYOpts.visible === 'hidden');
1021
- if (!showYScroll || (($xeGantt && $xeGanttView && $xeGantt.reactData.showRightView) && !scrollbarYToLeft)) {
1021
+ const hideYScroll = scrollYVisible === false || scrollYVisible === 'hidden';
1022
+ if (hideYScroll || (($xeGantt && $xeGanttView && $xeGantt.reactData.showRightView) && !scrollbarYToLeft)) {
1022
1023
  osbWidth = 0;
1023
1024
  yScrollbarVisible = 'hidden';
1024
1025
  }
1025
- else if (showYScroll) {
1026
+ else if (scrollYVisible === 'visible') {
1026
1027
  osbWidth = scrollbarWidth;
1027
1028
  yScrollbarVisible = 'visible';
1028
1029
  }
@@ -2350,14 +2351,6 @@ function autoCellWidth($xeTable) {
2350
2351
  if (!bodyWrapperElem) {
2351
2352
  return;
2352
2353
  }
2353
- const yHandleEl = $xeTable.$refs.refScrollYHandleElem;
2354
- if (!yHandleEl) {
2355
- return;
2356
- }
2357
- const xHandleEl = $xeTable.$refs.refScrollXHandleElem;
2358
- if (!xHandleEl) {
2359
- return;
2360
- }
2361
2354
  const columnOpts = $xeTable.computeColumnOpts;
2362
2355
  let tWidth = 0;
2363
2356
  const minCellWidth = 40; // 列宽最少限制 40px
@@ -3028,12 +3021,10 @@ function computeScrollLoad($xeTable) {
3028
3021
  });
3029
3022
  }
3030
3023
  function calcScrollbar($xeTable) {
3031
- const scrollDefaultConf = $xeTable.scrollDefaultConf;
3032
3024
  const reactData = $xeTable;
3033
3025
  const internalData = $xeTable;
3034
3026
  const { scrollXWidth, scrollYHeight } = reactData;
3035
3027
  const { elemStore } = internalData;
3036
- const scrollbarOpts = $xeTable.computeScrollbarOpts;
3037
3028
  const el = $xeTable.$refs.refElem;
3038
3029
  if (!el || !el.clientWidth) {
3039
3030
  return;
@@ -3043,23 +3034,31 @@ function calcScrollbar($xeTable) {
3043
3034
  const footerTableElem = getRefElem(elemStore['main-footer-table']);
3044
3035
  const xHandleEl = $xeTable.$refs.refScrollXHandleElem;
3045
3036
  const yHandleEl = $xeTable.$refs.refScrollYHandleElem;
3037
+ const thumbXElem = $xeTable.$refs.refThumbXElem;
3038
+ const thumbYElem = $xeTable.$refs.refThumbYElem;
3046
3039
  let overflowY = false;
3047
3040
  let overflowX = false;
3048
3041
  if (bodyWrapperElem) {
3049
- const scrollbarXOpts = $xeTable.computeScrollbarXOpts;
3050
- const scrollbarYOpts = $xeTable.computeScrollbarYOpts;
3051
- const barWidth = XEUtils.toNumber(getDefaultConfig(getDefaultConfig(scrollbarYOpts.width, scrollbarOpts.width), scrollDefaultConf.width));
3052
- const barHeight = XEUtils.toNumber(getDefaultConfig(getDefaultConfig(scrollbarXOpts.height, scrollbarOpts.height), scrollDefaultConf.height));
3042
+ const scrollbarOpts = $xeTable.computeScrollbarOpts;
3043
+ const barWidth = $xeTable.computeScrollYWidth;
3044
+ const barHeight = $xeTable.computeScrollXHeight;
3053
3045
  overflowY = scrollYHeight > bodyWrapperElem.clientHeight;
3054
- if (yHandleEl) {
3046
+ // 如果是虚拟滚动条
3047
+ if (thumbYElem) {
3048
+ reactData.scrollbarHeight = scrollbarOpts.padding ? thumbYElem.offsetWidth : 0;
3049
+ }
3050
+ else if (yHandleEl) {
3055
3051
  reactData.scrollbarWidth = (barWidth || barHeight) || (yHandleEl.offsetWidth - yHandleEl.clientWidth) || 14;
3056
3052
  }
3057
3053
  reactData.overflowY = overflowY;
3058
3054
  overflowX = scrollXWidth > bodyWrapperElem.clientWidth;
3059
- if (xHandleEl) {
3055
+ // 如果是虚拟滚动条
3056
+ if (thumbXElem) {
3057
+ reactData.scrollbarHeight = scrollbarOpts.padding ? thumbXElem.offsetHeight : 0;
3058
+ }
3059
+ else if (xHandleEl) {
3060
3060
  reactData.scrollbarHeight = (barHeight || barWidth) || (xHandleEl.offsetHeight - xHandleEl.clientHeight) || 14;
3061
3061
  }
3062
- reactData.overflowX = overflowX;
3063
3062
  const hHeight = headerTableElem ? headerTableElem.clientHeight : 0;
3064
3063
  const fHeight = footerTableElem ? footerTableElem.clientHeight : 0;
3065
3064
  internalData.tableHeight = bodyWrapperElem.offsetHeight;
@@ -3147,6 +3146,7 @@ function handleLazyRecalculate($xeTable, reFull, reWidth, reHeight, options) {
3147
3146
  const refreshDelay = resizeOpts.refreshDelay || 30;
3148
3147
  const reDelay = rceDelay + refreshDelay;
3149
3148
  const el = $xeTable.$refs.refElem;
3149
+ $xeTable.updateScrollbar();
3150
3150
  if (el && el.clientWidth) {
3151
3151
  autoCellWidth($xeTable);
3152
3152
  updateRowExpandStyle($xeTable);
@@ -9949,6 +9949,14 @@ const tableMethods = {
9949
9949
  }
9950
9950
  return $xeTable.$nextTick();
9951
9951
  },
9952
+ /**
9953
+ * @private
9954
+ */
9955
+ updateScrollbar() {
9956
+ const $xeTable = this;
9957
+ $xeTable.updateThumbSize();
9958
+ $xeTable.updateThumbOffset();
9959
+ },
9952
9960
  /**
9953
9961
  * 表头单元格按下事件
9954
9962
  */
@@ -12255,19 +12263,18 @@ const tableMethods = {
12255
12263
  const props = $xeTable;
12256
12264
  const internalData = $xeTable;
12257
12265
  const { highlightHoverRow } = props;
12258
- const { lastScrollLeft, lastScrollTop } = internalData;
12259
- const xHandleEl = $xeTable.$refs.refScrollXHandleElem;
12260
- const yHandleEl = $xeTable.$refs.refScrollYHandleElem;
12261
- if (!xHandleEl || !yHandleEl) {
12266
+ const { elemStore, lastScrollLeft, lastScrollTop } = internalData;
12267
+ const bodyScrollElem = getRefElem(elemStore['main-body-scroll']);
12268
+ if (!bodyScrollElem) {
12262
12269
  return;
12263
12270
  }
12264
12271
  const rowOpts = $xeTable.computeRowOpts;
12265
12272
  const validTip = $xeTable.$refs.refValidTooltip;
12266
12273
  const tooltip = $xeTable.$refs.refTooltip;
12267
- const bodyHeight = yHandleEl.clientHeight;
12268
- const bodyWidth = xHandleEl.clientWidth;
12269
- const scrollHeight = yHandleEl.scrollHeight;
12270
- const scrollWidth = xHandleEl.scrollWidth;
12274
+ const bodyHeight = bodyScrollElem.clientHeight;
12275
+ const bodyWidth = bodyScrollElem.clientWidth;
12276
+ const scrollHeight = bodyScrollElem.scrollHeight;
12277
+ const scrollWidth = bodyScrollElem.scrollWidth;
12271
12278
  let isTop = false;
12272
12279
  let isBottom = false;
12273
12280
  let isLeft = false;
@@ -12329,6 +12336,7 @@ const tableMethods = {
12329
12336
  isLeft,
12330
12337
  isRight,
12331
12338
  direction }, params);
12339
+ $xeTable.updateThumbOffset();
12332
12340
  updateRowExpandStyle($xeTable);
12333
12341
  checkLastSyncScroll($xeTable, isRollX, isRollY);
12334
12342
  if (isRollX) {
@@ -12376,8 +12384,10 @@ const tableMethods = {
12376
12384
  },
12377
12385
  triggerBodyScrollEvent(evnt, fixedType) {
12378
12386
  const $xeTable = this;
12387
+ const props = $xeTable;
12379
12388
  const reactData = $xeTable;
12380
12389
  const internalData = $xeTable;
12390
+ const { useScrollbar } = props;
12381
12391
  const { scrollYLoad, scrollXLoad } = reactData;
12382
12392
  const { elemStore, intoRunScroll, lastScrollTop, lastScrollLeft, inWheelScroll, inVirtualScroll, inHeaderScroll, inBodyScroll, scrollRenderType, inFooterScroll } = internalData;
12383
12393
  if (inWheelScroll || inVirtualScroll || inHeaderScroll || inFooterScroll) {
@@ -12397,19 +12407,21 @@ const tableMethods = {
12397
12407
  if (!bodyScrollElem) {
12398
12408
  return;
12399
12409
  }
12400
- if (!xHandleEl) {
12401
- return;
12402
- }
12403
- if (!yHandleEl) {
12404
- return;
12410
+ if (!useScrollbar) {
12411
+ if (!xHandleEl) {
12412
+ return;
12413
+ }
12414
+ if (!yHandleEl) {
12415
+ return;
12416
+ }
12405
12417
  }
12406
12418
  if (inBodyScroll) {
12407
12419
  if (scrollRenderType !== fixedType) {
12408
12420
  return;
12409
12421
  }
12410
12422
  }
12411
- let scrollTop = yHandleEl.scrollTop;
12412
- let scrollLeft = xHandleEl.scrollLeft;
12423
+ let scrollTop = 0;
12424
+ let scrollLeft = 0;
12413
12425
  if (leftScrollElem && fixedType === 'left') {
12414
12426
  scrollTop = leftScrollElem.scrollTop;
12415
12427
  }
@@ -12561,8 +12573,8 @@ const tableMethods = {
12561
12573
  const rightFixedWidth = $xeTable.computeRightFixedWidth;
12562
12574
  const { elemStore, lastScrollTop, lastScrollLeft } = internalData;
12563
12575
  const rowOpts = $xeTable.computeRowOpts;
12564
- const scrollbarXOpts = $xeTable.computeScrollbarXOpts;
12565
- const scrollbarYOpts = $xeTable.computeScrollbarYOpts;
12576
+ const scrollXVisible = $xeTable.computeScrollXVisible;
12577
+ const scrollYVisible = $xeTable.computeScrollYVisible;
12566
12578
  const xHandleEl = $xeTable.$refs.refScrollXHandleElem;
12567
12579
  const yHandleEl = $xeTable.$refs.refScrollYHandleElem;
12568
12580
  const leftScrollElem = getRefElem(elemStore['left-body-scroll']);
@@ -12585,14 +12597,14 @@ const tableMethods = {
12585
12597
  const isRollY = overflowY && scrollTop !== lastScrollTop;
12586
12598
  if (isRollX) {
12587
12599
  // 如果禁用滚动
12588
- if (scrollbarXOpts.visible === false || scrollbarXOpts.visible === 'hidden') {
12600
+ if (scrollXVisible === false || scrollXVisible === 'hidden') {
12589
12601
  evnt.preventDefault();
12590
12602
  return;
12591
12603
  }
12592
12604
  }
12593
12605
  if (isRollY) {
12594
12606
  // 如果禁用滚动
12595
- if (scrollbarYOpts.visible === false || scrollbarYOpts.visible === 'hidden') {
12607
+ if (scrollYVisible === false || scrollYVisible === 'hidden') {
12596
12608
  evnt.preventDefault();
12597
12609
  return;
12598
12610
  }
@@ -13541,6 +13553,196 @@ const tableMethods = {
13541
13553
  const $xeTable = this;
13542
13554
  return $xeTable.handleClearStack();
13543
13555
  },
13556
+ // 滚动条
13557
+ updateThumbSize() {
13558
+ const $xeTable = this;
13559
+ const reactData = $xeTable;
13560
+ const internalData = $xeTable;
13561
+ const { elemStore } = internalData;
13562
+ const viewEl = getRefElem(elemStore['main-body-scroll']);
13563
+ if (!viewEl) {
13564
+ return;
13565
+ }
13566
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
13567
+ return;
13568
+ }
13569
+ const trackXEl = $xeTable.$refs.refTrackXElem;
13570
+ const xThumbWidth = trackXEl ? getThumbSize(viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth) : 0;
13571
+ const thumbXElem = $xeTable.$refs.refThumbXElem;
13572
+ if (thumbXElem) {
13573
+ thumbXElem.style.width = xThumbWidth + 'px';
13574
+ }
13575
+ reactData.xThumbWidth = xThumbWidth;
13576
+ const trackYEl = $xeTable.$refs.refTrackYElem;
13577
+ const yThumbHeight = trackYEl ? getThumbSize(viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight) : 0;
13578
+ const thumbYElem = $xeTable.$refs.refThumbYElem;
13579
+ if (thumbYElem) {
13580
+ thumbYElem.style.height = yThumbHeight + 'px';
13581
+ }
13582
+ reactData.yThumbHeight = yThumbHeight;
13583
+ },
13584
+ updateThumbOffset() {
13585
+ const $xeTable = this;
13586
+ const reactData = $xeTable;
13587
+ const internalData = $xeTable;
13588
+ const { elemStore } = internalData;
13589
+ const viewEl = getRefElem(elemStore['main-body-scroll']);
13590
+ if (!viewEl) {
13591
+ return;
13592
+ }
13593
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
13594
+ return;
13595
+ }
13596
+ const { xThumbWidth, yThumbHeight } = reactData;
13597
+ const trackXEl = $xeTable.$refs.refTrackXElem;
13598
+ const thumbXElem = $xeTable.$refs.refThumbXElem;
13599
+ const xThumbLeft = trackXEl && xThumbWidth ? getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth, xThumbWidth) : 0;
13600
+ internalData.xThumbLeft = xThumbLeft;
13601
+ if (thumbXElem && xThumbWidth) {
13602
+ thumbXElem.style.width = xThumbWidth + 'px';
13603
+ thumbXElem.style.transform = `translateX(${xThumbLeft}px)`;
13604
+ }
13605
+ const trackYEl = $xeTable.$refs.refTrackYElem;
13606
+ const thumbYElem = $xeTable.$refs.refThumbYElem;
13607
+ const yThumbTop = trackYEl && yThumbHeight ? getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight, yThumbHeight) : 0;
13608
+ internalData.yThumbTop = yThumbTop;
13609
+ if (thumbYElem && yThumbHeight) {
13610
+ thumbYElem.style.height = yThumbHeight + 'px';
13611
+ thumbYElem.style.transform = `translateY(${yThumbTop}px)`;
13612
+ }
13613
+ },
13614
+ clickTrackXEvent(evnt) {
13615
+ const $xeTable = this;
13616
+ const reactData = $xeTable;
13617
+ const internalData = $xeTable;
13618
+ const { elemStore } = internalData;
13619
+ const trackEl = evnt.currentTarget;
13620
+ if (trackEl !== evnt.target) {
13621
+ return;
13622
+ }
13623
+ const viewEl = getRefElem(elemStore['main-body-scroll']);
13624
+ if (!viewEl) {
13625
+ return;
13626
+ }
13627
+ const { xThumbWidth } = reactData;
13628
+ const trackRect = trackEl.getBoundingClientRect();
13629
+ viewEl.scrollTo({
13630
+ left: getScrollFromClick(evnt.clientX - trackRect.left, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth),
13631
+ behavior: 'auto'
13632
+ });
13633
+ },
13634
+ clickTrackYEvent(evnt) {
13635
+ const $xeTable = this;
13636
+ const reactData = $xeTable;
13637
+ const internalData = $xeTable;
13638
+ const trackEl = evnt.currentTarget;
13639
+ if (trackEl !== evnt.target) {
13640
+ return;
13641
+ }
13642
+ const { elemStore } = internalData;
13643
+ const viewEl = getRefElem(elemStore['main-body-scroll']);
13644
+ if (!viewEl) {
13645
+ return;
13646
+ }
13647
+ const { yThumbHeight } = reactData;
13648
+ const trackRect = trackEl.getBoundingClientRect();
13649
+ viewEl.scrollTo({
13650
+ top: getScrollFromClick(evnt.clientY - trackRect.top, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight),
13651
+ behavior: 'auto'
13652
+ });
13653
+ },
13654
+ pointerdownThumbXEvent(evnt) {
13655
+ const $xeTable = this;
13656
+ const reactData = $xeTable;
13657
+ const internalData = $xeTable;
13658
+ const { elemStore } = internalData;
13659
+ const thumbEl = evnt.currentTarget;
13660
+ internalData.isThumbDrag = true;
13661
+ thumbEl.setPointerCapture(evnt.pointerId);
13662
+ const viewEl = getRefElem(elemStore['main-body-scroll']);
13663
+ if (!viewEl) {
13664
+ return;
13665
+ }
13666
+ const { xThumbWidth } = reactData;
13667
+ const trackEl = thumbEl.parentElement;
13668
+ const trackRect = trackEl.getBoundingClientRect();
13669
+ const pointerPosition = evnt.clientX - trackRect.left;
13670
+ // 记录 thumb 的偏移
13671
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth);
13672
+ internalData.thumbDragOffset = pointerPosition - thumbOffset;
13673
+ },
13674
+ pointermoveThumbXEvent(evnt) {
13675
+ const $xeTable = this;
13676
+ const reactData = $xeTable;
13677
+ const internalData = $xeTable;
13678
+ const thumbEl = evnt.currentTarget;
13679
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
13680
+ return;
13681
+ }
13682
+ const { elemStore, isThumbDrag, thumbDragOffset } = internalData;
13683
+ if (isThumbDrag) {
13684
+ const viewEl = getRefElem(elemStore['main-body-scroll']);
13685
+ if (!viewEl) {
13686
+ return;
13687
+ }
13688
+ const { xThumbWidth } = reactData;
13689
+ const thumbEl = evnt.currentTarget;
13690
+ const trackEl = thumbEl.parentElement;
13691
+ const trackRect = trackEl.getBoundingClientRect();
13692
+ // 更新偏移
13693
+ viewEl.scrollLeft = getScrollFromDrag(evnt.clientX - trackRect.left, thumbDragOffset, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth);
13694
+ }
13695
+ },
13696
+ cleatPointerThumbEvent(evnt) {
13697
+ const $xeTable = this;
13698
+ const internalData = $xeTable;
13699
+ const thumbEl = evnt.currentTarget;
13700
+ thumbEl.releasePointerCapture(evnt.pointerId);
13701
+ internalData.isThumbDrag = false;
13702
+ },
13703
+ pointerdownThumbYEvent(evnt) {
13704
+ const $xeTable = this;
13705
+ const reactData = $xeTable;
13706
+ const internalData = $xeTable;
13707
+ const { elemStore } = internalData;
13708
+ const thumbEl = evnt.currentTarget;
13709
+ internalData.isThumbDrag = true;
13710
+ thumbEl.setPointerCapture(evnt.pointerId);
13711
+ const viewEl = getRefElem(elemStore['main-body-scroll']);
13712
+ if (!viewEl) {
13713
+ return;
13714
+ }
13715
+ const { yThumbHeight } = reactData;
13716
+ const trackEl = thumbEl.parentElement;
13717
+ const trackRect = trackEl.getBoundingClientRect();
13718
+ const pointerPosition = evnt.clientY - trackRect.top;
13719
+ // 记录 thumb 的偏移
13720
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight);
13721
+ internalData.thumbDragOffset = pointerPosition - thumbOffset;
13722
+ },
13723
+ pointermoveThumbYEvent(evnt) {
13724
+ const $xeTable = this;
13725
+ const reactData = $xeTable;
13726
+ const internalData = $xeTable;
13727
+ const thumbEl = evnt.currentTarget;
13728
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
13729
+ return;
13730
+ }
13731
+ const { elemStore, isThumbDrag, thumbDragOffset } = internalData;
13732
+ if (isThumbDrag) {
13733
+ const viewEl = getRefElem(elemStore['main-body-scroll']);
13734
+ if (!viewEl) {
13735
+ return;
13736
+ }
13737
+ const { yThumbHeight } = reactData;
13738
+ const thumbEl = evnt.currentTarget;
13739
+ const trackEl = thumbEl.parentElement;
13740
+ const trackRect = trackEl.getBoundingClientRect();
13741
+ // 更新偏移
13742
+ viewEl.scrollTop = getScrollFromDrag(evnt.clientY - trackRect.top, thumbDragOffset, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight);
13743
+ }
13744
+ },
13745
+ // 滚动条
13544
13746
  dispatchEvent(type, params, evnt) {
13545
13747
  const $xeTable = this;
13546
13748
  const $xeGrid = $xeTable.$xeGrid;
@@ -1,4 +1,5 @@
1
1
  import { VxeUI } from '../../ui';
2
+ import { getDefaultConfig } from '../../ui/src/utils';
2
3
  const { getConfig } = VxeUI;
3
4
  export const tableProps = {
4
5
  /** 基本属性 */
@@ -294,7 +295,7 @@ export const tableProps = {
294
295
  virtualYConfig: Object,
295
296
  useScrollbar: {
296
297
  type: Boolean,
297
- default: () => getConfig().table.useScrollbar
298
+ default: () => getDefaultConfig(getConfig().table.useScrollbar, getConfig().useScrollbar)
298
299
  },
299
300
  // 滚动条配置项
300
301
  scrollbarConfig: Object,
@@ -0,0 +1,54 @@
1
+ /**
2
+ * 计算滚动条滑块的长度
3
+ */
4
+ export function getThumbSize(viewportSize, contentSize, trackSize) {
5
+ if (contentSize <= viewportSize) {
6
+ return 0;
7
+ }
8
+ const ratio = viewportSize / contentSize;
9
+ const ideal = trackSize * ratio;
10
+ return Math.max(20, Math.min(ideal, trackSize));
11
+ }
12
+ /**
13
+ * 计算滚动条滑块的偏移位置
14
+ */
15
+ export function getThumbOffsetSize(offsetSize, viewportSize, contentSize, trackSize, thumbSize) {
16
+ const maxScroll = contentSize - viewportSize;
17
+ if (maxScroll <= 0) {
18
+ return 0;
19
+ }
20
+ const maxThumbOffset = trackSize - thumbSize;
21
+ if (maxThumbOffset <= 0) {
22
+ return 0;
23
+ }
24
+ const clamped = Math.min(Math.max(offsetSize, 0), maxScroll);
25
+ const ratio = clamped / maxScroll;
26
+ return ratio * maxThumbOffset;
27
+ }
28
+ /**
29
+ * 根据点击轨道的位置,计算滑块的偏移位置
30
+ */
31
+ export function getScrollFromClick(clickPosition, viewportSize, contentSize, trackSize, thumbSize) {
32
+ const maxThumbOffset = trackSize - thumbSize;
33
+ const maxScroll = contentSize - viewportSize;
34
+ if (maxScroll <= 0 || maxThumbOffset <= 0) {
35
+ return 0;
36
+ }
37
+ let thumbOffset = clickPosition - thumbSize / 2;
38
+ thumbOffset = Math.min(Math.max(thumbOffset, 0), maxThumbOffset);
39
+ const scrollOffset = (thumbOffset / maxThumbOffset) * maxScroll;
40
+ return scrollOffset;
41
+ }
42
+ /**
43
+ * 拖拽 thumb 时,根据鼠标位置计算滑块的偏移位置
44
+ */
45
+ export function getScrollFromDrag(pointerPosition, dragOffset, viewportSize, contentSize, trackSize, thumbSize) {
46
+ const maxScroll = contentSize - viewportSize;
47
+ const maxThumbOffset = trackSize - thumbSize;
48
+ if (maxScroll <= 0 || maxThumbOffset <= 0) {
49
+ return 0;
50
+ }
51
+ let thumbOffset = pointerPosition - dragOffset;
52
+ thumbOffset = Math.min(Math.max(thumbOffset, 0), maxThumbOffset);
53
+ return (thumbOffset / maxThumbOffset) * maxScroll;
54
+ }