vxe-pc-ui 3.20.0 → 3.20.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 (125) hide show
  1. package/es/card/src/card.js +20 -4
  2. package/es/drawer/src/drawer.js +75 -16
  3. package/es/drawer/style.css +13 -6
  4. package/es/drawer/style.min.css +1 -1
  5. package/es/icon/style.css +1 -1
  6. package/es/language/fr-FR.js +29 -29
  7. package/es/layout-aside/src/layout-aside.js +10 -6
  8. package/es/layout-body/src/layout-body.js +24 -12
  9. package/es/list/src/list.js +131 -49
  10. package/es/list/style.css +25 -8
  11. package/es/list/style.min.css +1 -1
  12. package/es/menu/src/menu.js +2 -2
  13. package/es/modal/src/modal.js +73 -14
  14. package/es/modal/style.css +4 -0
  15. package/es/modal/style.min.css +1 -1
  16. package/es/scrollbar/src/scrollbar.js +87 -19
  17. package/es/style.css +1 -1
  18. package/es/style.min.css +1 -1
  19. package/es/tabs/src/tabs.js +21 -5
  20. package/es/tree/src/tree.js +460 -54
  21. package/es/tree/style.css +43 -0
  22. package/es/tree/style.min.css +1 -1
  23. package/es/ui/index.js +1 -1
  24. package/es/ui/src/log.js +1 -1
  25. package/es/ui/src/utils.js +3 -0
  26. package/es/vxe-drawer/style.css +13 -6
  27. package/es/vxe-drawer/style.min.css +1 -1
  28. package/es/vxe-list/style.css +25 -8
  29. package/es/vxe-list/style.min.css +1 -1
  30. package/es/vxe-modal/style.css +4 -0
  31. package/es/vxe-modal/style.min.css +1 -1
  32. package/es/vxe-tree/style.css +43 -0
  33. package/es/vxe-tree/style.min.css +1 -1
  34. package/lib/card/src/card.js +20 -4
  35. package/lib/card/src/card.min.js +1 -1
  36. package/lib/drawer/src/drawer.js +76 -12
  37. package/lib/drawer/src/drawer.min.js +1 -1
  38. package/lib/drawer/style/style.css +13 -6
  39. package/lib/drawer/style/style.min.css +1 -1
  40. package/lib/icon/style/style.css +1 -1
  41. package/lib/icon/style/style.min.css +1 -1
  42. package/lib/index.umd.js +956 -185
  43. package/lib/index.umd.min.js +1 -1
  44. package/lib/language/fr-FR.js +29 -29
  45. package/lib/language/fr-FR.min.js +1 -1
  46. package/lib/language/fr-FR.umd.js +29 -29
  47. package/lib/layout-aside/src/layout-aside.js +10 -9
  48. package/lib/layout-aside/src/layout-aside.min.js +1 -1
  49. package/lib/layout-body/src/layout-body.js +28 -20
  50. package/lib/layout-body/src/layout-body.min.js +1 -1
  51. package/lib/list/src/list.js +119 -46
  52. package/lib/list/src/list.min.js +1 -1
  53. package/lib/list/style/style.css +25 -8
  54. package/lib/list/style/style.min.css +1 -1
  55. package/lib/menu/src/menu.js +1 -1
  56. package/lib/menu/src/menu.min.js +1 -1
  57. package/lib/modal/src/modal.js +74 -12
  58. package/lib/modal/src/modal.min.js +1 -1
  59. package/lib/modal/style/style.css +4 -0
  60. package/lib/modal/style/style.min.css +1 -1
  61. package/lib/scrollbar/src/scrollbar.js +92 -17
  62. package/lib/scrollbar/src/scrollbar.min.js +1 -1
  63. package/lib/style.css +1 -1
  64. package/lib/style.min.css +1 -1
  65. package/lib/tabs/src/tabs.js +21 -8
  66. package/lib/tabs/src/tabs.min.js +1 -1
  67. package/lib/tree/src/tree.js +438 -51
  68. package/lib/tree/src/tree.min.js +1 -1
  69. package/lib/tree/style/style.css +43 -0
  70. package/lib/tree/style/style.min.css +1 -1
  71. package/lib/ui/index.js +1 -1
  72. package/lib/ui/index.min.js +1 -1
  73. package/lib/ui/src/log.js +1 -1
  74. package/lib/ui/src/log.min.js +1 -1
  75. package/lib/ui/src/utils.js +4 -0
  76. package/lib/ui/src/utils.min.js +1 -1
  77. package/lib/vxe-drawer/style/style.css +13 -6
  78. package/lib/vxe-drawer/style/style.min.css +1 -1
  79. package/lib/vxe-list/style/style.css +25 -8
  80. package/lib/vxe-list/style/style.min.css +1 -1
  81. package/lib/vxe-modal/style/style.css +4 -0
  82. package/lib/vxe-modal/style/style.min.css +1 -1
  83. package/lib/vxe-tree/style/style.css +43 -0
  84. package/lib/vxe-tree/style/style.min.css +1 -1
  85. package/package.json +2 -2
  86. package/packages/card/src/card.ts +21 -4
  87. package/packages/drawer/src/drawer.ts +80 -16
  88. package/packages/language/fr-FR.ts +903 -903
  89. package/packages/layout-aside/src/layout-aside.ts +10 -6
  90. package/packages/layout-body/src/layout-body.ts +28 -15
  91. package/packages/list/src/list.ts +149 -55
  92. package/packages/menu/src/menu.ts +2 -2
  93. package/packages/modal/src/modal.ts +83 -19
  94. package/packages/scrollbar/src/scrollbar.ts +101 -19
  95. package/packages/tabs/src/tabs.ts +22 -9
  96. package/packages/tree/src/tree.ts +508 -65
  97. package/packages/ui/src/utils.ts +4 -0
  98. package/styles/components/drawer.scss +13 -6
  99. package/styles/components/list.scss +35 -10
  100. package/styles/components/modal.scss +4 -0
  101. package/styles/components/tree.scss +76 -0
  102. package/types/components/card.d.ts +10 -1
  103. package/types/components/drawer.d.ts +20 -0
  104. package/types/components/gantt-module/gantt-view.d.ts +24 -1
  105. package/types/components/gantt.d.ts +2 -0
  106. package/types/components/layout-aside.d.ts +10 -1
  107. package/types/components/layout-body.d.ts +10 -1
  108. package/types/components/list.d.ts +13 -2
  109. package/types/components/modal.d.ts +20 -0
  110. package/types/components/scrollbar.d.ts +16 -2
  111. package/types/components/table.d.ts +80 -6
  112. package/types/components/tabs.d.ts +10 -1
  113. package/types/components/tree.d.ts +35 -2
  114. /package/es/icon/{iconfont.1791880407207.ttf → iconfont.1792034961185.ttf} +0 -0
  115. /package/es/icon/{iconfont.1791880407207.woff → iconfont.1792034961185.woff} +0 -0
  116. /package/es/icon/{iconfont.1791880407207.woff2 → iconfont.1792034961185.woff2} +0 -0
  117. /package/es/{iconfont.1791880407207.ttf → iconfont.1792034961185.ttf} +0 -0
  118. /package/es/{iconfont.1791880407207.woff → iconfont.1792034961185.woff} +0 -0
  119. /package/es/{iconfont.1791880407207.woff2 → iconfont.1792034961185.woff2} +0 -0
  120. /package/lib/icon/style/{iconfont.1791880407207.ttf → iconfont.1792034961185.ttf} +0 -0
  121. /package/lib/icon/style/{iconfont.1791880407207.woff → iconfont.1792034961185.woff} +0 -0
  122. /package/lib/icon/style/{iconfont.1791880407207.woff2 → iconfont.1792034961185.woff2} +0 -0
  123. /package/lib/{iconfont.1791880407207.ttf → iconfont.1792034961185.ttf} +0 -0
  124. /package/lib/{iconfont.1791880407207.woff → iconfont.1792034961185.woff} +0 -0
  125. /package/lib/{iconfont.1791880407207.woff2 → iconfont.1792034961185.woff2} +0 -0
