vxe-pc-ui 3.20.0 → 3.20.1

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 (91) hide show
  1. package/es/card/src/card.js +18 -3
  2. package/es/icon/style.css +1 -1
  3. package/es/language/fr-FR.js +29 -29
  4. package/es/layout-aside/src/layout-aside.js +8 -5
  5. package/es/layout-body/src/layout-body.js +22 -11
  6. package/es/list/src/list.js +86 -35
  7. package/es/list/style.css +25 -8
  8. package/es/list/style.min.css +1 -1
  9. package/es/scrollbar/src/scrollbar.js +69 -17
  10. package/es/style.css +1 -1
  11. package/es/style.min.css +1 -1
  12. package/es/tabs/src/tabs.js +19 -3
  13. package/es/tree/src/tree.js +439 -56
  14. package/es/tree/style.css +43 -0
  15. package/es/tree/style.min.css +1 -1
  16. package/es/ui/index.js +1 -1
  17. package/es/ui/src/log.js +1 -1
  18. package/es/ui/src/utils.js +3 -0
  19. package/es/vxe-list/style.css +25 -8
  20. package/es/vxe-list/style.min.css +1 -1
  21. package/es/vxe-tree/style.css +43 -0
  22. package/es/vxe-tree/style.min.css +1 -1
  23. package/lib/card/src/card.js +18 -3
  24. package/lib/card/src/card.min.js +1 -1
  25. package/lib/icon/style/style.css +1 -1
  26. package/lib/icon/style/style.min.css +1 -1
  27. package/lib/index.umd.js +640 -139
  28. package/lib/index.umd.min.js +1 -1
  29. package/lib/language/fr-FR.js +29 -29
  30. package/lib/language/fr-FR.min.js +1 -1
  31. package/lib/language/fr-FR.umd.js +29 -29
  32. package/lib/layout-aside/src/layout-aside.js +8 -8
  33. package/lib/layout-aside/src/layout-aside.min.js +1 -1
  34. package/lib/layout-body/src/layout-body.js +26 -19
  35. package/lib/layout-body/src/layout-body.min.js +1 -1
  36. package/lib/list/src/list.js +73 -32
  37. package/lib/list/src/list.min.js +1 -1
  38. package/lib/list/style/style.css +25 -8
  39. package/lib/list/style/style.min.css +1 -1
  40. package/lib/scrollbar/src/scrollbar.js +74 -15
  41. package/lib/scrollbar/src/scrollbar.min.js +1 -1
  42. package/lib/style.css +1 -1
  43. package/lib/style.min.css +1 -1
  44. package/lib/tabs/src/tabs.js +20 -7
  45. package/lib/tabs/src/tabs.min.js +1 -1
  46. package/lib/tree/src/tree.js +416 -53
  47. package/lib/tree/src/tree.min.js +1 -1
  48. package/lib/tree/style/style.css +43 -0
  49. package/lib/tree/style/style.min.css +1 -1
  50. package/lib/ui/index.js +1 -1
  51. package/lib/ui/index.min.js +1 -1
  52. package/lib/ui/src/log.js +1 -1
  53. package/lib/ui/src/log.min.js +1 -1
  54. package/lib/ui/src/utils.js +4 -0
  55. package/lib/ui/src/utils.min.js +1 -1
  56. package/lib/vxe-list/style/style.css +25 -8
  57. package/lib/vxe-list/style/style.min.css +1 -1
  58. package/lib/vxe-tree/style/style.css +43 -0
  59. package/lib/vxe-tree/style/style.min.css +1 -1
  60. package/package.json +1 -1
  61. package/packages/card/src/card.ts +19 -3
  62. package/packages/language/fr-FR.ts +903 -903
  63. package/packages/layout-aside/src/layout-aside.ts +8 -5
  64. package/packages/layout-body/src/layout-body.ts +26 -14
  65. package/packages/list/src/list.ts +97 -41
  66. package/packages/scrollbar/src/scrollbar.ts +79 -17
  67. package/packages/tabs/src/tabs.ts +20 -7
  68. package/packages/tree/src/tree.ts +482 -67
  69. package/packages/ui/src/utils.ts +4 -0
  70. package/styles/components/list.scss +35 -10
  71. package/styles/components/tree.scss +76 -0
  72. package/types/components/card.d.ts +10 -1
  73. package/types/components/layout-aside.d.ts +10 -1
  74. package/types/components/layout-body.d.ts +10 -1
  75. package/types/components/list.d.ts +10 -1
  76. package/types/components/scrollbar.d.ts +16 -2
  77. package/types/components/table.d.ts +47 -4
  78. package/types/components/tabs.d.ts +10 -1
  79. package/types/components/tree.d.ts +33 -2
  80. /package/es/icon/{iconfont.1791880407207.ttf → iconfont.1791950618327.ttf} +0 -0
  81. /package/es/icon/{iconfont.1791880407207.woff → iconfont.1791950618327.woff} +0 -0
  82. /package/es/icon/{iconfont.1791880407207.woff2 → iconfont.1791950618327.woff2} +0 -0
  83. /package/es/{iconfont.1791880407207.ttf → iconfont.1791950618327.ttf} +0 -0
  84. /package/es/{iconfont.1791880407207.woff → iconfont.1791950618327.woff} +0 -0
  85. /package/es/{iconfont.1791880407207.woff2 → iconfont.1791950618327.woff2} +0 -0
  86. /package/lib/icon/style/{iconfont.1791880407207.ttf → iconfont.1791950618327.ttf} +0 -0
  87. /package/lib/icon/style/{iconfont.1791880407207.woff → iconfont.1791950618327.woff} +0 -0
  88. /package/lib/icon/style/{iconfont.1791880407207.woff2 → iconfont.1791950618327.woff2} +0 -0
  89. /package/lib/{iconfont.1791880407207.ttf → iconfont.1791950618327.ttf} +0 -0
  90. /package/lib/{iconfont.1791880407207.woff → iconfont.1791950618327.woff} +0 -0
  91. /package/lib/{iconfont.1791880407207.woff2 → iconfont.1791950618327.woff2} +0 -0
