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,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,17 @@ function createInternalData (): TreeInternalData {
552
584
  treeExpandedMaps: {},
553
585
  treeExpandLazyLoadedMaps: {},
554
586
 
555
- lastScrollLeft: 0,
587
+ // resizeObserver: undefined,
588
+
589
+ // 滚动条
590
+ // scrollObserver: undefined,
591
+ // isThumbDrag: false,
592
+ thumbDragOffset: 0,
593
+ yThumbTop: 0,
594
+ xThumbLeft: 0,
556
595
  lastScrollTop: 0,
596
+ lastScrollLeft: 0,
597
+
557
598
  scrollYStore: {
558
599
  startIndex: 0,
559
600
  endIndex: 0,
@@ -574,32 +615,6 @@ function createInternalData (): TreeInternalData {
574
615
  }
575
616
  }
576
617
 
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
618
  export default /* define-vxe-component start */ defineVxeComponent({
604
619
  name: 'VxeTree',
605
620
  mixins: [
@@ -732,7 +747,12 @@ export default /* define-vxe-component start */ defineVxeComponent({
732
747
  type: String as PropType<VxeTreePropTypes.Size>,
733
748
  default: () => getConfig().tree.size || getConfig().size
734
749
  },
735
- virtualYConfig: Object as PropType<VxeTreePropTypes.VirtualYConfig>
750
+ virtualYConfig: Object as PropType<VxeTreePropTypes.VirtualYConfig>,
751
+ useScrollbar: {
752
+ type: Boolean as PropType<VxeTreePropTypes.UseScrollbar>,
753
+ default: () => getDefaultConfig(getConfig().tree.useScrollbar, getConfig().useScrollbar)
754
+ },
755
+ scrollbarConfig: Object as PropType<VxeTreePropTypes.ScrollbarConfig>
736
756
  },
737
757
  provide () {
738
758
  const $xeTree = this
@@ -751,7 +771,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
751
771
  reactData,
752
772
  crossTreeDragNodeInfo: crossTreeDragNodeGlobal,
753
773
 
754
- hFlag: 0,
774
+ reFlag: 0,
755
775
  dataFlag: 0
756
776
  }
757
777
  },
@@ -872,6 +892,18 @@ export default /* define-vxe-component start */ defineVxeComponent({
872
892
 
873
893
  return Object.assign({}, getConfig().tree.menuConfig, props.menuConfig)
874
894
  },
895
+ computeWrapperStyles () {
896
+ const $xeTree = this
897
+
898
+ const barWidth = $xeTree.computeScrollYWidth
899
+ const barHeight = $xeTree.computeScrollXHeight
900
+ const stys: VxeComponentStyleType = {}
901
+ if (barWidth || barHeight) {
902
+ stys['--vxe-ui-scrollbar-y-width'] = toCssUnit(barWidth || barHeight)
903
+ stys['--vxe-ui-scrollbar-x-height'] = toCssUnit(barHeight || barWidth)
904
+ }
905
+ return stys
906
+ },
875
907
  computeTreeStyle () {
876
908
  const $xeTree = this
877
909
  const props = $xeTree
@@ -881,7 +913,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
881
913
  const { customHeight, customMinHeight, customMaxHeight } = reactData
882
914
  const checkboxOpts = $xeTree.computeCheckboxOpts
883
915
  const { nodeStyle } = checkboxOpts
884
- const stys: Record<string, string> = {}
916
+ const stys: VxeComponentStyleType = {}
885
917
  if (customHeight) {
886
918
  stys.height = toCssUnit(customHeight)
887
919
  }
@@ -910,6 +942,100 @@ export default /* define-vxe-component start */ defineVxeComponent({
910
942
  const props = $xeTree
911
943
 
912
944
  return Object.assign({}, getConfig().tree.filterConfig, props.filterConfig)
945
+ },
946
+ computeScrollbarOpts () {
947
+ const $xeTree = this
948
+ const props = $xeTree
949
+
950
+ return Object.assign({}, getConfig().tree.scrollbarConfig, props.scrollbarConfig)
951
+ },
952
+ computeScrollbarXOpts () {
953
+ const $xeTree = this
954
+
955
+ const scrollbarOpts = $xeTree.computeScrollbarOpts as VxeTreePropTypes.ScrollbarConfig
956
+ return Object.assign({}, getConfig().scrollbar.xConfig, scrollbarOpts.xConfig, {
957
+ visible: false
958
+ })
959
+ },
960
+ computeScrollbarYOpts () {
961
+ const $xeTree = this
962
+
963
+ const scrollbarOpts = $xeTree.computeScrollbarOpts as VxeTreePropTypes.ScrollbarConfig
964
+ return Object.assign({}, getConfig().scrollbar.yConfig, scrollbarOpts.yConfig)
965
+ },
966
+ computeScrollXHeight () {
967
+ const $xeTree = this
968
+
969
+ const scrollbarOpts = $xeTree.computeScrollbarOpts as VxeTreePropTypes.ScrollbarConfig
970
+ const scrollbarXOpts = $xeTree.computeScrollbarXOpts as VxeScrollbarPropTypes.XConfig
971
+ return getDefaultConfig(getDefaultConfig(scrollbarXOpts.height, scrollbarOpts.height), getConfig().scrollbar.height)
972
+ },
973
+ computeScrollYWidth () {
974
+ const $xeTree = this
975
+
976
+ const scrollbarOpts = $xeTree.computeScrollbarOpts as VxeTreePropTypes.ScrollbarConfig
977
+ const scrollbarYOpts = $xeTree.computeScrollbarYOpts as VxeScrollbarPropTypes.YConfig
978
+ return getDefaultConfig(getDefaultConfig(scrollbarYOpts.width, scrollbarOpts.width), getConfig().scrollbar.width)
979
+ },
980
+ computeScrollXVisible () {
981
+ const $xeTree = this
982
+
983
+ const scrollbarOpts = $xeTree.computeScrollbarOpts as VxeTreePropTypes.ScrollbarConfig
984
+ const scrollbarXOpts = $xeTree.computeScrollbarXOpts as VxeScrollbarPropTypes.XConfig
985
+ return getDefaultConfig(scrollbarXOpts.visible, scrollbarOpts.visible)
986
+ },
987
+ computeScrollYVisible () {
988
+ const $xeTree = this
989
+
990
+ const scrollbarOpts = $xeTree.computeScrollbarOpts as VxeTreePropTypes.ScrollbarConfig
991
+ const scrollbarYOpts = $xeTree.computeScrollbarYOpts as VxeScrollbarPropTypes.YConfig
992
+ return getDefaultConfig(scrollbarYOpts.visible, scrollbarOpts.visible)
993
+ },
994
+ computeScrollXAutoHide () {
995
+ const $xeTree = this
996
+
997
+ const scrollbarOpts = $xeTree.computeScrollbarOpts as VxeTreePropTypes.ScrollbarConfig
998
+ const scrollbarXOpts = $xeTree.computeScrollbarXOpts as VxeScrollbarPropTypes.XConfig
999
+ return getDefaultConfig(getDefaultConfig(scrollbarXOpts.autoHide, scrollbarOpts.autoHide), getConfig().scrollbar.autoHide)
1000
+ },
1001
+ computeScrollYAutoHide () {
1002
+ const $xeTree = this
1003
+
1004
+ const scrollbarOpts = $xeTree.computeScrollbarOpts as VxeTreePropTypes.ScrollbarConfig
1005
+ const scrollbarYOpts = $xeTree.computeScrollbarYOpts as VxeScrollbarPropTypes.YConfig
1006
+ return getDefaultConfig(getDefaultConfig(scrollbarYOpts.autoHide, scrollbarOpts.autoHide), getConfig().scrollbar.autoHide)
1007
+ },
1008
+ computeScrollbarWrapperClss () {
1009
+ const $xeTree = this
1010
+ const reactData = ($xeTree as any).reactData as TreeReactData
1011
+
1012
+ const { yThumbHeight, xThumbWidth } = reactData
1013
+ const scrollbarXToTop = $xeTree.computeScrollbarXToTop
1014
+ const scrollbarYToLeft = $xeTree.computeScrollbarYToLeft
1015
+ const scrollXVisible = $xeTree.computeScrollXVisible
1016
+ const scrollYVisible = $xeTree.computeScrollYVisible
1017
+ return domUtils.buildClass([
1018
+ 'vxe-scrollbar is--virtual',
1019
+ `ov-x--${scrollXVisible === false ? 'hidden' : 'visible'}`,
1020
+ `ov-y--${scrollYVisible === false ? 'hidden' : 'visible'}`,
1021
+ `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`,
1022
+ `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`
1023
+ ], {
1024
+ 'overflow-y': yThumbHeight,
1025
+ 'overflow-x': xThumbWidth
1026
+ })
1027
+ },
1028
+ computeScrollbarXToTop () {
1029
+ const $xeTree = this
1030
+
1031
+ const scrollbarXOpts = $xeTree.computeScrollbarXOpts as VxeScrollbarPropTypes.XConfig
1032
+ return scrollbarXOpts.position === 'top'
1033
+ },
1034
+ computeScrollbarYToLeft () {
1035
+ const $xeTree = this
1036
+
1037
+ const scrollbarYOpts = $xeTree.computeScrollbarYOpts as VxeScrollbarPropTypes.YConfig
1038
+ return scrollbarYOpts.position === 'left'
913
1039
  }
914
1040
  },
915
1041
  methods: {
@@ -1562,6 +1688,12 @@ export default /* define-vxe-component start */ defineVxeComponent({
1562
1688
  }
1563
1689
  })
1564
1690
  },
1691
+ updateScrollbar () {
1692
+ const $xeTree = this
1693
+
1694
+ $xeTree.updateThumbSize()
1695
+ $xeTree.updateThumbOffset()
1696
+ },
1565
1697
  /**
1566
1698
  * 重新计算列表
1567
1699
  */
@@ -1587,6 +1719,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
1587
1719
  const parentPaddingSize = getPaddingTopBottomSize(parentEl)
1588
1720
  reactData.parentHeight = Math.max(headHeight + footHeight + rowHeight, parentEl.clientHeight - parentPaddingSize - headHeight - footHeight)
1589
1721
  }
1722
+ $xeTree.updateScrollbar()
1590
1723
  $xeTree.updateHeight()
1591
1724
  return $xeTree.computeScrollLoad().then(() => {
1592
1725
  $xeTree.updateHeight()
@@ -1634,6 +1767,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
1634
1767
  const scrollLeft = scrollBodyElem.scrollLeft
1635
1768
  const isX = scrollLeft !== internalData.lastScrollLeft
1636
1769
  const isY = scrollTop !== internalData.lastScrollTop
1770
+ $xeTree.updateThumbOffset()
1637
1771
  internalData.lastScrollTop = scrollTop
1638
1772
  internalData.lastScrollLeft = scrollLeft
1639
1773
  if (reactData.scrollYLoad) {
@@ -2521,15 +2655,6 @@ export default /* define-vxe-component start */ defineVxeComponent({
2521
2655
  $xeTree.emitRadioMode(value)
2522
2656
  $xeTree.dispatchEvent('radio-change', { node, value, checked: isChecked }, evnt)
2523
2657
  },
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
2658
  reloadData (data: any[]) {
2534
2659
  const $xeTree = this
2535
2660
 
@@ -3325,6 +3450,201 @@ export default /* define-vxe-component start */ defineVxeComponent({
3325
3450
  }
3326
3451
  },
3327
3452
 
3453
+ // 滚动条
3454
+ updateThumbSize () {
3455
+ const $xeTree = this
3456
+ const reactData = $xeTree.reactData
3457
+
3458
+ const viewEl = $xeTree.$refs.refVirtualWrapper as HTMLDivElement
3459
+ if (!viewEl) {
3460
+ return
3461
+ }
3462
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
3463
+ return
3464
+ }
3465
+ const trackXEl = $xeTree.$refs.refTrackXElem as HTMLDivElement
3466
+ const xThumbWidth = trackXEl ? getThumbSize(viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth) : 0
3467
+ const thumbXElem = $xeTree.$refs.refThumbXElem as HTMLDivElement
3468
+ if (thumbXElem) {
3469
+ thumbXElem.style.width = xThumbWidth + 'px'
3470
+ }
3471
+ reactData.xThumbWidth = xThumbWidth
3472
+
3473
+ const trackYEl = $xeTree.$refs.refTrackYElem as HTMLDivElement
3474
+
3475
+ const yThumbHeight = trackYEl ? getThumbSize(viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight) : 0
3476
+ const thumbYElem = $xeTree.$refs.refThumbYElem as HTMLDivElement
3477
+ if (thumbYElem) {
3478
+ thumbYElem.style.height = yThumbHeight + 'px'
3479
+ }
3480
+ reactData.yThumbHeight = yThumbHeight
3481
+ },
3482
+ updateThumbOffset () {
3483
+ const $xeTree = this
3484
+ const reactData = $xeTree.reactData
3485
+ const internalData = $xeTree.internalData
3486
+
3487
+ const viewEl = $xeTree.$refs.refVirtualWrapper as HTMLDivElement
3488
+ if (!viewEl) {
3489
+ return
3490
+ }
3491
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
3492
+ return
3493
+ }
3494
+ const { xThumbWidth, yThumbHeight } = reactData
3495
+ const trackXEl = $xeTree.$refs.refTrackXElem as HTMLDivElement
3496
+ const thumbXElem = $xeTree.$refs.refThumbXElem as HTMLDivElement
3497
+ const xThumbLeft = trackXEl && xThumbWidth ? getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth, xThumbWidth) : 0
3498
+ internalData.xThumbLeft = xThumbLeft
3499
+ if (thumbXElem && xThumbWidth) {
3500
+ thumbXElem.style.width = xThumbWidth + 'px'
3501
+ thumbXElem.style.transform = `translateX(${xThumbLeft}px)`
3502
+ }
3503
+
3504
+ const trackYEl = $xeTree.$refs.refTrackYElem as HTMLDivElement
3505
+ const thumbYElem = $xeTree.$refs.refThumbYElem as HTMLDivElement
3506
+ const yThumbTop = trackYEl && yThumbHeight ? getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight, yThumbHeight) : 0
3507
+ internalData.yThumbTop = yThumbTop
3508
+ if (thumbYElem && yThumbHeight) {
3509
+ thumbYElem.style.height = yThumbHeight + 'px'
3510
+ thumbYElem.style.transform = `translateY(${yThumbTop}px)`
3511
+ }
3512
+ },
3513
+ clickTrackXEvent (evnt: MouseEvent) {
3514
+ const $xeTree = this
3515
+ const reactData = $xeTree.reactData
3516
+
3517
+ const trackEl = evnt.currentTarget as HTMLDivElement
3518
+ if (trackEl !== evnt.target) {
3519
+ return
3520
+ }
3521
+ const viewEl = $xeTree.$refs.refVirtualWrapper as HTMLDivElement
3522
+ if (!viewEl) {
3523
+ return
3524
+ }
3525
+ const { xThumbWidth } = reactData
3526
+ const trackRect = trackEl.getBoundingClientRect()
3527
+ viewEl.scrollTo({
3528
+ left: getScrollFromClick(evnt.clientX - trackRect.left, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth),
3529
+ behavior: 'auto'
3530
+ })
3531
+ },
3532
+ clickTrackYEvent (evnt: MouseEvent) {
3533
+ const $xeTree = this
3534
+ const reactData = $xeTree.reactData
3535
+
3536
+ const trackEl = evnt.currentTarget as HTMLDivElement
3537
+ if (trackEl !== evnt.target) {
3538
+ return
3539
+ }
3540
+ const viewEl = $xeTree.$refs.refVirtualWrapper as HTMLDivElement
3541
+ if (!viewEl) {
3542
+ return
3543
+ }
3544
+ const { yThumbHeight } = reactData
3545
+ const trackRect = trackEl.getBoundingClientRect()
3546
+ viewEl.scrollTo({
3547
+ top: getScrollFromClick(evnt.clientY - trackRect.top, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight),
3548
+ behavior: 'auto'
3549
+ })
3550
+ },
3551
+ pointerdownThumbXEvent (evnt: PointerEvent) {
3552
+ const $xeTree = this
3553
+ const reactData = $xeTree.reactData
3554
+ const internalData = $xeTree.internalData
3555
+
3556
+ const thumbEl = evnt.currentTarget as HTMLDivElement
3557
+ internalData.isThumbDrag = true
3558
+ thumbEl.setPointerCapture(evnt.pointerId)
3559
+
3560
+ const viewEl = $xeTree.$refs.refVirtualWrapper as HTMLDivElement
3561
+ if (!viewEl) {
3562
+ return
3563
+ }
3564
+ const { xThumbWidth } = reactData
3565
+ const trackEl = thumbEl.parentElement as HTMLDivElement
3566
+ const trackRect = trackEl.getBoundingClientRect()
3567
+ const pointerPosition = evnt.clientX - trackRect.left
3568
+ // 记录 thumb 的偏移
3569
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth)
3570
+ internalData.thumbDragOffset = pointerPosition - thumbOffset
3571
+ },
3572
+ pointermoveThumbXEvent (evnt: PointerEvent) {
3573
+ const $xeTree = this
3574
+ const reactData = $xeTree.reactData
3575
+ const internalData = $xeTree.internalData
3576
+
3577
+ const thumbEl = evnt.currentTarget as HTMLDivElement
3578
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
3579
+ return
3580
+ }
3581
+ const { isThumbDrag, thumbDragOffset } = internalData
3582
+ if (isThumbDrag) {
3583
+ const viewEl = $xeTree.$refs.refVirtualWrapper as HTMLDivElement
3584
+ if (!viewEl) {
3585
+ return
3586
+ }
3587
+ const { xThumbWidth } = reactData
3588
+ const thumbEl = evnt.currentTarget as HTMLDivElement
3589
+ const trackEl = thumbEl.parentElement as HTMLDivElement
3590
+ const trackRect = trackEl.getBoundingClientRect()
3591
+ // 更新偏移
3592
+ viewEl.scrollLeft = getScrollFromDrag(evnt.clientX - trackRect.left, thumbDragOffset, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth)
3593
+ }
3594
+ },
3595
+ cleatPointerThumbEvent (evnt: PointerEvent) {
3596
+ const $xeTree = this
3597
+ const internalData = $xeTree.internalData
3598
+
3599
+ const thumbEl = evnt.currentTarget as HTMLDivElement
3600
+ thumbEl.releasePointerCapture(evnt.pointerId)
3601
+ internalData.isThumbDrag = false
3602
+ },
3603
+ pointerdownThumbYEvent (evnt: PointerEvent) {
3604
+ const $xeTree = this
3605
+ const reactData = $xeTree.reactData
3606
+ const internalData = $xeTree.internalData
3607
+
3608
+ const thumbEl = evnt.currentTarget as HTMLDivElement
3609
+ internalData.isThumbDrag = true
3610
+ thumbEl.setPointerCapture(evnt.pointerId)
3611
+
3612
+ const viewEl = $xeTree.$refs.refVirtualWrapper as HTMLDivElement
3613
+ if (!viewEl) {
3614
+ return
3615
+ }
3616
+ const { yThumbHeight } = reactData
3617
+ const trackEl = thumbEl.parentElement as HTMLDivElement
3618
+ const trackRect = trackEl.getBoundingClientRect()
3619
+ const pointerPosition = evnt.clientY - trackRect.top
3620
+ // 记录 thumb 的偏移
3621
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight)
3622
+ internalData.thumbDragOffset = pointerPosition - thumbOffset
3623
+ },
3624
+ pointermoveThumbYEvent (evnt: PointerEvent) {
3625
+ const $xeTree = this
3626
+ const reactData = $xeTree.reactData
3627
+ const internalData = $xeTree.internalData
3628
+
3629
+ const thumbEl = evnt.currentTarget as HTMLDivElement
3630
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
3631
+ return
3632
+ }
3633
+ const { isThumbDrag, thumbDragOffset } = internalData
3634
+ if (isThumbDrag) {
3635
+ const viewEl = $xeTree.$refs.refVirtualWrapper as HTMLDivElement
3636
+ if (!viewEl) {
3637
+ return
3638
+ }
3639
+ const { yThumbHeight } = reactData
3640
+ const thumbEl = evnt.currentTarget as HTMLDivElement
3641
+ const trackEl = thumbEl.parentElement as HTMLDivElement
3642
+ const trackRect = trackEl.getBoundingClientRect()
3643
+ // 更新偏移
3644
+ viewEl.scrollTop = getScrollFromDrag(evnt.clientY - trackRect.top, thumbDragOffset, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight)
3645
+ }
3646
+ },
3647
+
3328
3648
  //
