vxe-table 3.25.0-beta.0 → 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 (58) hide show
  1. package/es/index.css +1 -1
  2. package/es/index.min.css +1 -1
  3. package/es/locale/lang/fr-FR.js +29 -29
  4. package/es/style.css +1 -1
  5. package/es/style.min.css +1 -1
  6. package/es/table/src/methods.js +248 -40
  7. package/es/table/src/props.js +5 -0
  8. package/es/table/src/scrollbar.js +54 -0
  9. package/es/table/src/table.js +292 -73
  10. package/es/table/src/util.js +11 -2
  11. package/es/table/style.css +30 -0
  12. package/es/table/style.min.css +1 -1
  13. package/es/ui/index.js +9 -11
  14. package/es/ui/src/log.js +1 -1
  15. package/es/vxe-table/style.css +30 -0
  16. package/es/vxe-table/style.min.css +1 -1
  17. package/lib/index.css +1 -1
  18. package/lib/index.min.css +1 -1
  19. package/lib/index.umd.js +366 -84
  20. package/lib/index.umd.min.js +1 -1
  21. package/lib/locale/lang/fr-FR.js +29 -29
  22. package/lib/locale/lang/fr-FR.min.js +1 -1
  23. package/lib/locale/lang/fr-FR.umd.js +29 -29
  24. package/lib/style.css +1 -1
  25. package/lib/style.min.css +1 -1
  26. package/lib/table/src/methods.js +21 -11
  27. package/lib/table/src/methods.min.js +1 -1
  28. package/lib/table/src/props.js +5 -0
  29. package/lib/table/src/props.min.js +1 -1
  30. package/lib/table/src/scrollbar.js +63 -0
  31. package/lib/table/src/scrollbar.min.js +1 -0
  32. package/lib/table/src/table.js +265 -62
  33. package/lib/table/src/table.min.js +1 -1
  34. package/lib/table/src/util.js +11 -2
  35. package/lib/table/src/util.min.js +1 -1
  36. package/lib/table/style/style.css +30 -0
  37. package/lib/table/style/style.min.css +1 -1
  38. package/lib/ui/index.js +9 -11
  39. package/lib/ui/index.min.js +1 -1
  40. package/lib/ui/src/log.js +1 -1
  41. package/lib/ui/src/log.min.js +1 -1
  42. package/lib/vxe-table/style/style.css +30 -0
  43. package/lib/vxe-table/style/style.min.css +1 -1
  44. package/package.json +2 -2
  45. package/packages/locale/lang/fr-FR.ts +903 -903
  46. package/packages/table/src/methods.ts +260 -40
  47. package/packages/table/src/props.ts +5 -0
  48. package/packages/table/src/scrollbar.ts +57 -0
  49. package/packages/table/src/table.ts +329 -75
  50. package/packages/table/src/util.ts +15 -2
  51. package/packages/ui/index.ts +8 -10
  52. package/styles/components/table.scss +65 -0
  53. /package/es/{iconfont.1791880417274.ttf → iconfont.1792035018941.ttf} +0 -0
  54. /package/es/{iconfont.1791880417274.woff → iconfont.1792035018941.woff} +0 -0
  55. /package/es/{iconfont.1791880417274.woff2 → iconfont.1792035018941.woff2} +0 -0
  56. /package/lib/{iconfont.1791880417274.ttf → iconfont.1792035018941.ttf} +0 -0
  57. /package/lib/{iconfont.1791880417274.woff → iconfont.1792035018941.woff} +0 -0
  58. /package/lib/{iconfont.1791880417274.woff2 → iconfont.1792035018941.woff2} +0 -0