@@ -1,18 +1,19 @@
1
1
  import { PropType, CreateElement, VNode } from 'vue'
2
2
  import { defineVxeComponent } from '../../ui/src/comp'
3
3
  import XEUtils from 'xe-utils'
4
- import { VxeUI, createEvent, globalEvents, globalResize, renderEmptyElement, globalMixins } from '../../ui'
4
+ import { VxeUI, domUtils, createEvent, globalEvents, globalResize, renderEmptyElement, globalMixins } from '../../ui'
5
5
  import { calcTreeLine, getItemCacheObj } from './util'
6
6
  import { createComponentLog } from '../../ui/src/log'
7
7
  import { getSlotVNs } from '../../ui/src/vn'
8
8
  import { crossTreeDragNodeGlobal, getCrossTreeDragNodeInfo } from './store'
9
9
  import { toCssUnit, isScale, getPaddingTopBottomSize, addClass, removeClass, getTpImg, hasControlKey, getEventTargetNode, hasClass } from '../../ui/src/dom'
10
- import { isEnableConf, enModelValue, deModelValue, getText } from '../../ui/src/utils'
10
+ import { isEnableConf, enModelValue, deModelValue, getText, getDefaultConfig } from '../../ui/src/utils'
11
11
  import { moveRowAnimateToTb, clearRowAnimate } from '../../ui/src/anime'
12
+ import { getThumbOffsetSize, getThumbSize, getScrollFromClick, getScrollFromDrag } from '../../scrollbar/src/util'
12
13
  import VxeLoadingComponent from '../../loading'
13
14
  import VxeTooltipComponent from '../../tooltip'
14
15
 
15
- import type { TreeReactData, VxeTreeEmits, VxeTreeConstructor, VxeTreePropTypes, TreeInternalData, VxeTreeDefines, VxeTreePrivateMethods, VxeComponentSizeType, ValueOf, VxeTooltipInstance } from '../../../types'
16
+ import type { TreeReactData, VxeTreeEmits, VxeTreeConstructor, VxeTreePropTypes, TreeInternalData, VxeTreeDefines, VxeTreePrivateMethods, VxeComponentSizeType, ValueOf, VxeTooltipInstance, VxeComponentStyleType, VxeScrollbarPropTypes } from '../../../types'
16
17
 
17
18
  const { warnLog, errLog } = createComponentLog('tree')
18
19
 
@@ -539,6 +540,37 @@ function insertTreeNode ($xeTree: VxeTreeConstructor, newRecords: any[], isAppen
539
540
  })
540
541
  }
541
542
 
