vxe-pc-ui 4.11.30 → 4.11.31

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 (202) hide show
  1. package/es/backtop/src/backtop.js +1 -3
  2. package/es/button/src/button.js +21 -12
  3. package/es/components.js +3 -0
  4. package/es/context-menu/index.js +46 -0
  5. package/es/context-menu/src/context-menu.js +344 -0
  6. package/es/context-menu/style.css +104 -0
  7. package/es/context-menu/style.min.css +1 -0
  8. package/es/dynamics/index.js +29 -3
  9. package/es/icon/style.css +1 -1
  10. package/es/language/ar-EG.js +3 -0
  11. package/es/language/de-DE.js +3 -0
  12. package/es/language/en-US.js +3 -0
  13. package/es/language/es-ES.js +3 -0
  14. package/es/language/fr-FR.js +3 -0
  15. package/es/language/hu-HU.js +3 -0
  16. package/es/language/hy-AM.js +4 -1
  17. package/es/language/id-ID.js +3 -0
  18. package/es/language/it-IT.js +3 -0
  19. package/es/language/ja-JP.js +3 -0
  20. package/es/language/ko-KR.js +3 -0
  21. package/es/language/ms-MY.js +3 -0
  22. package/es/language/nb-NO.js +3 -0
  23. package/es/language/pt-BR.js +3 -0
  24. package/es/language/ru-RU.js +3 -0
  25. package/es/language/th-TH.js +3 -0
  26. package/es/language/ug-CN.js +3 -0
  27. package/es/language/uk-UA.js +3 -0
  28. package/es/language/uz-UZ.js +3 -0
  29. package/es/language/vi-VN.js +3 -0
  30. package/es/language/zh-CHT.js +3 -0
  31. package/es/language/zh-CN.js +4 -1
  32. package/es/print/src/print.js +24 -1
  33. package/es/print/src/util.js +8 -1
  34. package/es/style.css +1 -1
  35. package/es/style.min.css +1 -1
  36. package/es/tree/src/tree.js +69 -21
  37. package/es/ui/index.js +8 -3
  38. package/es/ui/src/log.js +1 -1
  39. package/es/vxe-context-menu/index.js +3 -0
  40. package/es/vxe-context-menu/style.css +104 -0
  41. package/es/vxe-context-menu/style.min.css +1 -0
  42. package/lib/backtop/src/backtop.js +0 -2
  43. package/lib/backtop/src/backtop.min.js +1 -1
  44. package/lib/button/src/button.js +12 -6
  45. package/lib/button/src/button.min.js +1 -1
  46. package/lib/components.js +13 -1
  47. package/lib/components.min.js +1 -1
  48. package/lib/context-menu/index.js +56 -0
  49. package/lib/context-menu/index.min.js +1 -0
  50. package/lib/context-menu/src/context-menu.js +361 -0
  51. package/lib/context-menu/src/context-menu.min.js +1 -0
  52. package/lib/context-menu/style/index.js +1 -0
  53. package/lib/context-menu/style/style.css +104 -0
  54. package/lib/context-menu/style/style.min.css +1 -0
  55. package/lib/dynamics/index.js +33 -3
  56. package/lib/dynamics/index.min.js +1 -1
  57. package/lib/icon/style/style.css +1 -1
  58. package/lib/icon/style/style.min.css +1 -1
  59. package/lib/index.umd.js +602 -40
  60. package/lib/index.umd.min.js +1 -1
  61. package/lib/language/ar-EG.js +3 -0
  62. package/lib/language/ar-EG.min.js +1 -1
  63. package/lib/language/ar-EG.umd.js +3 -0
  64. package/lib/language/de-DE.js +3 -0
  65. package/lib/language/de-DE.min.js +1 -1
  66. package/lib/language/de-DE.umd.js +3 -0
  67. package/lib/language/en-US.js +3 -0
  68. package/lib/language/en-US.min.js +1 -1
  69. package/lib/language/en-US.umd.js +3 -0
  70. package/lib/language/es-ES.js +3 -0
  71. package/lib/language/es-ES.min.js +1 -1
  72. package/lib/language/es-ES.umd.js +3 -0
  73. package/lib/language/fr-FR.js +3 -0
  74. package/lib/language/fr-FR.min.js +1 -1
  75. package/lib/language/fr-FR.umd.js +3 -0
  76. package/lib/language/hu-HU.js +3 -0
  77. package/lib/language/hu-HU.min.js +1 -1
  78. package/lib/language/hu-HU.umd.js +3 -0
  79. package/lib/language/hy-AM.js +4 -1
  80. package/lib/language/hy-AM.min.js +1 -1
  81. package/lib/language/hy-AM.umd.js +4 -1
  82. package/lib/language/id-ID.js +3 -0
  83. package/lib/language/id-ID.min.js +1 -1
  84. package/lib/language/id-ID.umd.js +3 -0
  85. package/lib/language/it-IT.js +3 -0
  86. package/lib/language/it-IT.min.js +1 -1
  87. package/lib/language/it-IT.umd.js +3 -0
  88. package/lib/language/ja-JP.js +3 -0
  89. package/lib/language/ja-JP.min.js +1 -1
  90. package/lib/language/ja-JP.umd.js +3 -0
  91. package/lib/language/ko-KR.js +3 -0
  92. package/lib/language/ko-KR.min.js +1 -1
  93. package/lib/language/ko-KR.umd.js +3 -0
  94. package/lib/language/ms-MY.js +3 -0
  95. package/lib/language/ms-MY.min.js +1 -1
  96. package/lib/language/ms-MY.umd.js +3 -0
  97. package/lib/language/nb-NO.js +3 -0
  98. package/lib/language/nb-NO.min.js +1 -1
  99. package/lib/language/nb-NO.umd.js +3 -0
  100. package/lib/language/pt-BR.js +3 -0
  101. package/lib/language/pt-BR.min.js +1 -1
  102. package/lib/language/pt-BR.umd.js +3 -0
  103. package/lib/language/ru-RU.js +3 -0
  104. package/lib/language/ru-RU.min.js +1 -1
  105. package/lib/language/ru-RU.umd.js +3 -0
  106. package/lib/language/th-TH.js +3 -0
  107. package/lib/language/th-TH.min.js +1 -1
  108. package/lib/language/th-TH.umd.js +3 -0
  109. package/lib/language/ug-CN.js +3 -0
  110. package/lib/language/ug-CN.min.js +1 -1
  111. package/lib/language/ug-CN.umd.js +3 -0
  112. package/lib/language/uk-UA.js +3 -0
  113. package/lib/language/uk-UA.min.js +1 -1
  114. package/lib/language/uk-UA.umd.js +3 -0
  115. package/lib/language/uz-UZ.js +3 -0
  116. package/lib/language/uz-UZ.min.js +1 -1
  117. package/lib/language/uz-UZ.umd.js +3 -0
  118. package/lib/language/vi-VN.js +3 -0
  119. package/lib/language/vi-VN.min.js +1 -1
  120. package/lib/language/vi-VN.umd.js +3 -0
  121. package/lib/language/zh-CHT.js +3 -0
  122. package/lib/language/zh-CHT.min.js +1 -1
  123. package/lib/language/zh-CHT.umd.js +3 -0
  124. package/lib/language/zh-CN.js +4 -1
  125. package/lib/language/zh-CN.min.js +1 -1
  126. package/lib/language/zh-CN.umd.js +4 -1
  127. package/lib/print/src/print.js +42 -1
  128. package/lib/print/src/print.min.js +1 -1
  129. package/lib/print/src/util.js +9 -2
  130. package/lib/print/src/util.min.js +1 -1
  131. package/lib/style.css +1 -1
  132. package/lib/style.min.css +1 -1
  133. package/lib/tree/src/tree.js +78 -20
  134. package/lib/tree/src/tree.min.js +1 -1
  135. package/lib/ui/index.js +8 -3
  136. package/lib/ui/index.min.js +1 -1
  137. package/lib/ui/src/log.js +1 -1
  138. package/lib/ui/src/log.min.js +1 -1
  139. package/lib/vxe-context-menu/index.js +22 -0
  140. package/lib/vxe-context-menu/index.min.js +1 -0
  141. package/lib/vxe-context-menu/style/index.js +1 -0
  142. package/lib/vxe-context-menu/style/style.css +104 -0
  143. package/lib/vxe-context-menu/style/style.min.css +1 -0
  144. package/package.json +1 -1
  145. package/packages/backtop/src/backtop.ts +1 -4
  146. package/packages/button/src/button.ts +22 -13
  147. package/packages/components.ts +3 -0
  148. package/packages/context-menu/index.ts +54 -0
  149. package/packages/context-menu/src/context-menu.ts +388 -0
  150. package/packages/dynamics/index.ts +36 -9
  151. package/packages/language/ar-EG.ts +3 -0
  152. package/packages/language/de-DE.ts +3 -0
  153. package/packages/language/en-US.ts +3 -0
  154. package/packages/language/es-ES.ts +3 -0
  155. package/packages/language/fr-FR.ts +3 -0
  156. package/packages/language/hu-HU.ts +3 -0
  157. package/packages/language/hy-AM.ts +4 -1
  158. package/packages/language/id-ID.ts +3 -0
  159. package/packages/language/it-IT.ts +3 -0
  160. package/packages/language/ja-JP.ts +3 -0
  161. package/packages/language/ko-KR.ts +3 -0
  162. package/packages/language/ms-MY.ts +3 -0
  163. package/packages/language/nb-NO.ts +3 -0
  164. package/packages/language/pt-BR.ts +3 -0
  165. package/packages/language/ru-RU.ts +3 -0
  166. package/packages/language/th-TH.ts +3 -0
  167. package/packages/language/ug-CN.ts +3 -0
  168. package/packages/language/uk-UA.ts +3 -0
  169. package/packages/language/uz-UZ.ts +3 -0
  170. package/packages/language/vi-VN.ts +3 -0
  171. package/packages/language/zh-CHT.ts +3 -0
  172. package/packages/language/zh-CN.ts +4 -1
  173. package/packages/print/src/print.ts +24 -1
  174. package/packages/print/src/util.ts +9 -1
  175. package/packages/tree/src/tree.ts +73 -22
  176. package/packages/ui/index.ts +8 -2
  177. package/styles/all.scss +1 -0
  178. package/styles/components/backtop.scss +1 -1
  179. package/styles/components/context-menu.scss +105 -0
  180. package/styles/theme/base.scss +3 -0
  181. package/types/all.d.ts +3 -0
  182. package/types/components/button.d.ts +2 -0
  183. package/types/components/context-menu.d.ts +284 -0
  184. package/types/components/password-input.d.ts +2 -0
  185. package/types/components/print.d.ts +8 -0
  186. package/types/components/table.d.ts +8 -0
  187. package/types/components/tree.d.ts +46 -1
  188. package/types/ui/global-config.d.ts +2 -0
  189. package/types/ui/global-icon.d.ts +4 -0
  190. package/types/ui/index.d.ts +3 -0
  191. /package/es/icon/{iconfont.1767491587367.ttf → iconfont.1767605241010.ttf} +0 -0
  192. /package/es/icon/{iconfont.1767491587367.woff → iconfont.1767605241010.woff} +0 -0
  193. /package/es/icon/{iconfont.1767491587367.woff2 → iconfont.1767605241010.woff2} +0 -0
  194. /package/es/{iconfont.1767491587367.ttf → iconfont.1767605241010.ttf} +0 -0
  195. /package/es/{iconfont.1767491587367.woff → iconfont.1767605241010.woff} +0 -0
  196. /package/es/{iconfont.1767491587367.woff2 → iconfont.1767605241010.woff2} +0 -0
  197. /package/lib/icon/style/{iconfont.1767491587367.ttf → iconfont.1767605241010.ttf} +0 -0
  198. /package/lib/icon/style/{iconfont.1767491587367.woff → iconfont.1767605241010.woff} +0 -0
  199. /package/lib/icon/style/{iconfont.1767491587367.woff2 → iconfont.1767605241010.woff2} +0 -0
  200. /package/lib/{iconfont.1767491587367.ttf → iconfont.1767605241010.ttf} +0 -0
  201. /package/lib/{iconfont.1767491587367.woff → iconfont.1767605241010.woff} +0 -0
  202. /package/lib/{iconfont.1767491587367.woff2 → iconfont.1767605241010.woff2} +0 -0