3329
3649
  // Render
3330
3650
  //
@@ -3690,13 +4010,14 @@ export default /* define-vxe-component start */ defineVxeComponent({
3690
4010
  const slots = $xeTree.$scopedSlots
3691
4011
  const reactData = $xeTree.reactData
3692
4012
 
3693
- const { loading, trigger, showLine } = props
3694
- const { bodyHeight, topSpaceHeight, treeList, tooltipStore } = reactData
4013
+ const { loading, trigger, showLine, useScrollbar } = props
4014
+ const { bodyHeight, topSpaceHeight, treeList, tooltipStore, xThumbWidth, yThumbHeight } = reactData
3695
4015
  const vSize = $xeTree.computeSize
3696
4016
  const radioOpts = $xeTree.computeRadioOpts
3697
4017
  const checkboxOpts = $xeTree.computeCheckboxOpts
3698
4018
  const loadingOpts = $xeTree.computeLoadingOpts
3699
4019
  const isNodeHover = $xeTree.computeIsNodeHover
4020
+ const wrapperStyles = $xeTree.computeWrapperStyles
3700
4021
  const treeStyle = $xeTree.computeTreeStyle
3701
4022
  const dragOpts = $xeTree.computeDragOpts
3702
4023
  const tooltipOpts = $xeTree.computeTooltipOpts
@@ -3704,6 +4025,14 @@ export default /* define-vxe-component start */ defineVxeComponent({
3704
4025
  const headerSlot = slots.header
3705
4026
  const footerSlot = slots.footer
3706
4027
  const tooltipSlot = slots.tooltip
4028
+ const scrollbarOpts = $xeTree.computeScrollbarOpts
4029
+ const scrollXVisible = $xeTree.computeScrollXVisible
4030
+ const scrollYVisible = $xeTree.computeScrollYVisible
4031
+ const scrollbarXToTop = $xeTree.computeScrollbarXToTop
4032
+ const scrollbarYToLeft = $xeTree.computeScrollbarYToLeft
4033
+ const scrollXAutoHide = $xeTree.computeScrollXAutoHide
4034
+ const scrollYAutoHide = $xeTree.computeScrollYAutoHide
4035
+ const scrollbarWrapperClss = $xeTree.computeScrollbarWrapperClss
3707
4036
 
3708
4037
  const teOns: {
3709
4038
  dragover?: (...args: any[]) => void
@@ -3714,15 +4043,29 @@ export default /* define-vxe-component start */ defineVxeComponent({
3714
4043
 
3715
4044
  return h('div', {
3716
4045
  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
- }],
4046
+ class: [
4047
+ 'vxe-tree',
4048
+ useScrollbar ? `ov-x--${scrollXVisible === false ? 'hidden' : 'visible'}` : '',
4049
+ useScrollbar ? `ov-y--${scrollYVisible === false ? 'hidden' : 'visible'}` : '',
4050
+ useScrollbar ? `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}` : '',
4051
+ useScrollbar ? `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}` : '',
4052
+ {
4053
+ [`size--${vSize}`]: vSize,
4054
+ 'show--line': showLine,
4055
+ 'is--virtual-scrollbar': useScrollbar,
4056
+ 'ov-padding': useScrollbar && scrollbarOpts.padding,
4057
+ 'ov-x--auto-hide': useScrollbar && scrollXAutoHide,
4058
+ 'ov-y--auto-hide': useScrollbar && scrollYAutoHide,
4059
+ 'overflow-y': yThumbHeight,
4060
+ 'overflow-x': xThumbWidth,
4061
+ 'checkbox--highlight': checkboxOpts.highlight,
4062
+ 'radio--highlight': radioOpts.highlight,
4063
+ 'node--hover': isNodeHover,
4064
+ 'node--trigger': trigger === 'node',
4065
+ 'is--loading': loading
4066
+ }
4067
+ ],
4068
+ style: wrapperStyles,
3726
4069
  on: teOns
3727
4070
  }, [
3728
4071
  headerSlot
@@ -3759,6 +4102,57 @@ export default /* define-vxe-component start */ defineVxeComponent({
3759
4102
  class: 'vxe-tree--footer-wrapper'
3760
4103
  }, footerSlot({ $tree: $xeTree }))
3761
4104
  : renderEmptyElement($xeTree),
4105
+ /**
4106
+ * 滚动条
4107
+ */
4108
+ useScrollbar
4109
+ ? h('div', {
4110
+ class: scrollbarWrapperClss
4111
+ }, [
4112
+ scrollXVisible === false
4113
+ ? renderEmptyElement($xeTree)
4114
+ : h('div', {
4115
+ ref: 'refTrackXElem',
4116
+ class: 'vxe-scrollbar--track-x',
4117
+ on: {
4118
+ click: $xeTree.clickTrackXEvent
4119
+ }
4120
+ }, [
4121
+ h('div', {
4122
+ ref: 'refThumbXElem',
4123
+ class: 'vxe-scrollbar--thumb-x',
4124
+ on: {
4125
+ pointerdown: $xeTree.pointerdownThumbXEvent,
4126
+ pointermove: $xeTree.pointermoveThumbXEvent,
4127
+ pointerup: $xeTree.cleatPointerThumbEvent,
4128
+ pointercancel: $xeTree.cleatPointerThumbEvent,
4129
+ lostpointercapture: $xeTree.cleatPointerThumbEvent
4130
+ }
4131
+ })
4132
+ ]),
4133
+ scrollYVisible === false
4134
+ ? renderEmptyElement($xeTree)
4135
+ : h('div', {
4136
+ ref: 'refTrackYElem',
4137
+ class: 'vxe-scrollbar--track-y',
4138
+ on: {
4139
+ click: $xeTree.clickTrackYEvent
4140
+ }
4141
+ }, [
4142
+ h('div', {
4143
+ ref: 'refThumbYElem',
4144
+ class: 'vxe-scrollbar--thumb-y',
4145
+ on: {
4146
+ pointerdown: $xeTree.pointerdownThumbYEvent,
4147
+ pointermove: $xeTree.pointermoveThumbYEvent,
4148
+ pointerup: $xeTree.cleatPointerThumbEvent,
4149
+ pointercancel: $xeTree.cleatPointerThumbEvent,
4150
+ lostpointercapture: $xeTree.cleatPointerThumbEvent
4151
+ }
4152
+ })
4153
+ ])
4154
+ ])
4155
+ : renderEmptyElement($xeTree),
3762
4156
  /**
3763
4157
  * 拖拽提示
3764
4158
  */
@@ -3857,22 +4251,53 @@ export default /* define-vxe-component start */ defineVxeComponent({
3857
4251
  height () {
3858
4252
  const $xeTree = this
3859
4253
 
3860
- $xeTree.hFlag++
4254
+ $xeTree.reFlag++
3861
4255
  },
3862
4256
  minHeight () {
3863
4257
  const $xeTree = this
3864
4258
 
3865
- $xeTree.hFlag++
4259
+ $xeTree.reFlag++
3866
4260
  },
3867
4261
  maxHeight () {
3868
4262
  const $xeTree = this
3869
4263
 
3870
- $xeTree.hFlag++
4264
+ $xeTree.reFlag++
4265
+ },
4266
+ useScrollbar () {
4267
+ const $xeTree = this
4268
+
4269
+ $xeTree.reFlag++
4270
+ },
4271
+ computeScrollYWidth () {
4272
+ const $xeTree = this
4273
+
4274
+ $xeTree.reFlag++
4275
+ },
4276
+ computeScrollXHeight () {
4277
+ const $xeTree = this
4278
+
4279
+ $xeTree.reFlag++
4280
+ },
4281
+ computeScrollXVisible () {
4282
+ const $xeTree = this
4283
+
4284
+ $xeTree.$nextTick(() => {
4285
+ $xeTree.reFlag++
4286
+ })
4287
+ },
4288
+ computeScrollYVisible () {
4289
+ const $xeTree = this
4290
+
4291
+ $xeTree.$nextTick(() => {
4292
+ $xeTree.reFlag++
4293
+ })
3871
4294
  },
3872
- hFlag () {
4295
+ reFlag () {
3873
4296
  const $xeTree = this
3874
4297
 
3875
- $xeTree.recalculate()
4298
+ $xeTree.recalculate().then(() => {
4299
+ $xeTree.recalculate()
4300
+ })
3876
4301
  }
3877
4302
  },
3878
4303
  created () {
@@ -3890,7 +4315,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
3890
4315
  const props = $xeTree
3891
4316
  const internalData = $xeTree.internalData
3892
4317
 
3893
- const { transform, drag, menuConfig, showOverflow, lazy, loadMethod } = props
4318
+ const { transform, drag, menuConfig, showOverflow, lazy, loadMethod, autoResize, useScrollbar } = props
3894
4319
  const dragOpts = $xeTree.computeDragOpts
3895
4320
  if (!showOverflow) {
3896
4321
  errLog('vxe.error.errProp', ['show-overflow=false', 'show-overflow=true'])
@@ -3911,12 +4336,25 @@ export default /* define-vxe-component start */ defineVxeComponent({
3911
4336
  if (menuConfig && !VxeUIContextMenu) {
3912
4337
  errLog('vxe.error.reqComp', ['vxe-context-menu'])
3913
4338
  }
3914
- if (props.autoResize) {
3915
- const el = $xeTree.$refs.refElem as HTMLDivElement
4339
+ const el = $xeTree.$refs.refElem as HTMLDivElement
4340
+ if (useScrollbar) {
4341
+ const viewInnerEl = $xeTree.$refs.refVirtualBody as HTMLDivElement
4342
+ const scrollObserver = globalResize.create(() => {
4343
+ $xeTree.updateScrollbar()
4344
+ })
4345
+ if (el) {
4346
+ scrollObserver.observe(el)
4347
+ }
4348
+ if (viewInnerEl) {
4349
+ scrollObserver.observe(viewInnerEl)
4350
+ }
4351
+ internalData.scrollObserver = scrollObserver
4352
+ }
4353
+ if (autoResize) {
3916
4354
  const parentEl = $xeTree.getParentElem()
3917
4355
  const resizeObserver = globalResize.create(() => {
3918
4356
  if (props.autoResize) {
3919
- $xeTree.recalculate()
4357
+ $xeTree.reFlag++
3920
4358
  }
3921
4359
  })
3922
4360
  if (el) {
@@ -3928,18 +4366,23 @@ export default /* define-vxe-component start */ defineVxeComponent({
3928
4366
  internalData.resizeObserver = resizeObserver
3929
4367
  }
3930
4368
 
3931
- $xeTree.recalculate()
3932
- globalEvents.on($xeTree, 'resize', $xeTree.handleGlobalResizeEvent)
4369
+ $xeTree.reFlag++
4370
+ globalEvents.on($xeTree, 'resize', () => {
4371
+ $xeTree.reFlag++
4372
+ })
3933
4373
  },
3934
4374
  beforeDestroy () {
3935
4375
  const $xeTree = this
3936
4376
  const reactData = $xeTree.reactData
3937
4377
  const internalData = $xeTree.internalData
3938
4378
 
3939
- const { resizeObserver } = internalData
4379
+ const { scrollObserver, resizeObserver } = internalData
3940
4380
  if (resizeObserver) {
3941
4381
  resizeObserver.disconnect()
3942
4382
  }
4383
+ if (scrollObserver) {
4384
+ scrollObserver.disconnect()
4385
+ }
3943
4386
  globalEvents.off($xeTree, 'resize')
3944
4387
  XEUtils.assign(reactData, createReactData())
3945
4388
  XEUtils.assign(internalData, createInternalData())