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.
- package/es/index.css +1 -1
- package/es/index.min.css +1 -1
- package/es/locale/lang/fr-FR.js +29 -29
- package/es/style.css +1 -1
- package/es/style.min.css +1 -1
- package/es/table/src/methods.js +248 -40
- package/es/table/src/props.js +5 -0
- package/es/table/src/scrollbar.js +54 -0
- package/es/table/src/table.js +292 -73
- package/es/table/src/util.js +11 -2
- package/es/table/style.css +30 -0
- package/es/table/style.min.css +1 -1
- package/es/ui/index.js +9 -11
- package/es/ui/src/log.js +1 -1
- package/es/vxe-table/style.css +30 -0
- package/es/vxe-table/style.min.css +1 -1
- package/lib/index.css +1 -1
- package/lib/index.min.css +1 -1
- package/lib/index.umd.js +366 -84
- package/lib/index.umd.min.js +1 -1
- package/lib/locale/lang/fr-FR.js +29 -29
- package/lib/locale/lang/fr-FR.min.js +1 -1
- package/lib/locale/lang/fr-FR.umd.js +29 -29
- package/lib/style.css +1 -1
- package/lib/style.min.css +1 -1
- package/lib/table/src/methods.js +21 -11
- package/lib/table/src/methods.min.js +1 -1
- package/lib/table/src/props.js +5 -0
- package/lib/table/src/props.min.js +1 -1
- package/lib/table/src/scrollbar.js +63 -0
- package/lib/table/src/scrollbar.min.js +1 -0
- package/lib/table/src/table.js +265 -62
- package/lib/table/src/table.min.js +1 -1
- package/lib/table/src/util.js +11 -2
- package/lib/table/src/util.min.js +1 -1
- package/lib/table/style/style.css +30 -0
- package/lib/table/style/style.min.css +1 -1
- package/lib/ui/index.js +9 -11
- package/lib/ui/index.min.js +1 -1
- package/lib/ui/src/log.js +1 -1
- package/lib/ui/src/log.min.js +1 -1
- package/lib/vxe-table/style/style.css +30 -0
- package/lib/vxe-table/style/style.min.css +1 -1
- package/package.json +2 -2
- package/packages/locale/lang/fr-FR.ts +903 -903
- package/packages/table/src/methods.ts +260 -40
- package/packages/table/src/props.ts +5 -0
- package/packages/table/src/scrollbar.ts +57 -0
- package/packages/table/src/table.ts +329 -75
- package/packages/table/src/util.ts +15 -2
- package/packages/ui/index.ts +8 -10
- package/styles/components/table.scss +65 -0
- /package/es/{iconfont.1791880417274.ttf → iconfont.1792035018941.ttf} +0 -0
- /package/es/{iconfont.1791880417274.woff → iconfont.1792035018941.woff} +0 -0
- /package/es/{iconfont.1791880417274.woff2 → iconfont.1792035018941.woff2} +0 -0
- /package/lib/{iconfont.1791880417274.ttf → iconfont.1792035018941.ttf} +0 -0
- /package/lib/{iconfont.1791880417274.woff → iconfont.1792035018941.woff} +0 -0
- /package/lib/{iconfont.1791880417274.woff2 → iconfont.1792035018941.woff2} +0 -0
package/es/table/src/methods.js
CHANGED
|
@@ -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
|
|
1008
|
-
const
|
|
1007
|
+
const scrollXVisible = $xeTable.computeScrollXVisible;
|
|
1008
|
+
const scrollYVisible = $xeTable.computeScrollYVisible;
|
|
1009
1009
|
const scrollbarYToLeft = $xeTable.computeScrollbarYToLeft;
|
|
1010
1010
|
let xScrollbarVisible = overflowX ? 'visible' : 'hidden';
|
|
1011
|
-
|
|
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 (
|
|
1016
|
+
else if (hideXScroll) {
|
|
1016
1017
|
osbHeight = 0;
|
|
1017
1018
|
xScrollbarVisible = 'hidden';
|
|
1018
1019
|
}
|
|
1019
1020
|
let yScrollbarVisible = overflowY ? 'visible' : 'hidden';
|
|
1020
|
-
|
|
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 (
|
|
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
|
-
|
|
3049
|
-
|
|
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
|
-
|
|
3054
|
-
|
|
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
|
|
12254
|
-
|
|
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 =
|
|
12262
|
-
const bodyWidth =
|
|
12263
|
-
const scrollHeight =
|
|
12264
|
-
const 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 (!
|
|
12395
|
-
|
|
12396
|
-
|
|
12397
|
-
|
|
12398
|
-
|
|
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 =
|
|
12406
|
-
let 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
|
|
12559
|
-
const
|
|
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 (
|
|
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 (
|
|
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;
|
package/es/table/src/props.js
CHANGED
|
@@ -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
|
+
}
|