543
+ function createReactData ():TreeReactData {
544
+ return {
545
+ parentHeight: 0,
546
+ customHeight: 0,
547
+ customMinHeight: 0,
548
+ customMaxHeight: 0,
549
+ currentNode: null,
550
+ scrollYLoad: false,
551
+ bodyHeight: 0,
552
+ topSpaceHeight: 0,
553
+ selectRadioKey: null,
554
+ treeList: [],
555
+ updateExpandedFlag: 1,
556
+ updateCheckboxFlag: 1,
557
+
558
+ // 滚动条
559
+ yThumbHeight: 0,
560
+ xThumbWidth: 0,
561
+
562
+ insertNodeFlag: 1,
563
+ removeNodeFlag: 1,
564
+ dragNode: null,
565
+ dragTipText: '',
566
+ isCrossDragNode: false,
567
+ tooltipStore: {
568
+ visible: false,
569
+ node: null
570
+ }
571
+ }
572
+ }
573
+
542
574
  function createInternalData (): TreeInternalData {
543
575
  return {
544
576
  // initialized: false,
@@ -552,8 +584,15 @@ function createInternalData (): TreeInternalData {
552
584
  treeExpandedMaps: {},
553
585
  treeExpandLazyLoadedMaps: {},
554
586
 
555
- lastScrollLeft: 0,
587
+ // 滚动条
588
+ // resizeObserver: undefined,
589
+ // isThumbDrag: false,
590
+ thumbDragOffset: 0,
591
+ yThumbTop: 0,
592
+ xThumbLeft: 0,
556
593
  lastScrollTop: 0,
594
+ lastScrollLeft: 0,
595
+
557
596
  scrollYStore: {
558
597
  startIndex: 0,
559
598
  endIndex: 0,
@@ -574,32 +613,6 @@ function createInternalData (): TreeInternalData {
574
613
  }
575
614
  }
576
615
 
577
- function createReactData ():TreeReactData {
578
- return {
579
- parentHeight: 0,
580
- customHeight: 0,
581
- customMinHeight: 0,
582
- customMaxHeight: 0,
583
- currentNode: null,
584
- scrollYLoad: false,
585
- bodyHeight: 0,
586
- topSpaceHeight: 0,
587
- selectRadioKey: null,
588
- treeList: [],
589
- updateExpandedFlag: 1,
590
- updateCheckboxFlag: 1,
591
- insertNodeFlag: 1,
592
- removeNodeFlag: 1,
593
- dragNode: null,
594
- dragTipText: '',
595
- isCrossDragNode: false,
596
- tooltipStore: {
597
- visible: false,
598
- node: null
599
- }
600
- }
601
- }
602
-
603
616
  export default /* define-vxe-component start */ defineVxeComponent({
604
617
  name: 'VxeTree',
605
618
  mixins: [
@@ -732,7 +745,12 @@ export default /* define-vxe-component start */ defineVxeComponent({
732
745
  type: String as PropType<VxeTreePropTypes.Size>,
733
746
  default: () => getConfig().tree.size || getConfig().size
734
747
  },
735
- virtualYConfig: Object as PropType<VxeTreePropTypes.VirtualYConfig>
748
+ virtualYConfig: Object as PropType<VxeTreePropTypes.VirtualYConfig>,
749
+ useScrollbar: {
750
+ type: Boolean as PropType<VxeTreePropTypes.UseScrollbar>,
751
+ default: () => getConfig().tree.useScrollbar
752
+ },
753
+ scrollbarConfig: Object as PropType<VxeTreePropTypes.ScrollbarConfig>
736
754
  },
737
755
  provide () {
738
756
  const $xeTree = this
@@ -751,7 +769,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
751
769
  reactData,
752
770
  crossTreeDragNodeInfo: crossTreeDragNodeGlobal,
753
771
 
754
- hFlag: 0,
772
+ reFlag: 0,
755
773
  dataFlag: 0
756
774
  }
757
775
  },
@@ -872,6 +890,21 @@ export default /* define-vxe-component start */ defineVxeComponent({
872
890
 
873
891
  return Object.assign({}, getConfig().tree.menuConfig, props.menuConfig)
874
892
  },
893
+ computeWrapperStyles () {
894
+ const $xeTree = this
895
+
896
+ const scrollbarOpts = $xeTree.computeScrollbarOpts
897
+ const scrollbarXOpts = $xeTree.computeScrollbarXOpts
898
+ const scrollbarYOpts = $xeTree.computeScrollbarYOpts
899
+ const barWidth = getDefaultConfig(getDefaultConfig(scrollbarYOpts.width, scrollbarOpts.width), getConfig().scrollbar.width)
900
+ const barHeight = getDefaultConfig(getDefaultConfig(scrollbarXOpts.height, scrollbarOpts.height), getConfig().scrollbar.height)
901
+ const stys: VxeComponentStyleType = {}
902
+ if (barWidth || barHeight) {
903
+ stys['--vxe-ui-scrollbar-y-width'] = toCssUnit(barWidth || barHeight)
904
+ stys['--vxe-ui-scrollbar-x-height'] = toCssUnit(barHeight || barWidth)
905
+ }
906
+ return stys
907
+ },
875
908
  computeTreeStyle () {
876
909
  const $xeTree = this
877
910
  const props = $xeTree
@@ -881,7 +914,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
881
914
  const { customHeight, customMinHeight, customMaxHeight } = reactData
882
915
  const checkboxOpts = $xeTree.computeCheckboxOpts
883
916
  const { nodeStyle } = checkboxOpts
884
- const stys: Record<string, string> = {}
917
+ const stys: VxeComponentStyleType = {}
885
918
  if (customHeight) {
886
919
  stys.height = toCssUnit(customHeight)
887
920
  }
@@ -910,6 +943,93 @@ export default /* define-vxe-component start */ defineVxeComponent({
910
943
  const props = $xeTree
911
944
 
912
945
  return Object.assign({}, getConfig().tree.filterConfig, props.filterConfig)
946
+ },
947
+ computeScrollbarOpts () {
948
+ const $xeTree = this
949
+ const props = $xeTree
950
+
951
+ return Object.assign({}, getConfig().tree.scrollbarConfig, props.scrollbarConfig)
952
+ },
953
+ computeScrollbarXOpts () {
954
+ const $xeTree = this
955
+
956
+ const scrollbarOpts = $xeTree.computeScrollbarOpts as VxeTreePropTypes.ScrollbarConfig
957
+ return Object.assign({}, getConfig().scrollbar.xConfig, scrollbarOpts.xConfig, {
958
+ visible: false
959
+ })
960
+ },
961
+ computeScrollbarYOpts () {
962
+ const $xeTree = this
963
+
964
+ const scrollbarOpts = $xeTree.computeScrollbarOpts as VxeTreePropTypes.ScrollbarConfig
965
+ return Object.assign({}, getConfig().scrollbar.yConfig, scrollbarOpts.yConfig)
966
+ },
967
+ computeScrollXVisible () {
968
+ const $xeTree = this
969
+
970
+ const scrollbarOpts = $xeTree.computeScrollbarOpts as VxeTreePropTypes.ScrollbarConfig
971
+ const scrollbarXOpts = $xeTree.computeScrollbarXOpts as VxeScrollbarPropTypes.XConfig
972
+ return getDefaultConfig(scrollbarXOpts.visible, scrollbarOpts.visible)
973
+ },
974
+ computeScrollYVisible () {
975
+ const $xeTree = this
976
+
977
+ const scrollbarOpts = $xeTree.computeScrollbarOpts as VxeTreePropTypes.ScrollbarConfig
978
+ const scrollbarYOpts = $xeTree.computeScrollbarYOpts as VxeScrollbarPropTypes.YConfig
979
+ return getDefaultConfig(scrollbarYOpts.visible, scrollbarOpts.visible)
980
+ },
981
+ computeScrollXAutoHide () {
982
+ const $xeTree = this
983
+
984
+ const scrollbarOpts = $xeTree.computeScrollbarOpts as VxeTreePropTypes.ScrollbarConfig
985
+ const scrollbarXOpts = $xeTree.computeScrollbarXOpts as VxeScrollbarPropTypes.XConfig
986
+ return getDefaultConfig(getDefaultConfig(scrollbarXOpts.autoHide, scrollbarOpts.autoHide), getConfig().scrollbar.autoHide)
987
+ },
988
+ computeScrollYAutoHide () {
989
+ const $xeTree = this
990
+
991
+ const scrollbarOpts = $xeTree.computeScrollbarOpts as VxeTreePropTypes.ScrollbarConfig
992
+ const scrollbarYOpts = $xeTree.computeScrollbarYOpts as VxeScrollbarPropTypes.YConfig
993
+ return getDefaultConfig(getDefaultConfig(scrollbarYOpts.autoHide, scrollbarOpts.autoHide), getConfig().scrollbar.autoHide)
994
+ },
995
+ computeScrollbarWrapperClss () {
996
+ const $xeTree = this
997
+ const reactData = ($xeTree as any).reactData
998
+
999
+ const scrollbarOpts = $xeTree.computeScrollbarOpts as VxeTreePropTypes.ScrollbarConfig
1000
+ const { padding } = scrollbarOpts
1001
+ const { yThumbHeight, xThumbWidth } = reactData
1002
+ const scrollbarXToTop = $xeTree.computeScrollbarXToTop
1003
+ const scrollbarYToLeft = $xeTree.computeScrollbarYToLeft
1004
+ const scrollXVisible = $xeTree.computeScrollXVisible
1005
+ const scrollYVisible = $xeTree.computeScrollYVisible
1006
+ const scrollXAutoHide = $xeTree.computeScrollXAutoHide as boolean
1007
+ const scrollYAutoHide = $xeTree.computeScrollYAutoHide as boolean
1008
+ return domUtils.buildClass([
1009
+ 'vxe-scrollbar is--virtual',
1010
+ `ov-x--${scrollXVisible === false ? 'hidden' : 'visible'}`,
1011
+ `ov-y--${scrollYVisible === false ? 'hidden' : 'visible'}`,
1012
+ `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`,
1013
+ `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`
1014
+ ], {
1015
+ 'is--padding': padding,
1016
+ 'ov-x--auto-hide': scrollXAutoHide,
1017
+ 'ov-y--auto-hide': scrollYAutoHide,
1018
+ 'overflow-y': yThumbHeight,
1019
+ 'overflow-x': xThumbWidth
1020
+ })
1021
+ },
1022
+ computeScrollbarXToTop () {
1023
+ const $xeTree = this
1024
+
1025
+ const scrollbarXOpts = $xeTree.computeScrollbarXOpts as VxeScrollbarPropTypes.XConfig
1026
+ return scrollbarXOpts.position === 'top'
1027
+ },
1028
+ computeScrollbarYToLeft () {
1029
+ const $xeTree = this
1030
+
1031
+ const scrollbarYOpts = $xeTree.computeScrollbarYOpts as VxeScrollbarPropTypes.YConfig
1032
+ return scrollbarYOpts.position === 'left'
913
1033
  }
914
1034
  },
915
1035
  methods: {
@@ -1562,6 +1682,12 @@ export default /* define-vxe-component start */ defineVxeComponent({
1562
1682
  }
1563
1683
  })
1564
1684
  },
1685
+ updateScrollbar () {
1686
+ const $xeTree = this
1687
+
1688
+ $xeTree.updateThumbSize()
1689
+ $xeTree.updateThumbOffset()
1690
+ },
1565
1691
  /**
1566
1692
  * 重新计算列表
1567
1693
  */
@@ -1587,6 +1713,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
1587
1713
  const parentPaddingSize = getPaddingTopBottomSize(parentEl)
1588
1714
  reactData.parentHeight = Math.max(headHeight + footHeight + rowHeight, parentEl.clientHeight - parentPaddingSize - headHeight - footHeight)
1589
1715
  }
1716
+ $xeTree.updateScrollbar()
1590
1717
  $xeTree.updateHeight()
1591
1718
  return $xeTree.computeScrollLoad().then(() => {
1592
1719
  $xeTree.updateHeight()
@@ -1634,6 +1761,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
1634
1761
  const scrollLeft = scrollBodyElem.scrollLeft
1635
1762
  const isX = scrollLeft !== internalData.lastScrollLeft
1636
1763
  const isY = scrollTop !== internalData.lastScrollTop
1764
+ $xeTree.updateThumbOffset()
1637
1765
  internalData.lastScrollTop = scrollTop
1638
1766
  internalData.lastScrollLeft = scrollLeft
1639
1767
  if (reactData.scrollYLoad) {
@@ -2521,15 +2649,6 @@ export default /* define-vxe-component start */ defineVxeComponent({
2521
2649
  $xeTree.emitRadioMode(value)
2522
2650
  $xeTree.dispatchEvent('radio-change', { node, value, checked: isChecked }, evnt)
2523
2651
  },
2524
- handleGlobalResizeEvent () {
2525
- const $xeTree = this
2526
-
2527
- const el = $xeTree.$refs.refElem as HTMLDivElement
2528
- if (!el || !el.clientWidth) {
2529
- return
2530
- }
2531
- $xeTree.recalculate()
2532
- },
2533
2652
  reloadData (data: any[]) {
2534
2653
  const $xeTree = this
2535
2654
 
@@ -3325,6 +3444,201 @@ export default /* define-vxe-component start */ defineVxeComponent({
3325
3444
  }
3326
3445
  },
3327
3446
 
3447
+ // 滚动条
3448
+ updateThumbSize () {
3449
+ const $xeTree = this
3450
+ const reactData = $xeTree.reactData
3451
+
3452
+ const viewEl = $xeTree.$refs.refVirtualWrapper as HTMLDivElement
3453
+ if (!viewEl) {
3454
+ return
3455
+ }
3456
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
3457
+ return
3458
+ }
3459
+ const trackXEl = $xeTree.$refs.refTrackXElem as HTMLDivElement
3460
+ const xThumbWidth = trackXEl ? getThumbSize(viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth) : 0
3461
+ const thumbXElem = $xeTree.$refs.refThumbXElem as HTMLDivElement
3462
+ if (thumbXElem) {
3463
+ thumbXElem.style.width = xThumbWidth + 'px'
3464
+ }
3465
+ reactData.xThumbWidth = xThumbWidth
3466
+
3467
+ const trackYEl = $xeTree.$refs.refTrackYElem as HTMLDivElement
3468
+
3469
+ const yThumbHeight = trackYEl ? getThumbSize(viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight) : 0
3470
+ const thumbYElem = $xeTree.$refs.refThumbYElem as HTMLDivElement
3471
+ if (thumbYElem) {
3472
+ thumbYElem.style.height = yThumbHeight + 'px'
3473
+ }
3474
+ reactData.yThumbHeight = yThumbHeight
3475
+ },
3476
+ updateThumbOffset () {
3477
+ const $xeTree = this
3478
+ const reactData = $xeTree.reactData
3479
+ const internalData = $xeTree.internalData
3480
+
3481
+ const viewEl = $xeTree.$refs.refVirtualWrapper as HTMLDivElement
3482
+ if (!viewEl) {
3483
+ return
3484
+ }
3485
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
3486
+ return
3487
+ }
3488
+ const { xThumbWidth, yThumbHeight } = reactData
3489
+ const trackXEl = $xeTree.$refs.refTrackXElem as HTMLDivElement
3490
+ const thumbXElem = $xeTree.$refs.refThumbXElem as HTMLDivElement
3491
+ const xThumbLeft = trackXEl && xThumbWidth ? getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth, xThumbWidth) : 0
3492
+ internalData.xThumbLeft = xThumbLeft
3493
+ if (thumbXElem && xThumbWidth) {
3494
+ thumbXElem.style.width = xThumbWidth + 'px'
3495
+ thumbXElem.style.transform = `translateX(${xThumbLeft}px)`
3496
+ }
3497
+
3498
+ const trackYEl = $xeTree.$refs.refTrackYElem as HTMLDivElement
3499
+ const thumbYElem = $xeTree.$refs.refThumbYElem as HTMLDivElement
3500
+ const yThumbTop = trackYEl && yThumbHeight ? getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight, yThumbHeight) : 0
3501
+ internalData.yThumbTop = yThumbTop
3502
+ if (thumbYElem && yThumbHeight) {
3503
+ thumbYElem.style.height = yThumbHeight + 'px'
3504
+ thumbYElem.style.transform = `translateY(${yThumbTop}px)`
3505
+ }
3506
+ },
3507
+ clickTrackXEvent (evnt: MouseEvent) {
3508
+ const $xeTree = this
3509
+ const reactData = $xeTree.reactData
3510
+
3511
+ const trackEl = evnt.currentTarget as HTMLDivElement
3512
+ if (trackEl !== evnt.target) {
3513
+ return
3514
+ }
3515
+ const viewEl = $xeTree.$refs.refVirtualWrapper as HTMLDivElement
3516
+ if (!viewEl) {
3517
+ return
3518
+ }
3519
+ const { xThumbWidth } = reactData
3520
+ const trackRect = trackEl.getBoundingClientRect()
3521
+ viewEl.scrollTo({
3522
+ left: getScrollFromClick(evnt.clientX - trackRect.left, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth),
3523
+ behavior: 'auto'
3524
+ })
3525
+ },
3526
+ clickTrackYEvent (evnt: MouseEvent) {
3527
+ const $xeTree = this
3528
+ const reactData = $xeTree.reactData
3529
+
3530
+ const trackEl = evnt.currentTarget as HTMLDivElement
3531
+ if (trackEl !== evnt.target) {
3532
+ return
3533
+ }
3534
+ const viewEl = $xeTree.$refs.refVirtualWrapper as HTMLDivElement
3535
+ if (!viewEl) {
3536
+ return
3537
+ }
3538
+ const { yThumbHeight } = reactData
3539
+ const trackRect = trackEl.getBoundingClientRect()
3540
+ viewEl.scrollTo({
3541
+ top: getScrollFromClick(evnt.clientY - trackRect.top, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight),
3542
+ behavior: 'auto'
3543
+ })
3544
+ },
3545
+ pointerdownThumbXEvent (evnt: PointerEvent) {
3546
+ const $xeTree = this
3547
+ const reactData = $xeTree.reactData
3548
+ const internalData = $xeTree.internalData
3549
+
3550
+ const thumbEl = evnt.currentTarget as HTMLDivElement
3551
+ internalData.isThumbDrag = true
3552
+ thumbEl.setPointerCapture(evnt.pointerId)
3553
+
3554
+ const viewEl = $xeTree.$refs.refVirtualWrapper as HTMLDivElement
3555
+ if (!viewEl) {
3556
+ return
3557
+ }
3558
+ const { xThumbWidth } = reactData
3559
+ const trackEl = thumbEl.parentElement as HTMLDivElement
3560
+ const trackRect = trackEl.getBoundingClientRect()
3561
+ const pointerPosition = evnt.clientX - trackRect.left
3562
+ // 记录 thumb 的偏移
3563
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth)
3564
+ internalData.thumbDragOffset = pointerPosition - thumbOffset
3565
+ },
3566
+ pointermoveThumbXEvent (evnt: PointerEvent) {
3567
+ const $xeTree = this
3568
+ const reactData = $xeTree.reactData
3569
+ const internalData = $xeTree.internalData
3570
+
3571
+ const thumbEl = evnt.currentTarget as HTMLDivElement
3572
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
3573
+ return
3574
+ }
3575
+ const { isThumbDrag, thumbDragOffset } = internalData
3576
+ if (isThumbDrag) {
3577
+ const viewEl = $xeTree.$refs.refVirtualWrapper as HTMLDivElement
3578
+ if (!viewEl) {
3579
+ return
3580
+ }
3581
+ const { xThumbWidth } = reactData
3582
+ const thumbEl = evnt.currentTarget as HTMLDivElement
3583
+ const trackEl = thumbEl.parentElement as HTMLDivElement
3584
+ const trackRect = trackEl.getBoundingClientRect()
3585
+ // 更新偏移
3586
+ viewEl.scrollLeft = getScrollFromDrag(evnt.clientX - trackRect.left, thumbDragOffset, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth)
3587
+ }
3588
+ },
3589
+ cleatPointerThumbEvent (evnt: PointerEvent) {
3590
+ const $xeTree = this
3591
+ const internalData = $xeTree.internalData
3592
+
3593
+ const thumbEl = evnt.currentTarget as HTMLDivElement
3594
+ thumbEl.releasePointerCapture(evnt.pointerId)
3595
+ internalData.isThumbDrag = false
3596
+ },
3597
+ pointerdownThumbYEvent (evnt: PointerEvent) {
3598
+ const $xeTree = this
3599
+ const reactData = $xeTree.reactData
3600
+ const internalData = $xeTree.internalData
3601
+
3602
+ const thumbEl = evnt.currentTarget as HTMLDivElement
3603
+ internalData.isThumbDrag = true
3604
+ thumbEl.setPointerCapture(evnt.pointerId)
3605
+
3606
+ const viewEl = $xeTree.$refs.refVirtualWrapper as HTMLDivElement
3607
+ if (!viewEl) {
3608
+ return
3609
+ }
3610
+ const { yThumbHeight } = reactData
3611
+ const trackEl = thumbEl.parentElement as HTMLDivElement
3612
+ const trackRect = trackEl.getBoundingClientRect()
3613
+ const pointerPosition = evnt.clientY - trackRect.top
3614
+ // 记录 thumb 的偏移
3615
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight)
3616
+ internalData.thumbDragOffset = pointerPosition - thumbOffset
3617
+ },
3618
+ pointermoveThumbYEvent (evnt: PointerEvent) {
3619
+ const $xeTree = this
3620
+ const reactData = $xeTree.reactData
3621
+ const internalData = $xeTree.internalData
3622
+
3623
+ const thumbEl = evnt.currentTarget as HTMLDivElement
3624
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
3625
+ return
3626
+ }
3627
+ const { isThumbDrag, thumbDragOffset } = internalData
3628
+ if (isThumbDrag) {
3629
+ const viewEl = $xeTree.$refs.refVirtualWrapper as HTMLDivElement
3630
+ if (!viewEl) {
3631
+ return
3632
+ }
3633
+ const { yThumbHeight } = reactData
3634
+ const thumbEl = evnt.currentTarget as HTMLDivElement
3635
+ const trackEl = thumbEl.parentElement as HTMLDivElement
3636
+ const trackRect = trackEl.getBoundingClientRect()
3637
+ // 更新偏移
3638
+ viewEl.scrollTop = getScrollFromDrag(evnt.clientY - trackRect.top, thumbDragOffset, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight)
3639
+ }
3640
+ },
3641
+
3328
3642
  //
3329
3643
  // Render
3330
3644
  //
@@ -3690,13 +4004,14 @@ export default /* define-vxe-component start */ defineVxeComponent({
3690
4004
  const slots = $xeTree.$scopedSlots
3691
4005
  const reactData = $xeTree.reactData
3692
4006
 
3693
- const { loading, trigger, showLine } = props
3694
- const { bodyHeight, topSpaceHeight, treeList, tooltipStore } = reactData
4007
+ const { loading, trigger, showLine, useScrollbar } = props
4008
+ const { bodyHeight, topSpaceHeight, treeList, tooltipStore, xThumbWidth, yThumbHeight } = reactData
3695
4009
  const vSize = $xeTree.computeSize
3696
4010
  const radioOpts = $xeTree.computeRadioOpts
3697
4011
  const checkboxOpts = $xeTree.computeCheckboxOpts
3698
4012
  const loadingOpts = $xeTree.computeLoadingOpts
3699
4013
  const isNodeHover = $xeTree.computeIsNodeHover
4014
+ const wrapperStyles = $xeTree.computeWrapperStyles
3700
4015
  const treeStyle = $xeTree.computeTreeStyle
3701
4016
  const dragOpts = $xeTree.computeDragOpts
3702
4017
  const tooltipOpts = $xeTree.computeTooltipOpts
@@ -3704,6 +4019,14 @@ export default /* define-vxe-component start */ defineVxeComponent({
3704
4019
  const headerSlot = slots.header
3705
4020
  const footerSlot = slots.footer
3706
4021
  const tooltipSlot = slots.tooltip
4022
+ const scrollbarOpts = $xeTree.computeScrollbarOpts
4023
+ const scrollXVisible = $xeTree.computeScrollXVisible
4024
+ const scrollYVisible = $xeTree.computeScrollYVisible
4025
+ const scrollbarXToTop = $xeTree.computeScrollbarXToTop
4026
+ const scrollbarYToLeft = $xeTree.computeScrollbarYToLeft
4027
+ const scrollXAutoHide = $xeTree.computeScrollXAutoHide
4028
+ const scrollYAutoHide = $xeTree.computeScrollYAutoHide
4029
+ const scrollbarWrapperClss = $xeTree.computeScrollbarWrapperClss
3707
4030
 
3708
4031
  const teOns: {
3709
4032
  dragover?: (...args: any[]) => void
@@ -3714,15 +4037,29 @@ export default /* define-vxe-component start */ defineVxeComponent({
3714
4037
 
3715
4038
  return h('div', {
3716
4039
  ref: 'refElem',
3717
- class: ['vxe-tree', {
3718
- [`size--${vSize}`]: vSize,
3719
- 'show--line': showLine,
3720
- 'checkbox--highlight': checkboxOpts.highlight,
3721
- 'radio--highlight': radioOpts.highlight,
3722
- 'node--hover': isNodeHover,
3723
- 'node--trigger': trigger === 'node',
3724
- 'is--loading': loading
3725
- }],
4040
+ class: [
4041
+ 'vxe-tree',
4042
+ useScrollbar ? `ov-x--${scrollXVisible === false ? 'hidden' : 'visible'}` : '',
4043
+ useScrollbar ? `ov-y--${scrollYVisible === false ? 'hidden' : 'visible'}` : '',
4044
+ useScrollbar ? `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}` : '',
4045
+ useScrollbar ? `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}` : '',
4046
+ {
4047
+ [`size--${vSize}`]: vSize,
4048
+ 'show--line': showLine,
4049
+ 'is--virtual-scrollbar': useScrollbar,
4050
+ 'ov-padding': useScrollbar && scrollbarOpts.padding,
4051
+ 'ov-x--auto-hide': useScrollbar && scrollXAutoHide,
4052
+ 'ov-y--auto-hide': useScrollbar && scrollYAutoHide,
4053
+ 'overflow-y': yThumbHeight,
4054
+ 'overflow-x': xThumbWidth,
4055
+ 'checkbox--highlight': checkboxOpts.highlight,
4056
+ 'radio--highlight': radioOpts.highlight,
4057
+ 'node--hover': isNodeHover,
4058
+ 'node--trigger': trigger === 'node',
4059
+ 'is--loading': loading
4060
+ }
4061
+ ],
4062
+ style: wrapperStyles,
3726
4063
  on: teOns
3727
4064
  }, [
3728
4065
  headerSlot
@@ -3759,6 +4096,57 @@ export default /* define-vxe-component start */ defineVxeComponent({
3759
4096
  class: 'vxe-tree--footer-wrapper'
3760
4097
  }, footerSlot({ $tree: $xeTree }))
3761
4098
  : renderEmptyElement($xeTree),
4099
+ /**
4100
+ * 滚动条
4101
+ */
4102
+ useScrollbar
4103
+ ? h('div', {
4104
+ class: scrollbarWrapperClss
4105
+ }, [
4106
+ scrollXVisible === false
4107
+ ? renderEmptyElement($xeTree)
4108
+ : h('div', {
4109
+ ref: 'refTrackXElem',
4110
+ class: 'vxe-scrollbar--track-x',
4111
+ on: {
4112
+ click: $xeTree.clickTrackXEvent
4113
+ }
4114
+ }, [
4115
+ h('div', {
4116
+ ref: 'refThumbXElem',
4117
+ class: 'vxe-scrollbar--thumb-x',
4118
+ on: {
4119
+ pointerdown: $xeTree.pointerdownThumbXEvent,
4120
+ pointermove: $xeTree.pointermoveThumbXEvent,
4121
+ pointerup: $xeTree.cleatPointerThumbEvent,
4122
+ pointercancel: $xeTree.cleatPointerThumbEvent,
4123
+ lostpointercapture: $xeTree.cleatPointerThumbEvent
4124
+ }
4125
+ })
4126
+ ]),
4127
+ scrollYVisible === false
4128
+ ? renderEmptyElement($xeTree)
4129
+ : h('div', {
4130
+ ref: 'refTrackYElem',
4131
+ class: 'vxe-scrollbar--track-y',
4132
+ on: {
4133
+ click: $xeTree.clickTrackYEvent
4134
+ }
4135
+ }, [
4136
+ h('div', {
4137
+ ref: 'refThumbYElem',
4138
+ class: 'vxe-scrollbar--thumb-y',
4139
+ on: {
4140
+ pointerdown: $xeTree.pointerdownThumbYEvent,
4141
+ pointermove: $xeTree.pointermoveThumbYEvent,
4142
+ pointerup: $xeTree.cleatPointerThumbEvent,
4143
+ pointercancel: $xeTree.cleatPointerThumbEvent,
4144
+ lostpointercapture: $xeTree.cleatPointerThumbEvent
4145
+ }
4146
+ })
4147
+ ])
4148
+ ])
4149
+ : renderEmptyElement($xeTree),
3762
4150
  /**
3763
4151
  * 拖拽提示
3764
4152
  */
@@ -3857,22 +4245,43 @@ export default /* define-vxe-component start */ defineVxeComponent({
3857
4245
  height () {
3858
4246
  const $xeTree = this
3859
4247
 
3860
- $xeTree.hFlag++
4248
+ $xeTree.reFlag++
3861
4249
  },
3862
4250
  minHeight () {
3863
4251
  const $xeTree = this
3864
4252
 
3865
- $xeTree.hFlag++
4253
+ $xeTree.reFlag++
3866
4254
  },
3867
4255
  maxHeight () {
3868
4256
  const $xeTree = this
3869
4257
 
3870
- $xeTree.hFlag++
4258
+ $xeTree.reFlag++
4259
+ },
4260
+ useScrollbar () {
4261
+ const $xeTree = this
4262
+
4263
+ $xeTree.reFlag++
3871
4264
  },
3872
- hFlag () {
4265
+ computeScrollXVisible () {
3873
4266
  const $xeTree = this
3874
4267
 
3875
- $xeTree.recalculate()
4268
+ $xeTree.$nextTick(() => {
4269
+ $xeTree.reFlag++
4270
+ })
4271
+ },
4272
+ computeScrollYVisible () {
4273
+ const $xeTree = this
4274
+
4275
+ $xeTree.$nextTick(() => {
4276
+ $xeTree.reFlag++
4277
+ })
4278
+ },
4279
+ reFlag () {
4280
+ const $xeTree = this
4281
+
4282
+ $xeTree.recalculate().then(() => {
4283
+ $xeTree.recalculate()
4284
+ })
3876
4285
  }
3877
4286
  },
3878
4287
  created () {
@@ -3890,7 +4299,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
3890
4299
  const props = $xeTree
3891
4300
  const internalData = $xeTree.internalData
3892
4301
 
3893
- const { transform, drag, menuConfig, showOverflow, lazy, loadMethod } = props
4302
+ const { transform, drag, menuConfig, showOverflow, lazy, loadMethod, autoResize, useScrollbar } = props
3894
4303
  const dragOpts = $xeTree.computeDragOpts
3895
4304
  if (!showOverflow) {
3896
4305
  errLog('vxe.error.errProp', ['show-overflow=false', 'show-overflow=true'])
@@ -3911,25 +4320,31 @@ export default /* define-vxe-component start */ defineVxeComponent({
3911
4320
  if (menuConfig && !VxeUIContextMenu) {
3912
4321
  errLog('vxe.error.reqComp', ['vxe-context-menu'])
3913
4322
  }
3914
- if (props.autoResize) {
4323
+ if (useScrollbar || autoResize) {
3915
4324
  const el = $xeTree.$refs.refElem as HTMLDivElement
4325
+ const viewInnerEl = $xeTree.$refs.refVirtualBody as HTMLDivElement
3916
4326
  const parentEl = $xeTree.getParentElem()
3917
4327
  const resizeObserver = globalResize.create(() => {
3918
- if (props.autoResize) {
3919
- $xeTree.recalculate()
3920
- }
4328
+ $xeTree.reFlag++
3921
4329
  })
3922
4330
  if (el) {
3923
4331
  resizeObserver.observe(el)
4332
+ if (autoResize) {
4333
+ if (parentEl) {
4334
+ resizeObserver.observe(parentEl)
4335
+ }
4336
+ }
3924
4337
  }
3925
- if (parentEl) {
3926
- resizeObserver.observe(parentEl)
4338
+ if (viewInnerEl) {
4339
+ resizeObserver.observe(viewInnerEl)
3927
4340
  }
3928
4341
  internalData.resizeObserver = resizeObserver
3929
4342
  }
3930
4343
 
3931
- $xeTree.recalculate()
3932
- globalEvents.on($xeTree, 'resize', $xeTree.handleGlobalResizeEvent)
4344
+ $xeTree.reFlag++
4345
+ globalEvents.on($xeTree, 'resize', () => {
4346
+ $xeTree.reFlag++
4347
+ })
3933
4348
  },
3934
4349
  beforeDestroy () {
3935
4350
  const $xeTree = this