vxe-pc-ui 4.14.4 → 4.14.6

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 (480) hide show
  1. package/LICENSE +21 -21
  2. package/README.en.md +72 -72
  3. package/README.ja-JP.md +72 -72
  4. package/README.md +364 -364
  5. package/README.zh-TW.md +73 -73
  6. package/es/tree/src/tree.js +31 -2
  7. package/es/tree-select/src/tree-select.js +2 -0
  8. package/es/ui/index.js +1 -1
  9. package/es/ui/src/log.js +1 -1
  10. package/lib/index.umd.js +2359 -2257
  11. package/lib/index.umd.min.js +1 -1
  12. package/lib/tree/src/tree.js +27 -2
  13. package/lib/tree/src/tree.min.js +1 -1
  14. package/lib/tree-select/src/tree-select.js +2 -0
  15. package/lib/tree-select/src/tree-select.min.js +1 -1
  16. package/lib/ui/index.js +1 -1
  17. package/lib/ui/index.min.js +1 -1
  18. package/lib/ui/src/log.js +1 -1
  19. package/lib/ui/src/log.min.js +1 -1
  20. package/package.json +88 -88
  21. package/packages/alert/index.ts +16 -16
  22. package/packages/alert/src/alert.ts +124 -124
  23. package/packages/anchor/index.ts +16 -16
  24. package/packages/anchor/src/anchor-link.ts +121 -121
  25. package/packages/anchor/src/anchor.ts +237 -237
  26. package/packages/anchor/src/util.ts +23 -23
  27. package/packages/anchor-link/index.ts +16 -16
  28. package/packages/avatar/index.ts +16 -16
  29. package/packages/avatar/src/avatar.ts +149 -149
  30. package/packages/backtop/index.ts +16 -16
  31. package/packages/backtop/src/backtop.ts +314 -314
  32. package/packages/badge/index.ts +16 -16
  33. package/packages/badge/src/badge.ts +100 -100
  34. package/packages/breadcrumb/index.ts +16 -16
  35. package/packages/breadcrumb/src/breadcrumb-item.ts +106 -106
  36. package/packages/breadcrumb/src/breadcrumb.ts +92 -92
  37. package/packages/breadcrumb-item/index.ts +16 -16
  38. package/packages/button/index.ts +16 -16
  39. package/packages/button/src/button-group.ts +110 -110
  40. package/packages/button/src/button.ts +841 -841
  41. package/packages/button-group/index.ts +16 -16
  42. package/packages/calendar/index.ts +16 -16
  43. package/packages/calendar/src/calendar.ts +1351 -1351
  44. package/packages/card/index.ts +16 -16
  45. package/packages/card/src/card.ts +175 -175
  46. package/packages/carousel/index.ts +16 -16
  47. package/packages/carousel/src/carousel-item.ts +102 -102
  48. package/packages/carousel/src/carousel.ts +414 -414
  49. package/packages/carousel/src/util.ts +21 -21
  50. package/packages/carousel-item/index.ts +16 -16
  51. package/packages/cascader/index.ts +16 -16
  52. package/packages/cascader/src/cascader.ts +741 -741
  53. package/packages/checkbox/index.ts +16 -16
  54. package/packages/checkbox/src/button.ts +144 -144
  55. package/packages/checkbox/src/checkbox.ts +154 -154
  56. package/packages/checkbox/src/group.ts +222 -222
  57. package/packages/checkbox-button/index.ts +16 -16
  58. package/packages/checkbox-group/index.ts +16 -16
  59. package/packages/col/index.ts +16 -16
  60. package/packages/collapse/index.ts +16 -16
  61. package/packages/collapse/src/collapse-pane.ts +114 -114
  62. package/packages/collapse/src/collapse.ts +284 -284
  63. package/packages/collapse/src/util.ts +21 -21
  64. package/packages/collapse-pane/index.ts +16 -16
  65. package/packages/color-picker/index.ts +16 -16
  66. package/packages/color-picker/src/color-picker.ts +1109 -1109
  67. package/packages/color-picker/src/util.ts +198 -198
  68. package/packages/components.ts +307 -307
  69. package/packages/context-menu/index.ts +54 -54
  70. package/packages/context-menu/src/context-menu.ts +681 -681
  71. package/packages/countdown/index.ts +16 -16
  72. package/packages/countdown/src/countdown.ts +262 -262
  73. package/packages/date-panel/index.ts +16 -16
  74. package/packages/date-panel/src/date-panel.ts +1809 -1809
  75. package/packages/date-panel/src/util.ts +244 -244
  76. package/packages/date-picker/index.ts +16 -16
  77. package/packages/date-picker/src/date-picker.ts +1071 -1071
  78. package/packages/date-range-picker/index.ts +16 -16
  79. package/packages/date-range-picker/src/date-range-picker.ts +1280 -1280
  80. package/packages/drawer/index.ts +77 -77
  81. package/packages/drawer/src/drawer.ts +657 -657
  82. package/packages/dynamics/index.ts +89 -89
  83. package/packages/empty/index.ts +16 -16
  84. package/packages/empty/src/empty.ts +100 -100
  85. package/packages/form/index.ts +16 -16
  86. package/packages/form/render/index.ts +598 -598
  87. package/packages/form/src/form-config-item.ts +72 -72
  88. package/packages/form/src/form-group.ts +86 -86
  89. package/packages/form/src/form-item.ts +174 -174
  90. package/packages/form/src/form.ts +987 -987
  91. package/packages/form/src/itemInfo.ts +80 -80
  92. package/packages/form/src/render.ts +387 -387
  93. package/packages/form/src/util.ts +93 -93
  94. package/packages/form-gather/index.ts +26 -26
  95. package/packages/form-group/index.ts +16 -16
  96. package/packages/form-item/index.ts +16 -16
  97. package/packages/icon/index.ts +16 -16
  98. package/packages/icon/src/icon.ts +75 -75
  99. package/packages/icon-picker/index.ts +16 -16
  100. package/packages/icon-picker/src/icon-picker.ts +626 -626
  101. package/packages/image/index.ts +16 -16
  102. package/packages/image/src/group.ts +153 -153
  103. package/packages/image/src/image.ts +298 -298
  104. package/packages/image/src/preview.ts +672 -672
  105. package/packages/image/src/util.ts +59 -59
  106. package/packages/image-group/index.ts +16 -16
  107. package/packages/image-preview/index.ts +19 -19
  108. package/packages/index.ts +4 -4
  109. package/packages/input/index.ts +16 -16
  110. package/packages/input/src/input.ts +2788 -2788
  111. package/packages/language/ar-EG.ts +840 -840
  112. package/packages/language/de-DE.ts +840 -840
  113. package/packages/language/en-US.ts +840 -840
  114. package/packages/language/es-ES.ts +840 -840
  115. package/packages/language/fr-FR.ts +840 -840
  116. package/packages/language/hu-HU.ts +840 -840
  117. package/packages/language/hy-AM.ts +840 -840
  118. package/packages/language/id-ID.ts +840 -840
  119. package/packages/language/it-IT.ts +840 -840
  120. package/packages/language/ja-JP.ts +840 -840
  121. package/packages/language/ko-KR.ts +840 -840
  122. package/packages/language/ms-MY.ts +840 -840
  123. package/packages/language/nb-NO.ts +840 -840
  124. package/packages/language/pt-BR.ts +840 -840
  125. package/packages/language/ru-RU.ts +840 -840
  126. package/packages/language/th-TH.ts +840 -840
  127. package/packages/language/ug-CN.ts +840 -840
  128. package/packages/language/uk-UA.ts +840 -840
  129. package/packages/language/uz-UZ.ts +840 -840
  130. package/packages/language/vi-VN.ts +840 -840
  131. package/packages/language/zh-CHT.ts +840 -840
  132. package/packages/language/zh-CN.ts +840 -840
  133. package/packages/language/zh-HK.ts +3 -3
  134. package/packages/language/zh-MO.ts +3 -3
  135. package/packages/language/zh-TC.ts +3 -3
  136. package/packages/language/zh-TW.ts +3 -3
  137. package/packages/layout-aside/index.ts +16 -16
  138. package/packages/layout-aside/src/layout-aside.ts +123 -123
  139. package/packages/layout-body/index.ts +16 -16
  140. package/packages/layout-body/src/layout-body.ts +142 -142
  141. package/packages/layout-container/index.ts +16 -16
  142. package/packages/layout-container/src/layout-container.ts +82 -82
  143. package/packages/layout-footer/index.ts +16 -16
  144. package/packages/layout-footer/src/layout-footer.ts +74 -74
  145. package/packages/layout-header/index.ts +16 -16
  146. package/packages/layout-header/src/layout-header.ts +73 -73
  147. package/packages/link/index.ts +16 -16
  148. package/packages/link/src/link.ts +161 -161
  149. package/packages/list/index.ts +16 -16
  150. package/packages/list/src/list.ts +442 -442
  151. package/packages/loading/index.ts +34 -34
  152. package/packages/loading/src/loading.ts +152 -152
  153. package/packages/mention/index.ts +16 -16
  154. package/packages/mention/src/mention.ts +71 -71
  155. package/packages/menu/index.ts +16 -16
  156. package/packages/menu/src/menu.ts +581 -581
  157. package/packages/modal/index.ts +136 -136
  158. package/packages/modal/src/modal.ts +1494 -1494
  159. package/packages/notice-bar/index.ts +16 -16
  160. package/packages/notice-bar/src/notice-bar.ts +181 -181
  161. package/packages/number-input/index.ts +16 -16
  162. package/packages/number-input/src/number-input.ts +1096 -1096
  163. package/packages/number-input/src/util.ts +12 -12
  164. package/packages/optgroup/index.ts +16 -16
  165. package/packages/option/index.ts +16 -16
  166. package/packages/pager/index.ts +16 -16
  167. package/packages/pager/src/pager.ts +769 -769
  168. package/packages/password-input/index.ts +16 -16
  169. package/packages/password-input/src/password-input.ts +378 -378
  170. package/packages/print/index.ts +18 -18
  171. package/packages/print/src/page-break.ts +92 -92
  172. package/packages/print/src/print.ts +272 -272
  173. package/packages/print/src/util.ts +284 -284
  174. package/packages/print-page-break/index.ts +16 -16
  175. package/packages/pulldown/index.ts +16 -16
  176. package/packages/pulldown/src/pulldown.ts +457 -457
  177. package/packages/radio/index.ts +16 -16
  178. package/packages/radio/src/button.ts +173 -173
  179. package/packages/radio/src/group.ts +213 -213
  180. package/packages/radio/src/radio.ts +180 -180
  181. package/packages/radio-button/index.ts +16 -16
  182. package/packages/radio-group/index.ts +16 -16
  183. package/packages/rate/index.ts +16 -16
  184. package/packages/rate/src/rate.ts +192 -192
  185. package/packages/result/index.ts +16 -16
  186. package/packages/result/src/result.ts +112 -112
  187. package/packages/row/index.ts +16 -16
  188. package/packages/row/src/col.ts +136 -136
  189. package/packages/row/src/row.ts +119 -119
  190. package/packages/segmented/index.ts +16 -16
  191. package/packages/segmented/src/segmented.ts +264 -264
  192. package/packages/select/index.ts +16 -16
  193. package/packages/select/src/optgroup.ts +49 -49
  194. package/packages/select/src/option-info.ts +20 -20
  195. package/packages/select/src/option.ts +47 -47
  196. package/packages/select/src/select.ts +1699 -1699
  197. package/packages/select/src/util.ts +47 -47
  198. package/packages/slider/index.ts +16 -16
  199. package/packages/slider/src/slider.ts +304 -304
  200. package/packages/split/index.ts +16 -16
  201. package/packages/split-pane/index.ts +17 -17
  202. package/packages/splitter/index.ts +16 -16
  203. package/packages/splitter/src/splitter-panel.ts +145 -145
  204. package/packages/splitter/src/splitter.ts +1009 -1009
  205. package/packages/splitter/src/util.ts +21 -21
  206. package/packages/splitter-panel/index.ts +16 -16
  207. package/packages/steps/index.ts +16 -16
  208. package/packages/steps/src/steps.ts +68 -68
  209. package/packages/switch/index.ts +16 -16
  210. package/packages/switch/src/switch.ts +237 -237
  211. package/packages/tab-pane/index.ts +16 -16
  212. package/packages/table-select/index.ts +16 -16
  213. package/packages/table-select/src/table-select.ts +800 -800
  214. package/packages/tabs/index.ts +16 -16
  215. package/packages/tabs/src/tab-pane.ts +117 -117
  216. package/packages/tabs/src/tabs.ts +940 -940
  217. package/packages/tabs/src/util.ts +21 -21
  218. package/packages/tag/index.ts +16 -16
  219. package/packages/tag/src/tag.ts +187 -187
  220. package/packages/text/index.ts +16 -16
  221. package/packages/text/src/text.ts +260 -260
  222. package/packages/text-ellipsis/index.ts +16 -16
  223. package/packages/text-ellipsis/src/text-ellipsis.ts +282 -282
  224. package/packages/textarea/index.ts +16 -16
  225. package/packages/textarea/src/textarea.ts +373 -373
  226. package/packages/timeline/index.ts +16 -16
  227. package/packages/timeline/src/timeline-item.ts +67 -67
  228. package/packages/timeline/src/timeline.ts +71 -71
  229. package/packages/timeline-item/index.ts +16 -16
  230. package/packages/tip/index.ts +19 -19
  231. package/packages/tip/src/tip.ts +129 -129
  232. package/packages/tooltip/index.ts +16 -16
  233. package/packages/tooltip/src/tooltip.ts +589 -589
  234. package/packages/tour/index.ts +16 -16
  235. package/packages/tour/src/tour.ts +71 -71
  236. package/packages/tree/index.ts +16 -16
  237. package/packages/tree/src/store.ts +14 -14
  238. package/packages/tree/src/tree.ts +2825 -2795
  239. package/packages/tree/src/util.ts +45 -45
  240. package/packages/tree-select/index.ts +16 -16
  241. package/packages/tree-select/src/tree-select.ts +979 -977
  242. package/packages/ui/index.ts +697 -697
  243. package/packages/ui/src/anime.ts +52 -52
  244. package/packages/ui/src/comp.ts +3 -3
  245. package/packages/ui/src/dom.ts +279 -279
  246. package/packages/ui/src/log.ts +6 -6
  247. package/packages/ui/src/utils.ts +49 -49
  248. package/packages/ui/src/vn.ts +39 -39
  249. package/packages/upload/index.ts +20 -20
  250. package/packages/upload/src/upload.ts +1919 -1919
  251. package/packages/upload/src/util.ts +109 -109
  252. package/packages/watermark/index.ts +31 -31
  253. package/packages/watermark/src/util.ts +176 -176
  254. package/packages/watermark/src/watermark.ts +168 -168
  255. package/styles/all.scss +90 -90
  256. package/styles/base.scss +16 -16
  257. package/styles/components/alert.scss +101 -101
  258. package/styles/components/anchor.scss +44 -44
  259. package/styles/components/avatar.scss +115 -115
  260. package/styles/components/backtop.scss +82 -82
  261. package/styles/components/badge.scss +45 -45
  262. package/styles/components/breadcrumb.scss +29 -29
  263. package/styles/components/button-group.scss +30 -30
  264. package/styles/components/button.scss +415 -415
  265. package/styles/components/calendar.scss +471 -471
  266. package/styles/components/card.scss +121 -121
  267. package/styles/components/carousel.scss +184 -184
  268. package/styles/components/cascader.scss +140 -140
  269. package/styles/components/checkbox-button.scss +57 -57
  270. package/styles/components/checkbox.scss +81 -81
  271. package/styles/components/collapse.scss +56 -56
  272. package/styles/components/color-picker.scss +409 -409
  273. package/styles/components/context-menu.scss +102 -102
  274. package/styles/components/countdown.scss +35 -35
  275. package/styles/components/date-panel.scss +505 -505
  276. package/styles/components/date-picker.scss +247 -247
  277. package/styles/components/date-range-picker.scss +252 -252
  278. package/styles/components/drawer.scss +298 -298
  279. package/styles/components/empty.scss +79 -79
  280. package/styles/components/form.scss +668 -668
  281. package/styles/components/icon-picker.scss +211 -211
  282. package/styles/components/icon.scss +1048 -1048
  283. package/styles/components/image-group.scss +2 -2
  284. package/styles/components/image-preview.scss +215 -215
  285. package/styles/components/image.scss +16 -16
  286. package/styles/components/input.scss +846 -846
  287. package/styles/components/layout-aside.scss +22 -22
  288. package/styles/components/layout-body.scss +14 -14
  289. package/styles/components/layout-container.scss +13 -13
  290. package/styles/components/layout-footer.scss +14 -14
  291. package/styles/components/layout-header.scss +11 -11
  292. package/styles/components/link.scss +115 -115
  293. package/styles/components/list.scss +40 -40
  294. package/styles/components/loading.scss +137 -137
  295. package/styles/components/menu.scss +150 -150
  296. package/styles/components/modal.scss +480 -480
  297. package/styles/components/notice-bar.scss +91 -91
  298. package/styles/components/number-input.scss +283 -283
  299. package/styles/components/old-icon.scss +4 -4
  300. package/styles/components/pager.scss +282 -282
  301. package/styles/components/password-input.scss +374 -374
  302. package/styles/components/print.scss +3 -3
  303. package/styles/components/pulldown.scss +75 -75
  304. package/styles/components/radio-button.scss +57 -57
  305. package/styles/components/radio.scss +79 -79
  306. package/styles/components/rate.scss +76 -76
  307. package/styles/components/result.scss +91 -91
  308. package/styles/components/row.scss +69 -69
  309. package/styles/components/segmented.scss +215 -215
  310. package/styles/components/select.scss +244 -244
  311. package/styles/components/slider.scss +139 -139
  312. package/styles/components/split.scss +1 -1
  313. package/styles/components/splitter.scss +318 -318
  314. package/styles/components/switch.scss +128 -128
  315. package/styles/components/table-select.scss +105 -105
  316. package/styles/components/tabs.scss +745 -745
  317. package/styles/components/tag.scss +184 -184
  318. package/styles/components/text-ellipsis.scss +130 -130
  319. package/styles/components/text.scss +123 -123
  320. package/styles/components/textarea.scss +106 -106
  321. package/styles/components/tip.scss +97 -97
  322. package/styles/components/tooltip.scss +141 -141
  323. package/styles/components/tree-select.scss +166 -166
  324. package/styles/components/tree.scss +294 -294
  325. package/styles/components/upload.scss +497 -497
  326. package/styles/components/watermark.scss +26 -26
  327. package/styles/helpers/baseMixin.scss +95 -95
  328. package/styles/helpers/baseVar.scss +3 -3
  329. package/styles/helpers/placement.scss +38 -38
  330. package/styles/theme/base.scss +214 -214
  331. package/styles/theme/dark.scss +119 -119
  332. package/styles/theme/light.scss +118 -118
  333. package/styles/variable.scss +111 -111
  334. package/types/all.d.ts +327 -327
  335. package/types/components/alert.d.ts +87 -87
  336. package/types/components/anchor-link.d.ts +91 -91
  337. package/types/components/anchor.d.ts +104 -104
  338. package/types/components/avatar.d.ts +88 -88
  339. package/types/components/backtop.d.ts +122 -122
  340. package/types/components/badge.d.ts +76 -76
  341. package/types/components/breadcrumb-item.d.ts +80 -80
  342. package/types/components/breadcrumb.d.ts +87 -87
  343. package/types/components/button-group.d.ts +120 -120
  344. package/types/components/button.d.ts +323 -323
  345. package/types/components/calendar.d.ts +264 -264
  346. package/types/components/card.d.ts +93 -93
  347. package/types/components/carousel-item.d.ts +75 -75
  348. package/types/components/carousel.d.ts +134 -134
  349. package/types/components/cascader.d.ts +263 -263
  350. package/types/components/checkbox-button.d.ts +103 -103
  351. package/types/components/checkbox-group.d.ts +143 -143
  352. package/types/components/checkbox.d.ts +123 -123
  353. package/types/components/col.d.ts +80 -80
  354. package/types/components/colgroup.d.ts +137 -137
  355. package/types/components/collapse-pane.d.ts +89 -89
  356. package/types/components/collapse.d.ts +121 -121
  357. package/types/components/color-picker.d.ts +176 -176
  358. package/types/components/column.d.ts +841 -841
  359. package/types/components/context-menu.d.ts +289 -289
  360. package/types/components/countdown.d.ts +112 -112
  361. package/types/components/date-panel.d.ts +280 -280
  362. package/types/components/date-picker.d.ts +332 -332
  363. package/types/components/date-range-picker.d.ts +352 -352
  364. package/types/components/drawer.d.ts +299 -299
  365. package/types/components/empty.d.ts +78 -78
  366. package/types/components/flow-design.d.ts +85 -85
  367. package/types/components/flow-view.d.ts +85 -85
  368. package/types/components/form-design.d.ts +376 -376
  369. package/types/components/form-gather.d.ts +124 -124
  370. package/types/components/form-group.d.ts +77 -77
  371. package/types/components/form-item.d.ts +411 -411
  372. package/types/components/form-view.d.ts +183 -183
  373. package/types/components/form.d.ts +468 -468
  374. package/types/components/gantt-module/gantt-view.d.ts +177 -177
  375. package/types/components/gantt-module/index.d.ts +1 -1
  376. package/types/components/gantt-plugins/extend-gantt-chart.d.ts +131 -131
  377. package/types/components/gantt-plugins/index.d.ts +1 -1
  378. package/types/components/gantt.d.ts +1194 -1185
  379. package/types/components/grid.d.ts +1040 -1040
  380. package/types/components/icon-picker.d.ts +196 -196
  381. package/types/components/icon.d.ts +87 -87
  382. package/types/components/image-group.d.ts +127 -127
  383. package/types/components/image-preview.d.ts +167 -167
  384. package/types/components/image.d.ts +173 -173
  385. package/types/components/input.d.ts +435 -435
  386. package/types/components/layout-aside.d.ts +80 -80
  387. package/types/components/layout-body.d.ts +91 -91
  388. package/types/components/layout-container.d.ts +73 -73
  389. package/types/components/layout-footer.d.ts +73 -73
  390. package/types/components/layout-header.d.ts +69 -69
  391. package/types/components/link.d.ts +111 -111
  392. package/types/components/list-design.d.ts +190 -190
  393. package/types/components/list-view.d.ts +199 -199
  394. package/types/components/list.d.ts +204 -204
  395. package/types/components/loading.d.ts +103 -103
  396. package/types/components/mention.d.ts +77 -77
  397. package/types/components/menu.d.ts +211 -211
  398. package/types/components/modal.d.ts +542 -542
  399. package/types/components/notice-bar.d.ts +102 -102
  400. package/types/components/number-input.d.ts +309 -309
  401. package/types/components/optgroup.d.ts +88 -88
  402. package/types/components/option.d.ts +103 -103
  403. package/types/components/pager.d.ts +335 -335
  404. package/types/components/password-input.d.ts +142 -142
  405. package/types/components/print-page-break.d.ts +69 -69
  406. package/types/components/print.d.ts +206 -206
  407. package/types/components/pulldown.d.ts +231 -231
  408. package/types/components/radio-button.d.ts +114 -114
  409. package/types/components/radio-group.d.ts +144 -144
  410. package/types/components/radio.d.ts +129 -129
  411. package/types/components/rate.d.ts +88 -88
  412. package/types/components/result.d.ts +84 -84
  413. package/types/components/row.d.ts +79 -79
  414. package/types/components/segmented.d.ts +123 -123
  415. package/types/components/select.d.ts +527 -527
  416. package/types/components/slider.d.ts +126 -126
  417. package/types/components/split-pane.d.ts +133 -133
  418. package/types/components/split.d.ts +312 -312
  419. package/types/components/splitter-panel.d.ts +105 -105
  420. package/types/components/splitter.d.ts +288 -288
  421. package/types/components/steps.d.ts +68 -68
  422. package/types/components/switch.d.ts +133 -133
  423. package/types/components/tab-pane.d.ts +114 -114
  424. package/types/components/table-module/custom.d.ts +123 -123
  425. package/types/components/table-module/edit.d.ts +243 -243
  426. package/types/components/table-module/export.d.ts +96 -96
  427. package/types/components/table-module/filter.d.ts +140 -140
  428. package/types/components/table-module/index.d.ts +7 -7
  429. package/types/components/table-module/keyboard.d.ts +26 -26
  430. package/types/components/table-module/menu.d.ts +28 -28
  431. package/types/components/table-module/validator.d.ts +53 -53
  432. package/types/components/table-plugins/extend-cell-area.d.ts +770 -770
  433. package/types/components/table-plugins/extend-pivot-table.d.ts +58 -58
  434. package/types/components/table-plugins/filters-combination.d.ts +15 -15
  435. package/types/components/table-plugins/filters-complex-input.d.ts +9 -9
  436. package/types/components/table-plugins/index.d.ts +4 -4
  437. package/types/components/table-select.d.ts +219 -219
  438. package/types/components/table.d.ts +7465 -7465
  439. package/types/components/tabs.d.ts +332 -332
  440. package/types/components/tag.d.ts +114 -114
  441. package/types/components/text-ellipsis.d.ts +112 -112
  442. package/types/components/text.d.ts +122 -122
  443. package/types/components/textarea.d.ts +247 -247
  444. package/types/components/timeline-item.d.ts +75 -75
  445. package/types/components/timeline.d.ts +77 -77
  446. package/types/components/tip.d.ts +83 -83
  447. package/types/components/toolbar.d.ts +336 -336
  448. package/types/components/tooltip.d.ts +180 -180
  449. package/types/components/tour.d.ts +77 -77
  450. package/types/components/tree-select.d.ts +310 -310
  451. package/types/components/tree.d.ts +843 -833
  452. package/types/components/upload.d.ts +437 -437
  453. package/types/components/watermark.d.ts +120 -120
  454. package/types/handles/form-design.d.ts +50 -50
  455. package/types/handles/index.d.ts +3 -3
  456. package/types/handles/list-design.d.ts +2 -2
  457. package/types/handles/table.d.ts +15 -15
  458. package/types/index.d.ts +8 -8
  459. package/types/ui/commands.d.ts +57 -57
  460. package/types/ui/formats.d.ts +62 -62
  461. package/types/ui/global-config.d.ts +254 -254
  462. package/types/ui/global-icon.d.ts +292 -292
  463. package/types/ui/hooks.d.ts +13 -13
  464. package/types/ui/index.d.ts +96 -96
  465. package/types/ui/interceptor.d.ts +52 -52
  466. package/types/ui/menus.d.ts +77 -77
  467. package/types/ui/renderer.d.ts +1041 -1041
  468. package/types/ui/validators.d.ts +38 -38
  469. /package/es/icon/{iconfont.1778169084473.ttf → iconfont.1778317220469.ttf} +0 -0
  470. /package/es/icon/{iconfont.1778169084473.woff → iconfont.1778317220469.woff} +0 -0
  471. /package/es/icon/{iconfont.1778169084473.woff2 → iconfont.1778317220469.woff2} +0 -0
  472. /package/es/{iconfont.1778169084473.ttf → iconfont.1778317220469.ttf} +0 -0
  473. /package/es/{iconfont.1778169084473.woff → iconfont.1778317220469.woff} +0 -0
  474. /package/es/{iconfont.1778169084473.woff2 → iconfont.1778317220469.woff2} +0 -0
  475. /package/lib/icon/style/{iconfont.1778169084473.ttf → iconfont.1778317220469.ttf} +0 -0
  476. /package/lib/icon/style/{iconfont.1778169084473.woff → iconfont.1778317220469.woff} +0 -0
  477. /package/lib/icon/style/{iconfont.1778169084473.woff2 → iconfont.1778317220469.woff2} +0 -0
  478. /package/lib/{iconfont.1778169084473.ttf → iconfont.1778317220469.ttf} +0 -0
  479. /package/lib/{iconfont.1778169084473.woff → iconfont.1778317220469.woff} +0 -0
  480. /package/lib/{iconfont.1778169084473.woff2 → iconfont.1778317220469.woff2} +0 -0