@@ -1,13 +1,14 @@
1
1
  import { defineVxeComponent } from '../../ui/src/comp';
2
2
  import XEUtils from 'xe-utils';
3
- import { VxeUI, createEvent, globalEvents, globalResize, renderEmptyElement, globalMixins } from '../../ui';
3
+ import { VxeUI, domUtils, createEvent, globalEvents, globalResize, renderEmptyElement, globalMixins } from '../../ui';
4
4
  import { calcTreeLine, getItemCacheObj } from './util';
5
5
  import { createComponentLog } from '../../ui/src/log';
6
6
  import { getSlotVNs } from '../../ui/src/vn';
7
7
  import { crossTreeDragNodeGlobal, getCrossTreeDragNodeInfo } from './store';
8
8
  import { toCssUnit, isScale, getPaddingTopBottomSize, addClass, removeClass, getTpImg, hasControlKey, getEventTargetNode, hasClass } from '../../ui/src/dom';
9
- import { isEnableConf, enModelValue, deModelValue, getText } from '../../ui/src/utils';
9
+ import { isEnableConf, enModelValue, deModelValue, getText, getDefaultConfig } from '../../ui/src/utils';
10
10
  import { moveRowAnimateToTb, clearRowAnimate } from '../../ui/src/anime';
11
+ import { getThumbOffsetSize, getThumbSize, getScrollFromClick, getScrollFromDrag } from '../../scrollbar/src/util';
11
12
  import VxeLoadingComponent from '../../loading';
12
13
  import VxeTooltipComponent from '../../tooltip';
13
14
  const { warnLog, errLog } = createComponentLog('tree');
@@ -498,6 +499,34 @@ function insertTreeNode($xeTree, newRecords, isAppend) {
498
499
  nodeMaps[nodeid] = itemRest;
499
500
  });
500
501
  }