@@ -539,6 +539,9 @@ export default {
539
539
  ss: 'Második'
540
540
  }
541
541
  },
542
+ contextMenu: {
543
+ loadingText: '加载中...'
544
+ },
542
545
  gantt: {
543
546
  tFullFormat: {
544
547
  year: '{yyyy}年',
@@ -106,7 +106,7 @@ export default {
106
106
  allChecked: '全选',
107
107
  total: '{0} / {1}',
108
108
  search: '搜索',
109
- loadingText: '加载中',
109
+ loadingText: '加载中...',
110
110
  emptyText: '暂无数据',
111
111
  maxOpt: '最大可选择的数量不能超过 {0} 个',
112
112
  overSizeErr: '已超出最大可选数量 {0} 个,超出部分将被忽略!',
@@ -539,6 +539,9 @@ export default {
539
539
  ss: '秒'
540
540
  }
541
541
  },
542
+ contextMenu: {
543
+ loadingText: '加载中...'
544
+ },
542
545
  gantt: {
543
546
  tFullFormat: {
544
547
  year: '{yyyy}年',
@@ -539,6 +539,9 @@ export default {
539
539
  ss: 'Kedua'
540
540
  }
541
541
  },
542
+ contextMenu: {
543
+ loadingText: '加载中...'
544
+ },
542
545
  gantt: {
543
546
  tFullFormat: {
544
547
  year: '{yyyy}年',
@@ -539,6 +539,9 @@ export default {
539
539
  ss: 'Secondo'
540
540
  }
541
541
  },
542
+ contextMenu: {
543
+ loadingText: '加载中...'
544
+ },
542
545
  gantt: {
543
546
  tFullFormat: {
544
547
  year: '{yyyy}年',
@@ -539,6 +539,9 @@ export default {
539
539
  ss: '2番'
540
540
  }
541
541
  },
542
+ contextMenu: {
543
+ loadingText: '加载中...'
544
+ },
542
545
  gantt: {
543
546
  tFullFormat: {
544
547
  year: '{yyyy}年',
@@ -539,6 +539,9 @@ export default {
539
539
  ss: '두번째'
540
540
  }
541
541
  },
542
+ contextMenu: {
543
+ loadingText: '加载中...'
544
+ },
542
545
  gantt: {
543
546
  tFullFormat: {
544
547
  year: '{yyyy}年',
@@ -539,6 +539,9 @@ export default {
539
539
  ss: 'Kedua'
540
540
  }
541
541
  },
542
+ contextMenu: {
543
+ loadingText: '加载中...'
544
+ },
542
545
  gantt: {
543
546
  tFullFormat: {
544
547
  year: '{yyyy}年',
@@ -539,6 +539,9 @@ export default {
539
539
  ss: 'Sekund'
540
540
  }
541
541
  },
542
+ contextMenu: {
543
+ loadingText: '加载中...'
544
+ },
542
545
  gantt: {
543
546
  tFullFormat: {
544
547
  year: '{yyyy}年',
@@ -539,6 +539,9 @@ export default {
539
539
  ss: 'Segundo'
540
540
  }
541
541
  },
542
+ contextMenu: {
543
+ loadingText: '加载中...'
544
+ },
542
545
  gantt: {
543
546
  tFullFormat: {
544
547
  year: '{yyyy}年',
@@ -539,6 +539,9 @@ export default {
539
539
  ss: 'Второй'
540
540
  }
541
541
  },
542
+ contextMenu: {
543
+ loadingText: '加载中...'
544
+ },
542
545
  gantt: {
543
546
  tFullFormat: {
544
547
  year: '{yyyy}年',
@@ -539,6 +539,9 @@ export default {
539
539
  ss: 'ที่สอง'
540
540
  }
541
541
  },
542
+ contextMenu: {
543
+ loadingText: '加载中...'
544
+ },
542
545
  gantt: {
543
546
  tFullFormat: {
544
547
  year: '{yyyy}年',
@@ -539,6 +539,9 @@ export default {
539
539
  ss: 'سېكۇنت'
540
540
  }
541
541
  },
542
+ contextMenu: {
543
+ loadingText: '加载中...'
544
+ },
542
545
  gantt: {
543
546
  tFullFormat: {
544
547
  year: '{yyyy}年',
@@ -539,6 +539,9 @@ export default {
539
539
  ss: 'Другий'
540
540
  }
541
541
  },
542
+ contextMenu: {
543
+ loadingText: '加载中...'
544
+ },
542
545
  gantt: {
543
546
  tFullFormat: {
544
547
  year: '{yyyy}年',
@@ -539,6 +539,9 @@ export default {
539
539
  ss: 'Ikkinchi'
540
540
  }
541
541
  },
542
+ contextMenu: {
543
+ loadingText: '加载中...'
544
+ },
542
545
  gantt: {
543
546
  tFullFormat: {
544
547
  year: '{yyyy}年',
@@ -539,6 +539,9 @@ export default {
539
539
  ss: 'Thứ hai'
540
540
  }
541
541
  },
542
+ contextMenu: {
543
+ loadingText: '加载中...'
544
+ },
542
545
  gantt: {
543
546
  tFullFormat: {
544
547
  year: '{yyyy}年',
@@ -539,6 +539,9 @@ export default {
539
539
  ss: '秒'
540
540
  }
541
541
  },
542
+ contextMenu: {
543
+ loadingText: '加载中...'
544
+ },
542
545
  gantt: {
543
546
  tFullFormat: {
544
547
  year: '{yyyy}年',
@@ -106,7 +106,7 @@ export default {
106
106
  allChecked: '全选',
107
107
  total: '{0} / {1}',
108
108
  search: '搜索',
109
- loadingText: '加载中',
109
+ loadingText: '加载中...',
110
110
  emptyText: '暂无数据',
111
111
  maxSize: '最大可选择的数量不能超过 {0} 个',
112
112
  overSizeErr: '已超出最大可选数量 {0} 个,超出部分将被忽略!',
@@ -539,6 +539,9 @@ export default {
539
539
  ss: '秒'
540
540
  }
541
541
  },
542
+ contextMenu: {
543
+ loadingText: '加载中...'
544
+ },
542
545
  gantt: {
543
546
  tFullFormat: {
544
547
  year: '{yyyy}年',
@@ -47,6 +47,10 @@ export default defineVxeComponent({
47
47
  type: String as PropType<VxePrintPropTypes.CustomStyle>,
48
48
  default: () => getConfig().print.customStyle
49
49
  },
50
+ styleUrls: {
51
+ type: Array as PropType<VxePrintPropTypes.StyleUrls>,
52
+ default: () => getConfig().print.styleUrls
53
+ },
50
54
  beforeMethod: Function as PropType<VxePrintPropTypes.BeforeMethod>
51
55
  },
52
56
  emits: [] as VxePrintEmits,
@@ -85,8 +89,27 @@ export default defineVxeComponent({
85
89
  const printMethods: PrintMethods = {
86
90
  dispatchEvent,
87
91
  print () {
92
+ const { align, title, headerAlign, footerAlign, showPageNumber, customLayout, pageBreaks, content, headerHtml, footerHtml, leftHtml, rightHtml, showAllPageTitle, pageStyle, customStyle, styleUrls, beforeMethod } = props
88
93
  const elem = refElem.value
89
- return printHtml(Object.assign({}, props, {
94
+ return printHtml(Object.assign({}, {
95
+ align,
96
+ title,
97
+ headerAlign,
98
+ footerAlign,
99
+ showPageNumber,
100
+ customLayout,
101
+ pageBreaks,
102
+ content,
103
+ headerHtml,
104
+ footerHtml,
105
+ leftHtml,
106
+ rightHtml,
107
+ showAllPageTitle,
108
+ pageStyle,
109
+ customStyle,
110
+ styleUrls,
111
+ beforeMethod
112
+ }, {
90
113
  _pageBreaks: !!reactData.staticPageBreaks.length,
91
114
  html: trimHtml(elem ? elem.outerHTML : '') || props.html || props.content || ''
92
115
  }))
@@ -97,8 +97,15 @@ function parsePageStyle (val?: VxePrintPropTypes.PageStyle) {
97
97
  }
98
98
  }
99
99
 
100
+ function createCssLink (urls?: string[]) {
101
+ if (urls) {
102
+ return urls.map(url => `<link rel="stylesheet" href="${url}">`).join('\n')
103
+ }
104
+ return ''
105
+ }
106
+
100
107
  function createHtmlPage (opts: VxePrintProps & { _pageBreaks: boolean }, printHtml: string): string {
101
- const { pageStyle, customStyle } = opts
108
+ const { pageStyle, customStyle, styleUrls } = opts
102
109
  const pageStyObj = parsePageStyle(pageStyle)
103
110
  const headStyOpts = pageStyObj.header
104
111
  const titStyOpts = pageStyObj.title
@@ -110,6 +117,7 @@ function createHtmlPage (opts: VxePrintProps & { _pageBreaks: boolean }, printHt
110
117
  '<head>',
111
118
  '<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no,minimal-ui">',
112
119
  `<title>${opts.title || ''}</title>`,
120
+ createCssLink(styleUrls),
113
121
  `<style media="print">@page{size:auto;${isPbMode ? 'margin: 0mm;' : ''}}</style>`,
114
122
  `<style>body{font-size:${pageStyObj.fontSize || '14px'};color:${pageStyObj.color || defaultFontColor};text-align:${pageStyObj.textAlign || 'left'};}</style>`,
115
123
  '<style>',
@@ -1,4 +1,4 @@
1
- import { ref, h, reactive, PropType, computed, VNode, watch, onUnmounted, nextTick, onMounted } from 'vue'
1
+ import { ref, h, reactive, PropType, computed, VNode, watch, onBeforeUnmount, nextTick, onMounted, provide } from 'vue'
2
2
  import { defineVxeComponent } from '../../ui/src/comp'
3
3
  import { VxeUI, getI18n, createEvent, getIcon, getConfig, useSize, globalEvents, globalResize, renderEmptyElement } from '../../ui'
4
4
  import { calcTreeLine, enNodeValue, deNodeValue } from './util'
@@ -7,8 +7,9 @@ import { getCrossTreeDragNodeInfo } from './store'
7
7
  import XEUtils from 'xe-utils'
8
8
  import { getSlotVNs } from '../../ui/src/vn'
9
9
  import { toCssUnit, isScale, getPaddingTopBottomSize, addClass, removeClass, getTpImg, hasControlKey, getEventTargetNode } from '../../ui/src/dom'
10
+ import { isEnableConf } from '../../ui/src/utils'
10
11
  import { moveRowAnimateToTb, clearRowAnimate } from '../../ui/src/anime'
11
- import VxeLoadingComponent from '../../loading/src/loading'
12
+ import VxeLoadingComponent from '../../loading'
12
13
 
13
14
  import type { TreeReactData, VxeTreeEmits, VxeTreePropTypes, TreeInternalData, TreePrivateRef, VxeTreeDefines, VxeTreePrivateComputed, TreePrivateMethods, TreeMethods, ValueOf, VxeTreeConstructor, VxeTreePrivateMethods } from '../../../types'
14
15
 
@@ -51,6 +52,25 @@ function createInternalData (): TreeInternalData {
51
52
  }
52
53
  }
53
54
 
55
+ function createReactData ():TreeReactData {
56
+ return {
57
+ parentHeight: 0,
58
+ customHeight: 0,
59
+ customMinHeight: 0,
60
+ customMaxHeight: 0,
61
+ currentNode: null,
62
+ scrollYLoad: false,
63
+ bodyHeight: 0,
64
+ topSpaceHeight: 0,
65
+ selectRadioKey: null,
66
+ treeList: [],
67
+ updateExpandedFlag: 1,
68
+ updateCheckboxFlag: 1,
69
+ dragNode: null,
70
+ dragTipText: ''
71
+ }
72
+ }
73
+
54
74
  // let crossTreeDragNodeObj: {
55
75
  // $oldTree: VxeTreeConstructor & VxeTreePrivateMethods
56
76
  // $newTree: (VxeTreeConstructor & VxeTreePrivateMethods) | null
@@ -150,6 +170,7 @@ export default defineVxeComponent({
150
170
  default: () => getConfig().tree.drag
151
171
  },
152
172
  dragConfig: Object as PropType<VxeTreePropTypes.DragConfig>,
173
+ menuConfig: Object as PropType<VxeTreePropTypes.MenuConfig>,
153
174
  showIcon: {
154
175
  type: Boolean as PropType<VxeTreePropTypes.ShowIcon>,
155
176
  default: true
@@ -188,7 +209,10 @@ export default defineVxeComponent({
188
209
  'scroll',
189
210
  'node-dragstart',
190
211
  'node-dragover',
191
- 'node-dragend'
212
+ 'node-dragend',
213
+ 'node-expand',
214
+ 'node-menu',
215
+ 'menu-click'
192
216
  ] as VxeTreeEmits,
193
217
  setup (props, context) {
194
218
  const { emit, slots } = context
@@ -208,24 +232,8 @@ export default defineVxeComponent({
208
232
 
209
233
  const crossTreeDragNodeInfo = getCrossTreeDragNodeInfo()
210
234
 
211
- const reactData = reactive<TreeReactData>({
212
- parentHeight: 0,
213
- customHeight: 0,
214
- customMinHeight: 0,
215
- customMaxHeight: 0,
216
- currentNode: null,
217
- scrollYLoad: false,
218
- bodyHeight: 0,
219
- topSpaceHeight: 0,
220
- selectRadioKey: enNodeValue(props.checkNodeKey),
221
- treeList: [],
222
- updateExpandedFlag: 1,
223
- updateCheckboxFlag: 1,
224
- dragNode: null,
225
- dragTipText: ''
226
- })
227
-
228
235
  const internalData = createInternalData()
236
+ const reactData = reactive(createReactData())
229
237
 
230
238
  const refMaps: TreePrivateRef = {
231
239
  refElem
@@ -302,6 +310,10 @@ export default defineVxeComponent({
302
310
  return Object.assign({}, getConfig().tree.dragConfig, props.dragConfig)
303
311
  })
304
312
 
313
+ const computeMenuOpts = computed(() => {
314
+ return Object.assign({}, getConfig().tree.menuConfig, props.menuConfig)
315
+ })
316
+
305
317
  const computeTreeStyle = computed(() => {
306
318
  const { customHeight, customMinHeight, customMaxHeight } = reactData
307
319
  const stys: Record<string, string> = {}
@@ -978,6 +990,33 @@ export default defineVxeComponent({
978
990
  dispatchEvent('node-dblclick', { node }, evnt)
979
991
  }
980
992
 
993
+ const handleContextmenuEvent = (evnt: MouseEvent, node: any) => {
994
+ const { menuConfig } = props
995
+ const isRowCurrent = computeIsRowCurrent.value
996
+ const menuOpts = computeMenuOpts.value
997
+ if (menuConfig ? isEnableConf(menuOpts) : menuOpts.enabled) {
998
+ const { options, visibleMethod } = menuOpts
999
+ if (!visibleMethod || visibleMethod({ $tree: $xeTree, options, node })) {
1000
+ if (isRowCurrent) {
1001
+ changeCurrentEvent(evnt, node)
1002
+ } else if (reactData.currentNode) {
1003
+ reactData.currentNode = null
1004
+ }
1005
+ if (VxeUI.contextMenu) {
1006
+ VxeUI.contextMenu.openByEvent(evnt, {
1007
+ options,
1008
+ events: {
1009
+ optionClick (eventParams) {
1010
+ dispatchEvent('menu-click', Object.assign({ node }, eventParams), eventParams.$event)
1011
+ }
1012
+ }
1013
+ })
1014
+ }
1015
+ }
1016
+ }
1017
+ dispatchEvent('node-menu', { node }, evnt)
1018
+ }
1019
+
981
1020
  const handleAsyncTreeExpandChilds = (node: any) => {
982
1021
  const checkboxOpts = computeCheckboxOpts.value
983
1022
  const { loadMethod } = props
@@ -2386,6 +2425,7 @@ export default defineVxeComponent({
2386
2425
  onDragstart?: any
2387
2426
  onDragend?: any
2388
2427
  onDragover?: any
2428
+ onContextmenu?: any
2389
2429
  } = {
2390
2430
  onMousedown (evnt: MouseEvent) {
2391
2431
  handleNodeMousedownEvent(evnt, node)
@@ -2396,6 +2436,9 @@ export default defineVxeComponent({
2396
2436
  },
2397
2437
  onDblclick (evnt: MouseEvent) {
2398
2438
  handleNodeDblclickEvent(evnt, node)
2439
+ },
2440
+ onContextmenu (evnt: MouseEvent) {
2441
+ handleContextmenuEvent(evnt, node)
2399
2442
  }
2400
2443
  }
2401
2444
  // 拖拽行事件
@@ -2667,7 +2710,7 @@ export default defineVxeComponent({
2667
2710
  })
2668
2711
 
2669
2712
  onMounted(() => {
2670
- const { transform, drag } = props
2713
+ const { transform, drag, menuConfig } = props
2671
2714
  const dragOpts = computeDragOpts.value
2672
2715
  if (drag && !transform) {
2673
2716
  errLog('vxe.error.notSupportProp', ['drag', 'transform=false', 'transform=true'])
@@ -2675,6 +2718,10 @@ export default defineVxeComponent({
2675
2718
  if (dragOpts.isCrossTreeDrag) {
2676
2719
  errLog('vxe.error.notProp', ['drag-config.isCrossTreeDrag'])
2677
2720
  }
2721
+ const VxeUIContextMenu = VxeUI.getComponent('VxeContextMenu')
2722
+ if (menuConfig && !VxeUIContextMenu) {
2723
+ errLog('vxe.error.reqComp', ['vxe-context-menu'])
2724
+ }
2678
2725
  if (props.autoResize) {
2679
2726
  const el = refElem.value
2680
2727
  const parentEl = getParentElem()
@@ -2695,19 +2742,23 @@ export default defineVxeComponent({
2695
2742
  globalEvents.on($xeTree, 'resize', handleGlobalResizeEvent)
2696
2743
  })
2697
2744
 
2698
- onUnmounted(() => {
2745
+ onBeforeUnmount(() => {
2699
2746
  const { resizeObserver } = internalData
2700
2747
  if (resizeObserver) {
2701
2748
  resizeObserver.disconnect()
2702
2749
  }
2703
2750
  globalEvents.off($xeTree, 'resize')
2751
+ XEUtils.assign(reactData, createReactData())
2704
2752
  XEUtils.assign(internalData, createInternalData())
2705
2753
  })
2706
2754
 
2755
+ reactData.selectRadioKey = enNodeValue(props.checkNodeKey)
2707
2756
  loadData(props.data || [])
2708
2757
 
2709
2758
  $xeTree.renderVN = renderVN
2710
2759
 
2760
+ provide('$xeTree', $xeTree)
2761
+
2711
2762
  return $xeTree
2712
2763
  },
2713
2764
  render () {
@@ -46,7 +46,8 @@ setConfig({
46
46
  },
47
47
  suffixTooltip: {
48
48
  enterable: true
49
- }
49
+ },
50
+ showDropdownIcon: true
50
51
  },
51
52
  buttonGroup: {},
52
53
  calendar: {
@@ -79,6 +80,7 @@ setConfig({
79
80
  }
80
81
  },
81
82
  collapsePane: {},
83
+ contextMenu: {},
82
84
  countdown: {},
83
85
  colorPicker: {
84
86
  type: 'rgb',
@@ -672,7 +674,11 @@ setIcon({
672
674
  SPLIT_RIGHT_ACTION: iconPrefix + 'arrow-right',
673
675
 
674
676
  // backtop
675
- BACKTOP_TOP: iconPrefix + 'top'
677
+ BACKTOP_TOP: iconPrefix + 'top',
678
+
679
+ // context-menu
680
+ CONTEXT_MENU_OPTION_LOADING: iconPrefix + 'spinner roll',
681
+ CONTEXT_MENU_CHILDREN: iconPrefix + 'arrow-right'
676
682
  })
677
683
 
678
684
  export * from '@vxe-ui/core'
package/styles/all.scss CHANGED
@@ -22,6 +22,7 @@
22
22
  @use './components/collapse.scss';
23
23
  @use './components/collapse-pane.scss';
24
24
  @use './components/color-picker.scss';
25
+ @use './components/context-menu.scss';
25
26
  @use './components/countdown.scss';
26
27
  @use './components/date-panel.scss';
27
28
  @use './components/date-picker.scss';
@@ -43,7 +43,7 @@ $backtopThemeList: (
43
43
  color: var(--vxe-ui-font-color);
44
44
  font-family: var(--vxe-ui-font-family);
45
45
  background-color: var(--vxe-ui-layout-background-color);
46
- border-radius: var(--vxe-ui-base-border-radius);;
46
+ border-radius: var(--vxe-ui-base-border-radius);
47
47
  transition: all 0.3s;
48
48
  cursor: pointer;
49
49
  box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3);
@@ -0,0 +1,105 @@
1
+ .vxe-context-menu {
2
+ position: absolute;
3
+ top: 0;
4
+ left: 0;
5
+ user-select: none;
6
+ &.is--fixed {
7
+ position: fixed;
8
+ }
9
+ &.cp--left {
10
+ .vxe-context-menu--children-wrapper {
11
+ left: -100%;
12
+ }
13
+ }
14
+ &.cp--right {
15
+ .vxe-context-menu--children-wrapper {
16
+ left: 100%;
17
+ }
18
+ }
19
+ }
20
+
21
+ .vxe-context-menu--group-wrapper {
22
+ border-top: 1px solid var(--vxe-ui-base-popup-border-color);
23
+ &:first-child {
24
+ border: 0;
25
+ }
26
+ }
27
+
28
+ .vxe-context-menu--wrapper,
29
+ .vxe-context-menu--children-wrapper {
30
+ padding: 0;
31
+ color: var(--vxe-ui-font-color);
32
+ font-family: var(--vxe-ui-font-family);
33
+ border: 1px solid var(--vxe-ui-base-popup-border-color);
34
+ background-color: var(--vxe-ui-layout-background-color);
35
+ border-radius: var(--vxe-ui-base-border-radius);
36
+ box-shadow: 0 0 12px 0 rgba(0,0,0,0.3);
37
+ }
38
+
39
+ .vxe-context-menu--children-wrapper {
40
+ display: none;
41
+ position: absolute;
42
+ }
43
+
44
+ .vxe-context-menu--item-wrapper {
45
+ position: relative;
46
+ min-width: 12em;
47
+ max-width: 20em;
48
+ user-select: none;
49
+ &.is--active {
50
+ background-color: rgba(0, 0, 0, 0.1);
51
+ }
52
+ }
53
+ .vxe-context-menu--first-item {
54
+ &.is--active {
55
+ .vxe-context-menu--children-wrapper {
56
+ display: block;
57
+ }
58
+ }
59
+ }
60
+
61
+ .vxe-context-menu--item-inner {
62
+ height: var(--vxe-ui-context-menu-option-height);
63
+ display: flex;
64
+ align-items: center;
65
+ padding: 0 0.5em;
66
+ cursor: pointer;
67
+ &.is--loading {
68
+ opacity: 0.5;
69
+ cursor: progress;
70
+ }
71
+ &.is--disabled {
72
+ color: var(--vxe-ui-font-disabled-color);
73
+ cursor: no-drop;
74
+ }
75
+ }
76
+
77
+ .vxe-context-menu--item-prefix {
78
+ width: 1em;
79
+ text-align: center;
80
+ }
81
+ .vxe-context-menu--item-prefix,
82
+ .vxe-context-menu--item-suffix {
83
+ flex-shrink: 0;
84
+ }
85
+ .vxe-context-menu--item-label {
86
+ font-size: 0.9em;
87
+ padding: 0 0.5em;
88
+ flex-grow: 1;
89
+ overflow: hidden;
90
+ text-overflow: ellipsis;
91
+ white-space: nowrap;
92
+ }
93
+
94
+ .vxe-context-menu {
95
+ font-size: var(--vxe-ui-font-size-default);
96
+ &.size--medium {
97
+ font-size: var(--vxe-ui-font-size-medium);
98
+ }
99
+ &.size--small {
100
+ font-size: var(--vxe-ui-font-size-small);
101
+ }
102
+ &.size--mini {
103
+ font-size: var(--vxe-ui-font-size-mini);
104
+ }
105
+ }
@@ -203,4 +203,7 @@
203
203
  /*segmented*/
204
204
  --vxe-ui-segmented-item-background-color: rgba(0, 0, 0, 0.05);
205
205
  --vxe-ui-segmented-item-hover-background-color: rgba(0, 0, 0, 0.06);
206
+
207
+ /*context-menu*/
208
+ --vxe-ui-context-menu-option-height: 2em;
206
209
  }
package/types/all.d.ts CHANGED
@@ -23,6 +23,7 @@ import VxeCol from './components/col'
23
23
  import VxeCollapse from './components/collapse'
24
24
  import VxeCollapsePane from './components/collapse-pane'
25
25
  import VxeColorPicker from './components/color-picker'
26
+ import VxeContextMenu from './components/context-menu'
26
27
  import VxeCountdown from './components/countdown'
27
28
  import VxeDatePanel from './components/date-panel'
28
29
  import VxeDatePicker from './components/date-picker'
@@ -134,6 +135,7 @@ interface AllComponents {
134
135
  VxeCollapse: typeof VxeCollapse
135
136
  VxeCollapsePane: typeof VxeCollapsePane
136
137
  VxeColorPicker: typeof VxeColorPicker
138
+ VxeContextMenu: typeof VxeContextMenu
137
139
  VxeCountdown: typeof VxeCountdown
138
140
  VxeDatePanel: typeof VxeDatePanel
139
141
  VxeDatePicker: typeof VxeDatePicker
@@ -254,6 +256,7 @@ export * from './components/col'
254
256
  export * from './components/collapse'
255
257
  export * from './components/collapse-pane'
256
258
  export * from './components/color-picker'
259
+ export * from './components/context-menu'
257
260
  export * from './components/countdown'
258
261
  export * from './components/date-panel'
259
262
  export * from './components/date-picker'
@@ -79,6 +79,7 @@ export namespace VxeButtonPropTypes {
79
79
  export type PrefixTooltip = VxeTooltipDefines.TooltipHelperOption
80
80
  export type SuffixTooltip = VxeTooltipDefines.TooltipHelperOption
81
81
 
82
+ export type ShowDropdownIcon = boolean
82
83
  export type DestroyOnClose = boolean
83
84
  export type Transfer = boolean
84
85
  }
@@ -159,6 +160,7 @@ export interface VxeButtonProps {
159
160
 
160
161
  prefixTooltip?: VxeButtonPropTypes.PrefixTooltip
161
162
  suffixTooltip?: VxeButtonPropTypes.SuffixTooltip
163
+ showDropdownIcon?: VxeButtonPropTypes.ShowDropdownIcon
162
164
  /**
163
165
  * 在下拉面板关闭时销毁内容
164
166
  */