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,855 +1,975 @@
1
- import { h, ref, computed, Teleport, resolveComponent, VNode, onUnmounted, reactive, nextTick, PropType, onMounted, inject } from 'vue'
2
- import { defineVxeComponent } from '../../ui/src/comp'
3
- import XEUtils from 'xe-utils'
4
- import { getConfig, globalEvents, getIcon, createEvent, useSize, renderer, usePermission, permission, renderEmptyElement } from '../../ui'
5
- import { getEventTargetNode, getPopupContainer, updatePanelPlacement } from '../../ui/src/dom'
6
- import { getFuncText, getLastZIndex, nextZIndex } from '../../ui/src/utils'
7
- import { getSlotVNs } from '../../ui/src/vn'
8
- import { createComponentLog } from '../../ui/src/log'
9
- import VxeTooltipComponent from '../../tooltip'
10
-
11
- import type { VxeButtonConstructor, VxeButtonPropTypes, VxeButtonEmits, ButtonReactData, ButtonMethods, VxeButtonDefines, ButtonPrivateRef, ButtonInternalData, VxeButtonGroupConstructor, VxeButtonGroupPrivateMethods, VxeDrawerConstructor, VxeDrawerMethods, VxeFormConstructor, VxeFormPrivateMethods, VxeModalConstructor, VxeModalMethods, ValueOf, VxeTreeConstructor, VxeTreePrivateMethods } from '../../../types'
12
- import type { VxeTableConstructor, VxeTablePrivateMethods } from '../../../types/components/table'
13
- import type { VxeGridConstructor, VxeGridPrivateMethods } from '../../../types/components/grid'
14
-
15
- const { warnLog } = createComponentLog('button')
16
-
17
- const VxeButtonComponent = defineVxeComponent({
18
- name: 'VxeButton',
19
- props: {
20
- /**
21
- * 按钮类型
22
- */
23
- type: String as PropType<VxeButtonPropTypes.Type>,
24
- mode: String as PropType<VxeButtonPropTypes.Mode>,
25
- className: [String, Function] as PropType<VxeButtonPropTypes.ClassName>,
26
- popupClassName: [String, Function] as PropType<VxeButtonPropTypes.PopupClassName>,
27
- /**
28
- * 按钮尺寸
29
- */
30
- size: {
31
- type: String as PropType<VxeButtonPropTypes.Size>,
32
- default: () => getConfig().button.size || getConfig().size
33
- },
34
- zIndex: Number as PropType<VxeButtonPropTypes.ZIndex>,
35
- /**
36
- * 用来标识这一项
37
- */
38
- name: [String, Number] as PropType<VxeButtonPropTypes.Name>,
39
- routerLink: Object as PropType<VxeButtonPropTypes.RouterLink>,
40
- /**
41
- * 权限码
42
- */
43
- permissionCode: [String, Number] as PropType<VxeButtonPropTypes.PermissionCode>,
44
- /**
45
- * 按钮内容
46
- */
47
- content: String as PropType<VxeButtonPropTypes.Content>,
48
- /**
49
- * 固定显示下拉面板的方向
50
- */
51
- placement: String as PropType<VxeButtonPropTypes.Placement>,
52
- /**
53
- * 按钮状态
54
- */
55
- status: String as PropType<VxeButtonPropTypes.Status>,
56
- /**
57
- * 标题
58
- */
59
- title: String as PropType<VxeButtonPropTypes.Title>,
60
- shadow: Boolean as PropType<VxeButtonPropTypes.Shadow>,
61
- /**
62
- * 按钮的前缀图标,属于 prefix-icon 的简写
63
- */
64
- icon: String as PropType<VxeButtonPropTypes.Icon>,
65
- iconRender: Object as PropType<VxeButtonPropTypes.IconRender>,
66
- /**
67
- * 按钮的前缀图标
68
- */
69
- prefixIcon: String as PropType<VxeButtonPropTypes.PrefixIcon>,
70
- prefixRender: Object as PropType<VxeButtonPropTypes.PrefixRender>,
71
- /**
72
- * 按钮的后缀图标
73
- */
74
- suffixIcon: String as PropType<VxeButtonPropTypes.SuffixIcon>,
75
- suffixRender: Object as PropType<VxeButtonPropTypes.SuffixRender>,
76
- /**
77
- * 圆角边框
78
- */
79
- round: Boolean as PropType<VxeButtonPropTypes.Round>,
80
- /**
81
- * 圆角按钮
82
- */
83
- circle: Boolean as PropType<VxeButtonPropTypes.Circle>,
84
- /**
85
- * 是否禁用
86
- */
87
- disabled: Boolean as PropType<VxeButtonPropTypes.Disabled>,
88
- /**
89
- * 是否加载中
90
- */
91
- loading: Boolean as PropType<VxeButtonPropTypes.Loading>,
92
- trigger: {
93
- type: String as PropType<VxeButtonPropTypes.Trigger>,
94
- default: () => getConfig().button.trigger
95
- },
96
- align: String as PropType<VxeButtonPropTypes.Align>,
97
- prefixTooltip: Object as PropType<VxeButtonPropTypes.PrefixTooltip>,
98
- suffixTooltip: Object as PropType<VxeButtonPropTypes.SuffixTooltip>,
99
- options: Array as PropType<VxeButtonPropTypes.Options>,
100
- showDropdownIcon: {
101
- type: Boolean as PropType<VxeButtonPropTypes.ShowDropdownIcon>,
102
- default: () => getConfig().button.showDropdownIcon
103
- },
104
- dropdownCloseIcon: {
105
- type: String as PropType<VxeButtonPropTypes.DropdownCloseIcon>,
106
- default: () => getConfig().button.dropdownCloseIcon
107
- },
108
- dropdownOpenIcon: {
109
- type: String as PropType<VxeButtonPropTypes.DropdownOpenIcon>,
110
- default: () => getConfig().button.dropdownOpenIcon
111
- },
112
- /**
113
- * 在下拉面板关闭时销毁内容
114
- */
115
- destroyOnClose: {
116
- type: Boolean as PropType<VxeButtonPropTypes.DestroyOnClose>,
117
- default: () => getConfig().button.destroyOnClose
118
- },
119
- popupConfig: Object as PropType<VxeButtonPropTypes.PopupConfig>,
120
- /**
121
- * 是否将弹框容器插入于 body 内
122
- */
123
- transfer: {
124
- type: Boolean as PropType<VxeButtonPropTypes.Transfer>,
125
- default: null
126
- }
127
- },
128
- emits: [
129
- 'click',
130
- 'mouseenter',
131
- 'mouseleave',
132
- 'dropdown-click',
133
- 'dropdownClick',
134
- 'contextmenu'
135
- ] as VxeButtonEmits,
136
- setup (props, context) {
137
- const { slots, emit } = context
138
-
139
- const $xeModal = inject<(VxeModalConstructor & VxeModalMethods)| null>('$xeModal', null)
140
- const $xeDrawer = inject<(VxeDrawerConstructor & VxeDrawerMethods) | null>('$xeDrawer', null)
141
- const $xeGrid = inject<(VxeGridConstructor & VxeGridPrivateMethods) | null>('$xeGrid', null)
142
- const $xeTable = inject<(VxeTableConstructor & VxeTablePrivateMethods) | null>('$xeTable', null)
143
- const $xeTree = inject<(VxeTreeConstructor & VxeTreePrivateMethods) | null>('$xeTree', null)
144
- const $xeForm = inject<(VxeFormConstructor & VxeFormPrivateMethods)| null>('$xeForm', null)
145
- const $xeButtonGroup = inject<(VxeButtonGroupConstructor & VxeButtonGroupPrivateMethods) | null>('$xeButtonGroup', null)
146
-
147
- const xID = XEUtils.uniqueId()
148
-
149
- const { computeSize } = useSize(props)
150
-
151
- const { computePermissionInfo } = usePermission(props)
152
-
153
- const reactData = reactive<ButtonReactData>({
154
- initialized: false,
155
- visiblePanel: false,
156
- isAniVisible: false,
157
- isActivated: false,
158
- panelIndex: 0,
159
- panelStyle: {},
160
- panelPlacement: ''
161
- })
162
-
163
- const internalData: ButtonInternalData = {
164
- showTime: undefined,
165
- tooltipTimeout: undefined
166
- }
167
-
168
- const refElem = ref<HTMLDivElement>()
169
- const refButton = ref<HTMLButtonElement>()
170
- const refBtnPanel = ref<HTMLDivElement>()
171
-
172
- const refMaps: ButtonPrivateRef = {
173
- refElem
174
- }
175
-
176
- const $xeButton = {
177
- xID,
178
- props,
179
- context,
180
- reactData,
181
- internalData,
182
- getRefMaps: () => refMaps
183
- } as unknown as VxeButtonConstructor
184
-
185
- let buttonMethods = {} as ButtonMethods
186
-
187
- const computeBtnTransfer = computed(() => {
188
- const { transfer } = props
189
- const popupOpts = computePopupOpts.value
190
- if (XEUtils.isBoolean(popupOpts.transfer)) {
191
- return popupOpts.transfer
192
- }
193
- if (transfer === null) {
194
- const globalTransfer = getConfig().button.transfer
195
- if (XEUtils.isBoolean(globalTransfer)) {
196
- return globalTransfer
197
- }
198
- if ($xeGrid || $xeTable || $xeTree || $xeModal || $xeDrawer || $xeForm) {
199
- return true
200
- }
201
- }
202
- return transfer
203
- })
204
-
205
- const computeBtnDisabled = computed(() => {
206
- const { disabled } = props
207
- const permissionInfo = computePermissionInfo.value
208
- return disabled || permissionInfo.disabled
209
- })
210
-
211
- const computeIsFormBtn = computed(() => {
212
- const { type } = props
213
- if (type) {
214
- return ['submit', 'reset', 'button'].indexOf(type) > -1
215
- }
216
- return false
217
- })
218
-
219
- const computeBtnMode = computed(() => {
220
- const { type, mode } = props
221
- if (mode === 'text' || type === 'text' || ($xeButtonGroup && $xeButtonGroup.props.mode === 'text')) {
222
- return 'text'
223
- }
224
- return 'button'
225
- })
226
-
227
- const computeBtnStatus = computed(() => {
228
- const { status } = props
229
- if (status) {
230
- return status
231
- }
232
- if ($xeButtonGroup) {
233
- return $xeButtonGroup.props.status
234
- }
235
- return ''
236
- })
237
-
238
- const computeBtnAlign = computed(() => {
239
- const { align } = props
240
- if (align) {
241
- return align
242
- }
243
- if ($xeButtonGroup) {
244
- return $xeButtonGroup.props.align
245
- }
246
- return false
247
- })
248
-
249
- const computeBtnRound = computed(() => {
250
- const { round } = props
251
- if (round) {
252
- return round
253
- }
254
- if ($xeButtonGroup) {
255
- return $xeButtonGroup.props.round
256
- }
257
- return false
258
- })
259
-
260
- const computeBtnCircle = computed(() => {
261
- const { circle } = props
262
- if (circle) {
263
- return circle
264
- }
265
- if ($xeButtonGroup) {
266
- return $xeButtonGroup.props.circle
267
- }
268
- return false
269
- })
270
-
271
- const computeDownBtnList = computed(() => {
272
- const { options } = props
273
- if (options) {
274
- return options.filter(item => {
275
- const { permissionCode } = item
276
- return !permissionCode || permission.checkVisible(permissionCode)
277
- })
278
- }
279
- return []
280
- })
281
-
282
- const computePopupOpts = computed(() => {
283
- return Object.assign({}, getConfig().button.popupConfig, props.popupConfig)
284
- })
285
-
286
- const computePrefixTipOpts = computed(() => {
287
- return Object.assign({}, getConfig().button.prefixTooltip, props.prefixTooltip)
288
- })
289
-
290
- const computeSuffixTipOpts = computed(() => {
291
- return Object.assign({}, getConfig().button.suffixTooltip, props.suffixTooltip)
292
- })
293
-
294
- const updateZindex = () => {
295
- const popupOpts = computePopupOpts.value
296
- const customZIndex = popupOpts.zIndex || props.zIndex
297
- if (customZIndex) {
298
- reactData.panelIndex = XEUtils.toNumber(customZIndex)
299
- } else if (reactData.panelIndex < getLastZIndex()) {
300
- reactData.panelIndex = nextZIndex()
301
- }
302
- }
303
-
304
- const updatePlacement = () => {
305
- const { placement } = props
306
- const { panelIndex } = reactData
307
- const targetElem = refButton.value
308
- const panelElem = refBtnPanel.value
309
- const btnTransfer = computeBtnTransfer.value
310
- const popupOpts = computePopupOpts.value
311
- const handleStyle = () => {
312
- const ppObj = updatePanelPlacement(targetElem, panelElem, {
313
- placement: popupOpts.placement || placement,
314
- defaultPlacement: popupOpts.defaultPlacement,
315
- appendTo: popupOpts.appendTo,
316
- teleportTo: btnTransfer
317
- })
318
- const panelStyle: { [key: string]: string | number } = Object.assign(ppObj.style, {
319
- zIndex: panelIndex
320
- })
321
- reactData.panelStyle = panelStyle
322
- reactData.panelPlacement = ppObj.placement
323
- }
324
- handleStyle()
325
- return nextTick().then(handleStyle)
326
- }
327
-
328
- const clickEvent = (evnt: Event) => {
329
- if ($xeButtonGroup) {
330
- $xeButtonGroup.handleClick({ name: props.name }, evnt)
331
- }
332
- dispatchEvent('click', { $event: evnt }, evnt)
333
- }
334
-
335
- const downBtnClickEvent = (params: VxeButtonDefines.ClickEventParams, option: VxeButtonDefines.DownButtonOption) => {
336
- const { $event } = params
337
- hidePanel()
338
- dispatchEvent('dropdown-click', { name: option.name, option }, $event)
339
- }
340
-
341
- const mousedownDropdownEvent = (evnt: MouseEvent) => {
342
- const isLeftBtn = evnt.button === 0
343
- if (isLeftBtn) {
344
- evnt.stopPropagation()
345
- }
346
- }
347
-
348
- const clickDropdownEvent = (evnt: Event) => {
349
- const dropdownElem = evnt.currentTarget
350
- const panelElem = refBtnPanel.value
351
- const { flag, targetElem } = getEventTargetNode(evnt, dropdownElem, 'vxe-button')
352
- if (flag) {
353
- if (panelElem) {
354
- panelElem.dataset.active = 'N'
355
- }
356
- reactData.visiblePanel = false
357
- setTimeout(() => {
358
- if (!panelElem || panelElem.dataset.active !== 'Y') {
359
- reactData.isAniVisible = false
360
- }
361
- }, 350)
362
- dispatchEvent('dropdown-click', { name: targetElem.getAttribute('name'), option: null }, evnt)
363
- }
364
- }
365
-
366
- const mouseenterDropdownEvent = () => {
367
- const panelElem = refBtnPanel.value
368
- if (panelElem) {
369
- panelElem.dataset.active = 'Y'
370
- reactData.isAniVisible = true
371
- setTimeout(() => {
372
- if (panelElem.dataset.active === 'Y') {
373
- reactData.visiblePanel = true
374
- updateZindex()
375
- updatePlacement()
376
- setTimeout(() => {
377
- if (reactData.visiblePanel) {
378
- updatePlacement()
379
- }
380
- }, 50)
381
- }
382
- }, 20)
383
- }
384
- }
385
-
386
- const mouseenterTargetEvent = (evnt: MouseEvent) => {
387
- const { loading } = props
388
- const btnDisabled = computeBtnDisabled.value
389
- if (!(btnDisabled || loading)) {
390
- openPanel()
391
- mouseenterEvent(evnt)
392
- }
393
- }
394
-
395
- const mouseleaveTargetEvent = (evnt: MouseEvent) => {
396
- hidePanel()
397
- mouseleaveEvent(evnt)
398
- }
399
-
400
- const mouseenterEvent = (evnt: MouseEvent) => {
401
- dispatchEvent('mouseenter', {}, evnt)
402
- }
403
-
404
- const mouseleaveEvent = (evnt: MouseEvent) => {
405
- dispatchEvent('mouseleave', {}, evnt)
406
- }
407
-
408
- const contextmenuEvent = (evnt: MouseEvent) => {
409
- dispatchEvent('contextmenu', {}, evnt)
410
- }
411
-
412
- const clickTargetEvent = (evnt: MouseEvent) => {
413
- const { loading, trigger } = props
414
- const btnDisabled = computeBtnDisabled.value
415
- if (!(btnDisabled || loading)) {
416
- if (trigger === 'click') {
417
- if (reactData.visiblePanel) {
418
- hidePanel()
419
- } else {
420
- openPanel()
421
- }
422
- }
423
- clickEvent(evnt)
424
- }
425
- }
426
-
427
- const openPanel = () => {
428
- const { trigger } = props
429
- const panelElem = refBtnPanel.value
430
- if (panelElem) {
431
- panelElem.dataset.active = 'Y'
432
- if (!reactData.initialized) {
433
- reactData.initialized = true
434
- }
435
- internalData.showTime = setTimeout(() => {
436
- if (panelElem.dataset.active === 'Y') {
437
- mouseenterDropdownEvent()
438
- } else {
439
- reactData.isAniVisible = false
440
- }
441
- }, trigger === 'click' ? 50 : 250)
442
- }
443
- return nextTick()
444
- }
445
-
446
- const hidePanel = () => {
447
- const panelElem = refBtnPanel.value
448
- clearTimeout(internalData.showTime)
449
- if (panelElem) {
450
- panelElem.dataset.active = 'N'
451
- setTimeout(() => {
452
- if (panelElem.dataset.active !== 'Y') {
453
- reactData.visiblePanel = false
454
- setTimeout(() => {
455
- if (panelElem.dataset.active !== 'Y') {
456
- reactData.isAniVisible = false
457
- }
458
- }, 350)
459
- }
460
- }, 100)
461
- } else {
462
- reactData.isAniVisible = false
463
- reactData.visiblePanel = false
464
- }
465
- return nextTick()
466
- }
467
-
468
- const mouseleaveDropdownEvent = () => {
469
- hidePanel()
470
- }
471
-
472
- const renderTooltipIcon = (tipOpts: VxeButtonPropTypes.PrefixTooltip | VxeButtonPropTypes.SuffixTooltip, type: 'prefix' | 'suffix') => {
473
- return h(VxeTooltipComponent, {
474
- useHtml: XEUtils.isBoolean(tipOpts.useHtml) ? tipOpts.useHtml : tipOpts.useHTML,
475
- content: tipOpts.content,
476
- enterable: tipOpts.enterable,
477
- theme: tipOpts.theme
478
- }, {
479
- default () {
480
- return h('span', {
481
- class: `vxe-button--item vxe-button--tooltip-${type}-icon`
482
- }, [
483
- h('i', {
484
- class: tipOpts.icon || getIcon().BUTTON_TOOLTIP_ICON
485
- })
486
- ])
487
- }
488
- })
489
- }
490
-
491
- const renderContent = () => {
492
- const { content, suffixIcon, loading, prefixTooltip, suffixTooltip, suffixRender } = props
493
- const prefixIcon = props.prefixIcon || props.icon
494
- const prefixRender = props.prefixRender || props.iconRender
495
- const prefixTipOpts = computePrefixTipOpts.value
496
- const suffixTipOpts = computeSuffixTipOpts.value
497
- const prefixIconSlot = slots.prefix || slots.icon
498
- const suffixIconSlot = slots.suffix
499
- const defaultSlot = slots.default
500
- const contVNs: VNode[] = []
501
- if (prefixTooltip) {
502
- contVNs.push(
503
- renderTooltipIcon(prefixTipOpts, 'prefix')
504
- )
505
- }
506
- if (loading) {
507
- contVNs.push(
508
- h('i', {
509
- class: ['vxe-button--item vxe-button--loading-icon', getIcon().BUTTON_LOADING]
510
- })
511
- )
512
- } else if (prefixIconSlot) {
513
- contVNs.push(
514
- h('span', {
515
- class: 'vxe-button--item vxe-button--custom-prefix-icon'
516
- }, prefixIconSlot({}))
517
- )
518
- } else if (prefixRender) {
519
- const compConf = renderer.get(prefixRender.name)
520
- const pIconMethod = compConf ? compConf.renderButtonPrefix : null
521
- contVNs.push(
522
- h('span', {
523
- class: ['vxe-button--item vxe-button--custom-prefix-icon']
524
- }, pIconMethod ? getSlotVNs(pIconMethod(prefixRender, { $button: $xeButton })) : [])
525
- )
526
- } else if (prefixIcon) {
527
- contVNs.push(
528
- h('i', {
529
- class: ['vxe-button--item vxe-button--prefix-icon', prefixIcon]
530
- })
531
- )
532
- }
533
-
534
- if (defaultSlot) {
535
- contVNs.push(
536
- h('span', {
537
- class: 'vxe-button--item vxe-button--content'
538
- }, defaultSlot({}))
539
- )
540
- } else if (content) {
541
- contVNs.push(
542
- h('span', {
543
- class: 'vxe-button--item vxe-button--content'
544
- }, getFuncText(content))
545
- )
546
- }
547
-
548
- if (suffixIconSlot) {
549
- contVNs.push(
550
- h('span', {
551
- class: 'vxe-button--item vxe-button--custom-suffix-icon'
552
- }, suffixIconSlot({}))
553
- )
554
- } else if (suffixRender) {
555
- const compConf = renderer.get(suffixRender.name)
556
- const sIconMethod = compConf ? compConf.renderButtonSuffix : null
557
- contVNs.push(
558
- h('span', {
559
- class: ['vxe-button--item vxe-button--custom-suffix-icon']
560
- }, sIconMethod ? getSlotVNs(sIconMethod(suffixRender, { $button: $xeButton })) : [])
561
- )
562
- } else if (suffixIcon) {
563
- contVNs.push(
564
- h('i', {
565
- class: ['vxe-button--item vxe-button--suffix-icon', suffixIcon]
566
- })
567
- )
568
- }
569
- if (suffixTooltip) {
570
- contVNs.push(
571
- renderTooltipIcon(suffixTipOpts, 'suffix')
572
- )
573
- }
574
- return contVNs
575
- }
576
-
577
- const dispatchEvent = (type: ValueOf<VxeButtonEmits>, params: Record<string, any>, evnt: Event | null) => {
578
- emit(type, createEvent(evnt, { $button: $xeButton }, params))
579
- }
580
-
581
- buttonMethods = {
582
- dispatchEvent,
583
- openPanel,
584
- closePanel: hidePanel,
585
- focus () {
586
- const btnElem = refButton.value
587
- if (btnElem) {
588
- btnElem.focus()
589
- }
590
- return nextTick()
591
- },
592
- blur () {
593
- const btnElem = refButton.value
594
- if (btnElem) {
595
- btnElem.blur()
596
- }
597
- return nextTick()
598
- }
599
- }
600
-
601
- const handleGlobalMousedownEvent = (evnt: MouseEvent) => {
602
- const btnDisabled = computeBtnDisabled.value
603
- const { visiblePanel } = reactData
604
- if (!btnDisabled) {
605
- const el = refElem.value
606
- const panelElem = refBtnPanel.value
607
- reactData.isActivated = getEventTargetNode(evnt, el).flag || getEventTargetNode(evnt, panelElem).flag
608
- if (visiblePanel && !reactData.isActivated) {
609
- hidePanel()
610
- }
611
- }
612
- }
613
-
614
- const handleGlobalResizeEvent = () => {
615
- const { visiblePanel } = reactData
616
- if (visiblePanel) {
617
- updatePlacement()
618
- }
619
- }
620
-
621
- const handleGlobalScrollEvent = () => {
622
- const { visiblePanel } = reactData
623
- if (visiblePanel) {
624
- updatePlacement()
625
- }
626
- }
627
-
628
- Object.assign($xeButton, buttonMethods)
629
-
630
- const renderVN = () => {
631
- const { className, trigger, title, routerLink, type, destroyOnClose, name, loading, shadow, dropdownOpenIcon, dropdownCloseIcon, showDropdownIcon } = props
632
- const { initialized, isAniVisible, visiblePanel } = reactData
633
- const isFormBtn = computeIsFormBtn.value
634
- const btnMode = computeBtnMode.value
635
- const btnStatus = computeBtnStatus.value
636
- const btnRound = computeBtnRound.value
637
- const btnAlign = computeBtnAlign.value
638
- const btnCircle = computeBtnCircle.value
639
- const btnTransfer = computeBtnTransfer.value
640
- const btnDisabled = computeBtnDisabled.value
641
- const permissionInfo = computePermissionInfo.value
642
- const downBtnList = computeDownBtnList.value
643
- const popupOpts = computePopupOpts.value
644
- const vSize = computeSize.value
645
- const { appendTo } = popupOpts
646
- const dropdownsSlot = slots.dropdowns
647
- const ppClassName = popupOpts.className || props.popupClassName
648
-
649
- if (!permissionInfo.visible) {
650
- return renderEmptyElement($xeButton)
651
- }
652
- if (dropdownsSlot || downBtnList.length) {
653
- const btnOns: Record<string, any> = {
654
- onContextmenu: contextmenuEvent
655
- }
656
- const panelOns: Record<string, any> = {}
657
- if (trigger === 'hover') {
658
- // hover 触发
659
- btnOns.onMouseenter = mouseenterTargetEvent
660
- btnOns.onMouseleave = mouseleaveTargetEvent
661
-
662
- panelOns.onMouseenter = mouseenterDropdownEvent
663
- panelOns.onMouseleave = mouseleaveDropdownEvent
664
- }
665
- return h('div', {
666
- ref: refElem,
667
- class: ['vxe-button--dropdown', className ? (XEUtils.isFunction(className) ? className({ $button: $xeButton }) : className) : '', {
668
- [`size--${vSize}`]: vSize,
669
- 'is--active': visiblePanel
670
- }]
671
- }, [
672
- routerLink
673
- ? h(resolveComponent('router-link'), {
674
- ref: refButton,
675
- class: ['vxe-button', 'vxe-button--link', `type--${btnMode}`, btnAlign ? `align--${btnAlign}` : '', className ? (XEUtils.isFunction(className) ? className({ $button: $xeButton }) : className) : '', {
676
- [`size--${vSize}`]: vSize,
677
- [`theme--${btnStatus}`]: btnStatus,
678
- 'is--round': btnRound,
679
- 'is--circle': btnCircle,
680
- 'is--shadow': shadow,
681
- 'is--disabled': btnDisabled || loading,
682
- 'is--loading': loading
683
- }],
684
- title,
685
- name,
686
- type: isFormBtn ? type : 'button',
687
- disabled: btnDisabled || loading,
688
- to: routerLink,
689
- onClick: clickTargetEvent,
690
- ...btnOns
691
- }, {
692
- default () {
693
- return renderContent().concat(showDropdownIcon
694
- ? [
695
- h('i', {
696
- class: `vxe-button--dropdown-icon ${visiblePanel ? (dropdownOpenIcon || getIcon().BUTTON_DROPDOWN_OPEN) : (dropdownCloseIcon || getIcon().BUTTON_DROPDOWN_CLOSE)}`
697
- })
698
- ]
699
- : [])
700
- }
701
- })
702
- : h('button', {
703
- ref: refButton,
704
- class: ['vxe-button', `type--${btnMode}`, btnAlign ? `align--${btnAlign}` : '', className ? (XEUtils.isFunction(className) ? className({ $button: $xeButton }) : className) : '', {
705
- [`size--${vSize}`]: vSize,
706
- [`theme--${btnStatus}`]: btnStatus,
707
- 'is--round': btnRound,
708
- 'is--circle': btnCircle,
709
- 'is--shadow': shadow,
710
- 'is--disabled': btnDisabled || loading,
711
- 'is--loading': loading
712
- }],
713
- title,
714
- name,
715
- type: isFormBtn ? type : 'button',
716
- disabled: btnDisabled || loading,
717
- onClick: clickTargetEvent,
718
- ...btnOns
719
- }, renderContent().concat(showDropdownIcon
720
- ? [
721
- h('i', {
722
- class: `vxe-button--dropdown-icon ${visiblePanel ? (dropdownOpenIcon || getIcon().BUTTON_DROPDOWN_OPEN) : (dropdownCloseIcon || getIcon().BUTTON_DROPDOWN_CLOSE)}`
723
- })
724
- ]
725
- : [])),
726
- h(Teleport, {
727
- to: getPopupContainer(appendTo),
728
- disabled: btnTransfer ? !initialized : true
729
- }, [
730
- h('div', {
731
- ref: refBtnPanel,
732
- class: ['vxe-button--dropdown-panel', ppClassName ? (XEUtils.isFunction(ppClassName) ? ppClassName({ $button: $xeButton }) : ppClassName) : '', {
733
- [`size--${vSize}`]: vSize,
734
- 'is--transfer': btnTransfer,
735
- 'ani--leave': isAniVisible,
736
- 'ani--enter': visiblePanel
737
- }],
738
- placement: reactData.panelPlacement,
739
- style: reactData.panelStyle,
740
- ...panelOns
741
- }, initialized && (visiblePanel || isAniVisible)
742
- ? [
743
- dropdownsSlot
744
- ? h('div', {
745
- class: 'vxe-button--dropdown-wrapper',
746
- onMousedown: mousedownDropdownEvent,
747
- onClick: clickDropdownEvent
748
- }, initialized && (destroyOnClose ? (visiblePanel || isAniVisible) : true) ? dropdownsSlot({}) : [])
749
- : h('div', {
750
- class: 'vxe-button--dropdown-wrapper'
751
- }, initialized && (destroyOnClose ? (visiblePanel || isAniVisible) : true)
752
- ? downBtnList.map((option, i) => {
753
- return h(VxeButtonComponent, {
754
- key: i,
755
- type: option.type,
756
- mode: option.mode || btnMode,
757
- className: option.className,
758
- name: option.name,
759
- routerLink: option.routerLink,
760
- permissionCode: option.permissionCode,
761
- title: option.title,
762
- content: option.content,
763
- status: option.status,
764
- icon: option.icon,
765
- round: XEUtils.isBoolean(option.round) ? option.round : (btnMode === 'text' ? false : btnRound),
766
- circle: XEUtils.isBoolean(option.circle) ? option.circle : (btnMode === 'text' ? false : btnCircle),
767
- disabled: option.disabled,
768
- loading: option.loading,
769
- align: option.align,
770
- onClick (params: VxeButtonDefines.ClickEventParams) {
771
- downBtnClickEvent(params, option)
772
- }
773
- })
774
- })
775
- : [])
776
- ]
777
- : [])
778
- ])
779
- ])
780
- }
781
- if (routerLink) {
782
- return h(resolveComponent('router-link'), {
783
- ref: refButton,
784
- class: ['vxe-button', 'vxe-button--link', `type--${btnMode}`, btnAlign ? `align--${btnAlign}` : '', className ? (XEUtils.isFunction(className) ? className({ $button: $xeButton }) : className) : '', {
785
- [`size--${vSize}`]: vSize,
786
- [`theme--${btnStatus}`]: btnStatus,
787
- 'is--round': btnRound,
788
- 'is--circle': btnCircle,
789
- 'is--shadow': shadow,
790
- 'is--disabled': btnDisabled || loading,
791
- 'is--loading': loading
792
- }],
793
- title,
794
- name,
795
- type: isFormBtn ? type : 'button',
796
- disabled: btnDisabled || loading,
797
- to: routerLink,
798
- onClick: clickEvent,
799
- onMouseenter: mouseenterEvent,
800
- onMouseleave: mouseleaveEvent,
801
- onContextmenu: contextmenuEvent
802
- }, {
803
- default () {
804
- return renderContent()
805
- }
806
- })
807
- }
808
- return h('button', {
809
- ref: refButton,
810
- class: ['vxe-button', `type--${btnMode}`, btnAlign ? `align--${btnAlign}` : '', className ? (XEUtils.isFunction(className) ? className({ $button: $xeButton }) : className) : '', {
811
- [`size--${vSize}`]: vSize,
812
- [`theme--${btnStatus}`]: btnStatus,
813
- 'is--round': btnRound,
814
- 'is--circle': btnCircle,
815
- 'is--shadow': shadow,
816
- 'is--disabled': btnDisabled || loading,
817
- 'is--loading': loading
818
- }],
819
- title,
820
- name,
821
- type: isFormBtn ? type : 'button',
822
- disabled: btnDisabled || loading,
823
- onClick: clickEvent,
824
- onMouseenter: mouseenterEvent,
825
- onMouseleave: mouseleaveEvent,
826
- onContextmenu: contextmenuEvent
827
- }, renderContent())
828
- }
829
-
830
- $xeButton.renderVN = renderVN
831
-
832
- onMounted(() => {
833
- if (props.type === 'text') {
834
- warnLog('vxe.error.delProp', ['type=text', 'mode=text'])
835
- }
836
-
837
- globalEvents.on($xeButton, 'mousedown', handleGlobalMousedownEvent)
838
- globalEvents.on($xeButton, 'resize', handleGlobalResizeEvent)
839
- globalEvents.on($xeButton, 'scroll', handleGlobalScrollEvent)
840
- })
841
-
842
- onUnmounted(() => {
843
- globalEvents.off($xeButton, 'mousedown')
844
- globalEvents.off($xeButton, 'resize')
845
- globalEvents.off($xeButton, 'scroll')
846
- })
847
-
848
- return $xeButton
849
- },
850
- render () {
851
- return this.renderVN()
852
- }
853
- })
854
-
855
- export default VxeButtonComponent
1
+ import { h, ref, computed, Teleport, resolveComponent, VNode, onUnmounted, reactive, nextTick, PropType, onMounted, inject } from 'vue'
2
+ import { defineVxeComponent } from '../../ui/src/comp'
3
+ import XEUtils from 'xe-utils'
4
+ import { VxeUI } from '@vxe-ui/core'
5
+ import { getEventTargetNode, getPopupContainer, updatePanelPlacement } from '../../ui/src/dom'
6
+ import { getFuncText, getLastZIndex, nextZIndex } from '../../ui/src/utils'
7
+ import { getSlotVNs } from '../../ui/src/vn'
8
+ import { createComponentLog } from '../../ui/src/log'
9
+ import VxeTooltipComponent from '../../tooltip'
10
+
11
+ import type {
12
+ VxeButtonConstructor,
13
+ VxeButtonPropTypes,
14
+ VxeButtonEmits,
15
+ ButtonReactData,
16
+ ButtonMethods,
17
+ VxeButtonDefines,
18
+ ButtonPrivateRef,
19
+ ButtonInternalData,
20
+ VxeButtonGroupConstructor,
21
+ VxeButtonGroupPrivateMethods,
22
+ VxeDrawerConstructor,
23
+ VxeDrawerMethods,
24
+ VxeFormConstructor,
25
+ VxeFormPrivateMethods,
26
+ VxeModalConstructor,
27
+ VxeModalMethods,
28
+ ValueOf,
29
+ VxeTreeConstructor,
30
+ VxeTreePrivateMethods
31
+ } from '../../../types'
32
+ import type { VxeTableConstructor, VxeTablePrivateMethods } from '../../../types/components/table'
33
+ import type { VxeGridConstructor, VxeGridPrivateMethods } from '../../../types/components/grid'
34
+
35
+ const { getConfig, globalEvents, getIcon, createEvent, useFns, renderer, permission, renderEmptyElement } = VxeUI
36
+
37
+ const { warnLog } = createComponentLog('button')
38
+
39
+ const VxeButtonComponent = defineVxeComponent({
40
+ name: 'VxeButton',
41
+ props: {
42
+ /**
43
+ * 按钮类型
44
+ */
45
+ type: String as PropType<VxeButtonPropTypes.Type>,
46
+ mode: String as PropType<VxeButtonPropTypes.Mode>,
47
+ className: [String, Function] as PropType<VxeButtonPropTypes.ClassName>,
48
+ popupClassName: [String, Function] as PropType<VxeButtonPropTypes.PopupClassName>,
49
+ /**
50
+ * 按钮尺寸
51
+ */
52
+ size: {
53
+ type: String as PropType<VxeButtonPropTypes.Size>,
54
+ default: () => getConfig().button.size || getConfig().size
55
+ },
56
+ zIndex: Number as PropType<VxeButtonPropTypes.ZIndex>,
57
+ /**
58
+ * 用来标识这一项
59
+ */
60
+ name: [String, Number] as PropType<VxeButtonPropTypes.Name>,
61
+ routerLink: Object as PropType<VxeButtonPropTypes.RouterLink>,
62
+ /**
63
+ * 权限码
64
+ */
65
+ permissionCode: [String, Number] as PropType<VxeButtonPropTypes.PermissionCode>,
66
+ /**
67
+ * 按钮内容
68
+ */
69
+ content: String as PropType<VxeButtonPropTypes.Content>,
70
+ /**
71
+ * 固定显示下拉面板的方向
72
+ */
73
+ placement: String as PropType<VxeButtonPropTypes.Placement>,
74
+ /**
75
+ * 按钮状态
76
+ */
77
+ status: String as PropType<VxeButtonPropTypes.Status>,
78
+ /**
79
+ * 标题
80
+ */
81
+ title: String as PropType<VxeButtonPropTypes.Title>,
82
+ shadow: Boolean as PropType<VxeButtonPropTypes.Shadow>,
83
+ /**
84
+ * 按钮的前缀图标,属于 prefix-icon 的简写
85
+ */
86
+ icon: String as PropType<VxeButtonPropTypes.Icon>,
87
+ iconRender: Object as PropType<VxeButtonPropTypes.IconRender>,
88
+ /**
89
+ * 按钮的前缀图标
90
+ */
91
+ prefixIcon: String as PropType<VxeButtonPropTypes.PrefixIcon>,
92
+ prefixRender: Object as PropType<VxeButtonPropTypes.PrefixRender>,
93
+ /**
94
+ * 按钮的后缀图标
95
+ */
96
+ suffixIcon: String as PropType<VxeButtonPropTypes.SuffixIcon>,
97
+ suffixRender: Object as PropType<VxeButtonPropTypes.SuffixRender>,
98
+ /**
99
+ * 圆角边框
100
+ */
101
+ round: Boolean as PropType<VxeButtonPropTypes.Round>,
102
+ /**
103
+ * 圆角按钮
104
+ */
105
+ circle: Boolean as PropType<VxeButtonPropTypes.Circle>,
106
+ /**
107
+ * 是否禁用
108
+ */
109
+ disabled: Boolean as PropType<VxeButtonPropTypes.Disabled>,
110
+ /**
111
+ * 是否加载中
112
+ */
113
+ loading: Boolean as PropType<VxeButtonPropTypes.Loading>,
114
+ trigger: {
115
+ type: String as PropType<VxeButtonPropTypes.Trigger>,
116
+ default: () => getConfig().button.trigger
117
+ },
118
+ align: String as PropType<VxeButtonPropTypes.Align>,
119
+ prefixTooltip: Object as PropType<VxeButtonPropTypes.PrefixTooltip>,
120
+ suffixTooltip: Object as PropType<VxeButtonPropTypes.SuffixTooltip>,
121
+ options: Array as PropType<VxeButtonPropTypes.Options>,
122
+ showDropdownIcon: {
123
+ type: Boolean as PropType<VxeButtonPropTypes.ShowDropdownIcon>,
124
+ default: () => getConfig().button.showDropdownIcon
125
+ },
126
+ dropdownCloseIcon: {
127
+ type: String as PropType<VxeButtonPropTypes.DropdownCloseIcon>,
128
+ default: () => getConfig().button.dropdownCloseIcon
129
+ },
130
+ dropdownOpenIcon: {
131
+ type: String as PropType<VxeButtonPropTypes.DropdownOpenIcon>,
132
+ default: () => getConfig().button.dropdownOpenIcon
133
+ },
134
+ /**
135
+ * 在下拉面板关闭时销毁内容
136
+ */
137
+ destroyOnClose: {
138
+ type: Boolean as PropType<VxeButtonPropTypes.DestroyOnClose>,
139
+ default: () => getConfig().button.destroyOnClose
140
+ },
141
+ popupConfig: Object as PropType<VxeButtonPropTypes.PopupConfig>,
142
+ /**
143
+ * 是否将弹框容器插入于 body 内
144
+ */
145
+ transfer: {
146
+ type: Boolean as PropType<VxeButtonPropTypes.Transfer>,
147
+ default: null
148
+ }
149
+ },
150
+ emits: ['click', 'mouseenter', 'mouseleave', 'dropdown-click', 'dropdownClick', 'contextmenu'] as VxeButtonEmits,
151
+ setup(props, context) {
152
+ const { slots, emit } = context
153
+
154
+ const $xeModal = inject<(VxeModalConstructor & VxeModalMethods) | null>('$xeModal', null)
155
+ const $xeDrawer = inject<(VxeDrawerConstructor & VxeDrawerMethods) | null>('$xeDrawer', null)
156
+ const $xeGrid = inject<(VxeGridConstructor & VxeGridPrivateMethods) | null>('$xeGrid', null)
157
+ const $xeTable = inject<(VxeTableConstructor & VxeTablePrivateMethods) | null>('$xeTable', null)
158
+ const $xeTree = inject<(VxeTreeConstructor & VxeTreePrivateMethods) | null>('$xeTree', null)
159
+ const $xeForm = inject<(VxeFormConstructor & VxeFormPrivateMethods) | null>('$xeForm', null)
160
+ const $xeButtonGroup = inject<(VxeButtonGroupConstructor & VxeButtonGroupPrivateMethods) | null>('$xeButtonGroup', null)
161
+
162
+ const xID = XEUtils.uniqueId()
163
+
164
+ const { computeSize } = useFns.useSize(props)
165
+
166
+ const { computePermissionInfo } = useFns.usePermission(props)
167
+
168
+ const reactData = reactive<ButtonReactData>({
169
+ initialized: false,
170
+ visiblePanel: false,
171
+ isAniVisible: false,
172
+ isActivated: false,
173
+ panelIndex: 0,
174
+ panelStyle: {},
175
+ panelPlacement: ''
176
+ })
177
+
178
+ const internalData: ButtonInternalData = {
179
+ showTime: undefined,
180
+ tooltipTimeout: undefined
181
+ }
182
+
183
+ const refElem = ref<HTMLDivElement>()
184
+ const refButton = ref<HTMLButtonElement>()
185
+ const refBtnPanel = ref<HTMLDivElement>()
186
+
187
+ const refMaps: ButtonPrivateRef = {
188
+ refElem
189
+ }
190
+
191
+ const $xeButton = {
192
+ xID,
193
+ props,
194
+ context,
195
+ reactData,
196
+ internalData,
197
+ getRefMaps: () => refMaps
198
+ } as unknown as VxeButtonConstructor
199
+
200
+ let buttonMethods = {} as ButtonMethods
201
+
202
+ const computeBtnTransfer = computed(() => {
203
+ const { transfer } = props
204
+ const popupOpts = computePopupOpts.value
205
+ if (XEUtils.isBoolean(popupOpts.transfer)) {
206
+ return popupOpts.transfer
207
+ }
208
+ if (transfer === null) {
209
+ const globalTransfer = getConfig().button.transfer
210
+ if (XEUtils.isBoolean(globalTransfer)) {
211
+ return globalTransfer
212
+ }
213
+ if ($xeGrid || $xeTable || $xeTree || $xeModal || $xeDrawer || $xeForm) {
214
+ return true
215
+ }
216
+ }
217
+ return transfer
218
+ })
219
+
220
+ const computeBtnDisabled = computed(() => {
221
+ const { disabled } = props
222
+ const permissionInfo = computePermissionInfo.value
223
+ return disabled || permissionInfo.disabled
224
+ })
225
+
226
+ const computeIsFormBtn = computed(() => {
227
+ const { type } = props
228
+ if (type) {
229
+ return ['submit', 'reset', 'button'].indexOf(type) > -1
230
+ }
231
+ return false
232
+ })
233
+
234
+ const computeBtnMode = computed(() => {
235
+ const { type, mode } = props
236
+ if (mode === 'text' || type === 'text' || ($xeButtonGroup && $xeButtonGroup.props.mode === 'text')) {
237
+ return 'text'
238
+ }
239
+ return 'button'
240
+ })
241
+
242
+ const computeBtnStatus = computed(() => {
243
+ const { status } = props
244
+ if (status) {
245
+ return status
246
+ }
247
+ if ($xeButtonGroup) {
248
+ return $xeButtonGroup.props.status
249
+ }
250
+ return ''
251
+ })
252
+
253
+ const computeBtnAlign = computed(() => {
254
+ const { align } = props
255
+ if (align) {
256
+ return align
257
+ }
258
+ if ($xeButtonGroup) {
259
+ return $xeButtonGroup.props.align
260
+ }
261
+ return false
262
+ })
263
+
264
+ const computeBtnRound = computed(() => {
265
+ const { round } = props
266
+ if (round) {
267
+ return round
268
+ }
269
+ if ($xeButtonGroup) {
270
+ return $xeButtonGroup.props.round
271
+ }
272
+ return false
273
+ })
274
+
275
+ const computeBtnCircle = computed(() => {
276
+ const { circle } = props
277
+ if (circle) {
278
+ return circle
279
+ }
280
+ if ($xeButtonGroup) {
281
+ return $xeButtonGroup.props.circle
282
+ }
283
+ return false
284
+ })
285
+
286
+ const computeDownBtnList = computed(() => {
287
+ const { options } = props
288
+ if (options) {
289
+ return options.filter((item) => {
290
+ const { permissionCode } = item
291
+ return !permissionCode || permission.checkVisible(permissionCode)
292
+ })
293
+ }
294
+ return []
295
+ })
296
+
297
+ const computePopupOpts = computed(() => {
298
+ return Object.assign({}, getConfig().button.popupConfig, props.popupConfig)
299
+ })
300
+
301
+ const computePrefixTipOpts = computed(() => {
302
+ return Object.assign({}, getConfig().button.prefixTooltip, props.prefixTooltip)
303
+ })
304
+
305
+ const computeSuffixTipOpts = computed(() => {
306
+ return Object.assign({}, getConfig().button.suffixTooltip, props.suffixTooltip)
307
+ })
308
+
309
+ const updateZindex = () => {
310
+ const popupOpts = computePopupOpts.value
311
+ const customZIndex = popupOpts.zIndex || props.zIndex
312
+ if (customZIndex) {
313
+ reactData.panelIndex = XEUtils.toNumber(customZIndex)
314
+ } else if (reactData.panelIndex < getLastZIndex()) {
315
+ reactData.panelIndex = nextZIndex()
316
+ }
317
+ }
318
+
319
+ const updatePlacement = () => {
320
+ const { placement } = props
321
+ const { panelIndex } = reactData
322
+ const targetElem = refButton.value
323
+ const panelElem = refBtnPanel.value
324
+ const btnTransfer = computeBtnTransfer.value
325
+ const popupOpts = computePopupOpts.value
326
+ const handleStyle = () => {
327
+ const ppObj = updatePanelPlacement(targetElem, panelElem, {
328
+ placement: popupOpts.placement || placement,
329
+ defaultPlacement: popupOpts.defaultPlacement,
330
+ appendTo: popupOpts.appendTo,
331
+ teleportTo: btnTransfer
332
+ })
333
+ const panelStyle: { [key: string]: string | number } = Object.assign(ppObj.style, {
334
+ zIndex: panelIndex
335
+ })
336
+ reactData.panelStyle = panelStyle
337
+ reactData.panelPlacement = ppObj.placement
338
+ }
339
+ handleStyle()
340
+ return nextTick().then(handleStyle)
341
+ }
342
+
343
+ const clickEvent = (evnt: Event) => {
344
+ if ($xeButtonGroup) {
345
+ $xeButtonGroup.handleClick({ name: props.name }, evnt)
346
+ }
347
+ dispatchEvent('click', { $event: evnt }, evnt)
348
+ }
349
+
350
+ const downBtnClickEvent = (params: VxeButtonDefines.ClickEventParams, option: VxeButtonDefines.DownButtonOption) => {
351
+ const { $event } = params
352
+ hidePanel()
353
+ dispatchEvent('dropdown-click', { name: option.name, option }, $event)
354
+ }
355
+
356
+ const mousedownDropdownEvent = (evnt: MouseEvent) => {
357
+ const isLeftBtn = evnt.button === 0
358
+ if (isLeftBtn) {
359
+ evnt.stopPropagation()
360
+ }
361
+ }
362
+
363
+ const clickDropdownEvent = (evnt: Event) => {
364
+ const dropdownElem = evnt.currentTarget
365
+ const panelElem = refBtnPanel.value
366
+ const { flag, targetElem } = getEventTargetNode(evnt, dropdownElem, 'vxe-button')
367
+ if (flag) {
368
+ if (panelElem) {
369
+ panelElem.dataset.active = 'N'
370
+ }
371
+ reactData.visiblePanel = false
372
+ setTimeout(() => {
373
+ if (!panelElem || panelElem.dataset.active !== 'Y') {
374
+ reactData.isAniVisible = false
375
+ }
376
+ }, 350)
377
+ dispatchEvent('dropdown-click', { name: targetElem.getAttribute('name'), option: null }, evnt)
378
+ }
379
+ }
380
+
381
+ const mouseenterDropdownEvent = () => {
382
+ const panelElem = refBtnPanel.value
383
+ if (panelElem) {
384
+ panelElem.dataset.active = 'Y'
385
+ reactData.isAniVisible = true
386
+ setTimeout(() => {
387
+ if (panelElem.dataset.active === 'Y') {
388
+ reactData.visiblePanel = true
389
+ updateZindex()
390
+ updatePlacement()
391
+ setTimeout(() => {
392
+ if (reactData.visiblePanel) {
393
+ updatePlacement()
394
+ }
395
+ }, 50)
396
+ }
397
+ }, 20)
398
+ }
399
+ }
400
+
401
+ const mouseenterTargetEvent = (evnt: MouseEvent) => {
402
+ const { loading } = props
403
+ const btnDisabled = computeBtnDisabled.value
404
+ if (!(btnDisabled || loading)) {
405
+ openPanel()
406
+ mouseenterEvent(evnt)
407
+ }
408
+ }
409
+
410
+ const mouseleaveTargetEvent = (evnt: MouseEvent) => {
411
+ hidePanel()
412
+ mouseleaveEvent(evnt)
413
+ }
414
+
415
+ const mouseenterEvent = (evnt: MouseEvent) => {
416
+ dispatchEvent('mouseenter', {}, evnt)
417
+ }
418
+
419
+ const mouseleaveEvent = (evnt: MouseEvent) => {
420
+ dispatchEvent('mouseleave', {}, evnt)
421
+ }
422
+
423
+ const contextmenuEvent = (evnt: MouseEvent) => {
424
+ dispatchEvent('contextmenu', {}, evnt)
425
+ }
426
+
427
+ const clickTargetEvent = (evnt: MouseEvent) => {
428
+ const { loading, trigger } = props
429
+ const btnDisabled = computeBtnDisabled.value
430
+ if (!(btnDisabled || loading)) {
431
+ if (trigger === 'click') {
432
+ if (reactData.visiblePanel) {
433
+ hidePanel()
434
+ } else {
435
+ openPanel()
436
+ }
437
+ }
438
+ clickEvent(evnt)
439
+ }
440
+ }
441
+
442
+ const openPanel = () => {
443
+ const { trigger } = props
444
+ const panelElem = refBtnPanel.value
445
+ if (panelElem) {
446
+ panelElem.dataset.active = 'Y'
447
+ if (!reactData.initialized) {
448
+ reactData.initialized = true
449
+ }
450
+ internalData.showTime = setTimeout(
451
+ () => {
452
+ if (panelElem.dataset.active === 'Y') {
453
+ mouseenterDropdownEvent()
454
+ } else {
455
+ reactData.isAniVisible = false
456
+ }
457
+ },
458
+ trigger === 'click' ? 50 : 250
459
+ )
460
+ }
461
+ return nextTick()
462
+ }
463
+
464
+ const hidePanel = () => {
465
+ const panelElem = refBtnPanel.value
466
+ clearTimeout(internalData.showTime)
467
+ if (panelElem) {
468
+ panelElem.dataset.active = 'N'
469
+ setTimeout(() => {
470
+ if (panelElem.dataset.active !== 'Y') {
471
+ reactData.visiblePanel = false
472
+ setTimeout(() => {
473
+ if (panelElem.dataset.active !== 'Y') {
474
+ reactData.isAniVisible = false
475
+ }
476
+ }, 350)
477
+ }
478
+ }, 100)
479
+ } else {
480
+ reactData.isAniVisible = false
481
+ reactData.visiblePanel = false
482
+ }
483
+ return nextTick()
484
+ }
485
+
486
+ const mouseleaveDropdownEvent = () => {
487
+ hidePanel()
488
+ }
489
+
490
+ const renderTooltipIcon = (tipOpts: VxeButtonPropTypes.PrefixTooltip | VxeButtonPropTypes.SuffixTooltip, type: 'prefix' | 'suffix') => {
491
+ return h(
492
+ VxeTooltipComponent,
493
+ {
494
+ useHtml: XEUtils.isBoolean(tipOpts.useHtml) ? tipOpts.useHtml : tipOpts.useHTML,
495
+ content: tipOpts.content,
496
+ enterable: tipOpts.enterable,
497
+ theme: tipOpts.theme
498
+ },
499
+ {
500
+ default() {
501
+ return h(
502
+ 'span',
503
+ {
504
+ class: `vxe-button--item vxe-button--tooltip-${type}-icon`
505
+ },
506
+ [
507
+ h('i', {
508
+ class: tipOpts.icon || getIcon().BUTTON_TOOLTIP_ICON
509
+ })
510
+ ]
511
+ )
512
+ }
513
+ }
514
+ )
515
+ }
516
+
517
+ const renderContent = () => {
518
+ const { content, suffixIcon, loading, prefixTooltip, suffixTooltip, suffixRender } = props
519
+ const prefixIcon = props.prefixIcon || props.icon
520
+ const prefixRender = props.prefixRender || props.iconRender
521
+ const prefixTipOpts = computePrefixTipOpts.value
522
+ const suffixTipOpts = computeSuffixTipOpts.value
523
+ const prefixIconSlot = slots.prefix || slots.icon
524
+ const suffixIconSlot = slots.suffix
525
+ const defaultSlot = slots.default
526
+ const contVNs: VNode[] = []
527
+ if (prefixTooltip) {
528
+ contVNs.push(renderTooltipIcon(prefixTipOpts, 'prefix'))
529
+ }
530
+ if (loading) {
531
+ contVNs.push(
532
+ h('i', {
533
+ class: ['vxe-button--item vxe-button--loading-icon', getIcon().BUTTON_LOADING]
534
+ })
535
+ )
536
+ } else if (prefixIconSlot) {
537
+ contVNs.push(
538
+ h(
539
+ 'span',
540
+ {
541
+ class: 'vxe-button--item vxe-button--custom-prefix-icon'
542
+ },
543
+ prefixIconSlot({})
544
+ )
545
+ )
546
+ } else if (prefixRender) {
547
+ const compConf = renderer.get(prefixRender.name)
548
+ const pIconMethod = compConf ? compConf.renderButtonPrefix : null
549
+ contVNs.push(
550
+ h(
551
+ 'span',
552
+ {
553
+ class: ['vxe-button--item vxe-button--custom-prefix-icon']
554
+ },
555
+ pIconMethod ? getSlotVNs(pIconMethod(prefixRender, { $button: $xeButton })) : []
556
+ )
557
+ )
558
+ } else if (prefixIcon) {
559
+ contVNs.push(
560
+ h('i', {
561
+ class: ['vxe-button--item vxe-button--prefix-icon', prefixIcon]
562
+ })
563
+ )
564
+ }
565
+
566
+ if (defaultSlot) {
567
+ contVNs.push(
568
+ h(
569
+ 'span',
570
+ {
571
+ class: 'vxe-button--item vxe-button--content'
572
+ },
573
+ defaultSlot({})
574
+ )
575
+ )
576
+ } else if (content) {
577
+ contVNs.push(
578
+ h(
579
+ 'span',
580
+ {
581
+ class: 'vxe-button--item vxe-button--content'
582
+ },
583
+ getFuncText(content)
584
+ )
585
+ )
586
+ }
587
+
588
+ if (suffixIconSlot) {
589
+ contVNs.push(
590
+ h(
591
+ 'span',
592
+ {
593
+ class: 'vxe-button--item vxe-button--custom-suffix-icon'
594
+ },
595
+ suffixIconSlot({})
596
+ )
597
+ )
598
+ } else if (suffixRender) {
599
+ const compConf = renderer.get(suffixRender.name)
600
+ const sIconMethod = compConf ? compConf.renderButtonSuffix : null
601
+ contVNs.push(
602
+ h(
603
+ 'span',
604
+ {
605
+ class: ['vxe-button--item vxe-button--custom-suffix-icon']
606
+ },
607
+ sIconMethod ? getSlotVNs(sIconMethod(suffixRender, { $button: $xeButton })) : []
608
+ )
609
+ )
610
+ } else if (suffixIcon) {
611
+ contVNs.push(
612
+ h('i', {
613
+ class: ['vxe-button--item vxe-button--suffix-icon', suffixIcon]
614
+ })
615
+ )
616
+ }
617
+ if (suffixTooltip) {
618
+ contVNs.push(renderTooltipIcon(suffixTipOpts, 'suffix'))
619
+ }
620
+ return contVNs
621
+ }
622
+
623
+ const dispatchEvent = (type: ValueOf<VxeButtonEmits>, params: Record<string, any>, evnt: Event | null) => {
624
+ emit(type, createEvent(evnt, { $button: $xeButton }, params))
625
+ }
626
+
627
+ buttonMethods = {
628
+ dispatchEvent,
629
+ openPanel,
630
+ closePanel: hidePanel,
631
+ focus() {
632
+ const btnElem = refButton.value
633
+ if (btnElem) {
634
+ btnElem.focus()
635
+ }
636
+ return nextTick()
637
+ },
638
+ blur() {
639
+ const btnElem = refButton.value
640
+ if (btnElem) {
641
+ btnElem.blur()
642
+ }
643
+ return nextTick()
644
+ }
645
+ }
646
+
647
+ const handleGlobalMousedownEvent = (evnt: MouseEvent) => {
648
+ const btnDisabled = computeBtnDisabled.value
649
+ const { visiblePanel } = reactData
650
+ if (!btnDisabled) {
651
+ const el = refElem.value
652
+ const panelElem = refBtnPanel.value
653
+ reactData.isActivated = getEventTargetNode(evnt, el).flag || getEventTargetNode(evnt, panelElem).flag
654
+ if (visiblePanel && !reactData.isActivated) {
655
+ hidePanel()
656
+ }
657
+ }
658
+ }
659
+
660
+ const handleGlobalResizeEvent = () => {
661
+ const { visiblePanel } = reactData
662
+ if (visiblePanel) {
663
+ updatePlacement()
664
+ }
665
+ }
666
+
667
+ const handleGlobalScrollEvent = () => {
668
+ const { visiblePanel } = reactData
669
+ if (visiblePanel) {
670
+ updatePlacement()
671
+ }
672
+ }
673
+
674
+ Object.assign($xeButton, buttonMethods)
675
+
676
+ const renderVN = () => {
677
+ const { className, trigger, title, routerLink, type, destroyOnClose, name, loading, shadow, dropdownOpenIcon, dropdownCloseIcon, showDropdownIcon } = props
678
+ const { initialized, isAniVisible, visiblePanel } = reactData
679
+ const isFormBtn = computeIsFormBtn.value
680
+ const btnMode = computeBtnMode.value
681
+ const btnStatus = computeBtnStatus.value
682
+ const btnRound = computeBtnRound.value
683
+ const btnAlign = computeBtnAlign.value
684
+ const btnCircle = computeBtnCircle.value
685
+ const btnTransfer = computeBtnTransfer.value
686
+ const btnDisabled = computeBtnDisabled.value
687
+ const permissionInfo = computePermissionInfo.value
688
+ const downBtnList = computeDownBtnList.value
689
+ const popupOpts = computePopupOpts.value
690
+ const vSize = computeSize.value
691
+ const { appendTo } = popupOpts
692
+ const dropdownsSlot = slots.dropdowns
693
+ const ppClassName = popupOpts.className || props.popupClassName
694
+
695
+ if (!permissionInfo.visible) {
696
+ return renderEmptyElement($xeButton)
697
+ }
698
+ if (dropdownsSlot || downBtnList.length) {
699
+ const btnOns: Record<string, any> = {
700
+ onContextmenu: contextmenuEvent
701
+ }
702
+ const panelOns: Record<string, any> = {}
703
+ if (trigger === 'hover') {
704
+ // hover 触发
705
+ btnOns.onMouseenter = mouseenterTargetEvent
706
+ btnOns.onMouseleave = mouseleaveTargetEvent
707
+
708
+ panelOns.onMouseenter = mouseenterDropdownEvent
709
+ panelOns.onMouseleave = mouseleaveDropdownEvent
710
+ }
711
+ return h(
712
+ 'div',
713
+ {
714
+ ref: refElem,
715
+ class: [
716
+ 'vxe-button--dropdown',
717
+ className ? (XEUtils.isFunction(className) ? className({ $button: $xeButton }) : className) : '',
718
+ {
719
+ [`size--${vSize}`]: vSize,
720
+ 'is--active': visiblePanel
721
+ }
722
+ ]
723
+ },
724
+ [
725
+ routerLink
726
+ ? h(
727
+ resolveComponent('router-link'),
728
+ {
729
+ ref: refButton,
730
+ class: [
731
+ 'vxe-button',
732
+ 'vxe-button--link',
733
+ `type--${btnMode}`,
734
+ btnAlign ? `align--${btnAlign}` : '',
735
+ className ? (XEUtils.isFunction(className) ? className({ $button: $xeButton }) : className) : '',
736
+ {
737
+ [`size--${vSize}`]: vSize,
738
+ [`theme--${btnStatus}`]: btnStatus,
739
+ 'is--round': btnRound,
740
+ 'is--circle': btnCircle,
741
+ 'is--shadow': shadow,
742
+ 'is--disabled': btnDisabled || loading,
743
+ 'is--loading': loading
744
+ }
745
+ ],
746
+ title,
747
+ name,
748
+ type: isFormBtn ? type : 'button',
749
+ disabled: btnDisabled || loading,
750
+ to: routerLink,
751
+ onClick: clickTargetEvent,
752
+ ...btnOns
753
+ },
754
+ {
755
+ default() {
756
+ return renderContent().concat(
757
+ showDropdownIcon
758
+ ? [
759
+ h('i', {
760
+ class: `vxe-button--dropdown-icon ${visiblePanel ? dropdownOpenIcon || getIcon().BUTTON_DROPDOWN_OPEN : dropdownCloseIcon || getIcon().BUTTON_DROPDOWN_CLOSE}`
761
+ })
762
+ ]
763
+ : []
764
+ )
765
+ }
766
+ }
767
+ )
768
+ : h(
769
+ 'button',
770
+ {
771
+ ref: refButton,
772
+ class: [
773
+ 'vxe-button',
774
+ `type--${btnMode}`,
775
+ btnAlign ? `align--${btnAlign}` : '',
776
+ className ? (XEUtils.isFunction(className) ? className({ $button: $xeButton }) : className) : '',
777
+ {
778
+ [`size--${vSize}`]: vSize,
779
+ [`theme--${btnStatus}`]: btnStatus,
780
+ 'is--round': btnRound,
781
+ 'is--circle': btnCircle,
782
+ 'is--shadow': shadow,
783
+ 'is--disabled': btnDisabled || loading,
784
+ 'is--loading': loading
785
+ }
786
+ ],
787
+ title,
788
+ name,
789
+ type: isFormBtn ? type : 'button',
790
+ disabled: btnDisabled || loading,
791
+ onClick: clickTargetEvent,
792
+ ...btnOns
793
+ },
794
+ renderContent().concat(
795
+ showDropdownIcon
796
+ ? [
797
+ h('i', {
798
+ class: `vxe-button--dropdown-icon ${visiblePanel ? dropdownOpenIcon || getIcon().BUTTON_DROPDOWN_OPEN : dropdownCloseIcon || getIcon().BUTTON_DROPDOWN_CLOSE}`
799
+ })
800
+ ]
801
+ : []
802
+ )
803
+ ),
804
+ h(
805
+ Teleport,
806
+ {
807
+ to: getPopupContainer(appendTo),
808
+ disabled: btnTransfer ? !initialized : true
809
+ },
810
+ [
811
+ h(
812
+ 'div',
813
+ {
814
+ ref: refBtnPanel,
815
+ class: [
816
+ 'vxe-button--dropdown-panel',
817
+ ppClassName ? (XEUtils.isFunction(ppClassName) ? ppClassName({ $button: $xeButton }) : ppClassName) : '',
818
+ {
819
+ [`size--${vSize}`]: vSize,
820
+ 'is--transfer': btnTransfer,
821
+ 'ani--leave': isAniVisible,
822
+ 'ani--enter': visiblePanel
823
+ }
824
+ ],
825
+ placement: reactData.panelPlacement,
826
+ style: reactData.panelStyle,
827
+ ...panelOns
828
+ },
829
+ initialized && (visiblePanel || isAniVisible)
830
+ ? [
831
+ dropdownsSlot
832
+ ? h(
833
+ 'div',
834
+ {
835
+ class: 'vxe-button--dropdown-wrapper',
836
+ onMousedown: mousedownDropdownEvent,
837
+ onClick: clickDropdownEvent
838
+ },
839
+ initialized && (destroyOnClose ? visiblePanel || isAniVisible : true) ? dropdownsSlot({}) : []
840
+ )
841
+ : h(
842
+ 'div',
843
+ {
844
+ class: 'vxe-button--dropdown-wrapper'
845
+ },
846
+ initialized && (destroyOnClose ? visiblePanel || isAniVisible : true)
847
+ ? downBtnList.map((option, i) => {
848
+ return h(VxeButtonComponent, {
849
+ key: i,
850
+ type: option.type,
851
+ mode: option.mode || btnMode,
852
+ className: option.className,
853
+ name: option.name,
854
+ routerLink: option.routerLink,
855
+ permissionCode: option.permissionCode,
856
+ title: option.title,
857
+ content: option.content,
858
+ status: option.status,
859
+ icon: option.icon,
860
+ round: XEUtils.isBoolean(option.round) ? option.round : btnMode === 'text' ? false : btnRound,
861
+ circle: XEUtils.isBoolean(option.circle) ? option.circle : btnMode === 'text' ? false : btnCircle,
862
+ disabled: option.disabled,
863
+ loading: option.loading,
864
+ align: option.align,
865
+ onClick(params: VxeButtonDefines.ClickEventParams) {
866
+ downBtnClickEvent(params, option)
867
+ }
868
+ })
869
+ })
870
+ : []
871
+ )
872
+ ]
873
+ : []
874
+ )
875
+ ]
876
+ )
877
+ ]
878
+ )
879
+ }
880
+ if (routerLink) {
881
+ return h(
882
+ resolveComponent('router-link'),
883
+ {
884
+ ref: refButton,
885
+ class: [
886
+ 'vxe-button',
887
+ 'vxe-button--link',
888
+ `type--${btnMode}`,
889
+ btnAlign ? `align--${btnAlign}` : '',
890
+ className ? (XEUtils.isFunction(className) ? className({ $button: $xeButton }) : className) : '',
891
+ {
892
+ [`size--${vSize}`]: vSize,
893
+ [`theme--${btnStatus}`]: btnStatus,
894
+ 'is--round': btnRound,
895
+ 'is--circle': btnCircle,
896
+ 'is--shadow': shadow,
897
+ 'is--disabled': btnDisabled || loading,
898
+ 'is--loading': loading
899
+ }
900
+ ],
901
+ title,
902
+ name,
903
+ type: isFormBtn ? type : 'button',
904
+ disabled: btnDisabled || loading,
905
+ to: routerLink,
906
+ onClick: clickEvent,
907
+ onMouseenter: mouseenterEvent,
908
+ onMouseleave: mouseleaveEvent,
909
+ onContextmenu: contextmenuEvent
910
+ },
911
+ {
912
+ default() {
913
+ return renderContent()
914
+ }
915
+ }
916
+ )
917
+ }
918
+ return h(
919
+ 'button',
920
+ {
921
+ ref: refButton,
922
+ class: [
923
+ 'vxe-button',
924
+ `type--${btnMode}`,
925
+ btnAlign ? `align--${btnAlign}` : '',
926
+ className ? (XEUtils.isFunction(className) ? className({ $button: $xeButton }) : className) : '',
927
+ {
928
+ [`size--${vSize}`]: vSize,
929
+ [`theme--${btnStatus}`]: btnStatus,
930
+ 'is--round': btnRound,
931
+ 'is--circle': btnCircle,
932
+ 'is--shadow': shadow,
933
+ 'is--disabled': btnDisabled || loading,
934
+ 'is--loading': loading
935
+ }
936
+ ],
937
+ title,
938
+ name,
939
+ type: isFormBtn ? type : 'button',
940
+ disabled: btnDisabled || loading,
941
+ onClick: clickEvent,
942
+ onMouseenter: mouseenterEvent,
943
+ onMouseleave: mouseleaveEvent,
944
+ onContextmenu: contextmenuEvent
945
+ },
946
+ renderContent()
947
+ )
948
+ }
949
+
950
+ $xeButton.renderVN = renderVN
951
+
952
+ onMounted(() => {
953
+ if (props.type === 'text') {
954
+ warnLog('vxe.error.delProp', ['type=text', 'mode=text'])
955
+ }
956
+
957
+ globalEvents.on($xeButton, 'mousedown', handleGlobalMousedownEvent)
958
+ globalEvents.on($xeButton, 'resize', handleGlobalResizeEvent)
959
+ globalEvents.on($xeButton, 'scroll', handleGlobalScrollEvent)
960
+ })
961
+
962
+ onUnmounted(() => {
963
+ globalEvents.off($xeButton, 'mousedown')
964
+ globalEvents.off($xeButton, 'resize')
965
+ globalEvents.off($xeButton, 'scroll')
966
+ })
967
+
968
+ return $xeButton
969
+ },
970
+ render() {
971
+ return this.renderVN()
972
+ }
973
+ })
974
+
975
+ export default VxeButtonComponent