502
+ function createReactData() {
503
+ return {
504
+ parentHeight: 0,
505
+ customHeight: 0,
506
+ customMinHeight: 0,
507
+ customMaxHeight: 0,
508
+ currentNode: null,
509
+ scrollYLoad: false,
510
+ bodyHeight: 0,
511
+ topSpaceHeight: 0,
512
+ selectRadioKey: null,
513
+ treeList: [],
514
+ updateExpandedFlag: 1,
515
+ updateCheckboxFlag: 1,
516
+ // 滚动条
517
+ yThumbHeight: 0,
518
+ xThumbWidth: 0,
519
+ insertNodeFlag: 1,
520
+ removeNodeFlag: 1,
521
+ dragNode: null,
522
+ dragTipText: '',
523
+ isCrossDragNode: false,
524
+ tooltipStore: {
525
+ visible: false,
526
+ node: null
527
+ }
528
+ };
529
+ }
501
530
  function createInternalData() {
502
531
  return {
503
532
  // initialized: false,
@@ -510,8 +539,15 @@ function createInternalData() {
510
539
  indeterminateNodeMaps: {},
511
540
  treeExpandedMaps: {},
512
541
  treeExpandLazyLoadedMaps: {},
513
- lastScrollLeft: 0,
542
+ // resizeObserver: undefined,
543
+ // 滚动条
544
+ // scrollObserver: undefined,
545
+ // isThumbDrag: false,
546
+ thumbDragOffset: 0,
547
+ yThumbTop: 0,
548
+ xThumbLeft: 0,
514
549
  lastScrollTop: 0,
550
+ lastScrollLeft: 0,
515
551
  scrollYStore: {
516
552
  startIndex: 0,
517
553
  endIndex: 0,
@@ -528,31 +564,6 @@ function createInternalData() {
528
564
  // hpTimeout: undefined
529
565
  };
530
566
  }
531
- function createReactData() {
532
- return {
533
- parentHeight: 0,
534
- customHeight: 0,
535
- customMinHeight: 0,
536
- customMaxHeight: 0,
537
- currentNode: null,
538
- scrollYLoad: false,
539
- bodyHeight: 0,
540
- topSpaceHeight: 0,
541
- selectRadioKey: null,
542
- treeList: [],
543
- updateExpandedFlag: 1,
544
- updateCheckboxFlag: 1,
545
- insertNodeFlag: 1,
546
- removeNodeFlag: 1,
547
- dragNode: null,
548
- dragTipText: '',
549
- isCrossDragNode: false,
550
- tooltipStore: {
551
- visible: false,
552
- node: null
553
- }
554
- };
555
- }
556
567
  export default {
557
568
  name: 'VxeTree',
558
569
  mixins: [
@@ -685,7 +696,12 @@ export default {
685
696
  type: String,
686
697
  default: () => getConfig().tree.size || getConfig().size
687
698
  },
688
- virtualYConfig: Object
699
+ virtualYConfig: Object,
700
+ useScrollbar: {
701
+ type: Boolean,
702
+ default: () => getDefaultConfig(getConfig().tree.useScrollbar, getConfig().useScrollbar)
703
+ },
704
+ scrollbarConfig: Object
689
705
  },
690
706
  provide() {
691
707
  const $xeTree = this;
@@ -697,7 +713,7 @@ export default {
697
713
  const xID = XEUtils.uniqueId();
698
714
  const reactData = createReactData();
699
715
  return Object.assign(Object.assign({}, {}), { xID,
700
- reactData, crossTreeDragNodeInfo: crossTreeDragNodeGlobal, hFlag: 0, dataFlag: 0 });
716
+ reactData, crossTreeDragNodeInfo: crossTreeDragNodeGlobal, reFlag: 0, dataFlag: 0 });
701
717
  },
702
718
  computed: Object.assign(Object.assign({}, {}), { computeTitleField() {
703
719
  const $xeTree = this;
@@ -795,6 +811,17 @@ export default {
795
811
  const props = $xeTree;
796
812
  return Object.assign({}, getConfig().tree.menuConfig, props.menuConfig);
797
813
  },
814
+ computeWrapperStyles() {
815
+ const $xeTree = this;
816
+ const barWidth = $xeTree.computeScrollYWidth;
817
+ const barHeight = $xeTree.computeScrollXHeight;
818
+ const stys = {};
819
+ if (barWidth || barHeight) {
820
+ stys['--vxe-ui-scrollbar-y-width'] = toCssUnit(barWidth || barHeight);
821
+ stys['--vxe-ui-scrollbar-x-height'] = toCssUnit(barHeight || barWidth);
822
+ }
823
+ return stys;
824
+ },
798
825
  computeTreeStyle() {
799
826
  const $xeTree = this;
800
827
  const props = $xeTree;
@@ -831,6 +858,88 @@ export default {
831
858
  const $xeTree = this;
832
859
  const props = $xeTree;
833
860
  return Object.assign({}, getConfig().tree.filterConfig, props.filterConfig);
861
+ },
862
+ computeScrollbarOpts() {
863
+ const $xeTree = this;
864
+ const props = $xeTree;
865
+ return Object.assign({}, getConfig().tree.scrollbarConfig, props.scrollbarConfig);
866
+ },
867
+ computeScrollbarXOpts() {
868
+ const $xeTree = this;
869
+ const scrollbarOpts = $xeTree.computeScrollbarOpts;
870
+ return Object.assign({}, getConfig().scrollbar.xConfig, scrollbarOpts.xConfig, {
871
+ visible: false
872
+ });
873
+ },
874
+ computeScrollbarYOpts() {
875
+ const $xeTree = this;
876
+ const scrollbarOpts = $xeTree.computeScrollbarOpts;
877
+ return Object.assign({}, getConfig().scrollbar.yConfig, scrollbarOpts.yConfig);
878
+ },
879
+ computeScrollXHeight() {
880
+ const $xeTree = this;
881
+ const scrollbarOpts = $xeTree.computeScrollbarOpts;
882
+ const scrollbarXOpts = $xeTree.computeScrollbarXOpts;
883
+ return getDefaultConfig(getDefaultConfig(scrollbarXOpts.height, scrollbarOpts.height), getConfig().scrollbar.height);
884
+ },
885
+ computeScrollYWidth() {
886
+ const $xeTree = this;
887
+ const scrollbarOpts = $xeTree.computeScrollbarOpts;
888
+ const scrollbarYOpts = $xeTree.computeScrollbarYOpts;
889
+ return getDefaultConfig(getDefaultConfig(scrollbarYOpts.width, scrollbarOpts.width), getConfig().scrollbar.width);
890
+ },
891
+ computeScrollXVisible() {
892
+ const $xeTree = this;
893
+ const scrollbarOpts = $xeTree.computeScrollbarOpts;
894
+ const scrollbarXOpts = $xeTree.computeScrollbarXOpts;
895
+ return getDefaultConfig(scrollbarXOpts.visible, scrollbarOpts.visible);
896
+ },
897
+ computeScrollYVisible() {
898
+ const $xeTree = this;
899
+ const scrollbarOpts = $xeTree.computeScrollbarOpts;
900
+ const scrollbarYOpts = $xeTree.computeScrollbarYOpts;
901
+ return getDefaultConfig(scrollbarYOpts.visible, scrollbarOpts.visible);
902
+ },
903
+ computeScrollXAutoHide() {
904
+ const $xeTree = this;
905
+ const scrollbarOpts = $xeTree.computeScrollbarOpts;
906
+ const scrollbarXOpts = $xeTree.computeScrollbarXOpts;
907
+ return getDefaultConfig(getDefaultConfig(scrollbarXOpts.autoHide, scrollbarOpts.autoHide), getConfig().scrollbar.autoHide);
908
+ },
909
+ computeScrollYAutoHide() {
910
+ const $xeTree = this;
911
+ const scrollbarOpts = $xeTree.computeScrollbarOpts;
912
+ const scrollbarYOpts = $xeTree.computeScrollbarYOpts;
913
+ return getDefaultConfig(getDefaultConfig(scrollbarYOpts.autoHide, scrollbarOpts.autoHide), getConfig().scrollbar.autoHide);
914
+ },
915
+ computeScrollbarWrapperClss() {
916
+ const $xeTree = this;
917
+ const reactData = $xeTree.reactData;
918
+ const { yThumbHeight, xThumbWidth } = reactData;
919
+ const scrollbarXToTop = $xeTree.computeScrollbarXToTop;
920
+ const scrollbarYToLeft = $xeTree.computeScrollbarYToLeft;
921
+ const scrollXVisible = $xeTree.computeScrollXVisible;
922
+ const scrollYVisible = $xeTree.computeScrollYVisible;
923
+ return domUtils.buildClass([
924
+ 'vxe-scrollbar is--virtual',
925
+ `ov-x--${scrollXVisible === false ? 'hidden' : 'visible'}`,
926
+ `ov-y--${scrollYVisible === false ? 'hidden' : 'visible'}`,
927
+ `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`,
928
+ `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`
929
+ ], {
930
+ 'overflow-y': yThumbHeight,
931
+ 'overflow-x': xThumbWidth
932
+ });
933
+ },
934
+ computeScrollbarXToTop() {
935
+ const $xeTree = this;
936
+ const scrollbarXOpts = $xeTree.computeScrollbarXOpts;
937
+ return scrollbarXOpts.position === 'top';
938
+ },
939
+ computeScrollbarYToLeft() {
940
+ const $xeTree = this;
941
+ const scrollbarYOpts = $xeTree.computeScrollbarYOpts;
942
+ return scrollbarYOpts.position === 'left';
834
943
  } }),
835
944
  methods: {
836
945
  //
@@ -1455,6 +1564,11 @@ export default {
1455
1564
  }
1456
1565
  });
1457
1566
  },
1567
+ updateScrollbar() {
1568
+ const $xeTree = this;
1569
+ $xeTree.updateThumbSize();
1570
+ $xeTree.updateThumbOffset();
1571
+ },
1458
1572
  /**
1459
1573
  * 重新计算列表
1460
1574
  */
@@ -1479,6 +1593,7 @@ export default {
1479
1593
  const parentPaddingSize = getPaddingTopBottomSize(parentEl);
1480
1594
  reactData.parentHeight = Math.max(headHeight + footHeight + rowHeight, parentEl.clientHeight - parentPaddingSize - headHeight - footHeight);
1481
1595
  }
1596
+ $xeTree.updateScrollbar();
1482
1597
  $xeTree.updateHeight();
1483
1598
  return $xeTree.computeScrollLoad().then(() => {
1484
1599
  $xeTree.updateHeight();
@@ -1523,6 +1638,7 @@ export default {
1523
1638
  const scrollLeft = scrollBodyElem.scrollLeft;
1524
1639
  const isX = scrollLeft !== internalData.lastScrollLeft;
1525
1640
  const isY = scrollTop !== internalData.lastScrollTop;
1641
+ $xeTree.updateThumbOffset();
1526
1642
  internalData.lastScrollTop = scrollTop;
1527
1643
  internalData.lastScrollLeft = scrollLeft;
1528
1644
  if (reactData.scrollYLoad) {
@@ -2397,14 +2513,6 @@ export default {
2397
2513
  $xeTree.emitRadioMode(value);
2398
2514
  $xeTree.dispatchEvent('radio-change', { node, value, checked: isChecked }, evnt);
2399
2515
  },
2400
- handleGlobalResizeEvent() {
2401
- const $xeTree = this;
2402
- const el = $xeTree.$refs.refElem;
2403
- if (!el || !el.clientWidth) {
2404
- return;
2405
- }
2406
- $xeTree.recalculate();
2407
- },
2408
2516
  reloadData(data) {
2409
2517
  const $xeTree = this;
2410
2518
  return $xeTree.loadData(data || []);
@@ -3165,6 +3273,186 @@ export default {
3165
3273
  }, evnt);
3166
3274
  }
3167
3275
  },
3276
+ // 滚动条
3277
+ updateThumbSize() {
3278
+ const $xeTree = this;
3279
+ const reactData = $xeTree.reactData;
3280
+ const viewEl = $xeTree.$refs.refVirtualWrapper;
3281
+ if (!viewEl) {
3282
+ return;
3283
+ }
3284
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
3285
+ return;
3286
+ }
3287
+ const trackXEl = $xeTree.$refs.refTrackXElem;
3288
+ const xThumbWidth = trackXEl ? getThumbSize(viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth) : 0;
3289
+ const thumbXElem = $xeTree.$refs.refThumbXElem;
3290
+ if (thumbXElem) {
3291
+ thumbXElem.style.width = xThumbWidth + 'px';
3292
+ }
3293
+ reactData.xThumbWidth = xThumbWidth;
3294
+ const trackYEl = $xeTree.$refs.refTrackYElem;
3295
+ const yThumbHeight = trackYEl ? getThumbSize(viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight) : 0;
3296
+ const thumbYElem = $xeTree.$refs.refThumbYElem;
3297
+ if (thumbYElem) {
3298
+ thumbYElem.style.height = yThumbHeight + 'px';
3299
+ }
3300
+ reactData.yThumbHeight = yThumbHeight;
3301
+ },
3302
+ updateThumbOffset() {
3303
+ const $xeTree = this;
3304
+ const reactData = $xeTree.reactData;
3305
+ const internalData = $xeTree.internalData;
3306
+ const viewEl = $xeTree.$refs.refVirtualWrapper;
3307
+ if (!viewEl) {
3308
+ return;
3309
+ }
3310
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
3311
+ return;
3312
+ }
3313
+ const { xThumbWidth, yThumbHeight } = reactData;
3314
+ const trackXEl = $xeTree.$refs.refTrackXElem;
3315
+ const thumbXElem = $xeTree.$refs.refThumbXElem;
3316
+ const xThumbLeft = trackXEl && xThumbWidth ? getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth, xThumbWidth) : 0;
3317
+ internalData.xThumbLeft = xThumbLeft;
3318
+ if (thumbXElem && xThumbWidth) {
3319
+ thumbXElem.style.width = xThumbWidth + 'px';
3320
+ thumbXElem.style.transform = `translateX(${xThumbLeft}px)`;
3321
+ }
3322
+ const trackYEl = $xeTree.$refs.refTrackYElem;
3323
+ const thumbYElem = $xeTree.$refs.refThumbYElem;
3324
+ const yThumbTop = trackYEl && yThumbHeight ? getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight, yThumbHeight) : 0;
3325
+ internalData.yThumbTop = yThumbTop;
3326
+ if (thumbYElem && yThumbHeight) {
3327
+ thumbYElem.style.height = yThumbHeight + 'px';
3328
+ thumbYElem.style.transform = `translateY(${yThumbTop}px)`;
3329
+ }
3330
+ },
3331
+ clickTrackXEvent(evnt) {
3332
+ const $xeTree = this;
3333
+ const reactData = $xeTree.reactData;
3334
+ const trackEl = evnt.currentTarget;
3335
+ if (trackEl !== evnt.target) {
3336
+ return;
3337
+ }
3338
+ const viewEl = $xeTree.$refs.refVirtualWrapper;
3339
+ if (!viewEl) {
3340
+ return;
3341
+ }
3342
+ const { xThumbWidth } = reactData;
3343
+ const trackRect = trackEl.getBoundingClientRect();
3344
+ viewEl.scrollTo({
3345
+ left: getScrollFromClick(evnt.clientX - trackRect.left, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth),
3346
+ behavior: 'auto'
3347
+ });
3348
+ },
3349
+ clickTrackYEvent(evnt) {
3350
+ const $xeTree = this;
3351
+ const reactData = $xeTree.reactData;
3352
+ const trackEl = evnt.currentTarget;
3353
+ if (trackEl !== evnt.target) {
3354
+ return;
3355
+ }
3356
+ const viewEl = $xeTree.$refs.refVirtualWrapper;
3357
+ if (!viewEl) {
3358
+ return;
3359
+ }
3360
+ const { yThumbHeight } = reactData;
3361
+ const trackRect = trackEl.getBoundingClientRect();
3362
+ viewEl.scrollTo({
3363
+ top: getScrollFromClick(evnt.clientY - trackRect.top, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight),
3364
+ behavior: 'auto'
3365
+ });
3366
+ },
3367
+ pointerdownThumbXEvent(evnt) {
3368
+ const $xeTree = this;
3369
+ const reactData = $xeTree.reactData;
3370
+ const internalData = $xeTree.internalData;
3371
+ const thumbEl = evnt.currentTarget;
3372
+ internalData.isThumbDrag = true;
3373
+ thumbEl.setPointerCapture(evnt.pointerId);
3374
+ const viewEl = $xeTree.$refs.refVirtualWrapper;
3375
+ if (!viewEl) {
3376
+ return;
3377
+ }
3378
+ const { xThumbWidth } = reactData;
3379
+ const trackEl = thumbEl.parentElement;
3380
+ const trackRect = trackEl.getBoundingClientRect();
3381
+ const pointerPosition = evnt.clientX - trackRect.left;
3382
+ // 记录 thumb 的偏移
3383
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth);
3384
+ internalData.thumbDragOffset = pointerPosition - thumbOffset;
3385
+ },
3386
+ pointermoveThumbXEvent(evnt) {
3387
+ const $xeTree = this;
3388
+ const reactData = $xeTree.reactData;
3389
+ const internalData = $xeTree.internalData;
3390
+ const thumbEl = evnt.currentTarget;
3391
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
3392
+ return;
3393
+ }
3394
+ const { isThumbDrag, thumbDragOffset } = internalData;
3395
+ if (isThumbDrag) {
3396
+ const viewEl = $xeTree.$refs.refVirtualWrapper;
3397
+ if (!viewEl) {
3398
+ return;
3399
+ }
3400
+ const { xThumbWidth } = reactData;
3401
+ const thumbEl = evnt.currentTarget;
3402
+ const trackEl = thumbEl.parentElement;
3403
+ const trackRect = trackEl.getBoundingClientRect();
3404
+ // 更新偏移
3405
+ viewEl.scrollLeft = getScrollFromDrag(evnt.clientX - trackRect.left, thumbDragOffset, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth);
3406
+ }
3407
+ },
3408
+ cleatPointerThumbEvent(evnt) {
3409
+ const $xeTree = this;
3410
+ const internalData = $xeTree.internalData;
3411
+ const thumbEl = evnt.currentTarget;
3412
+ thumbEl.releasePointerCapture(evnt.pointerId);
3413
+ internalData.isThumbDrag = false;
3414
+ },
3415
+ pointerdownThumbYEvent(evnt) {
3416
+ const $xeTree = this;
3417
+ const reactData = $xeTree.reactData;
3418
+ const internalData = $xeTree.internalData;
3419
+ const thumbEl = evnt.currentTarget;
3420
+ internalData.isThumbDrag = true;
3421
+ thumbEl.setPointerCapture(evnt.pointerId);
3422
+ const viewEl = $xeTree.$refs.refVirtualWrapper;
3423
+ if (!viewEl) {
3424
+ return;
3425
+ }
3426
+ const { yThumbHeight } = reactData;
3427
+ const trackEl = thumbEl.parentElement;
3428
+ const trackRect = trackEl.getBoundingClientRect();
3429
+ const pointerPosition = evnt.clientY - trackRect.top;
3430
+ // 记录 thumb 的偏移
3431
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight);
3432
+ internalData.thumbDragOffset = pointerPosition - thumbOffset;
3433
+ },
3434
+ pointermoveThumbYEvent(evnt) {
3435
+ const $xeTree = this;
3436
+ const reactData = $xeTree.reactData;
3437
+ const internalData = $xeTree.internalData;
3438
+ const thumbEl = evnt.currentTarget;
3439
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
3440
+ return;
3441
+ }
3442
+ const { isThumbDrag, thumbDragOffset } = internalData;
3443
+ if (isThumbDrag) {
3444
+ const viewEl = $xeTree.$refs.refVirtualWrapper;
3445
+ if (!viewEl) {
3446
+ return;
3447
+ }
3448
+ const { yThumbHeight } = reactData;
3449
+ const thumbEl = evnt.currentTarget;
3450
+ const trackEl = thumbEl.parentElement;
3451
+ const trackRect = trackEl.getBoundingClientRect();
3452
+ // 更新偏移
3453
+ viewEl.scrollTop = getScrollFromDrag(evnt.clientY - trackRect.top, thumbDragOffset, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight);
3454
+ }
3455
+ },
3168
3456
  //
