vxe-pc-ui 4.20.25 → 4.20.26

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 (626) hide show
  1. package/dist/all.esm.js +15059 -10308
  2. package/dist/style.css +1 -1
  3. package/dist/style.mini.css +1 -1
  4. package/es/alert/src/alert.js +61 -36
  5. package/es/anchor/src/anchor-link.js +39 -20
  6. package/es/anchor/src/anchor.js +74 -45
  7. package/es/avatar/src/avatar.js +47 -27
  8. package/es/backtop/src/backtop.js +65 -40
  9. package/es/badge/src/badge.js +32 -16
  10. package/es/breadcrumb/src/breadcrumb-item.js +52 -27
  11. package/es/breadcrumb/src/breadcrumb.js +11 -8
  12. package/es/button/src/button-group.js +24 -18
  13. package/es/button/src/button.js +284 -185
  14. package/es/calendar/src/calendar.js +571 -358
  15. package/es/card/src/card.js +123 -68
  16. package/es/carousel/src/carousel-item.js +14 -7
  17. package/es/carousel/src/carousel.js +174 -112
  18. package/es/cascader/src/cascader.js +526 -380
  19. package/es/checkbox/src/button.js +90 -55
  20. package/es/checkbox/src/checkbox.js +60 -40
  21. package/es/checkbox/src/group.js +34 -26
  22. package/es/collapse/src/collapse-pane.js +33 -16
  23. package/es/collapse/src/collapse.js +133 -79
  24. package/es/color-picker/src/color-picker.js +489 -350
  25. package/es/components.d.ts +3 -1
  26. package/es/components.js +3 -2
  27. package/es/context-menu/src/context-menu.js +190 -110
  28. package/es/countdown/src/countdown.js +91 -59
  29. package/es/date-panel/src/date-panel.js +760 -450
  30. package/es/date-picker/src/date-picker.js +331 -228
  31. package/es/date-range-picker/src/date-range-picker.js +366 -265
  32. package/es/divider/src/divider.js +26 -12
  33. package/es/drawer/src/drawer.js +254 -154
  34. package/es/dynamics/index.js +38 -25
  35. package/es/empty/src/empty.js +53 -29
  36. package/es/form/render/index.js +66 -41
  37. package/es/form/src/form-config-item.js +22 -16
  38. package/es/form/src/form-group.js +23 -14
  39. package/es/form/src/form-item.js +23 -17
  40. package/es/form/src/form.js +139 -95
  41. package/es/form/src/itemInfo.js +2 -1
  42. package/es/form/src/render.js +207 -127
  43. package/es/form/src/util.js +8 -4
  44. package/es/icon/src/icon.js +14 -10
  45. package/es/icon/style.css +1 -1
  46. package/es/icon/style.mini.css +1 -1
  47. package/es/icon-picker/src/icon-picker.js +250 -157
  48. package/es/image/src/group.js +26 -20
  49. package/es/image/src/image.js +33 -32
  50. package/es/image/src/preview.js +182 -122
  51. package/es/image/src/util.js +6 -3
  52. package/es/index.esm.js +9 -8
  53. package/es/index.js +9 -8
  54. package/es/input/src/input.js +820 -507
  55. package/es/layout-aside/src/layout-aside.js +54 -38
  56. package/es/layout-body/src/layout-body.js +39 -27
  57. package/es/layout-container/src/layout-container.js +16 -9
  58. package/es/layout-footer/src/layout-footer.js +16 -7
  59. package/es/layout-header/src/layout-header.js +15 -7
  60. package/es/link/src/link.js +65 -44
  61. package/es/list/src/list.js +453 -333
  62. package/es/loading/index.js +8 -5
  63. package/es/loading/src/loading.js +60 -33
  64. package/es/mention/src/mention.js +2 -1
  65. package/es/menu/src/menu.js +341 -210
  66. package/es/modal/index.js +60 -37
  67. package/es/modal/src/modal.js +303 -205
  68. package/es/notice-bar/src/notice-bar.js +64 -37
  69. package/es/number-input/src/number-input.js +249 -172
  70. package/es/pager/src/pager.js +346 -202
  71. package/es/password-input/src/password-input.js +145 -105
  72. package/es/print/src/page-break.js +2 -1
  73. package/es/print/src/print.js +184 -99
  74. package/es/pulldown/src/pulldown.js +113 -71
  75. package/es/radio/src/button.js +92 -57
  76. package/es/radio/src/group.js +33 -25
  77. package/es/radio/src/radio.js +61 -41
  78. package/es/rate/src/rate.js +48 -36
  79. package/es/result/src/result.js +67 -35
  80. package/es/row/src/col.js +30 -16
  81. package/es/row/src/row.js +21 -14
  82. package/es/scrollbar/src/scrollbar.js +177 -145
  83. package/es/segmented/src/segmented.js +93 -60
  84. package/es/select/src/optgroup.js +7 -3
  85. package/es/select/src/select.js +483 -340
  86. package/es/select/src/util.js +6 -3
  87. package/es/slider/src/slider.js +108 -80
  88. package/es/space/src/space.js +40 -23
  89. package/es/splitter/src/splitter-panel.js +50 -25
  90. package/es/splitter/src/splitter.js +219 -144
  91. package/es/steps/src/steps.js +10 -5
  92. package/es/style.css +1 -1
  93. package/es/style.mini.css +1 -1
  94. package/es/switch/src/switch.js +85 -57
  95. package/es/table-select/src/table-select.js +232 -153
  96. package/es/table-transfer/src/table-transfer.js +10 -5
  97. package/es/tabs/src/tab-pane.js +33 -16
  98. package/es/tabs/src/tabs.js +363 -230
  99. package/es/tag/src/tag.js +61 -43
  100. package/es/text/src/text.js +89 -65
  101. package/es/text-ellipsis/src/text-ellipsis.js +82 -51
  102. package/es/textarea/src/textarea.js +116 -86
  103. package/es/timeline/src/timeline-item.js +2 -1
  104. package/es/timeline/src/timeline.js +2 -1
  105. package/es/tip/src/tip.js +53 -29
  106. package/es/tooltip/src/tooltip.js +114 -74
  107. package/es/tour/src/tour.js +2 -1
  108. package/es/transfer/src/transfer.js +42 -25
  109. package/es/tree/src/tree.js +709 -492
  110. package/es/tree-select/src/tree-select.js +320 -225
  111. package/es/ui/index.d.ts +0 -1
  112. package/es/ui/index.js +46 -3
  113. package/es/ui/src/dom.js +9 -6
  114. package/es/ui/src/log.js +1 -1
  115. package/es/ui/src/utils.d.ts +1 -1
  116. package/es/upload/src/upload.js +614 -398
  117. package/es/vxe-icon/style.css +1 -1
  118. package/es/vxe-icon/style.mini.css +1 -1
  119. package/es/watermark/src/util.js +15 -12
  120. package/es/watermark/src/watermark.js +55 -25
  121. package/lib/alert/src/alert.js +62 -37
  122. package/lib/anchor/src/anchor-link.js +39 -20
  123. package/lib/anchor/src/anchor.js +75 -46
  124. package/lib/avatar/src/avatar.js +52 -32
  125. package/lib/backtop/src/backtop.js +81 -56
  126. package/lib/badge/src/badge.js +35 -19
  127. package/lib/breadcrumb/src/breadcrumb-item.js +52 -27
  128. package/lib/breadcrumb/src/breadcrumb.js +13 -10
  129. package/lib/button/src/button-group.js +27 -21
  130. package/lib/button/src/button.js +306 -207
  131. package/lib/calendar/src/calendar.js +575 -362
  132. package/lib/card/src/card.js +133 -78
  133. package/lib/carousel/src/carousel-item.js +15 -8
  134. package/lib/carousel/src/carousel.js +182 -120
  135. package/lib/cascader/src/cascader.js +555 -409
  136. package/lib/checkbox/src/button.js +93 -58
  137. package/lib/checkbox/src/checkbox.js +63 -43
  138. package/lib/checkbox/src/group.js +37 -29
  139. package/lib/collapse/src/collapse-pane.js +34 -17
  140. package/lib/collapse/src/collapse.js +139 -85
  141. package/lib/color-picker/src/color-picker.js +516 -377
  142. package/lib/components.js +3 -2
  143. package/lib/context-menu/src/context-menu.js +212 -132
  144. package/lib/countdown/src/countdown.js +95 -63
  145. package/lib/date-panel/src/date-panel.js +776 -466
  146. package/lib/date-picker/src/date-picker.js +377 -274
  147. package/lib/date-range-picker/src/date-range-picker.js +401 -300
  148. package/lib/divider/src/divider.js +31 -17
  149. package/lib/drawer/src/drawer.js +255 -155
  150. package/lib/dynamics/index.js +38 -25
  151. package/lib/empty/src/empty.js +55 -31
  152. package/lib/form/render/index.js +68 -43
  153. package/lib/form/src/form-config-item.js +24 -18
  154. package/lib/form/src/form-group.js +25 -16
  155. package/lib/form/src/form-item.js +25 -19
  156. package/lib/form/src/form.js +140 -96
  157. package/lib/form/src/itemInfo.js +4 -3
  158. package/lib/form/src/render.js +214 -134
  159. package/lib/form/src/util.js +9 -5
  160. package/lib/icon/src/icon.js +17 -13
  161. package/lib/icon/style/style.css +1 -1
  162. package/lib/icon/style/style.mini.css +1 -1
  163. package/lib/icon-picker/src/icon-picker.js +251 -158
  164. package/lib/image/src/group.js +26 -20
  165. package/lib/image/src/image.js +41 -40
  166. package/lib/image/src/preview.js +206 -146
  167. package/lib/image/src/util.js +6 -3
  168. package/lib/index.common.js +9 -8
  169. package/lib/index.js +9 -8
  170. package/lib/index.umd.js +15131 -10364
  171. package/lib/index.umd.min.js +3 -3
  172. package/lib/input/src/input.js +878 -565
  173. package/lib/layout-aside/src/layout-aside.js +61 -45
  174. package/lib/layout-body/src/layout-body.js +47 -35
  175. package/lib/layout-container/src/layout-container.js +18 -11
  176. package/lib/layout-footer/src/layout-footer.js +17 -8
  177. package/lib/layout-header/src/layout-header.js +16 -8
  178. package/lib/link/src/link.js +69 -48
  179. package/lib/list/src/list.js +456 -336
  180. package/lib/loading/index.js +8 -5
  181. package/lib/loading/src/loading.js +69 -42
  182. package/lib/mention/src/mention.js +4 -3
  183. package/lib/menu/src/menu.js +351 -220
  184. package/lib/modal/index.js +60 -37
  185. package/lib/modal/src/modal.js +306 -208
  186. package/lib/notice-bar/src/notice-bar.js +70 -43
  187. package/lib/number-input/src/number-input.js +290 -213
  188. package/lib/pager/src/pager.js +347 -203
  189. package/lib/password-input/src/password-input.js +155 -115
  190. package/lib/print/src/page-break.js +3 -2
  191. package/lib/print/src/print.js +193 -108
  192. package/lib/pulldown/src/pulldown.js +128 -86
  193. package/lib/radio/src/button.js +96 -61
  194. package/lib/radio/src/group.js +37 -29
  195. package/lib/radio/src/radio.js +65 -45
  196. package/lib/rate/src/rate.js +50 -38
  197. package/lib/result/src/result.js +68 -36
  198. package/lib/row/src/col.js +32 -18
  199. package/lib/row/src/row.js +25 -18
  200. package/lib/scrollbar/src/scrollbar.js +178 -146
  201. package/lib/segmented/src/segmented.js +97 -64
  202. package/lib/select/src/optgroup.js +7 -3
  203. package/lib/select/src/select.js +486 -343
  204. package/lib/select/src/util.js +6 -3
  205. package/lib/slider/src/slider.js +122 -94
  206. package/lib/space/src/space.js +54 -37
  207. package/lib/splitter/src/splitter-panel.js +51 -26
  208. package/lib/splitter/src/splitter.js +233 -158
  209. package/lib/steps/src/steps.js +11 -6
  210. package/lib/style.css +1 -1
  211. package/lib/style.mini.css +1 -1
  212. package/lib/switch/src/switch.js +87 -59
  213. package/lib/table-select/src/table-select.js +234 -155
  214. package/lib/table-transfer/src/table-transfer.js +12 -7
  215. package/lib/tabs/src/tab-pane.js +34 -17
  216. package/lib/tabs/src/tabs.js +365 -232
  217. package/lib/tag/src/tag.js +67 -49
  218. package/lib/text/src/text.js +100 -76
  219. package/lib/text-ellipsis/src/text-ellipsis.js +86 -55
  220. package/lib/textarea/src/textarea.js +127 -97
  221. package/lib/timeline/src/timeline-item.js +3 -2
  222. package/lib/timeline/src/timeline.js +4 -3
  223. package/lib/tip/src/tip.js +58 -34
  224. package/lib/tooltip/src/tooltip.js +116 -76
  225. package/lib/tour/src/tour.js +4 -3
  226. package/lib/transfer/src/transfer.js +44 -27
  227. package/lib/tree/src/tree.js +717 -500
  228. package/lib/tree-select/src/tree-select.js +351 -256
  229. package/lib/ui/index.js +46 -4
  230. package/lib/ui/src/dom.js +9 -6
  231. package/lib/ui/src/log.js +1 -1
  232. package/lib/upload/src/upload.js +708 -492
  233. package/lib/vxe-icon/style/style.css +1 -1
  234. package/lib/vxe-icon/style/style.mini.css +1 -1
  235. package/lib/watermark/src/util.js +15 -12
  236. package/lib/watermark/src/watermark.js +60 -30
  237. package/package.json +10 -4
  238. package/packages/alert/index.ts +16 -16
  239. package/packages/alert/src/alert.ts +148 -126
  240. package/packages/anchor/index.ts +16 -16
  241. package/packages/anchor/src/anchor-link.ts +139 -121
  242. package/packages/anchor/src/anchor.ts +266 -237
  243. package/packages/anchor/src/util.ts +23 -23
  244. package/packages/anchor-link/index.ts +16 -16
  245. package/packages/avatar/index.ts +16 -16
  246. package/packages/avatar/src/avatar.ts +166 -149
  247. package/packages/backtop/index.ts +16 -16
  248. package/packages/backtop/src/backtop.ts +337 -313
  249. package/packages/badge/index.ts +16 -16
  250. package/packages/badge/src/badge.ts +131 -118
  251. package/packages/breadcrumb/index.ts +16 -16
  252. package/packages/breadcrumb/src/breadcrumb-item.ts +129 -106
  253. package/packages/breadcrumb/src/breadcrumb.ts +94 -92
  254. package/packages/breadcrumb-item/index.ts +16 -16
  255. package/packages/button/index.ts +16 -16
  256. package/packages/button/src/button-group.ts +116 -110
  257. package/packages/button/src/button.ts +975 -855
  258. package/packages/button-group/index.ts +16 -16
  259. package/packages/calendar/index.ts +16 -16
  260. package/packages/calendar/src/calendar.ts +1566 -1352
  261. package/packages/card/index.ts +16 -16
  262. package/packages/card/src/card.ts +285 -236
  263. package/packages/carousel/index.ts +16 -16
  264. package/packages/carousel/src/carousel-item.ts +120 -102
  265. package/packages/carousel/src/carousel.ts +475 -414
  266. package/packages/carousel/src/util.ts +21 -21
  267. package/packages/carousel-item/index.ts +16 -16
  268. package/packages/cascader/index.ts +16 -16
  269. package/packages/cascader/src/cascader.ts +2074 -1896
  270. package/packages/cascader/src/util.ts +9 -9
  271. package/packages/checkbox/index.ts +16 -16
  272. package/packages/checkbox/src/button.ts +267 -221
  273. package/packages/checkbox/src/checkbox.ts +219 -199
  274. package/packages/checkbox/src/group.ts +292 -269
  275. package/packages/checkbox-button/index.ts +16 -16
  276. package/packages/checkbox-group/index.ts +16 -16
  277. package/packages/col/index.ts +16 -16
  278. package/packages/collapse/index.ts +16 -16
  279. package/packages/collapse/src/collapse-pane.ts +142 -114
  280. package/packages/collapse/src/collapse.ts +453 -384
  281. package/packages/collapse/src/util.ts +21 -21
  282. package/packages/collapse-pane/index.ts +16 -16
  283. package/packages/color-picker/index.ts +31 -31
  284. package/packages/color-picker/src/color-picker.ts +1310 -1147
  285. package/packages/color-picker/src/util.ts +436 -423
  286. package/packages/components.ts +350 -349
  287. package/packages/context-menu/index.ts +54 -54
  288. package/packages/context-menu/src/context-menu.ts +773 -681
  289. package/packages/countdown/index.ts +16 -16
  290. package/packages/countdown/src/countdown.ts +295 -262
  291. package/packages/date-panel/index.ts +16 -16
  292. package/packages/date-panel/src/date-panel.ts +2214 -1900
  293. package/packages/date-panel/src/util.ts +354 -326
  294. package/packages/date-picker/index.ts +16 -16
  295. package/packages/date-picker/src/date-picker.ts +1884 -1752
  296. package/packages/date-range-picker/index.ts +16 -16
  297. package/packages/date-range-picker/src/date-range-picker.ts +1728 -1604
  298. package/packages/divider/index.ts +16 -16
  299. package/packages/divider/src/divider.ts +105 -93
  300. package/packages/drawer/index.ts +78 -78
  301. package/packages/drawer/src/drawer.ts +920 -802
  302. package/packages/drawer/src/store.ts +3 -3
  303. package/packages/dynamics/index.ts +124 -117
  304. package/packages/empty/index.ts +16 -16
  305. package/packages/empty/src/empty.ts +124 -103
  306. package/packages/form/index.ts +16 -16
  307. package/packages/form/render/index.ts +646 -614
  308. package/packages/form/src/form-config-item.ts +85 -80
  309. package/packages/form/src/form-group.ts +96 -86
  310. package/packages/form/src/form-item.ts +181 -174
  311. package/packages/form/src/form.ts +1122 -1069
  312. package/packages/form/src/itemInfo.ts +84 -82
  313. package/packages/form/src/render.ts +470 -387
  314. package/packages/form/src/util.ts +98 -93
  315. package/packages/form-gather/index.ts +26 -26
  316. package/packages/form-group/index.ts +16 -16
  317. package/packages/form-item/index.ts +16 -16
  318. package/packages/icon/index.ts +16 -16
  319. package/packages/icon/src/icon.ts +78 -75
  320. package/packages/icon-picker/index.ts +16 -16
  321. package/packages/icon-picker/src/icon-picker.ts +922 -809
  322. package/packages/image/index.ts +16 -16
  323. package/packages/image/src/group.ts +159 -153
  324. package/packages/image/src/image.ts +298 -298
  325. package/packages/image/src/preview.ts +749 -672
  326. package/packages/image/src/util.ts +62 -59
  327. package/packages/image-group/index.ts +16 -16
  328. package/packages/image-preview/index.ts +19 -19
  329. package/packages/index.ts +20 -21
  330. package/packages/input/index.ts +16 -16
  331. package/packages/input/src/input.ts +3201 -2863
  332. package/packages/language/fr-FR.ts +15 -15
  333. package/packages/language/it-IT.ts +4 -4
  334. package/packages/language/uk-UA.ts +1 -1
  335. package/packages/language/uz-UZ.ts +13 -13
  336. package/packages/language/zh-CN.ts +907 -907
  337. package/packages/layout-aside/index.ts +16 -16
  338. package/packages/layout-aside/src/layout-aside.ts +172 -156
  339. package/packages/layout-body/index.ts +16 -16
  340. package/packages/layout-body/src/layout-body.ts +191 -181
  341. package/packages/layout-container/index.ts +16 -16
  342. package/packages/layout-container/src/layout-container.ts +108 -92
  343. package/packages/layout-footer/index.ts +16 -16
  344. package/packages/layout-footer/src/layout-footer.ts +81 -74
  345. package/packages/layout-header/index.ts +16 -16
  346. package/packages/layout-header/src/layout-header.ts +79 -73
  347. package/packages/link/index.ts +16 -16
  348. package/packages/link/src/link.ts +180 -161
  349. package/packages/list/index.ts +16 -16
  350. package/packages/list/src/list.ts +2690 -2564
  351. package/packages/list/src/store.ts +10 -10
  352. package/packages/list/src/util.ts +10 -11
  353. package/packages/loading/index.ts +39 -36
  354. package/packages/loading/src/loading.ts +179 -152
  355. package/packages/mention/index.ts +16 -16
  356. package/packages/mention/src/mention.ts +69 -71
  357. package/packages/menu/index.ts +16 -16
  358. package/packages/menu/src/menu.ts +1000 -857
  359. package/packages/modal/index.ts +164 -141
  360. package/packages/modal/src/modal.ts +1803 -1681
  361. package/packages/modal/src/store.ts +3 -3
  362. package/packages/notice-bar/index.ts +16 -16
  363. package/packages/notice-bar/src/notice-bar.ts +207 -181
  364. package/packages/number-input/index.ts +16 -16
  365. package/packages/number-input/src/number-input.ts +1322 -1242
  366. package/packages/number-input/src/util.ts +25 -25
  367. package/packages/optgroup/index.ts +16 -16
  368. package/packages/option/index.ts +16 -16
  369. package/packages/pager/index.ts +16 -16
  370. package/packages/pager/src/pager.ts +919 -775
  371. package/packages/password-input/index.ts +16 -16
  372. package/packages/password-input/src/password-input.ts +523 -482
  373. package/packages/print/index.ts +18 -18
  374. package/packages/print/src/page-break.ts +104 -92
  375. package/packages/print/src/print.ts +366 -281
  376. package/packages/print/src/util.ts +299 -304
  377. package/packages/print-page-break/index.ts +16 -16
  378. package/packages/pulldown/index.ts +16 -16
  379. package/packages/pulldown/src/pulldown.ts +505 -445
  380. package/packages/radio/index.ts +16 -16
  381. package/packages/radio/src/button.ts +290 -243
  382. package/packages/radio/src/group.ts +275 -252
  383. package/packages/radio/src/radio.ts +237 -218
  384. package/packages/radio-button/index.ts +16 -16
  385. package/packages/radio-group/index.ts +16 -16
  386. package/packages/rate/index.ts +16 -16
  387. package/packages/rate/src/rate.ts +203 -192
  388. package/packages/result/index.ts +16 -16
  389. package/packages/result/src/result.ts +141 -112
  390. package/packages/row/index.ts +16 -16
  391. package/packages/row/src/col.ts +171 -159
  392. package/packages/row/src/row.ts +143 -138
  393. package/packages/scrollbar/index.ts +16 -16
  394. package/packages/scrollbar/src/scrollbar.ts +626 -595
  395. package/packages/segmented/index.ts +16 -16
  396. package/packages/segmented/src/segmented.ts +297 -264
  397. package/packages/select/index.ts +16 -16
  398. package/packages/select/src/optgroup.ts +53 -49
  399. package/packages/select/src/option-info.ts +20 -20
  400. package/packages/select/src/option.ts +47 -47
  401. package/packages/select/src/select.ts +2390 -2214
  402. package/packages/select/src/util.ts +50 -47
  403. package/packages/slider/index.ts +16 -16
  404. package/packages/slider/src/slider.ts +547 -506
  405. package/packages/space/index.ts +16 -16
  406. package/packages/space/src/space.ts +225 -209
  407. package/packages/split/index.ts +16 -16
  408. package/packages/split-pane/index.ts +17 -17
  409. package/packages/splitter/index.ts +16 -16
  410. package/packages/splitter/src/splitter-panel.ts +199 -163
  411. package/packages/splitter/src/splitter.ts +1110 -1020
  412. package/packages/splitter/src/util.ts +21 -21
  413. package/packages/splitter-panel/index.ts +16 -16
  414. package/packages/steps/index.ts +16 -16
  415. package/packages/steps/src/steps.ts +69 -68
  416. package/packages/switch/index.ts +16 -16
  417. package/packages/switch/src/switch.ts +300 -271
  418. package/packages/tab-pane/index.ts +16 -16
  419. package/packages/table-select/index.ts +16 -16
  420. package/packages/table-select/src/table-select.ts +1103 -999
  421. package/packages/table-transfer/index.ts +16 -16
  422. package/packages/table-transfer/src/table-transfer.ts +104 -91
  423. package/packages/tabs/index.ts +16 -16
  424. package/packages/tabs/src/tab-pane.ts +132 -117
  425. package/packages/tabs/src/tabs.ts +1137 -997
  426. package/packages/tabs/src/util.ts +21 -21
  427. package/packages/tag/index.ts +16 -16
  428. package/packages/tag/src/tag.ts +204 -187
  429. package/packages/text/index.ts +16 -16
  430. package/packages/text/src/text.ts +282 -260
  431. package/packages/text-ellipsis/index.ts +16 -16
  432. package/packages/text-ellipsis/src/text-ellipsis.ts +312 -282
  433. package/packages/textarea/index.ts +16 -16
  434. package/packages/textarea/src/textarea.ts +526 -495
  435. package/packages/timeline/index.ts +16 -16
  436. package/packages/timeline/src/timeline-item.ts +65 -67
  437. package/packages/timeline/src/timeline.ts +70 -71
  438. package/packages/timeline-item/index.ts +16 -16
  439. package/packages/tip/index.ts +19 -19
  440. package/packages/tip/src/tip.ts +150 -129
  441. package/packages/tooltip/index.ts +72 -72
  442. package/packages/tooltip/src/tooltip.ts +669 -627
  443. package/packages/tour/index.ts +16 -16
  444. package/packages/tour/src/tour.ts +70 -71
  445. package/packages/transfer/index.ts +16 -16
  446. package/packages/transfer/src/transfer.ts +130 -117
  447. package/packages/tree/index.ts +16 -16
  448. package/packages/tree/src/store.ts +10 -10
  449. package/packages/tree/src/tree.ts +4077 -3852
  450. package/packages/tree/src/util.ts +51 -51
  451. package/packages/tree-select/index.ts +16 -16
  452. package/packages/tree-select/src/tree-select.ts +1217 -1094
  453. package/packages/ui/index.ts +836 -793
  454. package/packages/ui/src/anime.ts +51 -52
  455. package/packages/ui/src/comp.ts +3 -3
  456. package/packages/ui/src/dom.ts +357 -354
  457. package/packages/ui/src/log.ts +19 -19
  458. package/packages/ui/src/utils.ts +79 -79
  459. package/packages/ui/src/vn.ts +39 -39
  460. package/packages/upload/index.ts +20 -20
  461. package/packages/upload/src/upload.ts +2271 -2021
  462. package/packages/upload/src/util.ts +109 -109
  463. package/packages/watermark/index.ts +33 -33
  464. package/packages/watermark/src/util.ts +186 -180
  465. package/packages/watermark/src/watermark.ts +196 -168
  466. package/types/all.d.ts +552 -552
  467. package/types/components/alert.d.ts +83 -87
  468. package/types/components/anchor-link.d.ts +88 -91
  469. package/types/components/anchor.d.ts +97 -104
  470. package/types/components/avatar.d.ts +85 -88
  471. package/types/components/backtop.d.ts +119 -122
  472. package/types/components/badge.d.ts +77 -80
  473. package/types/components/breadcrumb-item.d.ts +77 -80
  474. package/types/components/breadcrumb.d.ts +83 -87
  475. package/types/components/button-group.d.ts +118 -120
  476. package/types/components/button.d.ts +331 -339
  477. package/types/components/calendar.d.ts +247 -264
  478. package/types/components/card.d.ts +111 -113
  479. package/types/components/carousel-item.d.ts +73 -75
  480. package/types/components/carousel.d.ts +130 -134
  481. package/types/components/cascader.d.ts +336 -386
  482. package/types/components/checkbox-button.d.ts +109 -114
  483. package/types/components/checkbox-group.d.ts +152 -154
  484. package/types/components/checkbox.d.ts +123 -128
  485. package/types/components/col.d.ts +77 -80
  486. package/types/components/colgroup.d.ts +64 -69
  487. package/types/components/collapse-pane.d.ts +86 -89
  488. package/types/components/collapse.d.ts +123 -133
  489. package/types/components/color-picker.d.ts +275 -280
  490. package/types/components/column.d.ts +834 -851
  491. package/types/components/context-menu.d.ts +282 -289
  492. package/types/components/countdown.d.ts +108 -112
  493. package/types/components/date-panel.d.ts +319 -331
  494. package/types/components/date-picker.d.ts +361 -384
  495. package/types/components/date-range-picker.d.ts +351 -371
  496. package/types/components/divider.d.ts +72 -75
  497. package/types/components/drawer.d.ts +333 -344
  498. package/types/components/empty.d.ts +75 -78
  499. package/types/components/flow-design.d.ts +73 -85
  500. package/types/components/flow-view.d.ts +73 -85
  501. package/types/components/form-design.d.ts +370 -376
  502. package/types/components/form-gather.d.ts +120 -124
  503. package/types/components/form-group.d.ts +73 -77
  504. package/types/components/form-item.d.ts +395 -413
  505. package/types/components/form-view.d.ts +179 -183
  506. package/types/components/form.d.ts +499 -495
  507. package/types/components/gantt-module/gantt-view.d.ts +195 -200
  508. package/types/components/gantt-module/index.d.ts +1 -1
  509. package/types/components/gantt-plugins/extend-gantt-chart.d.ts +137 -131
  510. package/types/components/gantt-plugins/index.d.ts +1 -1
  511. package/types/components/gantt.d.ts +1248 -1399
  512. package/types/components/grid.d.ts +1289 -1317
  513. package/types/components/icon-picker.d.ts +242 -253
  514. package/types/components/icon.d.ts +332 -87
  515. package/types/components/image-group.d.ts +124 -127
  516. package/types/components/image-preview.d.ts +167 -167
  517. package/types/components/image.d.ts +166 -173
  518. package/types/components/input.d.ts +429 -453
  519. package/types/components/layout-aside.d.ts +123 -123
  520. package/types/components/layout-body.d.ts +110 -113
  521. package/types/components/layout-container.d.ts +73 -75
  522. package/types/components/layout-footer.d.ts +71 -73
  523. package/types/components/layout-header.d.ts +67 -69
  524. package/types/components/link.d.ts +107 -111
  525. package/types/components/list-design.d.ts +189 -190
  526. package/types/components/list-view.d.ts +193 -199
  527. package/types/components/list.d.ts +678 -715
  528. package/types/components/loading.d.ts +98 -103
  529. package/types/components/mention.d.ts +70 -77
  530. package/types/components/menu.d.ts +284 -295
  531. package/types/components/modal.d.ts +567 -584
  532. package/types/components/notice-bar.d.ts +102 -106
  533. package/types/components/number-input.d.ts +359 -365
  534. package/types/components/optgroup.d.ts +85 -88
  535. package/types/components/option.d.ts +94 -103
  536. package/types/components/pager.d.ts +330 -335
  537. package/types/components/password-input.d.ts +143 -156
  538. package/types/components/print-page-break.d.ts +65 -69
  539. package/types/components/print.d.ts +243 -245
  540. package/types/components/pulldown.d.ts +231 -239
  541. package/types/components/radio-button.d.ts +113 -118
  542. package/types/components/radio-group.d.ts +151 -153
  543. package/types/components/radio.d.ts +129 -134
  544. package/types/components/rate.d.ts +83 -88
  545. package/types/components/result.d.ts +81 -84
  546. package/types/components/row.d.ts +77 -81
  547. package/types/components/scrollbar.d.ts +299 -305
  548. package/types/components/segmented.d.ts +119 -123
  549. package/types/components/select.d.ts +598 -616
  550. package/types/components/slider.d.ts +137 -151
  551. package/types/components/space.d.ts +120 -127
  552. package/types/components/split-pane.d.ts +126 -133
  553. package/types/components/split.d.ts +301 -312
  554. package/types/components/splitter-panel.d.ts +123 -130
  555. package/types/components/splitter.d.ts +290 -301
  556. package/types/components/steps.d.ts +63 -68
  557. package/types/components/switch.d.ts +127 -133
  558. package/types/components/tab-pane.d.ts +111 -114
  559. package/types/components/table-module/custom.d.ts +123 -123
  560. package/types/components/table-module/edit.d.ts +297 -276
  561. package/types/components/table-module/export.d.ts +88 -96
  562. package/types/components/table-module/filter.d.ts +144 -144
  563. package/types/components/table-module/index.d.ts +7 -7
  564. package/types/components/table-module/keyboard.d.ts +26 -26
  565. package/types/components/table-module/menu.d.ts +46 -46
  566. package/types/components/table-module/validator.d.ts +53 -53
  567. package/types/components/table-plugins/extend-cell-area.d.ts +781 -781
  568. package/types/components/table-plugins/extend-pivot-table.d.ts +59 -58
  569. package/types/components/table-plugins/filters-combination.d.ts +15 -15
  570. package/types/components/table-plugins/filters-complex-input.d.ts +9 -9
  571. package/types/components/table-plugins/index.d.ts +4 -4
  572. package/types/components/table-select.d.ts +268 -276
  573. package/types/components/table-transfer.d.ts +80 -84
  574. package/types/components/table.d.ts +7530 -8000
  575. package/types/components/tabs.d.ts +314 -352
  576. package/types/components/tag.d.ts +108 -114
  577. package/types/components/text-ellipsis.d.ts +107 -112
  578. package/types/components/text.d.ts +112 -122
  579. package/types/components/textarea.d.ts +261 -275
  580. package/types/components/timeline-item.d.ts +66 -75
  581. package/types/components/timeline.d.ts +70 -77
  582. package/types/components/tip.d.ts +81 -83
  583. package/types/components/toolbar.d.ts +327 -336
  584. package/types/components/tooltip.d.ts +250 -255
  585. package/types/components/tour.d.ts +70 -77
  586. package/types/components/transfer.d.ts +80 -84
  587. package/types/components/tree-select.d.ts +361 -376
  588. package/types/components/tree.d.ts +994 -1036
  589. package/types/components/upload.d.ts +477 -518
  590. package/types/components/watermark.d.ts +116 -120
  591. package/types/handles/form-design.d.ts +50 -50
  592. package/types/handles/index.d.ts +3 -3
  593. package/types/handles/list-design.d.ts +1 -2
  594. package/types/handles/table.d.ts +15 -15
  595. package/types/index.d.ts +8 -8
  596. package/types/ui/commands.d.ts +57 -57
  597. package/types/ui/formats.d.ts +62 -62
  598. package/types/ui/global-config.d.ts +269 -269
  599. package/types/ui/global-icon.d.ts +315 -315
  600. package/types/ui/hooks.d.ts +13 -13
  601. package/types/ui/index.d.ts +100 -100
  602. package/types/ui/interceptor.d.ts +52 -52
  603. package/types/ui/menus.d.ts +89 -89
  604. package/types/ui/renderer.d.ts +1033 -1047
  605. package/types/ui/validators.d.ts +37 -38
  606. /package/dist/{iconfont.1792992046297.ttf → iconfont.1793007755017.ttf} +0 -0
  607. /package/dist/{iconfont.1792992046297.woff → iconfont.1793007755017.woff} +0 -0
  608. /package/dist/{iconfont.1792992046297.woff2 → iconfont.1793007755017.woff2} +0 -0
  609. /package/es/icon/{iconfont.1792992046297.ttf → iconfont.1793007755017.ttf} +0 -0
  610. /package/es/icon/{iconfont.1792992046297.woff → iconfont.1793007755017.woff} +0 -0
  611. /package/es/icon/{iconfont.1792992046297.woff2 → iconfont.1793007755017.woff2} +0 -0
  612. /package/es/{iconfont.1792992046297.ttf → iconfont.1793007755017.ttf} +0 -0
  613. /package/es/{iconfont.1792992046297.woff → iconfont.1793007755017.woff} +0 -0
  614. /package/es/{iconfont.1792992046297.woff2 → iconfont.1793007755017.woff2} +0 -0
  615. /package/es/vxe-icon/{iconfont.1792992046297.ttf → iconfont.1793007755017.ttf} +0 -0
  616. /package/es/vxe-icon/{iconfont.1792992046297.woff → iconfont.1793007755017.woff} +0 -0
  617. /package/es/vxe-icon/{iconfont.1792992046297.woff2 → iconfont.1793007755017.woff2} +0 -0
  618. /package/lib/icon/style/{iconfont.1792992046297.ttf → iconfont.1793007755017.ttf} +0 -0
  619. /package/lib/icon/style/{iconfont.1792992046297.woff → iconfont.1793007755017.woff} +0 -0
  620. /package/lib/icon/style/{iconfont.1792992046297.woff2 → iconfont.1793007755017.woff2} +0 -0
  621. /package/lib/{iconfont.1792992046297.ttf → iconfont.1793007755017.ttf} +0 -0
  622. /package/lib/{iconfont.1792992046297.woff → iconfont.1793007755017.woff} +0 -0
  623. /package/lib/{iconfont.1792992046297.woff2 → iconfont.1793007755017.woff2} +0 -0
  624. /package/lib/vxe-icon/style/{iconfont.1792992046297.ttf → iconfont.1793007755017.ttf} +0 -0
  625. /package/lib/vxe-icon/style/{iconfont.1792992046297.woff → iconfont.1793007755017.woff} +0 -0
  626. /package/lib/vxe-icon/style/{iconfont.1792992046297.woff2 → iconfont.1793007755017.woff2} +0 -0