@@ -6,6 +6,7 @@ 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');
@@ -996,7 +997,6 @@ function updateStyle($xeTable) {
996
997
  const isHeaderRenderOptimize = $xeTable.computeIsHeaderRenderOptimize;
997
998
  const isBodyRenderOptimize = $xeTable.computeIsBodyRenderOptimize;
998
999
  const isFooterRenderOptimize = $xeTable.computeIsFooterRenderOptimize;
999
- const scrollbarOpts = $xeTable.computeScrollbarOpts;
1000
1000
  const mouseOpts = $xeTable.computeMouseOpts;
1001
1001
  const bodyWrapperElem = getRefElem(elemStore['main-body-wrapper']);
1002
1002
  const bodyTableElem = getRefElem(elemStore['main-body-table']);
@@ -1004,24 +1004,26 @@ function updateStyle($xeTable) {
1004
1004
  emptyPlaceholderElem.style.top = `${tHeaderHeight}px`;
1005
1005
  emptyPlaceholderElem.style.height = bodyWrapperElem ? `${bodyWrapperElem.offsetHeight - osbHeight}px` : '';
1006
1006
  }
1007
- const scrollbarXConf = scrollbarOpts.x || {};
1008
- const scrollbarYConf = scrollbarOpts.y || {};
1007
+ const scrollXVisible = $xeTable.computeScrollXVisible;
1008
+ const scrollYVisible = $xeTable.computeScrollYVisible;
1009
1009
  const scrollbarYToLeft = $xeTable.computeScrollbarYToLeft;
1010
1010
  let xScrollbarVisible = overflowX ? 'visible' : 'hidden';
1011
- if (scrollbarXConf.visible === 'visible' || $xeGanttView) {
1011
+ const hideXScroll = scrollXVisible === false || scrollXVisible === 'hidden';
1012
+ if (scrollXVisible === 'visible' || $xeGanttView) {
1012
1013
  osbHeight = scrollbarHeight;
1013
1014
  xScrollbarVisible = 'visible';
1014
1015
  }
1015
- else if (scrollbarXConf.visible === 'hidden' || scrollbarXConf.visible === false) {
1016
+ else if (hideXScroll) {
1016
1017
  osbHeight = 0;
1017
1018
  xScrollbarVisible = 'hidden';
1018
1019
  }
1019
1020
  let yScrollbarVisible = overflowY ? 'visible' : 'hidden';
1020
- if ((scrollbarYConf.visible === 'hidden' || scrollbarYConf.visible === false) || (($xeGantt && $xeGanttView && $xeGantt.reactData.showRightView) && !scrollbarYToLeft)) {
1021
+ const hideYScroll = scrollYVisible === false || scrollYVisible === 'hidden';
1022
+ if (hideYScroll || (($xeGantt && $xeGanttView && $xeGantt.reactData.showRightView) && !scrollbarYToLeft)) {
1021
1023
  osbWidth = 0;
1022
1024
  yScrollbarVisible = 'hidden';
1023
1025
  }
1024
- else if (scrollbarYConf.visible === 'visible') {
1026
+ else if (scrollYVisible === 'visible') {
1025
1027
  osbWidth = scrollbarWidth;
1026
1028
  yScrollbarVisible = 'visible';
1027
1029
  }
@@ -2349,14 +2351,6 @@ function autoCellWidth($xeTable) {
2349
2351
  if (!bodyWrapperElem) {
2350
2352
  return;
2351
2353
  }
2352
- const yHandleEl = $xeTable.$refs.refScrollYHandleElem;
2353
- if (!yHandleEl) {
2354
- return;
2355
- }
2356
- const xHandleEl = $xeTable.$refs.refScrollXHandleElem;
2357
- if (!xHandleEl) {
2358
- return;
2359
- }
2360
2354
  const columnOpts = $xeTable.computeColumnOpts;
2361
2355
  let tWidth = 0;
2362
2356
  const minCellWidth = 40; // 列宽最少限制 40px
@@ -3031,7 +3025,6 @@ function calcScrollbar($xeTable) {
3031
3025
  const internalData = $xeTable;
3032
3026
  const { scrollXWidth, scrollYHeight } = reactData;
3033
3027
  const { elemStore } = internalData;
3034
- const scrollbarOpts = $xeTable.computeScrollbarOpts;
3035
3028
  const el = $xeTable.$refs.refElem;
3036
3029
  if (!el || !el.clientWidth) {
3037
3030
  return;
@@ -3041,19 +3034,31 @@ function calcScrollbar($xeTable) {
3041
3034
  const footerTableElem = getRefElem(elemStore['main-footer-table']);
3042
3035
  const xHandleEl = $xeTable.$refs.refScrollXHandleElem;
3043
3036
  const yHandleEl = $xeTable.$refs.refScrollYHandleElem;
3037
+ const thumbXElem = $xeTable.$refs.refThumbXElem;
3038
+ const thumbYElem = $xeTable.$refs.refThumbYElem;
3044
3039
  let overflowY = false;
3045
3040
  let overflowX = false;
3046
3041
  if (bodyWrapperElem) {
3042
+ const scrollbarOpts = $xeTable.computeScrollbarOpts;
3043
+ const barWidth = $xeTable.computeScrollYWidth;
3044
+ const barHeight = $xeTable.computeScrollXHeight;
3047
3045
  overflowY = scrollYHeight > bodyWrapperElem.clientHeight;
3048
- if (yHandleEl) {
3049
- reactData.scrollbarWidth = scrollbarOpts.width || (yHandleEl.offsetWidth - yHandleEl.clientWidth) || 14;
3046
+ // 如果是虚拟滚动条
3047
+ if (thumbYElem) {
3048
+ reactData.scrollbarHeight = scrollbarOpts.padding ? thumbYElem.offsetWidth : 0;
3049
+ }
3050
+ else if (yHandleEl) {
3051
+ reactData.scrollbarWidth = (barWidth || barHeight) || (yHandleEl.offsetWidth - yHandleEl.clientWidth) || 14;
3050
3052
  }
3051
3053
  reactData.overflowY = overflowY;
3052
3054
  overflowX = scrollXWidth > bodyWrapperElem.clientWidth;
3053
- if (xHandleEl) {
3054
- reactData.scrollbarHeight = scrollbarOpts.height || (xHandleEl.offsetHeight - xHandleEl.clientHeight) || 14;
3055
+ // 如果是虚拟滚动条
3056
+ if (thumbXElem) {
3057
+ reactData.scrollbarHeight = scrollbarOpts.padding ? thumbXElem.offsetHeight : 0;
3058
+ }
3059
+ else if (xHandleEl) {
3060
+ reactData.scrollbarHeight = (barHeight || barWidth) || (xHandleEl.offsetHeight - xHandleEl.clientHeight) || 14;
3055
3061
  }
3056
- reactData.overflowX = overflowX;
3057
3062
  const hHeight = headerTableElem ? headerTableElem.clientHeight : 0;
3058
3063
  const fHeight = footerTableElem ? footerTableElem.clientHeight : 0;
3059
3064
  internalData.tableHeight = bodyWrapperElem.offsetHeight;
@@ -3141,6 +3146,7 @@ function handleLazyRecalculate($xeTable, reFull, reWidth, reHeight, options) {
3141
3146
  const refreshDelay = resizeOpts.refreshDelay || 30;
3142
3147
  const reDelay = rceDelay + refreshDelay;
3143
3148
  const el = $xeTable.$refs.refElem;
3149
+ $xeTable.updateScrollbar();
3144
3150
  if (el && el.clientWidth) {
3145
3151
  autoCellWidth($xeTable);
3146
3152
  updateRowExpandStyle($xeTable);
@@ -9943,6 +9949,14 @@ const tableMethods = {
9943
9949
  }
9944
9950
  return $xeTable.$nextTick();
9945
9951
  },
9952
+ /**
9953
+ * @private
9954
+ */
9955
+ updateScrollbar() {
9956
+ const $xeTable = this;
9957
+ $xeTable.updateThumbSize();
9958
+ $xeTable.updateThumbOffset();
9959
+ },
9946
9960
  /**
9947
9961
  * 表头单元格按下事件
9948
9962
  */
@@ -12249,19 +12263,18 @@ const tableMethods = {
12249
12263
  const props = $xeTable;
12250
12264
  const internalData = $xeTable;
12251
12265
  const { highlightHoverRow } = props;
12252
- const { lastScrollLeft, lastScrollTop } = internalData;
12253
- const xHandleEl = $xeTable.$refs.refScrollXHandleElem;
12254
- const yHandleEl = $xeTable.$refs.refScrollYHandleElem;
12255
- if (!xHandleEl || !yHandleEl) {
12266
+ const { elemStore, lastScrollLeft, lastScrollTop } = internalData;
12267
+ const bodyScrollElem = getRefElem(elemStore['main-body-scroll']);
12268
+ if (!bodyScrollElem) {
12256
12269
  return;
12257
12270
  }
12258
12271
  const rowOpts = $xeTable.computeRowOpts;
12259
12272
  const validTip = $xeTable.$refs.refValidTooltip;
12260
12273
  const tooltip = $xeTable.$refs.refTooltip;
12261
- const bodyHeight = yHandleEl.clientHeight;
12262
- const bodyWidth = xHandleEl.clientWidth;
12263
- const scrollHeight = yHandleEl.scrollHeight;
12264
- const scrollWidth = xHandleEl.scrollWidth;
12274
+ const bodyHeight = bodyScrollElem.clientHeight;
12275
+ const bodyWidth = bodyScrollElem.clientWidth;
12276
+ const scrollHeight = bodyScrollElem.scrollHeight;
12277
+ const scrollWidth = bodyScrollElem.scrollWidth;
12265
12278
  let isTop = false;
12266
12279
  let isBottom = false;
12267
12280
  let isLeft = false;
@@ -12323,6 +12336,7 @@ const tableMethods = {
12323
12336
  isLeft,
12324
12337
  isRight,
12325
12338
  direction }, params);
12339
+ $xeTable.updateThumbOffset();
12326
12340
  updateRowExpandStyle($xeTable);
12327
12341
  checkLastSyncScroll($xeTable, isRollX, isRollY);
12328
12342
  if (isRollX) {
@@ -12370,8 +12384,10 @@ const tableMethods = {
12370
12384
  },
12371
12385
  triggerBodyScrollEvent(evnt, fixedType) {
12372
12386
  const $xeTable = this;
12387
+ const props = $xeTable;
12373
12388
  const reactData = $xeTable;
12374
12389
  const internalData = $xeTable;
12390
+ const { useScrollbar } = props;
12375
12391
  const { scrollYLoad, scrollXLoad } = reactData;
12376
12392
  const { elemStore, intoRunScroll, lastScrollTop, lastScrollLeft, inWheelScroll, inVirtualScroll, inHeaderScroll, inBodyScroll, scrollRenderType, inFooterScroll } = internalData;
12377
12393
  if (inWheelScroll || inVirtualScroll || inHeaderScroll || inFooterScroll) {
@@ -12391,19 +12407,21 @@ const tableMethods = {
12391
12407
  if (!bodyScrollElem) {
12392
12408
  return;
12393
12409
  }
12394
- if (!xHandleEl) {
12395
- return;
12396
- }
12397
- if (!yHandleEl) {
12398
- return;
12410
+ if (!useScrollbar) {
12411
+ if (!xHandleEl) {
12412
+ return;
12413
+ }
12414
+ if (!yHandleEl) {
12415
+ return;
12416
+ }
12399
12417
  }
12400
12418
  if (inBodyScroll) {
12401
12419
  if (scrollRenderType !== fixedType) {
12402
12420
  return;
12403
12421
  }
12404
12422
  }
12405
- let scrollTop = yHandleEl.scrollTop;
12406
- let scrollLeft = xHandleEl.scrollLeft;
12423
+ let scrollTop = 0;
12424
+ let scrollLeft = 0;
12407
12425
  if (leftScrollElem && fixedType === 'left') {
12408
12426
  scrollTop = leftScrollElem.scrollTop;
12409
12427
  }
@@ -12555,8 +12573,8 @@ const tableMethods = {
12555
12573
  const rightFixedWidth = $xeTable.computeRightFixedWidth;
12556
12574
  const { elemStore, lastScrollTop, lastScrollLeft } = internalData;
12557
12575
  const rowOpts = $xeTable.computeRowOpts;
12558
- const scrollbarXOpts = $xeTable.computeScrollbarXOpts;
12559
- const scrollbarYOpts = $xeTable.computeScrollbarYOpts;
12576
+ const scrollXVisible = $xeTable.computeScrollXVisible;
12577
+ const scrollYVisible = $xeTable.computeScrollYVisible;
12560
12578
  const xHandleEl = $xeTable.$refs.refScrollXHandleElem;
12561
12579
  const yHandleEl = $xeTable.$refs.refScrollYHandleElem;
12562
12580
  const leftScrollElem = getRefElem(elemStore['left-body-scroll']);
@@ -12579,14 +12597,14 @@ const tableMethods = {
12579
12597
  const isRollY = overflowY && scrollTop !== lastScrollTop;
12580
12598
  if (isRollX) {
12581
12599
  // 如果禁用滚动
12582
- if (scrollbarXOpts.visible === 'hidden') {
12600
+ if (scrollXVisible === false || scrollXVisible === 'hidden') {
12583
12601
  evnt.preventDefault();
12584
12602
  return;
12585
12603
  }
12586
12604
  }
12587
12605
  if (isRollY) {
12588
12606
  // 如果禁用滚动
12589
- if (scrollbarYOpts.visible === 'hidden') {
12607
+ if (scrollYVisible === false || scrollYVisible === 'hidden') {
12590
12608
  evnt.preventDefault();
12591
12609
  return;
12592
12610
  }
@@ -13535,6 +13553,196 @@ const tableMethods = {
13535
13553
  const $xeTable = this;
13536
13554
  return $xeTable.handleClearStack();
13537
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
+ // 滚动条
13538
13746
  dispatchEvent(type, params, evnt) {
13539
13747
  const $xeTable = this;
13540
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
  /** 基本属性 */
@@ -292,6 +293,10 @@ export const tableProps = {
292
293
  virtualXConfig: Object,
293
294
  // 纵向虚拟滚动配置项
294
295
  virtualYConfig: Object,
296
+ useScrollbar: {
297
+ type: Boolean,
298
+ default: () => getDefaultConfig(getConfig().table.useScrollbar, getConfig().useScrollbar)
299
+ },
295
300
  // 滚动条配置项
296
301
  scrollbarConfig: Object,
297
302
  // 撤销/恢复历史配置项
@@ -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
+ }