3169
3457
  // Render
3170
3458
  //
@@ -3505,13 +3793,14 @@ export default {
3505
3793
  const props = $xeTree;
3506
3794
  const slots = $xeTree.$scopedSlots;
3507
3795
  const reactData = $xeTree.reactData;
3508
- const { loading, trigger, showLine } = props;
3509
- const { bodyHeight, topSpaceHeight, treeList, tooltipStore } = reactData;
3796
+ const { loading, trigger, showLine, useScrollbar } = props;
3797
+ const { bodyHeight, topSpaceHeight, treeList, tooltipStore, xThumbWidth, yThumbHeight } = reactData;
3510
3798
  const vSize = $xeTree.computeSize;
3511
3799
  const radioOpts = $xeTree.computeRadioOpts;
3512
3800
  const checkboxOpts = $xeTree.computeCheckboxOpts;
3513
3801
  const loadingOpts = $xeTree.computeLoadingOpts;
3514
3802
  const isNodeHover = $xeTree.computeIsNodeHover;
3803
+ const wrapperStyles = $xeTree.computeWrapperStyles;
3515
3804
  const treeStyle = $xeTree.computeTreeStyle;
3516
3805
  const dragOpts = $xeTree.computeDragOpts;
3517
3806
  const tooltipOpts = $xeTree.computeTooltipOpts;
@@ -3519,21 +3808,43 @@ export default {
3519
3808
  const headerSlot = slots.header;
3520
3809
  const footerSlot = slots.footer;
3521
3810
  const tooltipSlot = slots.tooltip;
3811
+ const scrollbarOpts = $xeTree.computeScrollbarOpts;
3812
+ const scrollXVisible = $xeTree.computeScrollXVisible;
3813
+ const scrollYVisible = $xeTree.computeScrollYVisible;
3814
+ const scrollbarXToTop = $xeTree.computeScrollbarXToTop;
3815
+ const scrollbarYToLeft = $xeTree.computeScrollbarYToLeft;
3816
+ const scrollXAutoHide = $xeTree.computeScrollXAutoHide;
3817
+ const scrollYAutoHide = $xeTree.computeScrollYAutoHide;
3818
+ const scrollbarWrapperClss = $xeTree.computeScrollbarWrapperClss;
3522
3819
  const teOns = {};
3523
3820
  if (dragOpts.isCrossTreeDrag && !treeList.length) {
3524
3821
  teOns.dragover = $xeTree.handleCrossTreeNodeDragoverEmptyEvent;
3525
3822
  }
3526
3823
  return h('div', {
3527
3824
  ref: 'refElem',
3528
- class: ['vxe-tree', {
3825
+ class: [
3826
+ 'vxe-tree',
3827
+ useScrollbar ? `ov-x--${scrollXVisible === false ? 'hidden' : 'visible'}` : '',
3828
+ useScrollbar ? `ov-y--${scrollYVisible === false ? 'hidden' : 'visible'}` : '',
3829
+ useScrollbar ? `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}` : '',
3830
+ useScrollbar ? `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}` : '',
3831
+ {
3529
3832
  [`size--${vSize}`]: vSize,
3530
3833
  'show--line': showLine,
3834
+ 'is--virtual-scrollbar': useScrollbar,
3835
+ 'ov-padding': useScrollbar && scrollbarOpts.padding,
3836
+ 'ov-x--auto-hide': useScrollbar && scrollXAutoHide,
3837
+ 'ov-y--auto-hide': useScrollbar && scrollYAutoHide,
3838
+ 'overflow-y': yThumbHeight,
3839
+ 'overflow-x': xThumbWidth,
3531
3840
  'checkbox--highlight': checkboxOpts.highlight,
3532
3841
  'radio--highlight': radioOpts.highlight,
3533
3842
  'node--hover': isNodeHover,
3534
3843
  'node--trigger': trigger === 'node',
3535
3844
  'is--loading': loading
3536
- }],
3845
+ }
3846
+ ],
3847
+ style: wrapperStyles,
3537
3848
  on: teOns
3538
3849
  }, [
3539
3850
  headerSlot
@@ -3570,6 +3881,57 @@ export default {
3570
3881
  class: 'vxe-tree--footer-wrapper'
3571
3882
  }, footerSlot({ $tree: $xeTree }))
3572
3883
  : renderEmptyElement($xeTree),
3884
+ /**
3885
+ * 滚动条
3886
+ */
3887
+ useScrollbar
3888
+ ? h('div', {
3889
+ class: scrollbarWrapperClss
3890
+ }, [
3891
+ scrollXVisible === false
3892
+ ? renderEmptyElement($xeTree)
3893
+ : h('div', {
3894
+ ref: 'refTrackXElem',
3895
+ class: 'vxe-scrollbar--track-x',
3896
+ on: {
3897
+ click: $xeTree.clickTrackXEvent
3898
+ }
3899
+ }, [
3900
+ h('div', {
3901
+ ref: 'refThumbXElem',
3902
+ class: 'vxe-scrollbar--thumb-x',
3903
+ on: {
3904
+ pointerdown: $xeTree.pointerdownThumbXEvent,
3905
+ pointermove: $xeTree.pointermoveThumbXEvent,
3906
+ pointerup: $xeTree.cleatPointerThumbEvent,
3907
+ pointercancel: $xeTree.cleatPointerThumbEvent,
3908
+ lostpointercapture: $xeTree.cleatPointerThumbEvent
3909
+ }
3910
+ })
3911
+ ]),
3912
+ scrollYVisible === false
3913
+ ? renderEmptyElement($xeTree)
3914
+ : h('div', {
3915
+ ref: 'refTrackYElem',
3916
+ class: 'vxe-scrollbar--track-y',
3917
+ on: {
3918
+ click: $xeTree.clickTrackYEvent
3919
+ }
3920
+ }, [
3921
+ h('div', {
3922
+ ref: 'refThumbYElem',
3923
+ class: 'vxe-scrollbar--thumb-y',
3924
+ on: {
3925
+ pointerdown: $xeTree.pointerdownThumbYEvent,
3926
+ pointermove: $xeTree.pointermoveThumbYEvent,
3927
+ pointerup: $xeTree.cleatPointerThumbEvent,
3928
+ pointercancel: $xeTree.cleatPointerThumbEvent,
3929
+ lostpointercapture: $xeTree.cleatPointerThumbEvent
3930
+ }
3931
+ })
3932
+ ])
3933
+ ])
3934
+ : renderEmptyElement($xeTree),
3573
3935
  /**
3574
3936
  * 拖拽提示
3575
3937
  */
@@ -3659,19 +4021,45 @@ export default {
3659
4021
  },
3660
4022
  height() {
3661
4023
  const $xeTree = this;
3662
- $xeTree.hFlag++;
4024
+ $xeTree.reFlag++;
3663
4025
  },
3664
4026
  minHeight() {
3665
4027
  const $xeTree = this;
3666
- $xeTree.hFlag++;
4028
+ $xeTree.reFlag++;
3667
4029
  },
3668
4030
  maxHeight() {
3669
4031
  const $xeTree = this;
3670
- $xeTree.hFlag++;
4032
+ $xeTree.reFlag++;
4033
+ },
4034
+ useScrollbar() {
4035
+ const $xeTree = this;
4036
+ $xeTree.reFlag++;
4037
+ },
4038
+ computeScrollYWidth() {
4039
+ const $xeTree = this;
4040
+ $xeTree.reFlag++;
3671
4041
  },
3672
- hFlag() {
4042
+ computeScrollXHeight() {
3673
4043
  const $xeTree = this;
3674
- $xeTree.recalculate();
4044
+ $xeTree.reFlag++;
4045
+ },
4046
+ computeScrollXVisible() {
4047
+ const $xeTree = this;
4048
+ $xeTree.$nextTick(() => {
4049
+ $xeTree.reFlag++;
4050
+ });
4051
+ },
4052
+ computeScrollYVisible() {
4053
+ const $xeTree = this;
4054
+ $xeTree.$nextTick(() => {
4055
+ $xeTree.reFlag++;
4056
+ });
4057
+ },
4058
+ reFlag() {
4059
+ const $xeTree = this;
4060
+ $xeTree.recalculate().then(() => {
4061
+ $xeTree.recalculate();
4062
+ });
3675
4063
  }
3676
4064
  },
3677
4065
  created() {
@@ -3686,7 +4074,7 @@ export default {
3686
4074
  const $xeTree = this;
3687
4075
  const props = $xeTree;
3688
4076
  const internalData = $xeTree.internalData;
3689
- const { transform, drag, menuConfig, showOverflow, lazy, loadMethod } = props;
4077
+ const { transform, drag, menuConfig, showOverflow, lazy, loadMethod, autoResize, useScrollbar } = props;
3690
4078
  const dragOpts = $xeTree.computeDragOpts;
3691
4079
  if (!showOverflow) {
3692
4080
  errLog('vxe.error.errProp', ['show-overflow=false', 'show-overflow=true']);
@@ -3707,12 +4095,25 @@ export default {
3707
4095
  if (menuConfig && !VxeUIContextMenu) {
3708
4096
  errLog('vxe.error.reqComp', ['vxe-context-menu']);
3709
4097
  }
3710
- if (props.autoResize) {
3711
- const el = $xeTree.$refs.refElem;
4098
+ const el = $xeTree.$refs.refElem;
4099
+ if (useScrollbar) {
4100
+ const viewInnerEl = $xeTree.$refs.refVirtualBody;
4101
+ const scrollObserver = globalResize.create(() => {
4102
+ $xeTree.updateScrollbar();
4103
+ });
4104
+ if (el) {
4105
+ scrollObserver.observe(el);
4106
+ }
4107
+ if (viewInnerEl) {
4108
+ scrollObserver.observe(viewInnerEl);
4109
+ }
4110
+ internalData.scrollObserver = scrollObserver;
4111
+ }
4112
+ if (autoResize) {
3712
4113
  const parentEl = $xeTree.getParentElem();
3713
4114
  const resizeObserver = globalResize.create(() => {
3714
4115
  if (props.autoResize) {
3715
- $xeTree.recalculate();
4116
+ $xeTree.reFlag++;
3716
4117
  }
3717
4118
  });
3718
4119
  if (el) {
@@ -3723,17 +4124,22 @@ export default {
3723
4124
  }
3724
4125
  internalData.resizeObserver = resizeObserver;
3725
4126
  }
3726
- $xeTree.recalculate();
3727
- globalEvents.on($xeTree, 'resize', $xeTree.handleGlobalResizeEvent);
4127
+ $xeTree.reFlag++;
4128
+ globalEvents.on($xeTree, 'resize', () => {
4129
+ $xeTree.reFlag++;
4130
+ });
3728
4131
  },
3729
4132
  beforeDestroy() {
3730
4133
  const $xeTree = this;
3731
4134
  const reactData = $xeTree.reactData;
3732
4135
  const internalData = $xeTree.internalData;
3733
- const { resizeObserver } = internalData;
4136
+ const { scrollObserver, resizeObserver } = internalData;
3734
4137
  if (resizeObserver) {
3735
4138
  resizeObserver.disconnect();
3736
4139
  }
4140
+ if (scrollObserver) {
4141
+ scrollObserver.disconnect();
4142
+ }
3737
4143
  globalEvents.off($xeTree, 'resize');
3738
4144
  XEUtils.assign(reactData, createReactData());
3739
4145
  XEUtils.assign(internalData, createInternalData());