@@ -1,841 +1,841 @@
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, updatePanelPlacement } from '../../ui/src/dom'
6
- import { getFuncText, getLastZIndex, nextZIndex } from '../../ui/src/utils'
7
- import { getSlotVNs } from '../../ui/src/vn'
8
- import { warnLog } 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
-
14
- const VxeButtonComponent = defineVxeComponent({
15
- name: 'VxeButton',
16
- props: {
17
- /**
18
- * 按钮类型
19
- */
20
- type: String as PropType<VxeButtonPropTypes.Type>,
21
- mode: String as PropType<VxeButtonPropTypes.Mode>,
22
- className: [String, Function] as PropType<VxeButtonPropTypes.ClassName>,
23
- popupClassName: [String, Function] as PropType<VxeButtonPropTypes.PopupClassName>,
24
- /**
25
- * 按钮尺寸
26
- */
27
- size: {
28
- type: String as PropType<VxeButtonPropTypes.Size>,
29
- default: () => getConfig().button.size || getConfig().size
30
- },
31
- zIndex: Number as PropType<VxeButtonPropTypes.ZIndex>,
32
- /**
33
- * 用来标识这一项
34
- */
35
- name: [String, Number] as PropType<VxeButtonPropTypes.Name>,
36
- routerLink: Object as PropType<VxeButtonPropTypes.RouterLink>,
37
- /**
38
- * 权限码
39
- */
40
- permissionCode: [String, Number] as PropType<VxeButtonPropTypes.PermissionCode>,
41
- /**
42
- * 按钮内容
43
- */
44
- content: String as PropType<VxeButtonPropTypes.Content>,
45
- /**
46
- * 固定显示下拉面板的方向
47
- */
48
- placement: String as PropType<VxeButtonPropTypes.Placement>,
49
- /**
50
- * 按钮状态
51
- */
52
- status: String as PropType<VxeButtonPropTypes.Status>,
53
- /**
54
- * 标题
55
- */
56
- title: String as PropType<VxeButtonPropTypes.Title>,
57
- shadow: Boolean as PropType<VxeButtonPropTypes.Shadow>,
58
- /**
59
- * 按钮的前缀图标,属于 prefix-icon 的简写
60
- */
61
- icon: String as PropType<VxeButtonPropTypes.Icon>,
62
- iconRender: Object as PropType<VxeButtonPropTypes.IconRender>,
63
- /**
64
- * 按钮的前缀图标
65
- */
66
- prefixIcon: String as PropType<VxeButtonPropTypes.PrefixIcon>,
67
- prefixRender: Object as PropType<VxeButtonPropTypes.PrefixRender>,
68
- /**
69
- * 按钮的后缀图标
70
- */
71
- suffixIcon: String as PropType<VxeButtonPropTypes.SuffixIcon>,
72
- suffixRender: Object as PropType<VxeButtonPropTypes.SuffixRender>,
73
- /**
74
- * 圆角边框
75
- */
76
- round: Boolean as PropType<VxeButtonPropTypes.Round>,
77
- /**
78
- * 圆角按钮
79
- */
80
- circle: Boolean as PropType<VxeButtonPropTypes.Circle>,
81
- /**
82
- * 是否禁用
83
- */
84
- disabled: Boolean as PropType<VxeButtonPropTypes.Disabled>,
85
- /**
86
- * 是否加载中
87
- */
88
- loading: Boolean as PropType<VxeButtonPropTypes.Loading>,
89
- trigger: {
90
- type: String as PropType<VxeButtonPropTypes.Trigger>,
91
- default: () => getConfig().button.trigger
92
- },
93
- align: String as PropType<VxeButtonPropTypes.Align>,
94
- prefixTooltip: Object as PropType<VxeButtonPropTypes.PrefixTooltip>,
95
- suffixTooltip: Object as PropType<VxeButtonPropTypes.SuffixTooltip>,
96
- options: Array as PropType<VxeButtonPropTypes.Options>,
97
- showDropdownIcon: {
98
- type: Boolean,
99
- default: () => getConfig().button.showDropdownIcon
100
- },
101
- /**
102
- * 在下拉面板关闭时销毁内容
103
- */
104
- destroyOnClose: {
105
- type: Boolean as PropType<VxeButtonPropTypes.DestroyOnClose>,
106
- default: () => getConfig().button.destroyOnClose
107
- },
108
- popupConfig: Object as PropType<VxeButtonPropTypes.PopupConfig>,
109
- /**
110
- * 是否将弹框容器插入于 body 内
111
- */
112
- transfer: {
113
- type: Boolean as PropType<VxeButtonPropTypes.Transfer>,
114
- default: null
115
- }
116
- },
117
- emits: [
118
- 'click',
119
- 'mouseenter',
120
- 'mouseleave',
121
- 'dropdown-click',
122
- 'dropdownClick',
123
- 'contextmenu'
124
- ] as VxeButtonEmits,
125
- setup (props, context) {
126
- const { slots, emit } = context
127
-
128
- const $xeModal = inject<(VxeModalConstructor & VxeModalMethods)| null>('$xeModal', null)
129
- const $xeDrawer = inject<(VxeDrawerConstructor & VxeDrawerMethods) | null>('$xeDrawer', null)
130
- const $xeTable = inject<(VxeTableConstructor & VxeTablePrivateMethods) | null>('$xeTable', null)
131
- const $xeTree = inject<(VxeTreeConstructor & VxeTreePrivateMethods) | null>('$xeTree', null)
132
- const $xeForm = inject<(VxeFormConstructor & VxeFormPrivateMethods)| null>('$xeForm', null)
133
- const $xeButtonGroup = inject<(VxeButtonGroupConstructor & VxeButtonGroupPrivateMethods) | null>('$xeButtonGroup', null)
134
-
135
- const xID = XEUtils.uniqueId()
136
-
137
- const { computeSize } = useSize(props)
138
-
139
- const { computePermissionInfo } = usePermission(props)
140
-
141
- const reactData = reactive<ButtonReactData>({
142
- initialized: false,
143
- visiblePanel: false,
144
- isAniVisible: false,
145
- isActivated: false,
146
- panelIndex: 0,
147
- panelStyle: {},
148
- panelPlacement: ''
149
- })
150
-
151
- const internalData: ButtonInternalData = {
152
- showTime: undefined,
153
- tooltipTimeout: undefined
154
- }
155
-
156
- const refElem = ref<HTMLDivElement>()
157
- const refButton = ref<HTMLButtonElement>()
158
- const refBtnPanel = ref<HTMLDivElement>()
159
-
160
- const refMaps: ButtonPrivateRef = {
161
- refElem
162
- }
163
-
164
- const $xeButton = {
165
- xID,
166
- props,
167
- context,
168
- reactData,
169
- internalData,
170
- getRefMaps: () => refMaps
171
- } as unknown as VxeButtonConstructor
172
-
173
- let buttonMethods = {} as ButtonMethods
174
-
175
- const computeBtnTransfer = computed(() => {
176
- const { transfer } = props
177
- const popupOpts = computePopupOpts.value
178
- if (XEUtils.isBoolean(popupOpts.transfer)) {
179
- return popupOpts.transfer
180
- }
181
- if (transfer === null) {
182
- const globalTransfer = getConfig().button.transfer
183
- if (XEUtils.isBoolean(globalTransfer)) {
184
- return globalTransfer
185
- }
186
- if ($xeTable || $xeTree || $xeModal || $xeDrawer || $xeForm) {
187
- return true
188
- }
189
- }
190
- return transfer
191
- })
192
-
193
- const computeBtnDisabled = computed(() => {
194
- const { disabled } = props
195
- const permissionInfo = computePermissionInfo.value
196
- return disabled || permissionInfo.disabled
197
- })
198
-
199
- const computeIsFormBtn = computed(() => {
200
- const { type } = props
201
- if (type) {
202
- return ['submit', 'reset', 'button'].indexOf(type) > -1
203
- }
204
- return false
205
- })
206
-
207
- const computeBtnMode = computed(() => {
208
- const { type, mode } = props
209
- if (mode === 'text' || type === 'text' || ($xeButtonGroup && $xeButtonGroup.props.mode === 'text')) {
210
- return 'text'
211
- }
212
- return 'button'
213
- })
214
-
215
- const computeBtnStatus = computed(() => {
216
- const { status } = props
217
- if (status) {
218
- return status
219
- }
220
- if ($xeButtonGroup) {
221
- return $xeButtonGroup.props.status
222
- }
223
- return ''
224
- })
225
-
226
- const computeBtnAlign = computed(() => {
227
- const { align } = props
228
- if (align) {
229
- return align
230
- }
231
- if ($xeButtonGroup) {
232
- return $xeButtonGroup.props.align
233
- }
234
- return false
235
- })
236
-
237
- const computeBtnRound = computed(() => {
238
- const { round } = props
239
- if (round) {
240
- return round
241
- }
242
- if ($xeButtonGroup) {
243
- return $xeButtonGroup.props.round
244
- }
245
- return false
246
- })
247
-
248
- const computeBtnCircle = computed(() => {
249
- const { circle } = props
250
- if (circle) {
251
- return circle
252
- }
253
- if ($xeButtonGroup) {
254
- return $xeButtonGroup.props.circle
255
- }
256
- return false
257
- })
258
-
259
- const computeDownBtnList = computed(() => {
260
- const { options } = props
261
- if (options) {
262
- return options.filter(item => {
263
- const { permissionCode } = item
264
- return !permissionCode || permission.checkVisible(permissionCode)
265
- })
266
- }
267
- return []
268
- })
269
-
270
- const computePopupOpts = computed(() => {
271
- return Object.assign({}, getConfig().button.popupConfig, props.popupConfig)
272
- })
273
-
274
- const computePrefixTipOpts = computed(() => {
275
- return Object.assign({}, getConfig().button.prefixTooltip, props.prefixTooltip)
276
- })
277
-
278
- const computeSuffixTipOpts = computed(() => {
279
- return Object.assign({}, getConfig().button.suffixTooltip, props.suffixTooltip)
280
- })
281
-
282
- const updateZindex = () => {
283
- const popupOpts = computePopupOpts.value
284
- const customZIndex = popupOpts.zIndex || props.zIndex
285
- if (customZIndex) {
286
- reactData.panelIndex = XEUtils.toNumber(customZIndex)
287
- } else if (reactData.panelIndex < getLastZIndex()) {
288
- reactData.panelIndex = nextZIndex()
289
- }
290
- }
291
-
292
- const updatePlacement = () => {
293
- const { placement } = props
294
- const { panelIndex } = reactData
295
- const targetElem = refButton.value
296
- const panelElem = refBtnPanel.value
297
- const btnTransfer = computeBtnTransfer.value
298
- const popupOpts = computePopupOpts.value
299
- const handleStyle = () => {
300
- const ppObj = updatePanelPlacement(targetElem, panelElem, {
301
- placement: popupOpts.placement || placement,
302
- defaultPlacement: (popupOpts as any).defaultPlacement,
303
- teleportTo: btnTransfer
304
- })
305
- const panelStyle: { [key: string]: string | number } = Object.assign(ppObj.style, {
306
- zIndex: panelIndex
307
- })
308
- reactData.panelStyle = panelStyle
309
- reactData.panelPlacement = ppObj.placement
310
- }
311
- handleStyle()
312
- return nextTick().then(handleStyle)
313
- }
314
-
315
- const clickEvent = (evnt: Event) => {
316
- if ($xeButtonGroup) {
317
- $xeButtonGroup.handleClick({ name: props.name }, evnt)
318
- }
319
- dispatchEvent('click', { $event: evnt }, evnt)
320
- }
321
-
322
- const downBtnClickEvent = (params: VxeButtonDefines.ClickEventParams, option: VxeButtonDefines.DownButtonOption) => {
323
- const { $event } = params
324
- hidePanel()
325
- dispatchEvent('dropdown-click', { name: option.name, option }, $event)
326
- }
327
-
328
- const mousedownDropdownEvent = (evnt: MouseEvent) => {
329
- const isLeftBtn = evnt.button === 0
330
- if (isLeftBtn) {
331
- evnt.stopPropagation()
332
- }
333
- }
334
-
335
- const clickDropdownEvent = (evnt: Event) => {
336
- const dropdownElem = evnt.currentTarget
337
- const panelElem = refBtnPanel.value
338
- const { flag, targetElem } = getEventTargetNode(evnt, dropdownElem, 'vxe-button')
339
- if (flag) {
340
- if (panelElem) {
341
- panelElem.dataset.active = 'N'
342
- }
343
- reactData.visiblePanel = false
344
- setTimeout(() => {
345
- if (!panelElem || panelElem.dataset.active !== 'Y') {
346
- reactData.isAniVisible = false
347
- }
348
- }, 350)
349
- dispatchEvent('dropdown-click', { name: targetElem.getAttribute('name'), option: null }, evnt)
350
- }
351
- }
352
-
353
- const mouseenterDropdownEvent = () => {
354
- const panelElem = refBtnPanel.value
355
- if (panelElem) {
356
- panelElem.dataset.active = 'Y'
357
- reactData.isAniVisible = true
358
- setTimeout(() => {
359
- if (panelElem.dataset.active === 'Y') {
360
- reactData.visiblePanel = true
361
- updateZindex()
362
- updatePlacement()
363
- setTimeout(() => {
364
- if (reactData.visiblePanel) {
365
- updatePlacement()
366
- }
367
- }, 50)
368
- }
369
- }, 20)
370
- }
371
- }
372
-
373
- const mouseenterTargetEvent = (evnt: MouseEvent) => {
374
- const { loading } = props
375
- const btnDisabled = computeBtnDisabled.value
376
- if (!(btnDisabled || loading)) {
377
- openPanel()
378
- mouseenterEvent(evnt)
379
- }
380
- }
381
-
382
- const mouseleaveTargetEvent = (evnt: MouseEvent) => {
383
- hidePanel()
384
- mouseleaveEvent(evnt)
385
- }
386
-
387
- const mouseenterEvent = (evnt: MouseEvent) => {
388
- dispatchEvent('mouseenter', {}, evnt)
389
- }
390
-
391
- const mouseleaveEvent = (evnt: MouseEvent) => {
392
- dispatchEvent('mouseleave', {}, evnt)
393
- }
394
-
395
- const contextmenuEvent = (evnt: MouseEvent) => {
396
- dispatchEvent('contextmenu', {}, evnt)
397
- }
398
-
399
- const clickTargetEvent = (evnt: MouseEvent) => {
400
- const { loading, trigger } = props
401
- const btnDisabled = computeBtnDisabled.value
402
- if (!(btnDisabled || loading)) {
403
- if (trigger === 'click') {
404
- if (reactData.visiblePanel) {
405
- hidePanel()
406
- } else {
407
- openPanel()
408
- }
409
- }
410
- clickEvent(evnt)
411
- }
412
- }
413
-
414
- const openPanel = () => {
415
- const { trigger } = props
416
- const panelElem = refBtnPanel.value
417
- if (panelElem) {
418
- panelElem.dataset.active = 'Y'
419
- if (!reactData.initialized) {
420
- reactData.initialized = true
421
- }
422
- internalData.showTime = setTimeout(() => {
423
- if (panelElem.dataset.active === 'Y') {
424
- mouseenterDropdownEvent()
425
- } else {
426
- reactData.isAniVisible = false
427
- }
428
- }, trigger === 'click' ? 50 : 250)
429
- }
430
- return nextTick()
431
- }
432
-
433
- const hidePanel = () => {
434
- const panelElem = refBtnPanel.value
435
- clearTimeout(internalData.showTime)
436
- if (panelElem) {
437
- panelElem.dataset.active = 'N'
438
- setTimeout(() => {
439
- if (panelElem.dataset.active !== 'Y') {
440
- reactData.visiblePanel = false
441
- setTimeout(() => {
442
- if (panelElem.dataset.active !== 'Y') {
443
- reactData.isAniVisible = false
444
- }
445
- }, 350)
446
- }
447
- }, 100)
448
- } else {
449
- reactData.isAniVisible = false
450
- reactData.visiblePanel = false
451
- }
452
- return nextTick()
453
- }
454
-
455
- const mouseleaveDropdownEvent = () => {
456
- hidePanel()
457
- }
458
-
459
- const renderTooltipIcon = (tipOpts: VxeButtonPropTypes.PrefixTooltip | VxeButtonPropTypes.SuffixTooltip, type: 'prefix' | 'suffix') => {
460
- return h(VxeTooltipComponent, {
461
- useHTML: tipOpts.useHTML,
462
- content: tipOpts.content,
463
- enterable: tipOpts.enterable,
464
- theme: tipOpts.theme
465
- }, {
466
- default () {
467
- return h('span', {
468
- class: `vxe-button--item vxe-button--tooltip-${type}-icon`
469
- }, [
470
- h('i', {
471
- class: tipOpts.icon || getIcon().BUTTON_TOOLTIP_ICON
472
- })
473
- ])
474
- }
475
- })
476
- }
477
-
478
- const renderContent = () => {
479
- const { content, suffixIcon, loading, prefixTooltip, suffixTooltip, suffixRender } = props
480
- const prefixIcon = props.prefixIcon || props.icon
481
- const prefixRender = props.prefixRender || props.iconRender
482
- const prefixTipOpts = computePrefixTipOpts.value
483
- const suffixTipOpts = computeSuffixTipOpts.value
484
- const prefixIconSlot = slots.prefix || slots.icon
485
- const suffixIconSlot = slots.suffix
486
- const defaultSlot = slots.default
487
- const contVNs: VNode[] = []
488
- if (prefixTooltip) {
489
- contVNs.push(
490
- renderTooltipIcon(prefixTipOpts, 'prefix')
491
- )
492
- }
493
- if (loading) {
494
- contVNs.push(
495
- h('i', {
496
- class: ['vxe-button--item vxe-button--loading-icon', getIcon().BUTTON_LOADING]
497
- })
498
- )
499
- } else if (prefixIconSlot) {
500
- contVNs.push(
501
- h('span', {
502
- class: 'vxe-button--item vxe-button--custom-prefix-icon'
503
- }, prefixIconSlot({}))
504
- )
505
- } else if (prefixRender) {
506
- const compConf = renderer.get(prefixRender.name)
507
- const pIconMethod = compConf ? compConf.renderButtonPrefix : null
508
- contVNs.push(
509
- h('span', {
510
- class: ['vxe-button--item vxe-button--custom-prefix-icon']
511
- }, pIconMethod ? getSlotVNs(pIconMethod(prefixRender, { $button: $xeButton })) : [])
512
- )
513
- } else if (prefixIcon) {
514
- contVNs.push(
515
- h('i', {
516
- class: ['vxe-button--item vxe-button--prefix-icon', prefixIcon]
517
- })
518
- )
519
- }
520
-
521
- if (defaultSlot) {
522
- contVNs.push(
523
- h('span', {
524
- class: 'vxe-button--item vxe-button--content'
525
- }, defaultSlot({}))
526
- )
527
- } else if (content) {
528
- contVNs.push(
529
- h('span', {
530
- class: 'vxe-button--item vxe-button--content'
531
- }, getFuncText(content))
532
- )
533
- }
534
-
535
- if (suffixIconSlot) {
536
- contVNs.push(
537
- h('span', {
538
- class: 'vxe-button--item vxe-button--custom-suffix-icon'
539
- }, suffixIconSlot({}))
540
- )
541
- } else if (suffixRender) {
542
- const compConf = renderer.get(suffixRender.name)
543
- const sIconMethod = compConf ? compConf.renderButtonSuffix : null
544
- contVNs.push(
545
- h('span', {
546
- class: ['vxe-button--item vxe-button--custom-suffix-icon']
547
- }, sIconMethod ? getSlotVNs(sIconMethod(suffixRender, { $button: $xeButton })) : [])
548
- )
549
- } else if (suffixIcon) {
550
- contVNs.push(
551
- h('i', {
552
- class: ['vxe-button--item vxe-button--suffix-icon', suffixIcon]
553
- })
554
- )
555
- }
556
- if (suffixTooltip) {
557
- contVNs.push(
558
- renderTooltipIcon(suffixTipOpts, 'suffix')
559
- )
560
- }
561
- return contVNs
562
- }
563
-
564
- const dispatchEvent = (type: ValueOf<VxeButtonEmits>, params: Record<string, any>, evnt: Event | null) => {
565
- emit(type, createEvent(evnt, { $button: $xeButton }, params))
566
- }
567
-
568
- buttonMethods = {
569
- dispatchEvent,
570
- openPanel,
571
- closePanel: hidePanel,
572
- focus () {
573
- const btnElem = refButton.value
574
- if (btnElem) {
575
- btnElem.focus()
576
- }
577
- return nextTick()
578
- },
579
- blur () {
580
- const btnElem = refButton.value
581
- if (btnElem) {
582
- btnElem.blur()
583
- }
584
- return nextTick()
585
- }
586
- }
587
-
588
- const handleGlobalMousewheelEvent = (evnt: Event) => {
589
- const panelElem = refBtnPanel.value
590
- if (reactData.visiblePanel && !getEventTargetNode(evnt, panelElem).flag) {
591
- hidePanel()
592
- }
593
- }
594
-
595
- const handleGlobalMousedownEvent = (evnt: MouseEvent) => {
596
- const btnDisabled = computeBtnDisabled.value
597
- const { visiblePanel } = reactData
598
- if (!btnDisabled) {
599
- const el = refElem.value
600
- const panelElem = refBtnPanel.value
601
- reactData.isActivated = getEventTargetNode(evnt, el).flag || getEventTargetNode(evnt, panelElem).flag
602
- if (visiblePanel && !reactData.isActivated) {
603
- hidePanel()
604
- }
605
- }
606
- }
607
-
608
- const handleGlobalResizeEvent = () => {
609
- const { visiblePanel } = reactData
610
- if (visiblePanel) {
611
- updatePlacement()
612
- }
613
- }
614
-
615
- Object.assign($xeButton, buttonMethods)
616
-
617
- const renderVN = () => {
618
- const { className, trigger, title, routerLink, type, destroyOnClose, name, loading, shadow, showDropdownIcon } = props
619
- const { initialized, isAniVisible, visiblePanel } = reactData
620
- const isFormBtn = computeIsFormBtn.value
621
- const btnMode = computeBtnMode.value
622
- const btnStatus = computeBtnStatus.value
623
- const btnRound = computeBtnRound.value
624
- const btnAlign = computeBtnAlign.value
625
- const btnCircle = computeBtnCircle.value
626
- const btnTransfer = computeBtnTransfer.value
627
- const btnDisabled = computeBtnDisabled.value
628
- const permissionInfo = computePermissionInfo.value
629
- const downBtnList = computeDownBtnList.value
630
- const popupOpts = computePopupOpts.value
631
- const vSize = computeSize.value
632
- const dropdownsSlot = slots.dropdowns
633
- const ppClassName = popupOpts.className || props.popupClassName
634
-
635
- if (!permissionInfo.visible) {
636
- return renderEmptyElement($xeButton)
637
- }
638
- if (dropdownsSlot || downBtnList.length) {
639
- const btnOns: Record<string, any> = {
640
- onContextmenu: contextmenuEvent
641
- }
642
- const panelOns: Record<string, any> = {}
643
- if (trigger === 'hover') {
644
- // hover 触发
645
- btnOns.onMouseenter = mouseenterTargetEvent
646
- btnOns.onMouseleave = mouseleaveTargetEvent
647
-
648
- panelOns.onMouseenter = mouseenterDropdownEvent
649
- panelOns.onMouseleave = mouseleaveDropdownEvent
650
- }
651
- return h('div', {
652
- ref: refElem,
653
- class: ['vxe-button--dropdown', className ? (XEUtils.isFunction(className) ? className({ $button: $xeButton }) : className) : '', {
654
- [`size--${vSize}`]: vSize,
655
- 'is--active': visiblePanel
656
- }]
657
- }, [
658
- routerLink
659
- ? h(resolveComponent('router-link'), {
660
- ref: refButton,
661
- class: ['vxe-button', 'vxe-button--link', `type--${btnMode}`, btnAlign ? `align--${btnAlign}` : '', className ? (XEUtils.isFunction(className) ? className({ $button: $xeButton }) : className) : '', {
662
- [`size--${vSize}`]: vSize,
663
- [`theme--${btnStatus}`]: btnStatus,
664
- 'is--round': btnRound,
665
- 'is--circle': btnCircle,
666
- 'is--shadow': shadow,
667
- 'is--disabled': btnDisabled || loading,
668
- 'is--loading': loading
669
- }],
670
- title,
671
- name,
672
- type: isFormBtn ? type : 'button',
673
- disabled: btnDisabled || loading,
674
- to: routerLink,
675
- onClick: clickTargetEvent,
676
- ...btnOns
677
- }, {
678
- default () {
679
- return renderContent().concat(showDropdownIcon
680
- ? [
681
- h('i', {
682
- class: `vxe-button--dropdown-arrow ${getIcon().BUTTON_DROPDOWN}`
683
- })
684
- ]
685
- : [])
686
- }
687
- })
688
- : h('button', {
689
- ref: refButton,
690
- class: ['vxe-button', `type--${btnMode}`, btnAlign ? `align--${btnAlign}` : '', className ? (XEUtils.isFunction(className) ? className({ $button: $xeButton }) : className) : '', {
691
- [`size--${vSize}`]: vSize,
692
- [`theme--${btnStatus}`]: btnStatus,
693
- 'is--round': btnRound,
694
- 'is--circle': btnCircle,
695
- 'is--shadow': shadow,
696
- 'is--disabled': btnDisabled || loading,
697
- 'is--loading': loading
698
- }],
699
- title,
700
- name,
701
- type: isFormBtn ? type : 'button',
702
- disabled: btnDisabled || loading,
703
- onClick: clickTargetEvent,
704
- ...btnOns
705
- }, renderContent().concat(showDropdownIcon
706
- ? [
707
- h('i', {
708
- class: `vxe-button--dropdown-arrow ${getIcon().BUTTON_DROPDOWN}`
709
- })
710
- ]
711
- : [])),
712
- h(Teleport, {
713
- to: 'body',
714
- disabled: btnTransfer ? !initialized : true
715
- }, [
716
- h('div', {
717
- ref: refBtnPanel,
718
- class: ['vxe-button--dropdown-panel', ppClassName ? (XEUtils.isFunction(ppClassName) ? ppClassName({ $button: $xeButton }) : ppClassName) : '', {
719
- [`size--${vSize}`]: vSize,
720
- 'is--transfer': btnTransfer,
721
- 'ani--leave': isAniVisible,
722
- 'ani--enter': visiblePanel
723
- }],
724
- placement: reactData.panelPlacement,
725
- style: reactData.panelStyle,
726
- ...panelOns
727
- }, initialized && (visiblePanel || isAniVisible)
728
- ? [
729
- dropdownsSlot
730
- ? h('div', {
731
- class: 'vxe-button--dropdown-wrapper',
732
- onMousedown: mousedownDropdownEvent,
733
- onClick: clickDropdownEvent
734
- }, initialized && (destroyOnClose ? (visiblePanel || isAniVisible) : true) ? dropdownsSlot({}) : [])
735
- : h('div', {
736
- class: 'vxe-button--dropdown-wrapper'
737
- }, initialized && (destroyOnClose ? (visiblePanel || isAniVisible) : true)
738
- ? downBtnList.map((option, i) => {
739
- return h(VxeButtonComponent, {
740
- key: i,
741
- type: option.type,
742
- mode: option.mode || btnMode,
743
- className: option.className,
744
- name: option.name,
745
- routerLink: option.routerLink,
746
- permissionCode: option.permissionCode,
747
- title: option.title,
748
- content: option.content,
749
- status: option.status,
750
- icon: option.icon,
751
- round: XEUtils.isBoolean(option.round) ? option.round : (btnMode === 'text' ? false : btnRound),
752
- circle: XEUtils.isBoolean(option.circle) ? option.circle : (btnMode === 'text' ? false : btnCircle),
753
- disabled: option.disabled,
754
- loading: option.loading,
755
- align: option.align,
756
- onClick (params: VxeButtonDefines.ClickEventParams) {
757
- downBtnClickEvent(params, option)
758
- }
759
- })
760
- })
761
- : [])
762
- ]
763
- : [])
764
- ])
765
- ])
766
- }
767
- if (routerLink) {
768
- return h(resolveComponent('router-link'), {
769
- ref: refButton,
770
- class: ['vxe-button', 'vxe-button--link', `type--${btnMode}`, btnAlign ? `align--${btnAlign}` : '', className ? (XEUtils.isFunction(className) ? className({ $button: $xeButton }) : className) : '', {
771
- [`size--${vSize}`]: vSize,
772
- [`theme--${btnStatus}`]: btnStatus,
773
- 'is--round': btnRound,
774
- 'is--circle': btnCircle,
775
- 'is--shadow': shadow,
776
- 'is--disabled': btnDisabled || loading,
777
- 'is--loading': loading
778
- }],
779
- title,
780
- name,
781
- type: isFormBtn ? type : 'button',
782
- disabled: btnDisabled || loading,
783
- to: routerLink,
784
- onClick: clickEvent,
785
- onMouseenter: mouseenterEvent,
786
- onMouseleave: mouseleaveEvent,
787
- onContextmenu: contextmenuEvent
788
- }, {
789
- default () {
790
- return renderContent()
791
- }
792
- })
793
- }
794
- return h('button', {
795
- ref: refButton,
796
- class: ['vxe-button', `type--${btnMode}`, btnAlign ? `align--${btnAlign}` : '', className ? (XEUtils.isFunction(className) ? className({ $button: $xeButton }) : className) : '', {
797
- [`size--${vSize}`]: vSize,
798
- [`theme--${btnStatus}`]: btnStatus,
799
- 'is--round': btnRound,
800
- 'is--circle': btnCircle,
801
- 'is--shadow': shadow,
802
- 'is--disabled': btnDisabled || loading,
803
- 'is--loading': loading
804
- }],
805
- title,
806
- name,
807
- type: isFormBtn ? type : 'button',
808
- disabled: btnDisabled || loading,
809
- onClick: clickEvent,
810
- onMouseenter: mouseenterEvent,
811
- onMouseleave: mouseleaveEvent,
812
- onContextmenu: contextmenuEvent
813
- }, renderContent())
814
- }
815
-
816
- $xeButton.renderVN = renderVN
817
-
818
- onMounted(() => {
819
- if (props.type === 'text') {
820
- warnLog('vxe.error.delProp', ['[button] type=text', 'mode=text'])
821
- }
822
-
823
- globalEvents.on($xeButton, 'mousewheel', handleGlobalMousewheelEvent)
824
- globalEvents.on($xeButton, 'mousedown', handleGlobalMousedownEvent)
825
- globalEvents.on($xeButton, 'resize', handleGlobalResizeEvent)
826
- })
827
-
828
- onUnmounted(() => {
829
- globalEvents.off($xeButton, 'mousewheel')
830
- globalEvents.off($xeButton, 'mousedown')
831
- globalEvents.off($xeButton, 'resize')
832
- })
833
-
834
- return $xeButton
835
- },
836
- render () {
837
- return this.renderVN()
838
- }
839
- })
840
-
841
- 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 { getConfig, globalEvents, getIcon, createEvent, useSize, renderer, usePermission, permission, renderEmptyElement } from '../../ui'
5
+ import { getEventTargetNode, updatePanelPlacement } from '../../ui/src/dom'
6
+ import { getFuncText, getLastZIndex, nextZIndex } from '../../ui/src/utils'
7
+ import { getSlotVNs } from '../../ui/src/vn'
8
+ import { warnLog } 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
+
14
+ const VxeButtonComponent = defineVxeComponent({
15
+ name: 'VxeButton',
16
+ props: {
17
+ /**
18
+ * 按钮类型
19
+ */
20
+ type: String as PropType<VxeButtonPropTypes.Type>,
21
+ mode: String as PropType<VxeButtonPropTypes.Mode>,
22
+ className: [String, Function] as PropType<VxeButtonPropTypes.ClassName>,
23
+ popupClassName: [String, Function] as PropType<VxeButtonPropTypes.PopupClassName>,
24
+ /**
25
+ * 按钮尺寸
26
+ */
27
+ size: {
28
+ type: String as PropType<VxeButtonPropTypes.Size>,
29
+ default: () => getConfig().button.size || getConfig().size
30
+ },
31
+ zIndex: Number as PropType<VxeButtonPropTypes.ZIndex>,
32
+ /**
33
+ * 用来标识这一项
34
+ */
35
+ name: [String, Number] as PropType<VxeButtonPropTypes.Name>,
36
+ routerLink: Object as PropType<VxeButtonPropTypes.RouterLink>,
37
+ /**
38
+ * 权限码
39
+ */
40
+ permissionCode: [String, Number] as PropType<VxeButtonPropTypes.PermissionCode>,
41
+ /**
42
+ * 按钮内容
43
+ */
44
+ content: String as PropType<VxeButtonPropTypes.Content>,
45
+ /**
46
+ * 固定显示下拉面板的方向
47
+ */
48
+ placement: String as PropType<VxeButtonPropTypes.Placement>,
49
+ /**
50
+ * 按钮状态
51
+ */
52
+ status: String as PropType<VxeButtonPropTypes.Status>,
53
+ /**
54
+ * 标题
55
+ */
56
+ title: String as PropType<VxeButtonPropTypes.Title>,
57
+ shadow: Boolean as PropType<VxeButtonPropTypes.Shadow>,
58
+ /**
59
+ * 按钮的前缀图标,属于 prefix-icon 的简写
60
+ */
61
+ icon: String as PropType<VxeButtonPropTypes.Icon>,
62
+ iconRender: Object as PropType<VxeButtonPropTypes.IconRender>,
63
+ /**
64
+ * 按钮的前缀图标
65
+ */
66
+ prefixIcon: String as PropType<VxeButtonPropTypes.PrefixIcon>,
67
+ prefixRender: Object as PropType<VxeButtonPropTypes.PrefixRender>,
68
+ /**
69
+ * 按钮的后缀图标
70
+ */
71
+ suffixIcon: String as PropType<VxeButtonPropTypes.SuffixIcon>,
72
+ suffixRender: Object as PropType<VxeButtonPropTypes.SuffixRender>,
73
+ /**
74
+ * 圆角边框
75
+ */
76
+ round: Boolean as PropType<VxeButtonPropTypes.Round>,
77
+ /**
78
+ * 圆角按钮
79
+ */
80
+ circle: Boolean as PropType<VxeButtonPropTypes.Circle>,
81
+ /**
82
+ * 是否禁用
83
+ */
84
+ disabled: Boolean as PropType<VxeButtonPropTypes.Disabled>,
85
+ /**
86
+ * 是否加载中
87
+ */
88
+ loading: Boolean as PropType<VxeButtonPropTypes.Loading>,
89
+ trigger: {
90
+ type: String as PropType<VxeButtonPropTypes.Trigger>,
91
+ default: () => getConfig().button.trigger
92
+ },
93
+ align: String as PropType<VxeButtonPropTypes.Align>,
94
+ prefixTooltip: Object as PropType<VxeButtonPropTypes.PrefixTooltip>,
95
+ suffixTooltip: Object as PropType<VxeButtonPropTypes.SuffixTooltip>,
96
+ options: Array as PropType<VxeButtonPropTypes.Options>,
97
+ showDropdownIcon: {
98
+ type: Boolean,
99
+ default: () => getConfig().button.showDropdownIcon
100
+ },
101
+ /**
102
+ * 在下拉面板关闭时销毁内容
103
+ */
104
+ destroyOnClose: {
105
+ type: Boolean as PropType<VxeButtonPropTypes.DestroyOnClose>,
106
+ default: () => getConfig().button.destroyOnClose
107
+ },
108
+ popupConfig: Object as PropType<VxeButtonPropTypes.PopupConfig>,
109
+ /**
110
+ * 是否将弹框容器插入于 body 内
111
+ */
112
+ transfer: {
113
+ type: Boolean as PropType<VxeButtonPropTypes.Transfer>,
114
+ default: null
115
+ }
116
+ },
117
+ emits: [
118
+ 'click',
119
+ 'mouseenter',
120
+ 'mouseleave',
121
+ 'dropdown-click',
122
+ 'dropdownClick',
123
+ 'contextmenu'
124
+ ] as VxeButtonEmits,
125
+ setup (props, context) {
126
+ const { slots, emit } = context
127
+
128
+ const $xeModal = inject<(VxeModalConstructor & VxeModalMethods)| null>('$xeModal', null)
129
+ const $xeDrawer = inject<(VxeDrawerConstructor & VxeDrawerMethods) | null>('$xeDrawer', null)
130
+ const $xeTable = inject<(VxeTableConstructor & VxeTablePrivateMethods) | null>('$xeTable', null)
131
+ const $xeTree = inject<(VxeTreeConstructor & VxeTreePrivateMethods) | null>('$xeTree', null)
132
+ const $xeForm = inject<(VxeFormConstructor & VxeFormPrivateMethods)| null>('$xeForm', null)
133
+ const $xeButtonGroup = inject<(VxeButtonGroupConstructor & VxeButtonGroupPrivateMethods) | null>('$xeButtonGroup', null)
134
+
135
+ const xID = XEUtils.uniqueId()
136
+
137
+ const { computeSize } = useSize(props)
138
+
139
+ const { computePermissionInfo } = usePermission(props)
140
+
141
+ const reactData = reactive<ButtonReactData>({
142
+ initialized: false,
143
+ visiblePanel: false,
144
+ isAniVisible: false,
145
+ isActivated: false,
146
+ panelIndex: 0,
147
+ panelStyle: {},
148
+ panelPlacement: ''
149
+ })
150
+
151
+ const internalData: ButtonInternalData = {
152
+ showTime: undefined,
153
+ tooltipTimeout: undefined
154
+ }
155
+
156
+ const refElem = ref<HTMLDivElement>()
157
+ const refButton = ref<HTMLButtonElement>()
158
+ const refBtnPanel = ref<HTMLDivElement>()
159
+
160
+ const refMaps: ButtonPrivateRef = {
161
+ refElem
162
+ }
163
+
164
+ const $xeButton = {
165
+ xID,
166
+ props,
167
+ context,
168
+ reactData,
169
+ internalData,
170
+ getRefMaps: () => refMaps
171
+ } as unknown as VxeButtonConstructor
172
+
173
+ let buttonMethods = {} as ButtonMethods
174
+
175
+ const computeBtnTransfer = computed(() => {
176
+ const { transfer } = props
177
+ const popupOpts = computePopupOpts.value
178
+ if (XEUtils.isBoolean(popupOpts.transfer)) {
179
+ return popupOpts.transfer
180
+ }
181
+ if (transfer === null) {
182
+ const globalTransfer = getConfig().button.transfer
183
+ if (XEUtils.isBoolean(globalTransfer)) {
184
+ return globalTransfer
185
+ }
186
+ if ($xeTable || $xeTree || $xeModal || $xeDrawer || $xeForm) {
187
+ return true
188
+ }
189
+ }
190
+ return transfer
191
+ })
192
+
193
+ const computeBtnDisabled = computed(() => {
194
+ const { disabled } = props
195
+ const permissionInfo = computePermissionInfo.value
196
+ return disabled || permissionInfo.disabled
197
+ })
198
+
199
+ const computeIsFormBtn = computed(() => {
200
+ const { type } = props
201
+ if (type) {
202
+ return ['submit', 'reset', 'button'].indexOf(type) > -1
203
+ }
204
+ return false
205
+ })
206
+
207
+ const computeBtnMode = computed(() => {
208
+ const { type, mode } = props
209
+ if (mode === 'text' || type === 'text' || ($xeButtonGroup && $xeButtonGroup.props.mode === 'text')) {
210
+ return 'text'
211
+ }
212
+ return 'button'
213
+ })
214
+
215
+ const computeBtnStatus = computed(() => {
216
+ const { status } = props
217
+ if (status) {
218
+ return status
219
+ }
220
+ if ($xeButtonGroup) {
221
+ return $xeButtonGroup.props.status
222
+ }
223
+ return ''
224
+ })
225
+
226
+ const computeBtnAlign = computed(() => {
227
+ const { align } = props
228
+ if (align) {
229
+ return align
230
+ }
231
+ if ($xeButtonGroup) {
232
+ return $xeButtonGroup.props.align
233
+ }
234
+ return false
235
+ })
236
+
237
+ const computeBtnRound = computed(() => {
238
+ const { round } = props
239
+ if (round) {
240
+ return round
241
+ }
242
+ if ($xeButtonGroup) {
243
+ return $xeButtonGroup.props.round
244
+ }
245
+ return false
246
+ })
247
+
248
+ const computeBtnCircle = computed(() => {
249
+ const { circle } = props
250
+ if (circle) {
251
+ return circle
252
+ }
253
+ if ($xeButtonGroup) {
254
+ return $xeButtonGroup.props.circle
255
+ }
256
+ return false
257
+ })
258
+
259
+ const computeDownBtnList = computed(() => {
260
+ const { options } = props
261
+ if (options) {
262
+ return options.filter(item => {
263
+ const { permissionCode } = item
264
+ return !permissionCode || permission.checkVisible(permissionCode)
265
+ })
266
+ }
267
+ return []
268
+ })
269
+
270
+ const computePopupOpts = computed(() => {
271
+ return Object.assign({}, getConfig().button.popupConfig, props.popupConfig)
272
+ })
273
+
274
+ const computePrefixTipOpts = computed(() => {
275
+ return Object.assign({}, getConfig().button.prefixTooltip, props.prefixTooltip)
276
+ })
277
+
278
+ const computeSuffixTipOpts = computed(() => {
279
+ return Object.assign({}, getConfig().button.suffixTooltip, props.suffixTooltip)
280
+ })
281
+
282
+ const updateZindex = () => {
283
+ const popupOpts = computePopupOpts.value
284
+ const customZIndex = popupOpts.zIndex || props.zIndex
285
+ if (customZIndex) {
286
+ reactData.panelIndex = XEUtils.toNumber(customZIndex)
287
+ } else if (reactData.panelIndex < getLastZIndex()) {
288
+ reactData.panelIndex = nextZIndex()
289
+ }
290
+ }
291
+
292
+ const updatePlacement = () => {
293
+ const { placement } = props
294
+ const { panelIndex } = reactData
295
+ const targetElem = refButton.value
296
+ const panelElem = refBtnPanel.value
297
+ const btnTransfer = computeBtnTransfer.value
298
+ const popupOpts = computePopupOpts.value
299
+ const handleStyle = () => {
300
+ const ppObj = updatePanelPlacement(targetElem, panelElem, {
301
+ placement: popupOpts.placement || placement,
302
+ defaultPlacement: (popupOpts as any).defaultPlacement,
303
+ teleportTo: btnTransfer
304
+ })
305
+ const panelStyle: { [key: string]: string | number } = Object.assign(ppObj.style, {
306
+ zIndex: panelIndex
307
+ })
308
+ reactData.panelStyle = panelStyle
309
+ reactData.panelPlacement = ppObj.placement
310
+ }
311
+ handleStyle()
312
+ return nextTick().then(handleStyle)
313
+ }
314
+
315
+ const clickEvent = (evnt: Event) => {
316
+ if ($xeButtonGroup) {
317
+ $xeButtonGroup.handleClick({ name: props.name }, evnt)
318
+ }
319
+ dispatchEvent('click', { $event: evnt }, evnt)
320
+ }
321
+
322
+ const downBtnClickEvent = (params: VxeButtonDefines.ClickEventParams, option: VxeButtonDefines.DownButtonOption) => {
323
+ const { $event } = params
324
+ hidePanel()
325
+ dispatchEvent('dropdown-click', { name: option.name, option }, $event)
326
+ }
327
+
328
+ const mousedownDropdownEvent = (evnt: MouseEvent) => {
329
+ const isLeftBtn = evnt.button === 0
330
+ if (isLeftBtn) {
331
+ evnt.stopPropagation()
332
+ }
333
+ }
334
+
335
+ const clickDropdownEvent = (evnt: Event) => {
336
+ const dropdownElem = evnt.currentTarget
337
+ const panelElem = refBtnPanel.value
338
+ const { flag, targetElem } = getEventTargetNode(evnt, dropdownElem, 'vxe-button')
339
+ if (flag) {
340
+ if (panelElem) {
341
+ panelElem.dataset.active = 'N'
342
+ }
343
+ reactData.visiblePanel = false
344
+ setTimeout(() => {
345
+ if (!panelElem || panelElem.dataset.active !== 'Y') {
346
+ reactData.isAniVisible = false
347
+ }
348
+ }, 350)
349
+ dispatchEvent('dropdown-click', { name: targetElem.getAttribute('name'), option: null }, evnt)
350
+ }
351
+ }
352
+
353
+ const mouseenterDropdownEvent = () => {
354
+ const panelElem = refBtnPanel.value
355
+ if (panelElem) {
356
+ panelElem.dataset.active = 'Y'
357
+ reactData.isAniVisible = true
358
+ setTimeout(() => {
359
+ if (panelElem.dataset.active === 'Y') {
360
+ reactData.visiblePanel = true
361
+ updateZindex()
362
+ updatePlacement()
363
+ setTimeout(() => {
364
+ if (reactData.visiblePanel) {
365
+ updatePlacement()
366
+ }
367
+ }, 50)
368
+ }
369
+ }, 20)
370
+ }
371
+ }
372
+
373
+ const mouseenterTargetEvent = (evnt: MouseEvent) => {
374
+ const { loading } = props
375
+ const btnDisabled = computeBtnDisabled.value
376
+ if (!(btnDisabled || loading)) {
377
+ openPanel()
378
+ mouseenterEvent(evnt)
379
+ }
380
+ }
381
+
382
+ const mouseleaveTargetEvent = (evnt: MouseEvent) => {
383
+ hidePanel()
384
+ mouseleaveEvent(evnt)
385
+ }
386
+
387
+ const mouseenterEvent = (evnt: MouseEvent) => {
388
+ dispatchEvent('mouseenter', {}, evnt)
389
+ }
390
+
391
+ const mouseleaveEvent = (evnt: MouseEvent) => {
392
+ dispatchEvent('mouseleave', {}, evnt)
393
+ }
394
+
395
+ const contextmenuEvent = (evnt: MouseEvent) => {
396
+ dispatchEvent('contextmenu', {}, evnt)
397
+ }
398
+
399
+ const clickTargetEvent = (evnt: MouseEvent) => {
400
+ const { loading, trigger } = props
401
+ const btnDisabled = computeBtnDisabled.value
402
+ if (!(btnDisabled || loading)) {
403
+ if (trigger === 'click') {
404
+ if (reactData.visiblePanel) {
405
+ hidePanel()
406
+ } else {
407
+ openPanel()
408
+ }
409
+ }
410
+ clickEvent(evnt)
411
+ }
412
+ }
413
+
414
+ const openPanel = () => {
415
+ const { trigger } = props
416
+ const panelElem = refBtnPanel.value
417
+ if (panelElem) {
418
+ panelElem.dataset.active = 'Y'
419
+ if (!reactData.initialized) {
420
+ reactData.initialized = true
421
+ }
422
+ internalData.showTime = setTimeout(() => {
423
+ if (panelElem.dataset.active === 'Y') {
424
+ mouseenterDropdownEvent()
425
+ } else {
426
+ reactData.isAniVisible = false
427
+ }
428
+ }, trigger === 'click' ? 50 : 250)
429
+ }
430
+ return nextTick()
431
+ }
432
+
433
+ const hidePanel = () => {
434
+ const panelElem = refBtnPanel.value
435
+ clearTimeout(internalData.showTime)
436
+ if (panelElem) {
437
+ panelElem.dataset.active = 'N'
438
+ setTimeout(() => {
439
+ if (panelElem.dataset.active !== 'Y') {
440
+ reactData.visiblePanel = false
441
+ setTimeout(() => {
442
+ if (panelElem.dataset.active !== 'Y') {
443
+ reactData.isAniVisible = false
444
+ }
445
+ }, 350)
446
+ }
447
+ }, 100)
448
+ } else {
449
+ reactData.isAniVisible = false
450
+ reactData.visiblePanel = false
451
+ }
452
+ return nextTick()
453
+ }
454
+
455
+ const mouseleaveDropdownEvent = () => {
456
+ hidePanel()
457
+ }
458
+
459
+ const renderTooltipIcon = (tipOpts: VxeButtonPropTypes.PrefixTooltip | VxeButtonPropTypes.SuffixTooltip, type: 'prefix' | 'suffix') => {
460
+ return h(VxeTooltipComponent, {
461
+ useHTML: tipOpts.useHTML,
462
+ content: tipOpts.content,
463
+ enterable: tipOpts.enterable,
464
+ theme: tipOpts.theme
465
+ }, {
466
+ default () {
467
+ return h('span', {
468
+ class: `vxe-button--item vxe-button--tooltip-${type}-icon`
469
+ }, [
470
+ h('i', {
471
+ class: tipOpts.icon || getIcon().BUTTON_TOOLTIP_ICON
472
+ })
473
+ ])
474
+ }
475
+ })
476
+ }
477
+
478
+ const renderContent = () => {
479
+ const { content, suffixIcon, loading, prefixTooltip, suffixTooltip, suffixRender } = props
480
+ const prefixIcon = props.prefixIcon || props.icon
481
+ const prefixRender = props.prefixRender || props.iconRender
482
+ const prefixTipOpts = computePrefixTipOpts.value
483
+ const suffixTipOpts = computeSuffixTipOpts.value
484
+ const prefixIconSlot = slots.prefix || slots.icon
485
+ const suffixIconSlot = slots.suffix
486
+ const defaultSlot = slots.default
487
+ const contVNs: VNode[] = []
488
+ if (prefixTooltip) {
489
+ contVNs.push(
490
+ renderTooltipIcon(prefixTipOpts, 'prefix')
491
+ )
492
+ }
493
+ if (loading) {
494
+ contVNs.push(
495
+ h('i', {
496
+ class: ['vxe-button--item vxe-button--loading-icon', getIcon().BUTTON_LOADING]
497
+ })
498
+ )
499
+ } else if (prefixIconSlot) {
500
+ contVNs.push(
501
+ h('span', {
502
+ class: 'vxe-button--item vxe-button--custom-prefix-icon'
503
+ }, prefixIconSlot({}))
504
+ )
505
+ } else if (prefixRender) {
506
+ const compConf = renderer.get(prefixRender.name)
507
+ const pIconMethod = compConf ? compConf.renderButtonPrefix : null
508
+ contVNs.push(
509
+ h('span', {
510
+ class: ['vxe-button--item vxe-button--custom-prefix-icon']
511
+ }, pIconMethod ? getSlotVNs(pIconMethod(prefixRender, { $button: $xeButton })) : [])
512
+ )
513
+ } else if (prefixIcon) {
514
+ contVNs.push(
515
+ h('i', {
516
+ class: ['vxe-button--item vxe-button--prefix-icon', prefixIcon]
517
+ })
518
+ )
519
+ }
520
+
521
+ if (defaultSlot) {
522
+ contVNs.push(
523
+ h('span', {
524
+ class: 'vxe-button--item vxe-button--content'
525
+ }, defaultSlot({}))
526
+ )
527
+ } else if (content) {
528
+ contVNs.push(
529
+ h('span', {
530
+ class: 'vxe-button--item vxe-button--content'
531
+ }, getFuncText(content))
532
+ )
533
+ }
534
+
535
+ if (suffixIconSlot) {
536
+ contVNs.push(
537
+ h('span', {
538
+ class: 'vxe-button--item vxe-button--custom-suffix-icon'
539
+ }, suffixIconSlot({}))
540
+ )
541
+ } else if (suffixRender) {
542
+ const compConf = renderer.get(suffixRender.name)
543
+ const sIconMethod = compConf ? compConf.renderButtonSuffix : null
544
+ contVNs.push(
545
+ h('span', {
546
+ class: ['vxe-button--item vxe-button--custom-suffix-icon']
547
+ }, sIconMethod ? getSlotVNs(sIconMethod(suffixRender, { $button: $xeButton })) : [])
548
+ )
549
+ } else if (suffixIcon) {
550
+ contVNs.push(
551
+ h('i', {
552
+ class: ['vxe-button--item vxe-button--suffix-icon', suffixIcon]
553
+ })
554
+ )
555
+ }
556
+ if (suffixTooltip) {
557
+ contVNs.push(
558
+ renderTooltipIcon(suffixTipOpts, 'suffix')
559
+ )
560
+ }
561
+ return contVNs
562
+ }
563
+
564
+ const dispatchEvent = (type: ValueOf<VxeButtonEmits>, params: Record<string, any>, evnt: Event | null) => {
565
+ emit(type, createEvent(evnt, { $button: $xeButton }, params))
566
+ }
567
+
568
+ buttonMethods = {
569
+ dispatchEvent,
570
+ openPanel,
571
+ closePanel: hidePanel,
572
+ focus () {
573
+ const btnElem = refButton.value
574
+ if (btnElem) {
575
+ btnElem.focus()
576
+ }
577
+ return nextTick()
578
+ },
579
+ blur () {
580
+ const btnElem = refButton.value
581
+ if (btnElem) {
582
+ btnElem.blur()
583
+ }
584
+ return nextTick()
585
+ }
586
+ }
587
+
588
+ const handleGlobalMousewheelEvent = (evnt: Event) => {
589
+ const panelElem = refBtnPanel.value
590
+ if (reactData.visiblePanel && !getEventTargetNode(evnt, panelElem).flag) {
591
+ hidePanel()
592
+ }
593
+ }
594
+
595
+ const handleGlobalMousedownEvent = (evnt: MouseEvent) => {
596
+ const btnDisabled = computeBtnDisabled.value
597
+ const { visiblePanel } = reactData
598
+ if (!btnDisabled) {
599
+ const el = refElem.value
600
+ const panelElem = refBtnPanel.value
601
+ reactData.isActivated = getEventTargetNode(evnt, el).flag || getEventTargetNode(evnt, panelElem).flag
602
+ if (visiblePanel && !reactData.isActivated) {
603
+ hidePanel()
604
+ }
605
+ }
606
+ }
607
+
608
+ const handleGlobalResizeEvent = () => {
609
+ const { visiblePanel } = reactData
610
+ if (visiblePanel) {
611
+ updatePlacement()
612
+ }
613
+ }
614
+
615
+ Object.assign($xeButton, buttonMethods)
616
+
617
+ const renderVN = () => {
618
+ const { className, trigger, title, routerLink, type, destroyOnClose, name, loading, shadow, showDropdownIcon } = props
619
+ const { initialized, isAniVisible, visiblePanel } = reactData
620
+ const isFormBtn = computeIsFormBtn.value
621
+ const btnMode = computeBtnMode.value
622
+ const btnStatus = computeBtnStatus.value
623
+ const btnRound = computeBtnRound.value
624
+ const btnAlign = computeBtnAlign.value
625
+ const btnCircle = computeBtnCircle.value
626
+ const btnTransfer = computeBtnTransfer.value
627
+ const btnDisabled = computeBtnDisabled.value
628
+ const permissionInfo = computePermissionInfo.value
629
+ const downBtnList = computeDownBtnList.value
630
+ const popupOpts = computePopupOpts.value
631
+ const vSize = computeSize.value
632
+ const dropdownsSlot = slots.dropdowns
633
+ const ppClassName = popupOpts.className || props.popupClassName
634
+
635
+ if (!permissionInfo.visible) {
636
+ return renderEmptyElement($xeButton)
637
+ }
638
+ if (dropdownsSlot || downBtnList.length) {
639
+ const btnOns: Record<string, any> = {
640
+ onContextmenu: contextmenuEvent
641
+ }
642
+ const panelOns: Record<string, any> = {}
643
+ if (trigger === 'hover') {
644
+ // hover 触发
645
+ btnOns.onMouseenter = mouseenterTargetEvent
646
+ btnOns.onMouseleave = mouseleaveTargetEvent
647
+
648
+ panelOns.onMouseenter = mouseenterDropdownEvent
649
+ panelOns.onMouseleave = mouseleaveDropdownEvent
650
+ }
651
+ return h('div', {
652
+ ref: refElem,
653
+ class: ['vxe-button--dropdown', className ? (XEUtils.isFunction(className) ? className({ $button: $xeButton }) : className) : '', {
654
+ [`size--${vSize}`]: vSize,
655
+ 'is--active': visiblePanel
656
+ }]
657
+ }, [
658
+ routerLink
659
+ ? h(resolveComponent('router-link'), {
660
+ ref: refButton,
661
+ class: ['vxe-button', 'vxe-button--link', `type--${btnMode}`, btnAlign ? `align--${btnAlign}` : '', className ? (XEUtils.isFunction(className) ? className({ $button: $xeButton }) : className) : '', {
662
+ [`size--${vSize}`]: vSize,
663
+ [`theme--${btnStatus}`]: btnStatus,
664
+ 'is--round': btnRound,
665
+ 'is--circle': btnCircle,
666
+ 'is--shadow': shadow,
667
+ 'is--disabled': btnDisabled || loading,
668
+ 'is--loading': loading
669
+ }],
670
+ title,
671
+ name,
672
+ type: isFormBtn ? type : 'button',
673
+ disabled: btnDisabled || loading,
674
+ to: routerLink,
675
+ onClick: clickTargetEvent,
676
+ ...btnOns
677
+ }, {
678
+ default () {
679
+ return renderContent().concat(showDropdownIcon
680
+ ? [
681
+ h('i', {
682
+ class: `vxe-button--dropdown-arrow ${getIcon().BUTTON_DROPDOWN}`
683
+ })
684
+ ]
685
+ : [])
686
+ }
687
+ })
688
+ : h('button', {
689
+ ref: refButton,
690
+ class: ['vxe-button', `type--${btnMode}`, btnAlign ? `align--${btnAlign}` : '', className ? (XEUtils.isFunction(className) ? className({ $button: $xeButton }) : className) : '', {
691
+ [`size--${vSize}`]: vSize,
692
+ [`theme--${btnStatus}`]: btnStatus,
693
+ 'is--round': btnRound,
694
+ 'is--circle': btnCircle,
695
+ 'is--shadow': shadow,
696
+ 'is--disabled': btnDisabled || loading,
697
+ 'is--loading': loading
698
+ }],
699
+ title,
700
+ name,
701
+ type: isFormBtn ? type : 'button',
702
+ disabled: btnDisabled || loading,
703
+ onClick: clickTargetEvent,
704
+ ...btnOns
705
+ }, renderContent().concat(showDropdownIcon
706
+ ? [
707
+ h('i', {
708
+ class: `vxe-button--dropdown-arrow ${getIcon().BUTTON_DROPDOWN}`
709
+ })
710
+ ]
711
+ : [])),
712
+ h(Teleport, {
713
+ to: 'body',
714
+ disabled: btnTransfer ? !initialized : true
715
+ }, [
716
+ h('div', {
717
+ ref: refBtnPanel,
718
+ class: ['vxe-button--dropdown-panel', ppClassName ? (XEUtils.isFunction(ppClassName) ? ppClassName({ $button: $xeButton }) : ppClassName) : '', {
719
+ [`size--${vSize}`]: vSize,
720
+ 'is--transfer': btnTransfer,
721
+ 'ani--leave': isAniVisible,
722
+ 'ani--enter': visiblePanel
723
+ }],
724
+ placement: reactData.panelPlacement,
725
+ style: reactData.panelStyle,
726
+ ...panelOns
727
+ }, initialized && (visiblePanel || isAniVisible)
728
+ ? [
729
+ dropdownsSlot
730
+ ? h('div', {
731
+ class: 'vxe-button--dropdown-wrapper',
732
+ onMousedown: mousedownDropdownEvent,
733
+ onClick: clickDropdownEvent
734
+ }, initialized && (destroyOnClose ? (visiblePanel || isAniVisible) : true) ? dropdownsSlot({}) : [])
735
+ : h('div', {
736
+ class: 'vxe-button--dropdown-wrapper'
737
+ }, initialized && (destroyOnClose ? (visiblePanel || isAniVisible) : true)
738
+ ? downBtnList.map((option, i) => {
739
+ return h(VxeButtonComponent, {
740
+ key: i,
741
+ type: option.type,
742
+ mode: option.mode || btnMode,
743
+ className: option.className,
744
+ name: option.name,
745
+ routerLink: option.routerLink,
746
+ permissionCode: option.permissionCode,
747
+ title: option.title,
748
+ content: option.content,
749
+ status: option.status,
750
+ icon: option.icon,
751
+ round: XEUtils.isBoolean(option.round) ? option.round : (btnMode === 'text' ? false : btnRound),
752
+ circle: XEUtils.isBoolean(option.circle) ? option.circle : (btnMode === 'text' ? false : btnCircle),
753
+ disabled: option.disabled,
754
+ loading: option.loading,
755
+ align: option.align,
756
+ onClick (params: VxeButtonDefines.ClickEventParams) {
757
+ downBtnClickEvent(params, option)
758
+ }
759
+ })
760
+ })
761
+ : [])
762
+ ]
763
+ : [])
764
+ ])
765
+ ])
766
+ }
767
+ if (routerLink) {
768
+ return h(resolveComponent('router-link'), {
769
+ ref: refButton,
770
+ class: ['vxe-button', 'vxe-button--link', `type--${btnMode}`, btnAlign ? `align--${btnAlign}` : '', className ? (XEUtils.isFunction(className) ? className({ $button: $xeButton }) : className) : '', {
771
+ [`size--${vSize}`]: vSize,
772
+ [`theme--${btnStatus}`]: btnStatus,
773
+ 'is--round': btnRound,
774
+ 'is--circle': btnCircle,
775
+ 'is--shadow': shadow,
776
+ 'is--disabled': btnDisabled || loading,
777
+ 'is--loading': loading
778
+ }],
779
+ title,
780
+ name,
781
+ type: isFormBtn ? type : 'button',
782
+ disabled: btnDisabled || loading,
783
+ to: routerLink,
784
+ onClick: clickEvent,
785
+ onMouseenter: mouseenterEvent,
786
+ onMouseleave: mouseleaveEvent,
787
+ onContextmenu: contextmenuEvent
788
+ }, {
789
+ default () {
790
+ return renderContent()
791
+ }
792
+ })
793
+ }
794
+ return h('button', {
795
+ ref: refButton,
796
+ class: ['vxe-button', `type--${btnMode}`, btnAlign ? `align--${btnAlign}` : '', className ? (XEUtils.isFunction(className) ? className({ $button: $xeButton }) : className) : '', {
797
+ [`size--${vSize}`]: vSize,
798
+ [`theme--${btnStatus}`]: btnStatus,
799
+ 'is--round': btnRound,
800
+ 'is--circle': btnCircle,
801
+ 'is--shadow': shadow,
802
+ 'is--disabled': btnDisabled || loading,
803
+ 'is--loading': loading
804
+ }],
805
+ title,
806
+ name,
807
+ type: isFormBtn ? type : 'button',
808
+ disabled: btnDisabled || loading,
809
+ onClick: clickEvent,
810
+ onMouseenter: mouseenterEvent,
811
+ onMouseleave: mouseleaveEvent,
812
+ onContextmenu: contextmenuEvent
813
+ }, renderContent())
814
+ }
815
+
816
+ $xeButton.renderVN = renderVN
817
+
818
+ onMounted(() => {
819
+ if (props.type === 'text') {
820
+ warnLog('vxe.error.delProp', ['[button] type=text', 'mode=text'])
821
+ }
822
+
823
+ globalEvents.on($xeButton, 'mousewheel', handleGlobalMousewheelEvent)
824
+ globalEvents.on($xeButton, 'mousedown', handleGlobalMousedownEvent)
825
+ globalEvents.on($xeButton, 'resize', handleGlobalResizeEvent)
826
+ })
827
+
828
+ onUnmounted(() => {
829
+ globalEvents.off($xeButton, 'mousewheel')
830
+ globalEvents.off($xeButton, 'mousedown')
831
+ globalEvents.off($xeButton, 'resize')
832
+ })
833
+
834
+ return $xeButton
835
+ },
836
+ render () {
837
+ return this.renderVN()
838
+ }
839
+ })
840
+
841
+ export default VxeButtonComponent