@@ -1,681 +1,773 @@
1
- import { ref, h, reactive, PropType, computed, VNode, watch, onMounted, onBeforeUnmount, nextTick } from 'vue'
2
- import { defineVxeComponent } from '../../ui/src/comp'
3
- import XEUtils from 'xe-utils'
4
- import { getConfig, getIcon, getI18n, createEvent, useSize, globalEvents, renderEmptyElement, GLOBAL_EVENT_KEYS } from '../../ui'
5
- import { getLastZIndex, nextSubZIndex, nextZIndex, getFuncText } from '../../ui/src/utils'
6
- import { getDomNode, getEventTargetNode, toCssUnit } from '../../ui/src/dom'
7
- import { getSlotVNs } from '../../ui/src/vn'
8
-
9
- import type { ContextMenuInternalData, ContextMenuReactData, VxeContextMenuPropTypes, VxeContextMenuDefines, ContextMenuPrivateRef, VxeContextMenuEmits, VxeContextMenuPrivateComputed, ContextMenuMethods, ContextMenuPrivateMethods, VxeContextMenuConstructor, VxeContextMenuPrivateMethods, ValueOf } from '../../../types'
10
-
11
- function createInternalData (): ContextMenuInternalData {
12
- return {
13
- // leaveTime: null
14
- }
15
- }
16
-
17
- function createReactData (): ContextMenuReactData {
18
- return {
19
- visible: false,
20
- activeOption: null,
21
- activeChildOption: null,
22
- popupStyle: {
23
- top: '',
24
- left: '',
25
- zIndex: 0
26
- },
27
- childOffsetX: 0
28
- }
29
- }
30
-
31
- export default defineVxeComponent({
32
- name: 'VxeContextMenu',
33
- props: {
34
- modelValue: Boolean as PropType<VxeContextMenuPropTypes.ModelValue>,
35
- className: String as PropType<VxeContextMenuPropTypes.ClassName>,
36
- size: {
37
- type: String as PropType<VxeContextMenuPropTypes.Size>,
38
- default: () => getConfig().contextMenu.size || getConfig().size
39
- },
40
- options: Array as PropType<VxeContextMenuPropTypes.Options>,
41
- x: [Number, String] as PropType<VxeContextMenuPropTypes.X>,
42
- y: [Number, String] as PropType<VxeContextMenuPropTypes.Y>,
43
- autoLocate: {
44
- type: Boolean as PropType<VxeContextMenuPropTypes.AutoLocate>,
45
- default: () => getConfig().contextMenu.autoLocate
46
- },
47
- zIndex: [Number, String] as PropType<VxeContextMenuPropTypes.ZIndex>,
48
- position: {
49
- type: String as PropType<VxeContextMenuPropTypes.Position>,
50
- default: () => getConfig().contextMenu.position
51
- },
52
- destroyOnClose: {
53
- type: Boolean as PropType<VxeContextMenuPropTypes.DestroyOnClose>,
54
- default: () => getConfig().contextMenu.destroyOnClose
55
- },
56
- transfer: {
57
- type: Boolean as PropType<VxeContextMenuPropTypes.Transfer>,
58
- default: () => getConfig().contextMenu.transfer
59
- }
60
- },
61
- emits: [
62
- 'update:modelValue',
63
- 'option-click',
64
- 'change',
65
- 'show',
66
- 'hide'
67
- ] as VxeContextMenuEmits,
68
- setup (props, context) {
69
- const { emit } = context
70
-
71
- const xID = XEUtils.uniqueId()
72
-
73
- const refElem = ref<HTMLDivElement>()
74
-
75
- const { computeSize } = useSize(props)
76
-
77
- const internalData = createInternalData()
78
- const reactData = reactive(createReactData())
79
-
80
- const refMaps: ContextMenuPrivateRef = {
81
- refElem
82
- }
83
-
84
- const computeMenuGroups = computed(() => {
85
- const { options } = props
86
- return options || []
87
- })
88
-
89
- const computeAllFirstMenuList = computed(() => {
90
- const menuGroups: VxeContextMenuDefines.MenuFirstOption[] = computeMenuGroups.value
91
- const firstList = []
92
- for (let i = 0; i < menuGroups.length; i++) {
93
- const list = menuGroups[i]
94
- for (let j = 0; j < list.length; j++) {
95
- const firstItem = list[j]
96
- if (hasValidItem(firstItem)) {
97
- firstList.push(firstItem)
98
- }
99
- }
100
- }
101
- return firstList
102
- })
103
-
104
- const computeTopAndLeft = computed(() => {
105
- const { x, y } = props
106
- return `${x}${y}`
107
- })
108
-
109
- const computeMaps: VxeContextMenuPrivateComputed = {
110
- }
111
-
112
- const $xeContextMenu = {
113
- xID,
114
- props,
115
- context,
116
- reactData,
117
-
118
- getRefMaps: () => refMaps,
119
- getComputeMaps: () => computeMaps
120
- } as unknown as VxeContextMenuConstructor & VxeContextMenuPrivateMethods
121
-
122
- const dispatchEvent = (type: ValueOf<VxeContextMenuEmits>, params: Record<string, any>, evnt: Event | null) => {
123
- emit(type, createEvent(evnt, { $contextMenu: $xeContextMenu }, params))
124
- }
125
-
126
- const emitModel = (value: any) => {
127
- emit('update:modelValue', value)
128
- }
129
-
130
- const openMenu = () => {
131
- const { modelValue } = props
132
- const { visible } = reactData
133
- const value = true
134
- reactData.visible = value
135
- handleLocate()
136
- updateZindex()
137
- if (modelValue !== value) {
138
- emitModel(value)
139
- dispatchEvent('change', { value }, null)
140
- }
141
- if (visible !== value) {
142
- dispatchEvent('show', { visible: value }, null)
143
- }
144
- return nextTick().then(() => {
145
- updateLocate()
146
- })
147
- }
148
-
149
- const closeMenu = () => {
150
- const { modelValue } = props
151
- const { visible } = reactData
152
- const value = false
153
- reactData.visible = value
154
- if (modelValue !== value) {
155
- emitModel(value)
156
- dispatchEvent('change', { value }, null)
157
- }
158
- if (visible !== value) {
159
- dispatchEvent('hide', { visible: value }, null)
160
- }
161
- return nextTick()
162
- }
163
-
164
- const handleLocate = () => {
165
- const { x, y } = props
166
- const { popupStyle } = reactData
167
- popupStyle.left = toCssUnit(x || 0)
168
- popupStyle.top = toCssUnit(y || 0)
169
- updateLocate()
170
- }
171
-
172
- const updateZindex = () => {
173
- const { zIndex, transfer } = props
174
- const { popupStyle } = reactData
175
- const menuZIndex = popupStyle.zIndex
176
- if (zIndex) {
177
- popupStyle.zIndex = XEUtils.toNumber(zIndex)
178
- } else {
179
- if (menuZIndex < getLastZIndex()) {
180
- popupStyle.zIndex = transfer ? nextSubZIndex() : nextZIndex()
181
- }
182
- }
183
- }
184
-
185
- const updateLocate = () => {
186
- const { autoLocate, position } = props
187
- const { popupStyle } = reactData
188
- if (autoLocate) {
189
- const wrapperEl = refElem.value
190
- if (wrapperEl) {
191
- const { visibleWidth, visibleHeight } = getDomNode()
192
- const wrapperStyle = getComputedStyle(wrapperEl)
193
- const offsetTop = XEUtils.toNumber(wrapperStyle.top)
194
- const offsetLeft = XEUtils.toNumber(wrapperStyle.left)
195
- const wrapperWidth = wrapperEl.offsetWidth
196
- const wrapperHeight = wrapperEl.offsetHeight
197
- if (position === 'absolute') {
198
- //
199
- } else {
200
- if (offsetTop + wrapperHeight > visibleHeight) {
201
- popupStyle.top = `${Math.max(0, offsetTop - wrapperHeight)}px`
202
- }
203
- if (offsetLeft + wrapperWidth > visibleWidth) {
204
- popupStyle.left = `${Math.max(0, offsetLeft - wrapperWidth)}px`
205
- }
206
- }
207
- }
208
- }
209
- updateChildLocate()
210
- }
211
-
212
- const updateChildLocate = () => {
213
- const wrapperEl = refElem.value
214
- if (wrapperEl) {
215
- const { visibleWidth } = getDomNode()
216
- const owSize = 4
217
-
218
- const handleStyle = () => {
219
- const wrapperStyle = getComputedStyle(wrapperEl)
220
- const offsetLeft = XEUtils.toNumber(wrapperStyle.left)
221
- const wrapperWidth = wrapperEl.offsetWidth
222
- const childEl = wrapperEl.querySelector<HTMLDivElement>('.vxe-context-menu--children-wrapper')
223
- const childWidth = childEl ? childEl.offsetWidth : wrapperWidth
224
- if ((offsetLeft + wrapperWidth) > (visibleWidth - childWidth)) {
225
- // 往左
226
- reactData.childOffsetX = -childWidth + owSize
227
- } else {
228
- // 往右
229
- reactData.childOffsetX = wrapperWidth - owSize
230
- }
231
- }
232
- handleStyle()
233
- nextTick(() => {
234
- handleStyle()
235
- })
236
- }
237
- }
238
-
239
- const handleVisible = () => {
240
- const { modelValue } = props
241
- if (modelValue) {
242
- openMenu()
243
- } else {
244
- closeMenu()
245
- }
246
- }
247
-
248
- const tagMethods: ContextMenuMethods = {
249
- dispatchEvent,
250
- open: openMenu,
251
- close: closeMenu
252
- }
253
-
254
- const hasChildMenu = (item: VxeContextMenuDefines.MenuFirstOption | VxeContextMenuDefines.MenuChildOption) => {
255
- const { children } = item as VxeContextMenuDefines.MenuFirstOption
256
- return children && children.some((child) => child.visible !== false)
257
- }
258
-
259
- const handleItemClickEvent = (evnt: MouseEvent | KeyboardEvent, item: VxeContextMenuDefines.MenuFirstOption | VxeContextMenuDefines.MenuChildOption) => {
260
- evnt.preventDefault()
261
- evnt.stopPropagation()
262
- if (!item.disabled && !item.loading && !hasChildMenu(item)) {
263
- dispatchEvent('option-click', { option: item }, evnt)
264
- closeMenu()
265
- }
266
- }
267
-
268
- const handleItemMouseenterEvent = (evnt: MouseEvent, item: VxeContextMenuDefines.MenuFirstOption | VxeContextMenuDefines.MenuChildOption, parentitem?: VxeContextMenuDefines.MenuFirstOption | null) => {
269
- const { leaveTime } = internalData
270
- if (leaveTime) {
271
- clearTimeout(leaveTime)
272
- }
273
- reactData.activeOption = parentitem || item
274
- if (parentitem) {
275
- reactData.activeOption = parentitem
276
- reactData.activeChildOption = item
277
- } else {
278
- reactData.activeOption = item
279
- if (hasChildMenu(item)) {
280
- reactData.activeChildOption = findFirstChildItem(item)
281
- nextTick(() => {
282
- updateChildLocate()
283
- })
284
- } else {
285
- reactData.activeChildOption = null
286
- }
287
- }
288
- }
289
-
290
- const handleItemMouseleaveEvent = () => {
291
- const { leaveTime } = internalData
292
- if (leaveTime) {
293
- clearTimeout(leaveTime)
294
- }
295
- internalData.leaveTime = setTimeout(() => {
296
- internalData.leaveTime = null
297
- reactData.activeOption = null
298
- reactData.activeChildOption = null
299
- }, 300)
300
- }
301
-
302
- const hasValidItem = (item: VxeContextMenuDefines.MenuFirstOption | VxeContextMenuDefines.MenuChildOption) => {
303
- return !item.loading && !item.disabled && item.visible !== false
304
- }
305
-
306
- const findNextFirstItem = (allFirstList: VxeContextMenuDefines.MenuFirstOption[], firstItem: VxeContextMenuDefines.MenuFirstOption) => {
307
- for (let i = 0; i < allFirstList.length; i++) {
308
- const item = allFirstList[i]
309
- if (firstItem === item) {
310
- const nextItem = allFirstList[i + 1]
311
- if (nextItem) {
312
- return nextItem
313
- }
314
- }
315
- }
316
- return XEUtils.first(allFirstList)
317
- }
318
-
319
- const findPrevFirstItem = (allFirstList: VxeContextMenuDefines.MenuFirstOption[], firstItem: VxeContextMenuDefines.MenuFirstOption) => {
320
- for (let i = 0; i < allFirstList.length; i++) {
321
- const item = allFirstList[i]
322
- if (firstItem === item) {
323
- if (i > 0) {
324
- return allFirstList[i - 1]
325
- }
326
- }
327
- }
328
- return XEUtils.last(allFirstList)
329
- }
330
-
331
- const findFirstChildItem = (firstItem: VxeContextMenuDefines.MenuFirstOption) => {
332
- const { children } = firstItem
333
- if (children) {
334
- for (let i = 0; i < children.length; i++) {
335
- const item = children[i]
336
- if (hasValidItem(item)) {
337
- return item
338
- }
339
- }
340
- }
341
- return null
342
- }
343
-
344
- const findPrevChildItem = (firstItem: VxeContextMenuDefines.MenuFirstOption, childItem: VxeContextMenuDefines.MenuChildOption) => {
345
- const { children } = firstItem
346
- let prevValidItem = null
347
- if (children) {
348
- for (let i = 0; i < children.length; i++) {
349
- const item = children[i]
350
- if (childItem === item) {
351
- break
352
- }
353
- if (hasValidItem(item)) {
354
- prevValidItem = item
355
- }
356
- }
357
- if (!prevValidItem) {
358
- for (let len = children.length - 1; len >= 0; len--) {
359
- const item = children[len]
360
- if (hasValidItem(item)) {
361
- return item
362
- }
363
- }
364
- }
365
- }
366
- return prevValidItem
367
- }
368
-
369
- const findNextChildItem = (firstItem: VxeContextMenuDefines.MenuFirstOption, childItem: VxeContextMenuDefines.MenuChildOption) => {
370
- const { children } = firstItem
371
- let firstValidItem = null
372
- if (children) {
373
- let isMetch = false
374
- for (let i = 0; i < children.length; i++) {
375
- const item = children[i]
376
- if (!firstValidItem) {
377
- if (hasValidItem(item)) {
378
- firstValidItem = item
379
- }
380
- }
381
- if (isMetch) {
382
- if (hasValidItem(item)) {
383
- return item
384
- }
385
- } else {
386
- isMetch = childItem === item
387
- }
388
- }
389
- }
390
- return firstValidItem
391
- }
392
-
393
- const handleGlobalMousewheelEvent = (evnt: MouseEvent) => {
394
- const { visible } = reactData
395
- if (visible) {
396
- const el = refElem.value
397
- if (!getEventTargetNode(evnt, el, '').flag) {
398
- closeMenu()
399
- }
400
- }
401
- }
402
-
403
- const handleGlobalKeydownEvent = (evnt: KeyboardEvent) => {
404
- const { visible, activeOption, activeChildOption } = reactData
405
- const allFirstMenuList = computeAllFirstMenuList.value
406
- if (visible) {
407
- const isUpArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_UP)
408
- const isDwArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_DOWN)
409
- const isLeftArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_LEFT)
410
- const isRightArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_RIGHT)
411
- const isEnter = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ENTER)
412
- const isEsc = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ESCAPE)
413
- if (isEsc) {
414
- closeMenu()
415
- return
416
- }
417
- // 回车选中
418
- if (isEnter) {
419
- if (activeOption || activeChildOption) {
420
- evnt.preventDefault()
421
- evnt.stopPropagation()
422
- if (!activeChildOption && hasChildMenu(activeOption)) {
423
- reactData.activeChildOption = findFirstChildItem(activeOption)
424
- updateChildLocate()
425
- return
426
- }
427
- handleItemClickEvent(evnt, activeChildOption || activeOption)
428
- return
429
- }
430
- }
431
- // 方向键操作
432
- if (activeChildOption) {
433
- if (isUpArrow) {
434
- evnt.preventDefault()
435
- reactData.activeChildOption = findPrevChildItem(activeOption, activeChildOption)
436
- updateChildLocate()
437
- } else if (isDwArrow) {
438
- evnt.preventDefault()
439
- reactData.activeChildOption = findNextChildItem(activeOption, activeChildOption)
440
- updateChildLocate()
441
- } else if (isLeftArrow) {
442
- evnt.preventDefault()
443
- reactData.activeChildOption = null
444
- }
445
- } else if (activeOption) {
446
- evnt.preventDefault()
447
- if (isUpArrow) {
448
- reactData.activeOption = findPrevFirstItem(allFirstMenuList, activeOption)
449
- } else if (isDwArrow) {
450
- reactData.activeOption = findNextFirstItem(allFirstMenuList, activeOption)
451
- } else {
452
- if (hasChildMenu(activeOption)) {
453
- if (isRightArrow) {
454
- reactData.activeChildOption = findFirstChildItem(activeOption)
455
- updateChildLocate()
456
- }
457
- }
458
- }
459
- } else {
460
- evnt.preventDefault()
461
- reactData.activeOption = XEUtils.first(allFirstMenuList)
462
- }
463
- }
464
- }
465
-
466
- const handleGlobalMousedownEvent = (evnt: MouseEvent) => {
467
- const { visible } = reactData
468
- if (visible) {
469
- const el = refElem.value
470
- if (!getEventTargetNode(evnt, el, '').flag) {
471
- closeMenu()
472
- }
473
- }
474
- }
475
-
476
- const handleGlobalBlurEvent = () => {
477
- const { visible } = reactData
478
- if (visible) {
479
- closeMenu()
480
- }
481
- }
482
-
483
- const tagPrivateMethods: ContextMenuPrivateMethods = {
484
- }
485
-
486
- Object.assign($xeContextMenu, tagMethods, tagPrivateMethods)
487
-
488
- const renderMenuItem = (item: VxeContextMenuDefines.MenuFirstOption | VxeContextMenuDefines.MenuChildOption, parentItem: VxeContextMenuDefines.MenuFirstOption | VxeContextMenuDefines.MenuChildOption | null, hasChildMenus?: boolean) => {
489
- const { visible, disabled, loading } = item
490
- if (visible === false) {
491
- return renderEmptyElement($xeContextMenu)
492
- }
493
- const prefixOpts = Object.assign({}, item.prefixConfig)
494
- const prefixIcon = prefixOpts.icon || item.prefixIcon
495
- const suffixOpts = Object.assign({}, item.suffixConfig)
496
- const suffixIcon = suffixOpts.icon || item.suffixIcon
497
- const menuContent = loading ? getI18n('vxe.contextMenu.loadingText') : getFuncText(item.name)
498
- return h('div', {
499
- class: ['vxe-context-menu--item-inner', {
500
- 'is--disabled': disabled,
501
- 'is--loading': loading
502
- }],
503
- onClick (evnt) {
504
- handleItemClickEvent(evnt, item)
505
- },
506
- onMouseenter (evnt) {
507
- handleItemMouseenterEvent(evnt, item, parentItem)
508
- },
509
- onMouseleave: handleItemMouseleaveEvent
510
- }, [
511
- h('div', {
512
- class: ['vxe-context-menu--item-prefix', prefixOpts.className || '']
513
- }, loading
514
- ? [
515
- h('span', {
516
- key: '1'
517
- }, [
518
- h('i', {
519
- class: getIcon().CONTEXT_MENU_OPTION_LOADING
520
- })
521
- ])
522
- ]
523
- : [
524
- prefixIcon && XEUtils.isFunction(prefixIcon)
525
- ? h('span', {
526
- key: '2'
527
- }, getSlotVNs(prefixIcon({})))
528
- : h('span', {
529
- key: '3'
530
- }, [
531
- h('i', {
532
- class: prefixIcon
533
- })
534
- ]),
535
- prefixOpts.content
536
- ? h('span', {
537
- key: '4'
538
- }, `${prefixOpts.content || ''}`)
539
- : renderEmptyElement($xeContextMenu)
540
- ]),
541
- h('div', {
542
- class: 'vxe-context-menu--item-label'
543
- }, menuContent),
544
- !loading && (suffixIcon || suffixOpts.content)
545
- ? h('div', {
546
- class: ['vxe-context-menu--item-suffix', suffixOpts.className || '']
547
- }, [
548
- suffixIcon && XEUtils.isFunction(suffixIcon)
549
- ? h('span', {
550
- key: '2'
551
- }, getSlotVNs(suffixIcon({})))
552
- : h('span', {
553
- key: '3'
554
- }, [
555
- h('i', {
556
- class: suffixIcon
557
- })
558
- ]),
559
- suffixOpts.content
560
- ? h('span', {
561
- key: '4'
562
- }, `${suffixOpts.content || ''}`)
563
- : renderEmptyElement($xeContextMenu)
564
- ])
565
- : renderEmptyElement($xeContextMenu),
566
- hasChildMenus
567
- ? h('div', {
568
- class: 'vxe-context-menu--item-subicon'
569
- }, [
570
- h('i', {
571
- class: getIcon().CONTEXT_MENU_CHILDREN
572
- })
573
- ])
574
- : renderEmptyElement($xeContextMenu)
575
- ])
576
- }
577
-
578
- const renderMenus = () => {
579
- const { activeOption, activeChildOption, childOffsetX } = reactData
580
- const menuGroups = computeMenuGroups.value
581
- const mgVNs: VNode[] = []
582
- menuGroups.forEach((menuList, gIndex) => {
583
- const moVNs: VNode[] = []
584
- menuList.forEach((firstItem, i) => {
585
- const { children } = firstItem
586
- const hasChildMenus = children && children.some((child) => child.visible !== false)
587
- const isActiveFirst = activeOption === firstItem
588
- const showChild = isActiveFirst && !!activeChildOption
589
- moVNs.push(
590
- h('div', {
591
- key: `${gIndex}_${i}`,
592
- class: ['vxe-context-menu--item-wrapper vxe-context-menu--first-item', firstItem.className || '', {
593
- 'is--active': isActiveFirst,
594
- 'is--subactive': isActiveFirst && !!activeChildOption
595
- }]
596
- }, [
597
- hasChildMenus && showChild
598
- ? h('div', {
599
- class: 'vxe-context-menu--children-wrapper',
600
- style: {
601
- transform: `translate(${childOffsetX}px, -2px)`
602
- }
603
- }, children.map(twoItem => {
604
- return h('div', {
605
- class: ['vxe-context-menu--item-wrapper vxe-context-menu--child-item', twoItem.className || '', {
606
- 'is--active': activeChildOption === twoItem
607
- }]
608
- }, [
609
- renderMenuItem(twoItem, firstItem)
610
- ])
611
- }))
612
- : renderEmptyElement($xeContextMenu),
613
- renderMenuItem(firstItem, null, hasChildMenus)
614
- ])
615
- )
616
- })
617
- mgVNs.push(
618
- h('div', {
619
- key: gIndex,
620
- class: 'vxe-context-menu--group-wrapper'
621
- }, moVNs)
622
- )
623
- })
624
- return mgVNs
625
- }
626
-
627
- const renderVN = () => {
628
- const { className, position, destroyOnClose } = props
629
- const { visible, popupStyle } = reactData
630
- const vSize = computeSize.value
631
- return h('div', {
632
- ref: refElem,
633
- class: ['vxe-context-menu vxe-context-menu--wrapper', position === 'absolute' ? ('is--' + position) : 'is--fixed', className || '', {
634
- [`size--${vSize}`]: vSize,
635
- 'is--visible': visible
636
- }],
637
- style: popupStyle
638
- }, (destroyOnClose ? visible : true) ? renderMenus() : [])
639
- }
640
-
641
- watch(computeTopAndLeft, () => {
642
- handleLocate()
643
- nextTick(() => {
644
- updateLocate()
645
- })
646
- })
647
-
648
- watch(() => props.modelValue, () => {
649
- handleVisible()
650
- })
651
-
652
- handleVisible()
653
-
654
- onMounted(() => {
655
- globalEvents.on($xeContextMenu, 'mousewheel', handleGlobalMousewheelEvent)
656
- globalEvents.on($xeContextMenu, 'keydown', handleGlobalKeydownEvent)
657
- globalEvents.on($xeContextMenu, 'mousedown', handleGlobalMousedownEvent)
658
- globalEvents.on($xeContextMenu, 'blur', handleGlobalBlurEvent)
659
- })
660
-
661
- onBeforeUnmount(() => {
662
- const { leaveTime } = internalData
663
- if (leaveTime) {
664
- clearTimeout(leaveTime)
665
- }
666
- globalEvents.off($xeContextMenu, 'mousewheel')
667
- globalEvents.off($xeContextMenu, 'keydown')
668
- globalEvents.off($xeContextMenu, 'mousedown')
669
- globalEvents.off($xeContextMenu, 'blur')
670
- XEUtils.assign(reactData, createReactData())
671
- XEUtils.assign(internalData, createInternalData())
672
- })
673
-
674
- $xeContextMenu.renderVN = renderVN
675
-
676
- return $xeContextMenu
677
- },
678
- render () {
679
- return this.renderVN()
680
- }
681
- })
1
+ import { ref, h, reactive, PropType, computed, VNode, watch, onMounted, onBeforeUnmount, nextTick } from 'vue'
2
+ import { defineVxeComponent } from '../../ui/src/comp'
3
+ import XEUtils from 'xe-utils'
4
+ import { VxeUI } from '@vxe-ui/core'
5
+ import { getLastZIndex, nextSubZIndex, nextZIndex, getFuncText } from '../../ui/src/utils'
6
+ import { getDomNode, getEventTargetNode, toCssUnit } from '../../ui/src/dom'
7
+ import { getSlotVNs } from '../../ui/src/vn'
8
+
9
+ import type {
10
+ ContextMenuInternalData,
11
+ ContextMenuReactData,
12
+ VxeContextMenuPropTypes,
13
+ VxeContextMenuDefines,
14
+ ContextMenuPrivateRef,
15
+ VxeContextMenuEmits,
16
+ VxeContextMenuPrivateComputed,
17
+ ContextMenuMethods,
18
+ ContextMenuPrivateMethods,
19
+ VxeContextMenuConstructor,
20
+ VxeContextMenuPrivateMethods,
21
+ ValueOf
22
+ } from '../../../types'
23
+
24
+ const { getConfig, getIcon, getI18n, createEvent, useFns, globalEvents, renderEmptyElement, GLOBAL_EVENT_KEYS } = VxeUI
25
+
26
+ function createInternalData(): ContextMenuInternalData {
27
+ return {
28
+ // leaveTime: null
29
+ }
30
+ }
31
+
32
+ function createReactData(): ContextMenuReactData {
33
+ return {
34
+ visible: false,
35
+ activeOption: null,
36
+ activeChildOption: null,
37
+ popupStyle: {
38
+ top: '',
39
+ left: '',
40
+ zIndex: 0
41
+ },
42
+ childOffsetX: 0
43
+ }
44
+ }
45
+
46
+ export default defineVxeComponent({
47
+ name: 'VxeContextMenu',
48
+ props: {
49
+ modelValue: Boolean as PropType<VxeContextMenuPropTypes.ModelValue>,
50
+ className: String as PropType<VxeContextMenuPropTypes.ClassName>,
51
+ size: {
52
+ type: String as PropType<VxeContextMenuPropTypes.Size>,
53
+ default: () => getConfig().contextMenu.size || getConfig().size
54
+ },
55
+ options: Array as PropType<VxeContextMenuPropTypes.Options>,
56
+ x: [Number, String] as PropType<VxeContextMenuPropTypes.X>,
57
+ y: [Number, String] as PropType<VxeContextMenuPropTypes.Y>,
58
+ autoLocate: {
59
+ type: Boolean as PropType<VxeContextMenuPropTypes.AutoLocate>,
60
+ default: () => getConfig().contextMenu.autoLocate
61
+ },
62
+ zIndex: [Number, String] as PropType<VxeContextMenuPropTypes.ZIndex>,
63
+ position: {
64
+ type: String as PropType<VxeContextMenuPropTypes.Position>,
65
+ default: () => getConfig().contextMenu.position
66
+ },
67
+ destroyOnClose: {
68
+ type: Boolean as PropType<VxeContextMenuPropTypes.DestroyOnClose>,
69
+ default: () => getConfig().contextMenu.destroyOnClose
70
+ },
71
+ transfer: {
72
+ type: Boolean as PropType<VxeContextMenuPropTypes.Transfer>,
73
+ default: () => getConfig().contextMenu.transfer
74
+ }
75
+ },
76
+ emits: ['update:modelValue', 'option-click', 'change', 'show', 'hide'] as VxeContextMenuEmits,
77
+ setup(props, context) {
78
+ const { emit } = context
79
+
80
+ const xID = XEUtils.uniqueId()
81
+
82
+ const refElem = ref<HTMLDivElement>()
83
+
84
+ const { computeSize } = useFns.useSize(props)
85
+
86
+ const internalData = createInternalData()
87
+ const reactData = reactive(createReactData())
88
+
89
+ const refMaps: ContextMenuPrivateRef = {
90
+ refElem
91
+ }
92
+
93
+ const computeMenuGroups = computed(() => {
94
+ const { options } = props
95
+ return options || []
96
+ })
97
+
98
+ const computeAllFirstMenuList = computed(() => {
99
+ const menuGroups: VxeContextMenuDefines.MenuFirstOption[] = computeMenuGroups.value
100
+ const firstList = []
101
+ for (let i = 0; i < menuGroups.length; i++) {
102
+ const list = menuGroups[i]
103
+ for (let j = 0; j < list.length; j++) {
104
+ const firstItem = list[j]
105
+ if (hasValidItem(firstItem)) {
106
+ firstList.push(firstItem)
107
+ }
108
+ }
109
+ }
110
+ return firstList
111
+ })
112
+
113
+ const computeTopAndLeft = computed(() => {
114
+ const { x, y } = props
115
+ return `${x}${y}`
116
+ })
117
+
118
+ const computeMaps: VxeContextMenuPrivateComputed = {}
119
+
120
+ const $xeContextMenu = {
121
+ xID,
122
+ props,
123
+ context,
124
+ reactData,
125
+
126
+ getRefMaps: () => refMaps,
127
+ getComputeMaps: () => computeMaps
128
+ } as unknown as VxeContextMenuConstructor & VxeContextMenuPrivateMethods
129
+
130
+ const dispatchEvent = (type: ValueOf<VxeContextMenuEmits>, params: Record<string, any>, evnt: Event | null) => {
131
+ emit(type, createEvent(evnt, { $contextMenu: $xeContextMenu }, params))
132
+ }
133
+
134
+ const emitModel = (value: any) => {
135
+ emit('update:modelValue', value)
136
+ }
137
+
138
+ const openMenu = () => {
139
+ const { modelValue } = props
140
+ const { visible } = reactData
141
+ const value = true
142
+ reactData.visible = value
143
+ handleLocate()
144
+ updateZindex()
145
+ if (modelValue !== value) {
146
+ emitModel(value)
147
+ dispatchEvent('change', { value }, null)
148
+ }
149
+ if (visible !== value) {
150
+ dispatchEvent('show', { visible: value }, null)
151
+ }
152
+ return nextTick().then(() => {
153
+ updateLocate()
154
+ })
155
+ }
156
+
157
+ const closeMenu = () => {
158
+ const { modelValue } = props
159
+ const { visible } = reactData
160
+ const value = false
161
+ reactData.visible = value
162
+ if (modelValue !== value) {
163
+ emitModel(value)
164
+ dispatchEvent('change', { value }, null)
165
+ }
166
+ if (visible !== value) {
167
+ dispatchEvent('hide', { visible: value }, null)
168
+ }
169
+ return nextTick()
170
+ }
171
+
172
+ const handleLocate = () => {
173
+ const { x, y } = props
174
+ const { popupStyle } = reactData
175
+ popupStyle.left = toCssUnit(x || 0)
176
+ popupStyle.top = toCssUnit(y || 0)
177
+ updateLocate()
178
+ }
179
+
180
+ const updateZindex = () => {
181
+ const { zIndex, transfer } = props
182
+ const { popupStyle } = reactData
183
+ const menuZIndex = popupStyle.zIndex
184
+ if (zIndex) {
185
+ popupStyle.zIndex = XEUtils.toNumber(zIndex)
186
+ } else {
187
+ if (menuZIndex < getLastZIndex()) {
188
+ popupStyle.zIndex = transfer ? nextSubZIndex() : nextZIndex()
189
+ }
190
+ }
191
+ }
192
+
193
+ const updateLocate = () => {
194
+ const { autoLocate, position } = props
195
+ const { popupStyle } = reactData
196
+ if (autoLocate) {
197
+ const wrapperEl = refElem.value
198
+ if (wrapperEl) {
199
+ const { visibleWidth, visibleHeight } = getDomNode()
200
+ const wrapperStyle = getComputedStyle(wrapperEl)
201
+ const offsetTop = XEUtils.toNumber(wrapperStyle.top)
202
+ const offsetLeft = XEUtils.toNumber(wrapperStyle.left)
203
+ const wrapperWidth = wrapperEl.offsetWidth
204
+ const wrapperHeight = wrapperEl.offsetHeight
205
+ if (position === 'absolute') {
206
+ //
207
+ } else {
208
+ if (offsetTop + wrapperHeight > visibleHeight) {
209
+ popupStyle.top = `${Math.max(0, offsetTop - wrapperHeight)}px`
210
+ }
211
+ if (offsetLeft + wrapperWidth > visibleWidth) {
212
+ popupStyle.left = `${Math.max(0, offsetLeft - wrapperWidth)}px`
213
+ }
214
+ }
215
+ }
216
+ }
217
+ updateChildLocate()
218
+ }
219
+
220
+ const updateChildLocate = () => {
221
+ const wrapperEl = refElem.value
222
+ if (wrapperEl) {
223
+ const { visibleWidth } = getDomNode()
224
+ const owSize = 4
225
+
226
+ const handleStyle = () => {
227
+ const wrapperStyle = getComputedStyle(wrapperEl)
228
+ const offsetLeft = XEUtils.toNumber(wrapperStyle.left)
229
+ const wrapperWidth = wrapperEl.offsetWidth
230
+ const childEl = wrapperEl.querySelector<HTMLDivElement>('.vxe-context-menu--children-wrapper')
231
+ const childWidth = childEl ? childEl.offsetWidth : wrapperWidth
232
+ if (offsetLeft + wrapperWidth > visibleWidth - childWidth) {
233
+ // 往左
234
+ reactData.childOffsetX = -childWidth + owSize
235
+ } else {
236
+ // 往右
237
+ reactData.childOffsetX = wrapperWidth - owSize
238
+ }
239
+ }
240
+ handleStyle()
241
+ nextTick(() => {
242
+ handleStyle()
243
+ })
244
+ }
245
+ }
246
+
247
+ const handleVisible = () => {
248
+ const { modelValue } = props
249
+ if (modelValue) {
250
+ openMenu()
251
+ } else {
252
+ closeMenu()
253
+ }
254
+ }
255
+
256
+ const tagMethods: ContextMenuMethods = {
257
+ dispatchEvent,
258
+ open: openMenu,
259
+ close: closeMenu
260
+ }
261
+
262
+ const hasChildMenu = (item: VxeContextMenuDefines.MenuFirstOption | VxeContextMenuDefines.MenuChildOption) => {
263
+ const { children } = item as VxeContextMenuDefines.MenuFirstOption
264
+ return children && children.some((child) => child.visible !== false)
265
+ }
266
+
267
+ const handleItemClickEvent = (evnt: MouseEvent | KeyboardEvent, item: VxeContextMenuDefines.MenuFirstOption | VxeContextMenuDefines.MenuChildOption) => {
268
+ evnt.preventDefault()
269
+ evnt.stopPropagation()
270
+ if (!item.disabled && !item.loading && !hasChildMenu(item)) {
271
+ dispatchEvent('option-click', { option: item }, evnt)
272
+ closeMenu()
273
+ }
274
+ }
275
+
276
+ const handleItemMouseenterEvent = (evnt: MouseEvent, item: VxeContextMenuDefines.MenuFirstOption | VxeContextMenuDefines.MenuChildOption, parentitem?: VxeContextMenuDefines.MenuFirstOption | null) => {
277
+ const { leaveTime } = internalData
278
+ if (leaveTime) {
279
+ clearTimeout(leaveTime)
280
+ }
281
+ reactData.activeOption = parentitem || item
282
+ if (parentitem) {
283
+ reactData.activeOption = parentitem
284
+ reactData.activeChildOption = item
285
+ } else {
286
+ reactData.activeOption = item
287
+ if (hasChildMenu(item)) {
288
+ reactData.activeChildOption = findFirstChildItem(item)
289
+ nextTick(() => {
290
+ updateChildLocate()
291
+ })
292
+ } else {
293
+ reactData.activeChildOption = null
294
+ }
295
+ }
296
+ }
297
+
298
+ const handleItemMouseleaveEvent = () => {
299
+ const { leaveTime } = internalData
300
+ if (leaveTime) {
301
+ clearTimeout(leaveTime)
302
+ }
303
+ internalData.leaveTime = setTimeout(() => {
304
+ internalData.leaveTime = null
305
+ reactData.activeOption = null
306
+ reactData.activeChildOption = null
307
+ }, 300)
308
+ }
309
+
310
+ const hasValidItem = (item: VxeContextMenuDefines.MenuFirstOption | VxeContextMenuDefines.MenuChildOption) => {
311
+ return !item.loading && !item.disabled && item.visible !== false
312
+ }
313
+
314
+ const findNextFirstItem = (allFirstList: VxeContextMenuDefines.MenuFirstOption[], firstItem: VxeContextMenuDefines.MenuFirstOption) => {
315
+ for (let i = 0; i < allFirstList.length; i++) {
316
+ const item = allFirstList[i]
317
+ if (firstItem === item) {
318
+ const nextItem = allFirstList[i + 1]
319
+ if (nextItem) {
320
+ return nextItem
321
+ }
322
+ }
323
+ }
324
+ return XEUtils.first(allFirstList)
325
+ }
326
+
327
+ const findPrevFirstItem = (allFirstList: VxeContextMenuDefines.MenuFirstOption[], firstItem: VxeContextMenuDefines.MenuFirstOption) => {
328
+ for (let i = 0; i < allFirstList.length; i++) {
329
+ const item = allFirstList[i]
330
+ if (firstItem === item) {
331
+ if (i > 0) {
332
+ return allFirstList[i - 1]
333
+ }
334
+ }
335
+ }
336
+ return XEUtils.last(allFirstList)
337
+ }
338
+
339
+ const findFirstChildItem = (firstItem: VxeContextMenuDefines.MenuFirstOption) => {
340
+ const { children } = firstItem
341
+ if (children) {
342
+ for (let i = 0; i < children.length; i++) {
343
+ const item = children[i]
344
+ if (hasValidItem(item)) {
345
+ return item
346
+ }
347
+ }
348
+ }
349
+ return null
350
+ }
351
+
352
+ const findPrevChildItem = (firstItem: VxeContextMenuDefines.MenuFirstOption, childItem: VxeContextMenuDefines.MenuChildOption) => {
353
+ const { children } = firstItem
354
+ let prevValidItem = null
355
+ if (children) {
356
+ for (let i = 0; i < children.length; i++) {
357
+ const item = children[i]
358
+ if (childItem === item) {
359
+ break
360
+ }
361
+ if (hasValidItem(item)) {
362
+ prevValidItem = item
363
+ }
364
+ }
365
+ if (!prevValidItem) {
366
+ for (let len = children.length - 1; len >= 0; len--) {
367
+ const item = children[len]
368
+ if (hasValidItem(item)) {
369
+ return item
370
+ }
371
+ }
372
+ }
373
+ }
374
+ return prevValidItem
375
+ }
376
+
377
+ const findNextChildItem = (firstItem: VxeContextMenuDefines.MenuFirstOption, childItem: VxeContextMenuDefines.MenuChildOption) => {
378
+ const { children } = firstItem
379
+ let firstValidItem = null
380
+ if (children) {
381
+ let isMetch = false
382
+ for (let i = 0; i < children.length; i++) {
383
+ const item = children[i]
384
+ if (!firstValidItem) {
385
+ if (hasValidItem(item)) {
386
+ firstValidItem = item
387
+ }
388
+ }
389
+ if (isMetch) {
390
+ if (hasValidItem(item)) {
391
+ return item
392
+ }
393
+ } else {
394
+ isMetch = childItem === item
395
+ }
396
+ }
397
+ }
398
+ return firstValidItem
399
+ }
400
+
401
+ const handleGlobalMousewheelEvent = (evnt: MouseEvent) => {
402
+ const { visible } = reactData
403
+ if (visible) {
404
+ const el = refElem.value
405
+ if (!getEventTargetNode(evnt, el, '').flag) {
406
+ closeMenu()
407
+ }
408
+ }
409
+ }
410
+
411
+ const handleGlobalKeydownEvent = (evnt: KeyboardEvent) => {
412
+ const { visible, activeOption, activeChildOption } = reactData
413
+ const allFirstMenuList = computeAllFirstMenuList.value
414
+ if (visible) {
415
+ const isUpArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_UP)
416
+ const isDwArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_DOWN)
417
+ const isLeftArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_LEFT)
418
+ const isRightArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_RIGHT)
419
+ const isEnter = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ENTER)
420
+ const isEsc = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ESCAPE)
421
+ if (isEsc) {
422
+ closeMenu()
423
+ return
424
+ }
425
+ // 回车选中
426
+ if (isEnter) {
427
+ if (activeOption || activeChildOption) {
428
+ evnt.preventDefault()
429
+ evnt.stopPropagation()
430
+ if (!activeChildOption && hasChildMenu(activeOption)) {
431
+ reactData.activeChildOption = findFirstChildItem(activeOption)
432
+ updateChildLocate()
433
+ return
434
+ }
435
+ handleItemClickEvent(evnt, activeChildOption || activeOption)
436
+ return
437
+ }
438
+ }
439
+ // 方向键操作
440
+ if (activeChildOption) {
441
+ if (isUpArrow) {
442
+ evnt.preventDefault()
443
+ reactData.activeChildOption = findPrevChildItem(activeOption, activeChildOption)
444
+ updateChildLocate()
445
+ } else if (isDwArrow) {
446
+ evnt.preventDefault()
447
+ reactData.activeChildOption = findNextChildItem(activeOption, activeChildOption)
448
+ updateChildLocate()
449
+ } else if (isLeftArrow) {
450
+ evnt.preventDefault()
451
+ reactData.activeChildOption = null
452
+ }
453
+ } else if (activeOption) {
454
+ evnt.preventDefault()
455
+ if (isUpArrow) {
456
+ reactData.activeOption = findPrevFirstItem(allFirstMenuList, activeOption)
457
+ } else if (isDwArrow) {
458
+ reactData.activeOption = findNextFirstItem(allFirstMenuList, activeOption)
459
+ } else {
460
+ if (hasChildMenu(activeOption)) {
461
+ if (isRightArrow) {
462
+ reactData.activeChildOption = findFirstChildItem(activeOption)
463
+ updateChildLocate()
464
+ }
465
+ }
466
+ }
467
+ } else {
468
+ evnt.preventDefault()
469
+ reactData.activeOption = XEUtils.first(allFirstMenuList)
470
+ }
471
+ }
472
+ }
473
+
474
+ const handleGlobalMousedownEvent = (evnt: MouseEvent) => {
475
+ const { visible } = reactData
476
+ if (visible) {
477
+ const el = refElem.value
478
+ if (!getEventTargetNode(evnt, el, '').flag) {
479
+ closeMenu()
480
+ }
481
+ }
482
+ }
483
+
484
+ const handleGlobalBlurEvent = () => {
485
+ const { visible } = reactData
486
+ if (visible) {
487
+ closeMenu()
488
+ }
489
+ }
490
+
491
+ const tagPrivateMethods: ContextMenuPrivateMethods = {}
492
+
493
+ Object.assign($xeContextMenu, tagMethods, tagPrivateMethods)
494
+
495
+ const renderMenuItem = (item: VxeContextMenuDefines.MenuFirstOption | VxeContextMenuDefines.MenuChildOption, parentItem: VxeContextMenuDefines.MenuFirstOption | VxeContextMenuDefines.MenuChildOption | null, hasChildMenus?: boolean) => {
496
+ const { visible, disabled, loading } = item
497
+ if (visible === false) {
498
+ return renderEmptyElement($xeContextMenu)
499
+ }
500
+ const prefixOpts = Object.assign({}, item.prefixConfig)
501
+ const prefixIcon = prefixOpts.icon || item.prefixIcon
502
+ const suffixOpts = Object.assign({}, item.suffixConfig)
503
+ const suffixIcon = suffixOpts.icon || item.suffixIcon
504
+ const menuContent = loading ? getI18n('vxe.contextMenu.loadingText') : getFuncText(item.name)
505
+ return h(
506
+ 'div',
507
+ {
508
+ class: [
509
+ 'vxe-context-menu--item-inner',
510
+ {
511
+ 'is--disabled': disabled,
512
+ 'is--loading': loading
513
+ }
514
+ ],
515
+ onClick(evnt) {
516
+ handleItemClickEvent(evnt, item)
517
+ },
518
+ onMouseenter(evnt) {
519
+ handleItemMouseenterEvent(evnt, item, parentItem)
520
+ },
521
+ onMouseleave: handleItemMouseleaveEvent
522
+ },
523
+ [
524
+ h(
525
+ 'div',
526
+ {
527
+ class: ['vxe-context-menu--item-prefix', prefixOpts.className || '']
528
+ },
529
+ loading
530
+ ? [
531
+ h(
532
+ 'span',
533
+ {
534
+ key: '1'
535
+ },
536
+ [
537
+ h('i', {
538
+ class: getIcon().CONTEXT_MENU_OPTION_LOADING
539
+ })
540
+ ]
541
+ )
542
+ ]
543
+ : [
544
+ prefixIcon && XEUtils.isFunction(prefixIcon)
545
+ ? h(
546
+ 'span',
547
+ {
548
+ key: '2'
549
+ },
550
+ getSlotVNs(prefixIcon({}))
551
+ )
552
+ : h(
553
+ 'span',
554
+ {
555
+ key: '3'
556
+ },
557
+ [
558
+ h('i', {
559
+ class: prefixIcon
560
+ })
561
+ ]
562
+ ),
563
+ prefixOpts.content
564
+ ? h(
565
+ 'span',
566
+ {
567
+ key: '4'
568
+ },
569
+ `${prefixOpts.content || ''}`
570
+ )
571
+ : renderEmptyElement($xeContextMenu)
572
+ ]
573
+ ),
574
+ h(
575
+ 'div',
576
+ {
577
+ class: 'vxe-context-menu--item-label'
578
+ },
579
+ menuContent
580
+ ),
581
+ !loading && (suffixIcon || suffixOpts.content)
582
+ ? h(
583
+ 'div',
584
+ {
585
+ class: ['vxe-context-menu--item-suffix', suffixOpts.className || '']
586
+ },
587
+ [
588
+ suffixIcon && XEUtils.isFunction(suffixIcon)
589
+ ? h(
590
+ 'span',
591
+ {
592
+ key: '2'
593
+ },
594
+ getSlotVNs(suffixIcon({}))
595
+ )
596
+ : h(
597
+ 'span',
598
+ {
599
+ key: '3'
600
+ },
601
+ [
602
+ h('i', {
603
+ class: suffixIcon
604
+ })
605
+ ]
606
+ ),
607
+ suffixOpts.content
608
+ ? h(
609
+ 'span',
610
+ {
611
+ key: '4'
612
+ },
613
+ `${suffixOpts.content || ''}`
614
+ )
615
+ : renderEmptyElement($xeContextMenu)
616
+ ]
617
+ )
618
+ : renderEmptyElement($xeContextMenu),
619
+ hasChildMenus
620
+ ? h(
621
+ 'div',
622
+ {
623
+ class: 'vxe-context-menu--item-subicon'
624
+ },
625
+ [
626
+ h('i', {
627
+ class: getIcon().CONTEXT_MENU_CHILDREN
628
+ })
629
+ ]
630
+ )
631
+ : renderEmptyElement($xeContextMenu)
632
+ ]
633
+ )
634
+ }
635
+
636
+ const renderMenus = () => {
637
+ const { activeOption, activeChildOption, childOffsetX } = reactData
638
+ const menuGroups = computeMenuGroups.value
639
+ const mgVNs: VNode[] = []
640
+ menuGroups.forEach((menuList, gIndex) => {
641
+ const moVNs: VNode[] = []
642
+ menuList.forEach((firstItem, i) => {
643
+ const { children } = firstItem
644
+ const hasChildMenus = children && children.some((child) => child.visible !== false)
645
+ const isActiveFirst = activeOption === firstItem
646
+ const showChild = isActiveFirst && !!activeChildOption
647
+ moVNs.push(
648
+ h(
649
+ 'div',
650
+ {
651
+ key: `${gIndex}_${i}`,
652
+ class: [
653
+ 'vxe-context-menu--item-wrapper vxe-context-menu--first-item',
654
+ firstItem.className || '',
655
+ {
656
+ 'is--active': isActiveFirst,
657
+ 'is--subactive': isActiveFirst && !!activeChildOption
658
+ }
659
+ ]
660
+ },
661
+ [
662
+ hasChildMenus && showChild
663
+ ? h(
664
+ 'div',
665
+ {
666
+ class: 'vxe-context-menu--children-wrapper',
667
+ style: {
668
+ transform: `translate(${childOffsetX}px, -2px)`
669
+ }
670
+ },
671
+ children.map((twoItem) => {
672
+ return h(
673
+ 'div',
674
+ {
675
+ class: [
676
+ 'vxe-context-menu--item-wrapper vxe-context-menu--child-item',
677
+ twoItem.className || '',
678
+ {
679
+ 'is--active': activeChildOption === twoItem
680
+ }
681
+ ]
682
+ },
683
+ [renderMenuItem(twoItem, firstItem)]
684
+ )
685
+ })
686
+ )
687
+ : renderEmptyElement($xeContextMenu),
688
+ renderMenuItem(firstItem, null, hasChildMenus)
689
+ ]
690
+ )
691
+ )
692
+ })
693
+ mgVNs.push(
694
+ h(
695
+ 'div',
696
+ {
697
+ key: gIndex,
698
+ class: 'vxe-context-menu--group-wrapper'
699
+ },
700
+ moVNs
701
+ )
702
+ )
703
+ })
704
+ return mgVNs
705
+ }
706
+
707
+ const renderVN = () => {
708
+ const { className, position, destroyOnClose } = props
709
+ const { visible, popupStyle } = reactData
710
+ const vSize = computeSize.value
711
+ return h(
712
+ 'div',
713
+ {
714
+ ref: refElem,
715
+ class: [
716
+ 'vxe-context-menu vxe-context-menu--wrapper',
717
+ position === 'absolute' ? 'is--' + position : 'is--fixed',
718
+ className || '',
719
+ {
720
+ [`size--${vSize}`]: vSize,
721
+ 'is--visible': visible
722
+ }
723
+ ],
724
+ style: popupStyle
725
+ },
726
+ (destroyOnClose ? visible : true) ? renderMenus() : []
727
+ )
728
+ }
729
+
730
+ watch(computeTopAndLeft, () => {
731
+ handleLocate()
732
+ nextTick(() => {
733
+ updateLocate()
734
+ })
735
+ })
736
+
737
+ watch(
738
+ () => props.modelValue,
739
+ () => {
740
+ handleVisible()
741
+ }
742
+ )
743
+
744
+ handleVisible()
745
+
746
+ onMounted(() => {
747
+ globalEvents.on($xeContextMenu, 'mousewheel', handleGlobalMousewheelEvent)
748
+ globalEvents.on($xeContextMenu, 'keydown', handleGlobalKeydownEvent)
749
+ globalEvents.on($xeContextMenu, 'mousedown', handleGlobalMousedownEvent)
750
+ globalEvents.on($xeContextMenu, 'blur', handleGlobalBlurEvent)
751
+ })
752
+
753
+ onBeforeUnmount(() => {
754
+ const { leaveTime } = internalData
755
+ if (leaveTime) {
756
+ clearTimeout(leaveTime)
757
+ }
758
+ globalEvents.off($xeContextMenu, 'mousewheel')
759
+ globalEvents.off($xeContextMenu, 'keydown')
760
+ globalEvents.off($xeContextMenu, 'mousedown')
761
+ globalEvents.off($xeContextMenu, 'blur')
762
+ XEUtils.assign(reactData, createReactData())
763
+ XEUtils.assign(internalData, createInternalData())
764
+ })
765
+
766
+ $xeContextMenu.renderVN = renderVN
767
+
768
+ return $xeContextMenu
769
+ },
770
+ render() {
771
+ return this.renderVN()
772
+ }
773
+ })