vxe-pc-ui 4.20.24 → 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 (627) hide show
  1. package/dist/all.esm.js +15151 -10366
  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.d.ts +3 -0
  53. package/es/index.esm.js +12 -0
  54. package/es/index.js +12 -0
  55. package/es/input/src/input.js +820 -507
  56. package/es/layout-aside/src/layout-aside.js +54 -38
  57. package/es/layout-body/src/layout-body.js +39 -27
  58. package/es/layout-container/src/layout-container.js +16 -9
  59. package/es/layout-footer/src/layout-footer.js +16 -7
  60. package/es/layout-header/src/layout-header.js +15 -7
  61. package/es/link/src/link.js +65 -44
  62. package/es/list/src/list.js +453 -333
  63. package/es/loading/index.js +8 -5
  64. package/es/loading/src/loading.js +60 -33
  65. package/es/mention/src/mention.js +2 -1
  66. package/es/menu/src/menu.js +341 -210
  67. package/es/modal/index.js +60 -37
  68. package/es/modal/src/modal.js +303 -205
  69. package/es/notice-bar/src/notice-bar.js +64 -37
  70. package/es/number-input/src/number-input.js +249 -172
  71. package/es/pager/src/pager.js +346 -202
  72. package/es/password-input/src/password-input.js +145 -105
  73. package/es/print/src/page-break.js +2 -1
  74. package/es/print/src/print.js +184 -99
  75. package/es/pulldown/src/pulldown.js +113 -71
  76. package/es/radio/src/button.js +92 -57
  77. package/es/radio/src/group.js +33 -25
  78. package/es/radio/src/radio.js +61 -41
  79. package/es/rate/src/rate.js +48 -36
  80. package/es/result/src/result.js +67 -35
  81. package/es/row/src/col.js +30 -16
  82. package/es/row/src/row.js +21 -14
  83. package/es/scrollbar/src/scrollbar.js +177 -145
  84. package/es/segmented/src/segmented.js +93 -60
  85. package/es/select/src/optgroup.js +7 -3
  86. package/es/select/src/select.js +483 -340
  87. package/es/select/src/util.js +6 -3
  88. package/es/slider/src/slider.js +108 -80
  89. package/es/space/src/space.js +43 -26
  90. package/es/splitter/src/splitter-panel.js +50 -25
  91. package/es/splitter/src/splitter.js +219 -144
  92. package/es/steps/src/steps.js +10 -5
  93. package/es/style.css +1 -1
  94. package/es/style.mini.css +1 -1
  95. package/es/switch/src/switch.js +115 -64
  96. package/es/table-select/src/table-select.js +232 -153
  97. package/es/table-transfer/src/table-transfer.js +10 -5
  98. package/es/tabs/src/tab-pane.js +33 -16
  99. package/es/tabs/src/tabs.js +363 -230
  100. package/es/tag/src/tag.js +61 -43
  101. package/es/text/src/text.js +89 -65
  102. package/es/text-ellipsis/src/text-ellipsis.js +82 -51
  103. package/es/textarea/src/textarea.js +116 -86
  104. package/es/timeline/src/timeline-item.js +2 -1
  105. package/es/timeline/src/timeline.js +2 -1
  106. package/es/tip/src/tip.js +53 -29
  107. package/es/tooltip/src/tooltip.js +114 -74
  108. package/es/tour/src/tour.js +2 -1
  109. package/es/transfer/src/transfer.js +42 -25
  110. package/es/tree/src/tree.js +709 -492
  111. package/es/tree-select/src/tree-select.js +320 -225
  112. package/es/ui/index.d.ts +0 -1
  113. package/es/ui/index.js +46 -3
  114. package/es/ui/src/dom.js +9 -6
  115. package/es/ui/src/log.js +1 -1
  116. package/es/ui/src/utils.d.ts +1 -1
  117. package/es/upload/src/upload.js +614 -398
  118. package/es/vxe-icon/style.css +1 -1
  119. package/es/vxe-icon/style.mini.css +1 -1
  120. package/es/watermark/src/util.js +15 -12
  121. package/es/watermark/src/watermark.js +55 -25
  122. package/lib/alert/src/alert.js +62 -37
  123. package/lib/anchor/src/anchor-link.js +39 -20
  124. package/lib/anchor/src/anchor.js +75 -46
  125. package/lib/avatar/src/avatar.js +52 -32
  126. package/lib/backtop/src/backtop.js +81 -56
  127. package/lib/badge/src/badge.js +35 -19
  128. package/lib/breadcrumb/src/breadcrumb-item.js +52 -27
  129. package/lib/breadcrumb/src/breadcrumb.js +13 -10
  130. package/lib/button/src/button-group.js +27 -21
  131. package/lib/button/src/button.js +306 -207
  132. package/lib/calendar/src/calendar.js +575 -362
  133. package/lib/card/src/card.js +133 -78
  134. package/lib/carousel/src/carousel-item.js +15 -8
  135. package/lib/carousel/src/carousel.js +182 -120
  136. package/lib/cascader/src/cascader.js +555 -409
  137. package/lib/checkbox/src/button.js +93 -58
  138. package/lib/checkbox/src/checkbox.js +63 -43
  139. package/lib/checkbox/src/group.js +37 -29
  140. package/lib/collapse/src/collapse-pane.js +34 -17
  141. package/lib/collapse/src/collapse.js +139 -85
  142. package/lib/color-picker/src/color-picker.js +516 -377
  143. package/lib/components.js +3 -2
  144. package/lib/context-menu/src/context-menu.js +212 -132
  145. package/lib/countdown/src/countdown.js +95 -63
  146. package/lib/date-panel/src/date-panel.js +776 -466
  147. package/lib/date-picker/src/date-picker.js +377 -274
  148. package/lib/date-range-picker/src/date-range-picker.js +401 -300
  149. package/lib/divider/src/divider.js +31 -17
  150. package/lib/drawer/src/drawer.js +255 -155
  151. package/lib/dynamics/index.js +38 -25
  152. package/lib/empty/src/empty.js +55 -31
  153. package/lib/form/render/index.js +68 -43
  154. package/lib/form/src/form-config-item.js +24 -18
  155. package/lib/form/src/form-group.js +25 -16
  156. package/lib/form/src/form-item.js +25 -19
  157. package/lib/form/src/form.js +140 -96
  158. package/lib/form/src/itemInfo.js +4 -3
  159. package/lib/form/src/render.js +214 -134
  160. package/lib/form/src/util.js +9 -5
  161. package/lib/icon/src/icon.js +17 -13
  162. package/lib/icon/style/style.css +1 -1
  163. package/lib/icon/style/style.mini.css +1 -1
  164. package/lib/icon-picker/src/icon-picker.js +251 -158
  165. package/lib/image/src/group.js +26 -20
  166. package/lib/image/src/image.js +41 -40
  167. package/lib/image/src/preview.js +206 -146
  168. package/lib/image/src/util.js +6 -3
  169. package/lib/index.common.js +12 -0
  170. package/lib/index.js +12 -0
  171. package/lib/index.umd.js +15359 -10558
  172. package/lib/index.umd.min.js +3 -3
  173. package/lib/input/src/input.js +878 -565
  174. package/lib/layout-aside/src/layout-aside.js +61 -45
  175. package/lib/layout-body/src/layout-body.js +47 -35
  176. package/lib/layout-container/src/layout-container.js +18 -11
  177. package/lib/layout-footer/src/layout-footer.js +17 -8
  178. package/lib/layout-header/src/layout-header.js +16 -8
  179. package/lib/link/src/link.js +69 -48
  180. package/lib/list/src/list.js +456 -336
  181. package/lib/loading/index.js +8 -5
  182. package/lib/loading/src/loading.js +69 -42
  183. package/lib/mention/src/mention.js +4 -3
  184. package/lib/menu/src/menu.js +351 -220
  185. package/lib/modal/index.js +60 -37
  186. package/lib/modal/src/modal.js +306 -208
  187. package/lib/notice-bar/src/notice-bar.js +70 -43
  188. package/lib/number-input/src/number-input.js +290 -213
  189. package/lib/pager/src/pager.js +347 -203
  190. package/lib/password-input/src/password-input.js +155 -115
  191. package/lib/print/src/page-break.js +3 -2
  192. package/lib/print/src/print.js +193 -108
  193. package/lib/pulldown/src/pulldown.js +128 -86
  194. package/lib/radio/src/button.js +96 -61
  195. package/lib/radio/src/group.js +37 -29
  196. package/lib/radio/src/radio.js +65 -45
  197. package/lib/rate/src/rate.js +50 -38
  198. package/lib/result/src/result.js +68 -36
  199. package/lib/row/src/col.js +32 -18
  200. package/lib/row/src/row.js +25 -18
  201. package/lib/scrollbar/src/scrollbar.js +178 -146
  202. package/lib/segmented/src/segmented.js +97 -64
  203. package/lib/select/src/optgroup.js +7 -3
  204. package/lib/select/src/select.js +486 -343
  205. package/lib/select/src/util.js +6 -3
  206. package/lib/slider/src/slider.js +122 -94
  207. package/lib/space/src/space.js +57 -40
  208. package/lib/splitter/src/splitter-panel.js +51 -26
  209. package/lib/splitter/src/splitter.js +233 -158
  210. package/lib/steps/src/steps.js +11 -6
  211. package/lib/style.css +1 -1
  212. package/lib/style.mini.css +1 -1
  213. package/lib/switch/src/switch.js +116 -65
  214. package/lib/table-select/src/table-select.js +234 -155
  215. package/lib/table-transfer/src/table-transfer.js +12 -7
  216. package/lib/tabs/src/tab-pane.js +34 -17
  217. package/lib/tabs/src/tabs.js +365 -232
  218. package/lib/tag/src/tag.js +67 -49
  219. package/lib/text/src/text.js +100 -76
  220. package/lib/text-ellipsis/src/text-ellipsis.js +86 -55
  221. package/lib/textarea/src/textarea.js +127 -97
  222. package/lib/timeline/src/timeline-item.js +3 -2
  223. package/lib/timeline/src/timeline.js +4 -3
  224. package/lib/tip/src/tip.js +58 -34
  225. package/lib/tooltip/src/tooltip.js +116 -76
  226. package/lib/tour/src/tour.js +4 -3
  227. package/lib/transfer/src/transfer.js +44 -27
  228. package/lib/tree/src/tree.js +717 -500
  229. package/lib/tree-select/src/tree-select.js +351 -256
  230. package/lib/ui/index.js +46 -4
  231. package/lib/ui/src/dom.js +9 -6
  232. package/lib/ui/src/log.js +1 -1
  233. package/lib/upload/src/upload.js +708 -492
  234. package/lib/vxe-icon/style/style.css +1 -1
  235. package/lib/vxe-icon/style/style.mini.css +1 -1
  236. package/lib/watermark/src/util.js +15 -12
  237. package/lib/watermark/src/watermark.js +60 -30
  238. package/package.json +10 -4
  239. package/packages/alert/index.ts +16 -16
  240. package/packages/alert/src/alert.ts +148 -126
  241. package/packages/anchor/index.ts +16 -16
  242. package/packages/anchor/src/anchor-link.ts +139 -121
  243. package/packages/anchor/src/anchor.ts +266 -237
  244. package/packages/anchor/src/util.ts +23 -23
  245. package/packages/anchor-link/index.ts +16 -16
  246. package/packages/avatar/index.ts +16 -16
  247. package/packages/avatar/src/avatar.ts +166 -149
  248. package/packages/backtop/index.ts +16 -16
  249. package/packages/backtop/src/backtop.ts +337 -313
  250. package/packages/badge/index.ts +16 -16
  251. package/packages/badge/src/badge.ts +131 -118
  252. package/packages/breadcrumb/index.ts +16 -16
  253. package/packages/breadcrumb/src/breadcrumb-item.ts +129 -106
  254. package/packages/breadcrumb/src/breadcrumb.ts +94 -92
  255. package/packages/breadcrumb-item/index.ts +16 -16
  256. package/packages/button/index.ts +16 -16
  257. package/packages/button/src/button-group.ts +116 -110
  258. package/packages/button/src/button.ts +975 -855
  259. package/packages/button-group/index.ts +16 -16
  260. package/packages/calendar/index.ts +16 -16
  261. package/packages/calendar/src/calendar.ts +1566 -1352
  262. package/packages/card/index.ts +16 -16
  263. package/packages/card/src/card.ts +285 -236
  264. package/packages/carousel/index.ts +16 -16
  265. package/packages/carousel/src/carousel-item.ts +120 -102
  266. package/packages/carousel/src/carousel.ts +475 -414
  267. package/packages/carousel/src/util.ts +21 -21
  268. package/packages/carousel-item/index.ts +16 -16
  269. package/packages/cascader/index.ts +16 -16
  270. package/packages/cascader/src/cascader.ts +2074 -1896
  271. package/packages/cascader/src/util.ts +9 -9
  272. package/packages/checkbox/index.ts +16 -16
  273. package/packages/checkbox/src/button.ts +267 -221
  274. package/packages/checkbox/src/checkbox.ts +219 -199
  275. package/packages/checkbox/src/group.ts +292 -269
  276. package/packages/checkbox-button/index.ts +16 -16
  277. package/packages/checkbox-group/index.ts +16 -16
  278. package/packages/col/index.ts +16 -16
  279. package/packages/collapse/index.ts +16 -16
  280. package/packages/collapse/src/collapse-pane.ts +142 -114
  281. package/packages/collapse/src/collapse.ts +453 -384
  282. package/packages/collapse/src/util.ts +21 -21
  283. package/packages/collapse-pane/index.ts +16 -16
  284. package/packages/color-picker/index.ts +31 -31
  285. package/packages/color-picker/src/color-picker.ts +1310 -1147
  286. package/packages/color-picker/src/util.ts +436 -423
  287. package/packages/components.ts +350 -349
  288. package/packages/context-menu/index.ts +54 -54
  289. package/packages/context-menu/src/context-menu.ts +773 -681
  290. package/packages/countdown/index.ts +16 -16
  291. package/packages/countdown/src/countdown.ts +295 -262
  292. package/packages/date-panel/index.ts +16 -16
  293. package/packages/date-panel/src/date-panel.ts +2214 -1900
  294. package/packages/date-panel/src/util.ts +354 -326
  295. package/packages/date-picker/index.ts +16 -16
  296. package/packages/date-picker/src/date-picker.ts +1884 -1752
  297. package/packages/date-range-picker/index.ts +16 -16
  298. package/packages/date-range-picker/src/date-range-picker.ts +1728 -1604
  299. package/packages/divider/index.ts +16 -16
  300. package/packages/divider/src/divider.ts +105 -93
  301. package/packages/drawer/index.ts +78 -78
  302. package/packages/drawer/src/drawer.ts +920 -802
  303. package/packages/drawer/src/store.ts +3 -3
  304. package/packages/dynamics/index.ts +124 -117
  305. package/packages/empty/index.ts +16 -16
  306. package/packages/empty/src/empty.ts +124 -103
  307. package/packages/form/index.ts +16 -16
  308. package/packages/form/render/index.ts +646 -614
  309. package/packages/form/src/form-config-item.ts +85 -80
  310. package/packages/form/src/form-group.ts +96 -86
  311. package/packages/form/src/form-item.ts +181 -174
  312. package/packages/form/src/form.ts +1122 -1069
  313. package/packages/form/src/itemInfo.ts +84 -82
  314. package/packages/form/src/render.ts +470 -387
  315. package/packages/form/src/util.ts +98 -93
  316. package/packages/form-gather/index.ts +26 -26
  317. package/packages/form-group/index.ts +16 -16
  318. package/packages/form-item/index.ts +16 -16
  319. package/packages/icon/index.ts +16 -16
  320. package/packages/icon/src/icon.ts +78 -75
  321. package/packages/icon-picker/index.ts +16 -16
  322. package/packages/icon-picker/src/icon-picker.ts +922 -809
  323. package/packages/image/index.ts +16 -16
  324. package/packages/image/src/group.ts +159 -153
  325. package/packages/image/src/image.ts +298 -298
  326. package/packages/image/src/preview.ts +749 -672
  327. package/packages/image/src/util.ts +62 -59
  328. package/packages/image-group/index.ts +16 -16
  329. package/packages/image-preview/index.ts +19 -19
  330. package/packages/index.ts +20 -4
  331. package/packages/input/index.ts +16 -16
  332. package/packages/input/src/input.ts +3201 -2863
  333. package/packages/language/fr-FR.ts +15 -15
  334. package/packages/language/it-IT.ts +4 -4
  335. package/packages/language/uk-UA.ts +1 -1
  336. package/packages/language/uz-UZ.ts +13 -13
  337. package/packages/language/zh-CN.ts +907 -907
  338. package/packages/layout-aside/index.ts +16 -16
  339. package/packages/layout-aside/src/layout-aside.ts +172 -156
  340. package/packages/layout-body/index.ts +16 -16
  341. package/packages/layout-body/src/layout-body.ts +191 -181
  342. package/packages/layout-container/index.ts +16 -16
  343. package/packages/layout-container/src/layout-container.ts +108 -92
  344. package/packages/layout-footer/index.ts +16 -16
  345. package/packages/layout-footer/src/layout-footer.ts +81 -74
  346. package/packages/layout-header/index.ts +16 -16
  347. package/packages/layout-header/src/layout-header.ts +79 -73
  348. package/packages/link/index.ts +16 -16
  349. package/packages/link/src/link.ts +180 -161
  350. package/packages/list/index.ts +16 -16
  351. package/packages/list/src/list.ts +2690 -2564
  352. package/packages/list/src/store.ts +10 -10
  353. package/packages/list/src/util.ts +10 -11
  354. package/packages/loading/index.ts +39 -36
  355. package/packages/loading/src/loading.ts +179 -152
  356. package/packages/mention/index.ts +16 -16
  357. package/packages/mention/src/mention.ts +69 -71
  358. package/packages/menu/index.ts +16 -16
  359. package/packages/menu/src/menu.ts +1000 -857
  360. package/packages/modal/index.ts +164 -141
  361. package/packages/modal/src/modal.ts +1803 -1681
  362. package/packages/modal/src/store.ts +3 -3
  363. package/packages/notice-bar/index.ts +16 -16
  364. package/packages/notice-bar/src/notice-bar.ts +207 -181
  365. package/packages/number-input/index.ts +16 -16
  366. package/packages/number-input/src/number-input.ts +1322 -1242
  367. package/packages/number-input/src/util.ts +25 -25
  368. package/packages/optgroup/index.ts +16 -16
  369. package/packages/option/index.ts +16 -16
  370. package/packages/pager/index.ts +16 -16
  371. package/packages/pager/src/pager.ts +919 -775
  372. package/packages/password-input/index.ts +16 -16
  373. package/packages/password-input/src/password-input.ts +523 -482
  374. package/packages/print/index.ts +18 -18
  375. package/packages/print/src/page-break.ts +104 -92
  376. package/packages/print/src/print.ts +366 -281
  377. package/packages/print/src/util.ts +299 -304
  378. package/packages/print-page-break/index.ts +16 -16
  379. package/packages/pulldown/index.ts +16 -16
  380. package/packages/pulldown/src/pulldown.ts +505 -445
  381. package/packages/radio/index.ts +16 -16
  382. package/packages/radio/src/button.ts +290 -243
  383. package/packages/radio/src/group.ts +275 -252
  384. package/packages/radio/src/radio.ts +237 -218
  385. package/packages/radio-button/index.ts +16 -16
  386. package/packages/radio-group/index.ts +16 -16
  387. package/packages/rate/index.ts +16 -16
  388. package/packages/rate/src/rate.ts +203 -192
  389. package/packages/result/index.ts +16 -16
  390. package/packages/result/src/result.ts +141 -112
  391. package/packages/row/index.ts +16 -16
  392. package/packages/row/src/col.ts +171 -159
  393. package/packages/row/src/row.ts +143 -138
  394. package/packages/scrollbar/index.ts +16 -16
  395. package/packages/scrollbar/src/scrollbar.ts +626 -595
  396. package/packages/segmented/index.ts +16 -16
  397. package/packages/segmented/src/segmented.ts +297 -264
  398. package/packages/select/index.ts +16 -16
  399. package/packages/select/src/optgroup.ts +53 -49
  400. package/packages/select/src/option-info.ts +20 -20
  401. package/packages/select/src/option.ts +47 -47
  402. package/packages/select/src/select.ts +2390 -2214
  403. package/packages/select/src/util.ts +50 -47
  404. package/packages/slider/index.ts +16 -16
  405. package/packages/slider/src/slider.ts +547 -506
  406. package/packages/space/index.ts +16 -16
  407. package/packages/space/src/space.ts +225 -209
  408. package/packages/split/index.ts +16 -16
  409. package/packages/split-pane/index.ts +17 -17
  410. package/packages/splitter/index.ts +16 -16
  411. package/packages/splitter/src/splitter-panel.ts +199 -163
  412. package/packages/splitter/src/splitter.ts +1110 -1020
  413. package/packages/splitter/src/util.ts +21 -21
  414. package/packages/splitter-panel/index.ts +16 -16
  415. package/packages/steps/index.ts +16 -16
  416. package/packages/steps/src/steps.ts +69 -68
  417. package/packages/switch/index.ts +16 -16
  418. package/packages/switch/src/switch.ts +300 -245
  419. package/packages/tab-pane/index.ts +16 -16
  420. package/packages/table-select/index.ts +16 -16
  421. package/packages/table-select/src/table-select.ts +1103 -999
  422. package/packages/table-transfer/index.ts +16 -16
  423. package/packages/table-transfer/src/table-transfer.ts +104 -91
  424. package/packages/tabs/index.ts +16 -16
  425. package/packages/tabs/src/tab-pane.ts +132 -117
  426. package/packages/tabs/src/tabs.ts +1137 -997
  427. package/packages/tabs/src/util.ts +21 -21
  428. package/packages/tag/index.ts +16 -16
  429. package/packages/tag/src/tag.ts +204 -187
  430. package/packages/text/index.ts +16 -16
  431. package/packages/text/src/text.ts +282 -260
  432. package/packages/text-ellipsis/index.ts +16 -16
  433. package/packages/text-ellipsis/src/text-ellipsis.ts +312 -282
  434. package/packages/textarea/index.ts +16 -16
  435. package/packages/textarea/src/textarea.ts +526 -495
  436. package/packages/timeline/index.ts +16 -16
  437. package/packages/timeline/src/timeline-item.ts +65 -67
  438. package/packages/timeline/src/timeline.ts +70 -71
  439. package/packages/timeline-item/index.ts +16 -16
  440. package/packages/tip/index.ts +19 -19
  441. package/packages/tip/src/tip.ts +150 -129
  442. package/packages/tooltip/index.ts +72 -72
  443. package/packages/tooltip/src/tooltip.ts +669 -627
  444. package/packages/tour/index.ts +16 -16
  445. package/packages/tour/src/tour.ts +70 -71
  446. package/packages/transfer/index.ts +16 -16
  447. package/packages/transfer/src/transfer.ts +130 -117
  448. package/packages/tree/index.ts +16 -16
  449. package/packages/tree/src/store.ts +10 -10
  450. package/packages/tree/src/tree.ts +4077 -3852
  451. package/packages/tree/src/util.ts +51 -51
  452. package/packages/tree-select/index.ts +16 -16
  453. package/packages/tree-select/src/tree-select.ts +1217 -1094
  454. package/packages/ui/index.ts +836 -793
  455. package/packages/ui/src/anime.ts +51 -52
  456. package/packages/ui/src/comp.ts +3 -3
  457. package/packages/ui/src/dom.ts +357 -354
  458. package/packages/ui/src/log.ts +19 -19
  459. package/packages/ui/src/utils.ts +79 -79
  460. package/packages/ui/src/vn.ts +39 -39
  461. package/packages/upload/index.ts +20 -20
  462. package/packages/upload/src/upload.ts +2271 -2021
  463. package/packages/upload/src/util.ts +109 -109
  464. package/packages/watermark/index.ts +33 -33
  465. package/packages/watermark/src/util.ts +186 -180
  466. package/packages/watermark/src/watermark.ts +196 -168
  467. package/types/all.d.ts +552 -552
  468. package/types/components/alert.d.ts +83 -87
  469. package/types/components/anchor-link.d.ts +88 -91
  470. package/types/components/anchor.d.ts +97 -104
  471. package/types/components/avatar.d.ts +85 -88
  472. package/types/components/backtop.d.ts +119 -122
  473. package/types/components/badge.d.ts +77 -80
  474. package/types/components/breadcrumb-item.d.ts +77 -80
  475. package/types/components/breadcrumb.d.ts +83 -87
  476. package/types/components/button-group.d.ts +118 -120
  477. package/types/components/button.d.ts +331 -339
  478. package/types/components/calendar.d.ts +247 -264
  479. package/types/components/card.d.ts +111 -113
  480. package/types/components/carousel-item.d.ts +73 -75
  481. package/types/components/carousel.d.ts +130 -134
  482. package/types/components/cascader.d.ts +336 -386
  483. package/types/components/checkbox-button.d.ts +109 -114
  484. package/types/components/checkbox-group.d.ts +152 -154
  485. package/types/components/checkbox.d.ts +123 -128
  486. package/types/components/col.d.ts +77 -80
  487. package/types/components/colgroup.d.ts +64 -69
  488. package/types/components/collapse-pane.d.ts +86 -89
  489. package/types/components/collapse.d.ts +123 -133
  490. package/types/components/color-picker.d.ts +275 -280
  491. package/types/components/column.d.ts +834 -851
  492. package/types/components/context-menu.d.ts +282 -289
  493. package/types/components/countdown.d.ts +108 -112
  494. package/types/components/date-panel.d.ts +319 -331
  495. package/types/components/date-picker.d.ts +361 -384
  496. package/types/components/date-range-picker.d.ts +351 -371
  497. package/types/components/divider.d.ts +72 -75
  498. package/types/components/drawer.d.ts +333 -344
  499. package/types/components/empty.d.ts +75 -78
  500. package/types/components/flow-design.d.ts +73 -85
  501. package/types/components/flow-view.d.ts +73 -85
  502. package/types/components/form-design.d.ts +370 -376
  503. package/types/components/form-gather.d.ts +120 -124
  504. package/types/components/form-group.d.ts +73 -77
  505. package/types/components/form-item.d.ts +395 -413
  506. package/types/components/form-view.d.ts +179 -183
  507. package/types/components/form.d.ts +499 -495
  508. package/types/components/gantt-module/gantt-view.d.ts +195 -200
  509. package/types/components/gantt-module/index.d.ts +1 -1
  510. package/types/components/gantt-plugins/extend-gantt-chart.d.ts +137 -131
  511. package/types/components/gantt-plugins/index.d.ts +1 -1
  512. package/types/components/gantt.d.ts +1248 -1399
  513. package/types/components/grid.d.ts +1289 -1317
  514. package/types/components/icon-picker.d.ts +242 -253
  515. package/types/components/icon.d.ts +332 -87
  516. package/types/components/image-group.d.ts +124 -127
  517. package/types/components/image-preview.d.ts +167 -167
  518. package/types/components/image.d.ts +166 -173
  519. package/types/components/input.d.ts +429 -453
  520. package/types/components/layout-aside.d.ts +123 -123
  521. package/types/components/layout-body.d.ts +110 -113
  522. package/types/components/layout-container.d.ts +73 -75
  523. package/types/components/layout-footer.d.ts +71 -73
  524. package/types/components/layout-header.d.ts +67 -69
  525. package/types/components/link.d.ts +107 -111
  526. package/types/components/list-design.d.ts +189 -190
  527. package/types/components/list-view.d.ts +193 -199
  528. package/types/components/list.d.ts +678 -715
  529. package/types/components/loading.d.ts +98 -103
  530. package/types/components/mention.d.ts +70 -77
  531. package/types/components/menu.d.ts +284 -295
  532. package/types/components/modal.d.ts +567 -584
  533. package/types/components/notice-bar.d.ts +102 -106
  534. package/types/components/number-input.d.ts +359 -365
  535. package/types/components/optgroup.d.ts +85 -88
  536. package/types/components/option.d.ts +94 -103
  537. package/types/components/pager.d.ts +330 -335
  538. package/types/components/password-input.d.ts +143 -156
  539. package/types/components/print-page-break.d.ts +65 -69
  540. package/types/components/print.d.ts +243 -245
  541. package/types/components/pulldown.d.ts +231 -239
  542. package/types/components/radio-button.d.ts +113 -118
  543. package/types/components/radio-group.d.ts +151 -153
  544. package/types/components/radio.d.ts +129 -134
  545. package/types/components/rate.d.ts +83 -88
  546. package/types/components/result.d.ts +81 -84
  547. package/types/components/row.d.ts +77 -81
  548. package/types/components/scrollbar.d.ts +299 -305
  549. package/types/components/segmented.d.ts +119 -123
  550. package/types/components/select.d.ts +598 -616
  551. package/types/components/slider.d.ts +137 -151
  552. package/types/components/space.d.ts +120 -127
  553. package/types/components/split-pane.d.ts +126 -133
  554. package/types/components/split.d.ts +301 -312
  555. package/types/components/splitter-panel.d.ts +123 -130
  556. package/types/components/splitter.d.ts +290 -301
  557. package/types/components/steps.d.ts +63 -68
  558. package/types/components/switch.d.ts +127 -133
  559. package/types/components/tab-pane.d.ts +111 -114
  560. package/types/components/table-module/custom.d.ts +123 -123
  561. package/types/components/table-module/edit.d.ts +297 -276
  562. package/types/components/table-module/export.d.ts +88 -96
  563. package/types/components/table-module/filter.d.ts +144 -144
  564. package/types/components/table-module/index.d.ts +7 -7
  565. package/types/components/table-module/keyboard.d.ts +26 -26
  566. package/types/components/table-module/menu.d.ts +46 -46
  567. package/types/components/table-module/validator.d.ts +53 -53
  568. package/types/components/table-plugins/extend-cell-area.d.ts +781 -781
  569. package/types/components/table-plugins/extend-pivot-table.d.ts +59 -58
  570. package/types/components/table-plugins/filters-combination.d.ts +15 -15
  571. package/types/components/table-plugins/filters-complex-input.d.ts +9 -9
  572. package/types/components/table-plugins/index.d.ts +4 -4
  573. package/types/components/table-select.d.ts +268 -276
  574. package/types/components/table-transfer.d.ts +80 -84
  575. package/types/components/table.d.ts +7530 -8000
  576. package/types/components/tabs.d.ts +314 -352
  577. package/types/components/tag.d.ts +108 -114
  578. package/types/components/text-ellipsis.d.ts +107 -112
  579. package/types/components/text.d.ts +112 -122
  580. package/types/components/textarea.d.ts +261 -275
  581. package/types/components/timeline-item.d.ts +66 -75
  582. package/types/components/timeline.d.ts +70 -77
  583. package/types/components/tip.d.ts +81 -83
  584. package/types/components/toolbar.d.ts +327 -336
  585. package/types/components/tooltip.d.ts +250 -255
  586. package/types/components/tour.d.ts +70 -77
  587. package/types/components/transfer.d.ts +80 -84
  588. package/types/components/tree-select.d.ts +361 -376
  589. package/types/components/tree.d.ts +994 -1036
  590. package/types/components/upload.d.ts +477 -518
  591. package/types/components/watermark.d.ts +116 -120
  592. package/types/handles/form-design.d.ts +50 -50
  593. package/types/handles/index.d.ts +3 -3
  594. package/types/handles/list-design.d.ts +1 -2
  595. package/types/handles/table.d.ts +15 -15
  596. package/types/index.d.ts +8 -8
  597. package/types/ui/commands.d.ts +57 -57
  598. package/types/ui/formats.d.ts +62 -62
  599. package/types/ui/global-config.d.ts +269 -269
  600. package/types/ui/global-icon.d.ts +315 -315
  601. package/types/ui/hooks.d.ts +13 -13
  602. package/types/ui/index.d.ts +100 -100
  603. package/types/ui/interceptor.d.ts +52 -52
  604. package/types/ui/menus.d.ts +89 -89
  605. package/types/ui/renderer.d.ts +1033 -1047
  606. package/types/ui/validators.d.ts +37 -38
  607. /package/dist/{iconfont.1792979107495.ttf → iconfont.1793007755017.ttf} +0 -0
  608. /package/dist/{iconfont.1792979107495.woff → iconfont.1793007755017.woff} +0 -0
  609. /package/dist/{iconfont.1792979107495.woff2 → iconfont.1793007755017.woff2} +0 -0
  610. /package/es/icon/{iconfont.1792979107495.ttf → iconfont.1793007755017.ttf} +0 -0
  611. /package/es/icon/{iconfont.1792979107495.woff → iconfont.1793007755017.woff} +0 -0
  612. /package/es/icon/{iconfont.1792979107495.woff2 → iconfont.1793007755017.woff2} +0 -0
  613. /package/es/{iconfont.1792979107495.ttf → iconfont.1793007755017.ttf} +0 -0
  614. /package/es/{iconfont.1792979107495.woff → iconfont.1793007755017.woff} +0 -0
  615. /package/es/{iconfont.1792979107495.woff2 → iconfont.1793007755017.woff2} +0 -0
  616. /package/es/vxe-icon/{iconfont.1792979107495.ttf → iconfont.1793007755017.ttf} +0 -0
  617. /package/es/vxe-icon/{iconfont.1792979107495.woff → iconfont.1793007755017.woff} +0 -0
  618. /package/es/vxe-icon/{iconfont.1792979107495.woff2 → iconfont.1793007755017.woff2} +0 -0
  619. /package/lib/icon/style/{iconfont.1792979107495.ttf → iconfont.1793007755017.ttf} +0 -0
  620. /package/lib/icon/style/{iconfont.1792979107495.woff → iconfont.1793007755017.woff} +0 -0
  621. /package/lib/icon/style/{iconfont.1792979107495.woff2 → iconfont.1793007755017.woff2} +0 -0
  622. /package/lib/{iconfont.1792979107495.ttf → iconfont.1793007755017.ttf} +0 -0
  623. /package/lib/{iconfont.1792979107495.woff → iconfont.1793007755017.woff} +0 -0
  624. /package/lib/{iconfont.1792979107495.woff2 → iconfont.1793007755017.woff2} +0 -0
  625. /package/lib/vxe-icon/style/{iconfont.1792979107495.ttf → iconfont.1793007755017.ttf} +0 -0
  626. /package/lib/vxe-icon/style/{iconfont.1792979107495.woff → iconfont.1793007755017.woff} +0 -0
  627. /package/lib/vxe-icon/style/{iconfont.1792979107495.woff2 → iconfont.1793007755017.woff2} +0 -0
@@ -1,672 +1,749 @@
1
- import { h, provide, PropType, ref, reactive, computed, watch, onMounted, onUnmounted, onBeforeUnmount } from 'vue'
2
- import { defineVxeComponent } from '../../ui/src/comp'
3
- import { VxeUI, getConfig, createEvent, getIcon, globalEvents, GLOBAL_EVENT_KEYS, getI18n, renderEmptyElement } from '../../ui'
4
- import XEUtils from 'xe-utils'
5
- import { getDomNode, addClass, removeClass, hasControlKey } from '../../ui/src/dom'
6
-
7
- import type { VxeImagePreviewConstructor, ImagePreviewReactData, ImagePreviewPrivateRef, VxeGlobalIcon, VxeImagePreviewEmits, VxeImagePreviewPrivateMethods, ImagePreviewPrivateMethods, ImagePreviewPrivateComputed, ImagePreviewMethods, VxeImagePreviewPropTypes, ValueOf, VxeImagePreviewDefines } from '../../../types'
8
-
9
- export default defineVxeComponent({
10
- name: 'VxeImagePreview',
11
- props: {
12
- modelValue: Number as PropType<VxeImagePreviewPropTypes.ModelValue>,
13
- urlList: Array as PropType<VxeImagePreviewPropTypes.UrlList>,
14
- urlField: {
15
- type: String as PropType<VxeImagePreviewPropTypes.UrlField>,
16
- default: () => getConfig().imagePreview.urlField
17
- },
18
- maskClosable: {
19
- type: Boolean as PropType<VxeImagePreviewPropTypes.MaskClosable>,
20
- default: () => getConfig().imagePreview.maskClosable
21
- },
22
- marginSize: {
23
- type: String as PropType<VxeImagePreviewPropTypes.MarginSize>,
24
- default: () => getConfig().imagePreview.marginSize
25
- },
26
- showPrintButton: {
27
- type: Boolean as PropType<VxeImagePreviewPropTypes.ShowPrintButton>,
28
- default: () => getConfig().imagePreview.showPrintButton
29
- },
30
- showDownloadButton: {
31
- type: Boolean as PropType<VxeImagePreviewPropTypes.ShowDownloadButton>,
32
- default: () => getConfig().imagePreview.showDownloadButton
33
- },
34
- zIndex: Number as PropType<VxeImagePreviewPropTypes.ZIndex>,
35
- toolbarConfig: Object as PropType<VxeImagePreviewPropTypes.ToolbarConfig>,
36
- beforeDownloadMethod: Function as PropType<VxeImagePreviewPropTypes.BeforeDownloadMethod>,
37
- downloadMethod: Function as PropType<VxeImagePreviewPropTypes.DownloadMethod>
38
- },
39
- emits: [
40
- 'update:modelValue',
41
- 'change',
42
- 'download',
43
- 'download-fail',
44
- 'rotate',
45
- 'close'
46
- ] as VxeImagePreviewEmits,
47
- setup (props, context) {
48
- const { emit } = context
49
-
50
- const xID = XEUtils.uniqueId()
51
- const refElem = ref<HTMLDivElement>()
52
-
53
- const refMaps: ImagePreviewPrivateRef = {
54
- refElem
55
- }
56
-
57
- const reactData = reactive<ImagePreviewReactData>({
58
- activeIndex: props.modelValue || 0,
59
- offsetPct11: false,
60
- offsetScale: 0,
61
- offsetRotate: 0,
62
- offsetLeft: 0,
63
- offsetTop: 0
64
- })
65
-
66
- const computeUrlProp = computed(() => {
67
- return props.urlField || 'url'
68
- })
69
-
70
- const computeMarginSize = computed(() => {
71
- return XEUtils.toNumber(props.marginSize || 0) || 16
72
- })
73
-
74
- const computeToolbarOpts = computed(() => {
75
- return Object.assign({}, getConfig().imagePreview.toolbarConfig, props.toolbarConfig)
76
- })
77
-
78
- const computeRotateText = computed(() => {
79
- const { offsetRotate } = reactData
80
- if (offsetRotate) {
81
- return `${offsetRotate}°`
82
- }
83
- return '0°'
84
- })
85
-
86
- const computeScaleText = computed(() => {
87
- const { offsetScale } = reactData
88
- if (offsetScale) {
89
- return `${XEUtils.ceil((1 + offsetScale) * 100)}%`
90
- }
91
- return '100%'
92
- })
93
-
94
- const computeImgList = computed(() => {
95
- const { urlList } = props
96
- const urlProp = computeUrlProp.value
97
- if (urlList && urlList.length) {
98
- return urlList.map(item => {
99
- if (XEUtils.isString(item)) {
100
- return item
101
- }
102
- if (item[urlProp]) {
103
- return item[urlProp]
104
- }
105
- return ''
106
- })
107
- }
108
- return []
109
- })
110
-
111
- const computeImgTransform = computed(() => {
112
- let { offsetScale, offsetRotate, offsetLeft, offsetTop } = reactData
113
- const stys: string[] = []
114
- let targetScale = 1
115
- if (offsetScale) {
116
- targetScale = 1 + offsetScale
117
- stys.push(`scale(${targetScale})`)
118
- }
119
- if (offsetRotate) {
120
- stys.push(`rotate(${offsetRotate}deg)`)
121
- }
122
- if (offsetLeft || offsetTop) {
123
- // 缩放与位移
124
- offsetLeft /= targetScale
125
- offsetTop /= targetScale
126
-
127
- let targetOffsetLeft = offsetLeft
128
- let targetOffsetTop = offsetTop
129
- if (offsetRotate) {
130
- // 转向与位移
131
- switch (offsetRotate % 360) {
132
- case 90:
133
- case -270:
134
- targetOffsetLeft = offsetTop
135
- targetOffsetTop = -offsetLeft
136
- break
137
- case 180:
138
- case -180:
139
- targetOffsetLeft = -offsetLeft
140
- targetOffsetTop = -offsetTop
141
- break
142
- case 270:
143
- case -90:
144
- targetOffsetLeft = -offsetTop
145
- targetOffsetTop = offsetLeft
146
- break
147
- }
148
- }
149
- stys.push(`translate(${targetOffsetLeft}px, ${targetOffsetTop}px)`)
150
- }
151
- return stys.length ? stys.join(' ') : ''
152
- })
153
-
154
- const computeMaps: ImagePreviewPrivateComputed = {
155
- computeImgList
156
- }
157
-
158
- const $xeImagePreview = {
159
- xID,
160
- props,
161
- context,
162
- reactData,
163
-
164
- getRefMaps: () => refMaps,
165
- getComputeMaps: () => computeMaps
166
- } as unknown as VxeImagePreviewConstructor & VxeImagePreviewPrivateMethods
167
-
168
- const dispatchEvent = (type: ValueOf<VxeImagePreviewEmits>, params: Record<string, any>, evnt: Event | null) => {
169
- emit(type, createEvent(evnt, { $imagePreview: $xeImagePreview }, params))
170
- }
171
-
172
- const imagePreviewMethods: ImagePreviewMethods = {
173
- dispatchEvent
174
- }
175
-
176
- const emitModel = (value: VxeImagePreviewPropTypes.ModelValue) => {
177
- reactData.activeIndex = value
178
- emit('update:modelValue', value)
179
- }
180
-
181
- const handleCloseEvent = (evnt: MouseEvent) => {
182
- dispatchEvent('close', {}, evnt)
183
- }
184
-
185
- const imagePreviewPrivateMethods: ImagePreviewPrivateMethods = {
186
- }
187
-
188
- const resetStyle = () => {
189
- const elem = refElem.value
190
- removeClass(elem, 'is--move')
191
- Object.assign(reactData, {
192
- offsetPct11: false,
193
- offsetScale: 0,
194
- offsetRotate: 0,
195
- offsetLeft: 0,
196
- offsetTop: 0
197
- })
198
- }
199
-
200
- const getOffsetZoomStep = () => {
201
- const { offsetScale } = reactData
202
- let stepNum = 0.02
203
- if (offsetScale >= -0.6) {
204
- stepNum = 0.04
205
- if (offsetScale >= -0.4) {
206
- stepNum = 0.07
207
- if (offsetScale >= 0) {
208
- stepNum = 0.1
209
- if (offsetScale >= 3) {
210
- stepNum = 0.25
211
- if (offsetScale >= 8) {
212
- stepNum = 0.4
213
- if (offsetScale >= 16) {
214
- stepNum = 0.6
215
- if (offsetScale >= 24) {
216
- stepNum = 0.9
217
- if (offsetScale >= 32) {
218
- stepNum = 1.3
219
- if (offsetScale >= 39) {
220
- stepNum = 1.9
221
- if (offsetScale >= 45) {
222
- stepNum = 2.5
223
- }
224
- }
225
- }
226
- }
227
- }
228
- }
229
- }
230
- }
231
- }
232
- }
233
- return stepNum
234
- }
235
-
236
- const handleZoom = (isAdd: boolean) => {
237
- const { offsetScale } = reactData
238
- const stepNum = getOffsetZoomStep()
239
- if (isAdd) {
240
- reactData.offsetScale = Number(Math.min(49, offsetScale + stepNum).toFixed(2))
241
- } else {
242
- reactData.offsetScale = Number(Math.max(-0.9, offsetScale - stepNum).toFixed(2))
243
- }
244
- }
245
-
246
- const handleChangeEvent = (evnt: Event, isNext: boolean) => {
247
- let activeIndex = reactData.activeIndex || 0
248
- const imgList = computeImgList.value
249
- if (isNext) {
250
- if (activeIndex >= imgList.length - 1) {
251
- activeIndex = 0
252
- } else {
253
- activeIndex++
254
- }
255
- } else {
256
- if (activeIndex <= 0) {
257
- activeIndex = imgList.length - 1
258
- } else {
259
- activeIndex--
260
- }
261
- }
262
- const imgUrl = imgList[activeIndex || 0]
263
- reactData.activeIndex = activeIndex
264
- resetStyle()
265
- emitModel(activeIndex)
266
- dispatchEvent('change', { url: imgUrl, activeIndex }, evnt)
267
- }
268
-
269
- const handleRotateImgEvent = (evnt: Event, isRight: boolean) => {
270
- const imgList = computeImgList.value
271
- const { activeIndex } = reactData
272
- const imgUrl = imgList[activeIndex || 0]
273
- let offsetRotate = reactData.offsetRotate
274
- if (isRight) {
275
- offsetRotate += 90
276
- } else {
277
- offsetRotate -= 90
278
- }
279
- reactData.offsetRotate = offsetRotate
280
- dispatchEvent('rotate', { url: imgUrl, rotateValue: offsetRotate }, evnt)
281
- }
282
-
283
- const handlePct11 = () => {
284
- resetStyle()
285
- reactData.offsetPct11 = true
286
- }
287
-
288
- const handlePrintImg = () => {
289
- const { activeIndex } = reactData
290
- const imgList = computeImgList.value
291
- const imgUrl = imgList[activeIndex || 0]
292
- if (VxeUI.print) {
293
- VxeUI.print({
294
- align: 'center',
295
- pageBreaks: [
296
- {
297
- bodyHtml: `<img src="${imgUrl}" style="max-width:100%;max-height:100%;">`
298
- }
299
- ]
300
- })
301
- }
302
- }
303
-
304
- const handleDownloadEvent = (evnt: MouseEvent, imgUrl: string) => {
305
- dispatchEvent('download', { url: imgUrl }, evnt)
306
- }
307
-
308
- const handleDefaultDownload = (evnt: MouseEvent, imgUrl: string) => {
309
- if (VxeUI.saveFile) {
310
- fetch(imgUrl).then(res => {
311
- return res.blob().then(blob => {
312
- VxeUI.saveFile({
313
- filename: imgUrl,
314
- content: blob
315
- })
316
- handleDownloadEvent(evnt, imgUrl)
317
- })
318
- }).catch(() => {
319
- if (VxeUI.modal) {
320
- VxeUI.modal.message({
321
- content: getI18n('vxe.error.downErr'),
322
- status: 'error'
323
- })
324
- }
325
- })
326
- }
327
- }
328
-
329
- const handleDownloadImg = (evnt: MouseEvent) => {
330
- const { activeIndex } = reactData
331
- const toolbarOpts = computeToolbarOpts.value
332
- const btnConf = toolbarOpts.download
333
- const btnOpts = XEUtils.isBoolean(btnConf) ? {} : (btnConf ? Object.assign({}, btnConf) : {})
334
- const imgList = computeImgList.value
335
- const imgUrl = imgList[activeIndex || 0]
336
- const beforeDownloadFn = props.beforeDownloadMethod || btnOpts.beforeDownloadMethod || getConfig().imagePreview.beforeDownloadMethod
337
- const downloadFn = props.downloadMethod || btnOpts.downloadMethod || getConfig().imagePreview.downloadMethod
338
- Promise.resolve(
339
- beforeDownloadFn
340
- ? beforeDownloadFn({
341
- $imagePreview: $xeImagePreview,
342
- url: imgUrl,
343
- index: activeIndex || 0
344
- })
345
- : true
346
- ).then(status => {
347
- if (status) {
348
- if (downloadFn) {
349
- Promise.resolve(
350
- downloadFn({
351
- $imagePreview: $xeImagePreview,
352
- url: imgUrl,
353
- index: activeIndex || 0
354
- })
355
- ).then(() => {
356
- handleDownloadEvent(evnt, imgUrl)
357
- }).catch(e => e)
358
- } else {
359
- handleDefaultDownload(evnt, imgUrl)
360
- }
361
- }
362
- })
363
- }
364
-
365
- const handleOperationBtn = (evnt: MouseEvent, code: VxeImagePreviewDefines.ToolbarCode) => {
366
- const { activeIndex } = reactData
367
- const imgList = computeImgList.value
368
- const imgUrl = imgList[activeIndex || 0]
369
- if (imgUrl) {
370
- switch (code) {
371
- case 'zoomOut':
372
- handleZoom(false)
373
- break
374
- case 'zoomIn':
375
- handleZoom(true)
376
- break
377
- case 'pctFull':
378
- resetStyle()
379
- break
380
- case 'pct11':
381
- handlePct11()
382
- break
383
- case 'rotateLeft':
384
- handleRotateImgEvent(evnt, false)
385
- break
386
- case 'rotateRight':
387
- handleRotateImgEvent(evnt, true)
388
- break
389
- case 'print':
390
- handlePrintImg()
391
- break
392
- case 'download':
393
- handleDownloadImg(evnt)
394
- break
395
- }
396
- }
397
- }
398
-
399
- const wheelEvent = (evnt: WheelEvent) => {
400
- const delta = evnt.deltaY
401
- if (delta > 0) {
402
- evnt.preventDefault()
403
- handleZoom(false)
404
- } else if (delta < 0) {
405
- evnt.preventDefault()
406
- handleZoom(true)
407
- }
408
- }
409
-
410
- const moveEvent = (evnt: MouseEvent) => {
411
- const { offsetTop, offsetLeft } = reactData
412
- const elem = refElem.value
413
- evnt.preventDefault()
414
- const domMousemove = document.onmousemove
415
- const domMouseup = document.onmouseup
416
- const startX = evnt.pageX
417
- const startY = evnt.pageY
418
- const marginSize = computeMarginSize.value
419
- document.onmousemove = et => {
420
- const { pageX, pageY } = et
421
- const { visibleHeight, visibleWidth } = getDomNode()
422
- et.preventDefault()
423
- addClass(elem, 'is--move')
424
- // 限制边界值
425
- if (pageX > marginSize && pageY > marginSize && pageX < (visibleWidth - marginSize) && pageY < (visibleHeight - marginSize)) {
426
- reactData.offsetLeft = offsetLeft + pageX - startX
427
- reactData.offsetTop = offsetTop + pageY - startY
428
- }
429
- }
430
- document.onmouseup = () => {
431
- document.onmousemove = domMousemove
432
- document.onmouseup = domMouseup
433
- removeClass(elem, 'is--move')
434
- }
435
- }
436
-
437
- const handleGlobalKeydownEvent = (evnt: KeyboardEvent) => {
438
- const isControlKey = hasControlKey(evnt)
439
- const hasShiftKey = evnt.shiftKey
440
- const isUpArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_UP)
441
- const isDownArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_DOWN)
442
- const isLeftArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_LEFT)
443
- const isRightArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_RIGHT)
444
- const isR = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.R)
445
- const isP = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.P)
446
- if (isUpArrow) {
447
- evnt.preventDefault()
448
- if (hasShiftKey) {
449
- reactData.offsetTop -= 1
450
- } else {
451
- handleZoom(true)
452
- }
453
- } else if (isDownArrow) {
454
- evnt.preventDefault()
455
- if (hasShiftKey) {
456
- reactData.offsetTop += 1
457
- } else {
458
- handleZoom(false)
459
- }
460
- } else if (isLeftArrow) {
461
- evnt.preventDefault()
462
- if (hasShiftKey) {
463
- reactData.offsetLeft -= 1
464
- } else {
465
- handleChangeEvent(evnt, false)
466
- }
467
- } else if (isRightArrow) {
468
- evnt.preventDefault()
469
- if (hasShiftKey) {
470
- reactData.offsetLeft += 1
471
- } else {
472
- handleChangeEvent(evnt, true)
473
- }
474
- } else if (isR && isControlKey) {
475
- evnt.preventDefault()
476
- if (hasShiftKey) {
477
- handleRotateImgEvent(evnt, false)
478
- } else {
479
- handleRotateImgEvent(evnt, true)
480
- }
481
- } else if (isP && isControlKey) {
482
- evnt.preventDefault()
483
- handlePrintImg()
484
- }
485
- }
486
-
487
- const handleClickMaskEvent = (evnt: MouseEvent) => {
488
- if (props.maskClosable) {
489
- if (evnt.target === evnt.currentTarget) {
490
- dispatchEvent('close', {}, evnt)
491
- }
492
- }
493
- }
494
-
495
- Object.assign($xeImagePreview, imagePreviewMethods, imagePreviewPrivateMethods)
496
-
497
- const renderImgWrapper = () => {
498
- const { activeIndex } = reactData
499
- const imgList = computeImgList.value
500
- const imgTransform = computeImgTransform.value
501
- return h('div', {
502
- class: 'vxe-image-preview--img-list',
503
- onClick: handleClickMaskEvent
504
- }, imgList.map((url, index) => {
505
- const isActive = activeIndex === index
506
- return h('img', {
507
- class: ['vxe-image-preview--img-item', {
508
- 'is--active': isActive
509
- }],
510
- src: url,
511
- style: isActive
512
- ? {
513
- transform: imgTransform
514
- }
515
- : null,
516
- onMousedown (evnt) {
517
- moveEvent(evnt)
518
- }
519
- })
520
- }))
521
- }
522
-
523
- const renderOperationBtn = (code: VxeImagePreviewDefines.ToolbarCode, icon: keyof VxeGlobalIcon) => {
524
- const toolbarOpts = computeToolbarOpts.value
525
- const btnConf = toolbarOpts[code]
526
- const btnOpts = XEUtils.isBoolean(btnConf) ? {} : (btnConf ? Object.assign({}, btnConf) : {})
527
- const showBtn = btnConf !== false
528
- return showBtn
529
- ? h('div', {
530
- class: 'vxe-image-preview--operation-btn',
531
- title: getI18n(`vxe.imagePreview.operBtn.${code}`),
532
- onClick (evnt) {
533
- handleOperationBtn(evnt, code)
534
- }
535
- }, [
536
- h('i', {
537
- class: btnOpts.icon || getIcon()[icon]
538
- })
539
- ])
540
- : renderEmptyElement($xeImagePreview)
541
- }
542
-
543
- const renderBtnWrapper = () => {
544
- const { showPrintButton, showDownloadButton } = props
545
- const { activeIndex } = reactData
546
- const imgList = computeImgList.value
547
- const rotateText = computeRotateText.value
548
- const scaleText = computeScaleText.value
549
- const toolbarOpts = computeToolbarOpts.value
550
-
551
- return h('div', {
552
- class: 'vxe-image-preview--btn-wrapper'
553
- }, [
554
- h('div', {
555
- class: 'vxe-image-preview--close-wrapper'
556
- }, [
557
- h('div', {
558
- class: 'vxe-image-preview--close-btn',
559
- onClick: handleCloseEvent
560
- }, [
561
- h('i', {
562
- class: getIcon().IMAGE_PREVIEW_CLOSE
563
- })
564
- ]),
565
- h('div', {
566
- class: 'vxe-image-preview--close-bg'
567
- })
568
- ]),
569
- imgList.length > 1
570
- ? h('div', {
571
- class: 'vxe-image-preview--previous-btn',
572
- onClick (evnt) {
573
- handleChangeEvent(evnt, false)
574
- }
575
- }, [
576
- h('i', {
577
- class: getIcon().IMAGE_PREVIEW_PREVIOUS
578
- })
579
- ])
580
- : renderEmptyElement($xeImagePreview),
581
- imgList.length > 1
582
- ? h('div', {
583
- class: 'vxe-image-preview--next-btn',
584
- onClick (evnt) {
585
- handleChangeEvent(evnt, true)
586
- }
587
- }, [
588
- h('i', {
589
- class: getIcon().IMAGE_PREVIEW_NEXT
590
- })
591
- ])
592
- : renderEmptyElement($xeImagePreview),
593
- h('div', {
594
- class: 'vxe-image-preview--operation-info'
595
- }, [
596
- h('div', {
597
- class: 'vxe-image-preview--operation-deg'
598
- }, rotateText),
599
- h('div', {
600
- class: 'vxe-image-preview--operation-pct'
601
- }, scaleText)
602
- ]),
603
- h('div', {
604
- class: 'vxe-image-preview--operation-wrapper'
605
- }, [
606
- h('div', {
607
- class: 'vxe-image-preview--operation-active-count'
608
- }, [
609
- h('span', {
610
- class: 'vxe-image-preview--operation-active-current'
611
- }, `${(activeIndex || 0) + 1}`),
612
- h('span', {
613
- class: 'vxe-image-preview--operation-active-total'
614
- }, `/${imgList.length}`)
615
- ]),
616
- renderOperationBtn('zoomOut', 'IMAGE_PREVIEW_ZOOM_OUT'),
617
- renderOperationBtn('zoomIn', 'IMAGE_PREVIEW_ZOOM_IN'),
618
- renderOperationBtn('pctFull', 'IMAGE_PREVIEW_PCT_FULL'),
619
- renderOperationBtn('pct11', 'IMAGE_PREVIEW_PCT_1_1'),
620
- renderOperationBtn('rotateLeft', 'IMAGE_PREVIEW_ROTATE_LEFT'),
621
- renderOperationBtn('rotateRight', 'IMAGE_PREVIEW_ROTATE_RIGHT'),
622
- showPrintButton || toolbarOpts.print ? renderOperationBtn('print', 'IMAGE_PREVIEW_PRINT') : renderEmptyElement($xeImagePreview),
623
- showDownloadButton || toolbarOpts.download ? renderOperationBtn('download', 'IMAGE_PREVIEW_DOWNLOAD') : renderEmptyElement($xeImagePreview)
624
- ])
625
- ])
626
- }
627
-
628
- const renderVN = () => {
629
- const { offsetPct11 } = reactData
630
- return h('div', {
631
- ref: refElem,
632
- class: ['vxe-image-preview', {
633
- 'is--pct11': offsetPct11
634
- }]
635
- }, [
636
- renderImgWrapper(),
637
- renderBtnWrapper()
638
- ])
639
- }
640
-
641
- watch(() => props.modelValue, val => {
642
- reactData.activeIndex = val
643
- resetStyle()
644
- })
645
-
646
- onMounted(() => {
647
- const elem = refElem.value
648
- if (elem) {
649
- elem.addEventListener('wheel', wheelEvent, { passive: false })
650
- }
651
- globalEvents.on($xeImagePreview, 'keydown', handleGlobalKeydownEvent)
652
- })
653
-
654
- onBeforeUnmount(() => {
655
- const elem = refElem.value
656
- if (elem) {
657
- elem.removeEventListener('wheel', wheelEvent)
658
- removeClass(elem, 'is--move')
659
- }
660
- })
661
-
662
- onUnmounted(() => {
663
- globalEvents.off($xeImagePreview, 'keydown')
664
- })
665
-
666
- provide('$xeImagePreview', $xeImagePreview)
667
-
668
- $xeImagePreview.renderVN = renderVN
669
-
670
- return renderVN
671
- }
672
- })
1
+ import { h, provide, PropType, ref, reactive, computed, watch, onMounted, onUnmounted, onBeforeUnmount } from 'vue'
2
+ import { defineVxeComponent } from '../../ui/src/comp'
3
+ import { VxeUI } from '@vxe-ui/core'
4
+ import XEUtils from 'xe-utils'
5
+ import { getDomNode, addClass, removeClass, hasControlKey } from '../../ui/src/dom'
6
+
7
+ import type {
8
+ VxeImagePreviewConstructor,
9
+ ImagePreviewReactData,
10
+ ImagePreviewPrivateRef,
11
+ VxeGlobalIcon,
12
+ VxeImagePreviewEmits,
13
+ VxeImagePreviewPrivateMethods,
14
+ ImagePreviewPrivateMethods,
15
+ ImagePreviewPrivateComputed,
16
+ ImagePreviewMethods,
17
+ VxeImagePreviewPropTypes,
18
+ ValueOf,
19
+ VxeImagePreviewDefines
20
+ } from '../../../types'
21
+
22
+ const { getConfig, createEvent, getIcon, globalEvents, GLOBAL_EVENT_KEYS, getI18n, renderEmptyElement } = VxeUI
23
+
24
+ export default defineVxeComponent({
25
+ name: 'VxeImagePreview',
26
+ props: {
27
+ modelValue: Number as PropType<VxeImagePreviewPropTypes.ModelValue>,
28
+ urlList: Array as PropType<VxeImagePreviewPropTypes.UrlList>,
29
+ urlField: {
30
+ type: String as PropType<VxeImagePreviewPropTypes.UrlField>,
31
+ default: () => getConfig().imagePreview.urlField
32
+ },
33
+ maskClosable: {
34
+ type: Boolean as PropType<VxeImagePreviewPropTypes.MaskClosable>,
35
+ default: () => getConfig().imagePreview.maskClosable
36
+ },
37
+ marginSize: {
38
+ type: String as PropType<VxeImagePreviewPropTypes.MarginSize>,
39
+ default: () => getConfig().imagePreview.marginSize
40
+ },
41
+ showPrintButton: {
42
+ type: Boolean as PropType<VxeImagePreviewPropTypes.ShowPrintButton>,
43
+ default: () => getConfig().imagePreview.showPrintButton
44
+ },
45
+ showDownloadButton: {
46
+ type: Boolean as PropType<VxeImagePreviewPropTypes.ShowDownloadButton>,
47
+ default: () => getConfig().imagePreview.showDownloadButton
48
+ },
49
+ zIndex: Number as PropType<VxeImagePreviewPropTypes.ZIndex>,
50
+ toolbarConfig: Object as PropType<VxeImagePreviewPropTypes.ToolbarConfig>,
51
+ beforeDownloadMethod: Function as PropType<VxeImagePreviewPropTypes.BeforeDownloadMethod>,
52
+ downloadMethod: Function as PropType<VxeImagePreviewPropTypes.DownloadMethod>
53
+ },
54
+ emits: ['update:modelValue', 'change', 'download', 'download-fail', 'rotate', 'close'] as VxeImagePreviewEmits,
55
+ setup(props, context) {
56
+ const { emit } = context
57
+
58
+ const xID = XEUtils.uniqueId()
59
+ const refElem = ref<HTMLDivElement>()
60
+
61
+ const refMaps: ImagePreviewPrivateRef = {
62
+ refElem
63
+ }
64
+
65
+ const reactData = reactive<ImagePreviewReactData>({
66
+ activeIndex: props.modelValue || 0,
67
+ offsetPct11: false,
68
+ offsetScale: 0,
69
+ offsetRotate: 0,
70
+ offsetLeft: 0,
71
+ offsetTop: 0
72
+ })
73
+
74
+ const computeUrlProp = computed(() => {
75
+ return props.urlField || 'url'
76
+ })
77
+
78
+ const computeMarginSize = computed(() => {
79
+ return XEUtils.toNumber(props.marginSize || 0) || 16
80
+ })
81
+
82
+ const computeToolbarOpts = computed(() => {
83
+ return Object.assign({}, getConfig().imagePreview.toolbarConfig, props.toolbarConfig)
84
+ })
85
+
86
+ const computeRotateText = computed(() => {
87
+ const { offsetRotate } = reactData
88
+ if (offsetRotate) {
89
+ return `${offsetRotate}°`
90
+ }
91
+ return '0°'
92
+ })
93
+
94
+ const computeScaleText = computed(() => {
95
+ const { offsetScale } = reactData
96
+ if (offsetScale) {
97
+ return `${XEUtils.ceil((1 + offsetScale) * 100)}%`
98
+ }
99
+ return '100%'
100
+ })
101
+
102
+ const computeImgList = computed(() => {
103
+ const { urlList } = props
104
+ const urlProp = computeUrlProp.value
105
+ if (urlList && urlList.length) {
106
+ return urlList.map((item) => {
107
+ if (XEUtils.isString(item)) {
108
+ return item
109
+ }
110
+ if (item[urlProp]) {
111
+ return item[urlProp]
112
+ }
113
+ return ''
114
+ })
115
+ }
116
+ return []
117
+ })
118
+
119
+ const computeImgTransform = computed(() => {
120
+ let { offsetScale, offsetRotate, offsetLeft, offsetTop } = reactData
121
+ const stys: string[] = []
122
+ let targetScale = 1
123
+ if (offsetScale) {
124
+ targetScale = 1 + offsetScale
125
+ stys.push(`scale(${targetScale})`)
126
+ }
127
+ if (offsetRotate) {
128
+ stys.push(`rotate(${offsetRotate}deg)`)
129
+ }
130
+ if (offsetLeft || offsetTop) {
131
+ // 缩放与位移
132
+ offsetLeft /= targetScale
133
+ offsetTop /= targetScale
134
+
135
+ let targetOffsetLeft = offsetLeft
136
+ let targetOffsetTop = offsetTop
137
+ if (offsetRotate) {
138
+ // 转向与位移
139
+ switch (offsetRotate % 360) {
140
+ case 90:
141
+ case -270:
142
+ targetOffsetLeft = offsetTop
143
+ targetOffsetTop = -offsetLeft
144
+ break
145
+ case 180:
146
+ case -180:
147
+ targetOffsetLeft = -offsetLeft
148
+ targetOffsetTop = -offsetTop
149
+ break
150
+ case 270:
151
+ case -90:
152
+ targetOffsetLeft = -offsetTop
153
+ targetOffsetTop = offsetLeft
154
+ break
155
+ }
156
+ }
157
+ stys.push(`translate(${targetOffsetLeft}px, ${targetOffsetTop}px)`)
158
+ }
159
+ return stys.length ? stys.join(' ') : ''
160
+ })
161
+
162
+ const computeMaps: ImagePreviewPrivateComputed = {
163
+ computeImgList
164
+ }
165
+
166
+ const $xeImagePreview = {
167
+ xID,
168
+ props,
169
+ context,
170
+ reactData,
171
+
172
+ getRefMaps: () => refMaps,
173
+ getComputeMaps: () => computeMaps
174
+ } as unknown as VxeImagePreviewConstructor & VxeImagePreviewPrivateMethods
175
+
176
+ const dispatchEvent = (type: ValueOf<VxeImagePreviewEmits>, params: Record<string, any>, evnt: Event | null) => {
177
+ emit(type, createEvent(evnt, { $imagePreview: $xeImagePreview }, params))
178
+ }
179
+
180
+ const imagePreviewMethods: ImagePreviewMethods = {
181
+ dispatchEvent
182
+ }
183
+
184
+ const emitModel = (value: VxeImagePreviewPropTypes.ModelValue) => {
185
+ reactData.activeIndex = value
186
+ emit('update:modelValue', value)
187
+ }
188
+
189
+ const handleCloseEvent = (evnt: MouseEvent) => {
190
+ dispatchEvent('close', {}, evnt)
191
+ }
192
+
193
+ const imagePreviewPrivateMethods: ImagePreviewPrivateMethods = {}
194
+
195
+ const resetStyle = () => {
196
+ const elem = refElem.value
197
+ removeClass(elem, 'is--move')
198
+ Object.assign(reactData, {
199
+ offsetPct11: false,
200
+ offsetScale: 0,
201
+ offsetRotate: 0,
202
+ offsetLeft: 0,
203
+ offsetTop: 0
204
+ })
205
+ }
206
+
207
+ const getOffsetZoomStep = () => {
208
+ const { offsetScale } = reactData
209
+ let stepNum = 0.02
210
+ if (offsetScale >= -0.6) {
211
+ stepNum = 0.04
212
+ if (offsetScale >= -0.4) {
213
+ stepNum = 0.07
214
+ if (offsetScale >= 0) {
215
+ stepNum = 0.1
216
+ if (offsetScale >= 3) {
217
+ stepNum = 0.25
218
+ if (offsetScale >= 8) {
219
+ stepNum = 0.4
220
+ if (offsetScale >= 16) {
221
+ stepNum = 0.6
222
+ if (offsetScale >= 24) {
223
+ stepNum = 0.9
224
+ if (offsetScale >= 32) {
225
+ stepNum = 1.3
226
+ if (offsetScale >= 39) {
227
+ stepNum = 1.9
228
+ if (offsetScale >= 45) {
229
+ stepNum = 2.5
230
+ }
231
+ }
232
+ }
233
+ }
234
+ }
235
+ }
236
+ }
237
+ }
238
+ }
239
+ }
240
+ return stepNum
241
+ }
242
+
243
+ const handleZoom = (isAdd: boolean) => {
244
+ const { offsetScale } = reactData
245
+ const stepNum = getOffsetZoomStep()
246
+ if (isAdd) {
247
+ reactData.offsetScale = Number(Math.min(49, offsetScale + stepNum).toFixed(2))
248
+ } else {
249
+ reactData.offsetScale = Number(Math.max(-0.9, offsetScale - stepNum).toFixed(2))
250
+ }
251
+ }
252
+
253
+ const handleChangeEvent = (evnt: Event, isNext: boolean) => {
254
+ let activeIndex = reactData.activeIndex || 0
255
+ const imgList = computeImgList.value
256
+ if (isNext) {
257
+ if (activeIndex >= imgList.length - 1) {
258
+ activeIndex = 0
259
+ } else {
260
+ activeIndex++
261
+ }
262
+ } else {
263
+ if (activeIndex <= 0) {
264
+ activeIndex = imgList.length - 1
265
+ } else {
266
+ activeIndex--
267
+ }
268
+ }
269
+ const imgUrl = imgList[activeIndex || 0]
270
+ reactData.activeIndex = activeIndex
271
+ resetStyle()
272
+ emitModel(activeIndex)
273
+ dispatchEvent('change', { url: imgUrl, activeIndex }, evnt)
274
+ }
275
+
276
+ const handleRotateImgEvent = (evnt: Event, isRight: boolean) => {
277
+ const imgList = computeImgList.value
278
+ const { activeIndex } = reactData
279
+ const imgUrl = imgList[activeIndex || 0]
280
+ let offsetRotate = reactData.offsetRotate
281
+ if (isRight) {
282
+ offsetRotate += 90
283
+ } else {
284
+ offsetRotate -= 90
285
+ }
286
+ reactData.offsetRotate = offsetRotate
287
+ dispatchEvent('rotate', { url: imgUrl, rotateValue: offsetRotate }, evnt)
288
+ }
289
+
290
+ const handlePct11 = () => {
291
+ resetStyle()
292
+ reactData.offsetPct11 = true
293
+ }
294
+
295
+ const handlePrintImg = () => {
296
+ const { activeIndex } = reactData
297
+ const imgList = computeImgList.value
298
+ const imgUrl = imgList[activeIndex || 0]
299
+ if (VxeUI.print) {
300
+ VxeUI.print({
301
+ align: 'center',
302
+ pageBreaks: [
303
+ {
304
+ bodyHtml: `<img src="${imgUrl}" style="max-width:100%;max-height:100%;">`
305
+ }
306
+ ]
307
+ })
308
+ }
309
+ }
310
+
311
+ const handleDownloadEvent = (evnt: MouseEvent, imgUrl: string) => {
312
+ dispatchEvent('download', { url: imgUrl }, evnt)
313
+ }
314
+
315
+ const handleDefaultDownload = (evnt: MouseEvent, imgUrl: string) => {
316
+ if (VxeUI.saveFile) {
317
+ fetch(imgUrl)
318
+ .then((res) => {
319
+ return res.blob().then((blob) => {
320
+ VxeUI.saveFile({
321
+ filename: imgUrl,
322
+ content: blob
323
+ })
324
+ handleDownloadEvent(evnt, imgUrl)
325
+ })
326
+ })
327
+ .catch(() => {
328
+ if (VxeUI.modal) {
329
+ VxeUI.modal.message({
330
+ content: getI18n('vxe.error.downErr'),
331
+ status: 'error'
332
+ })
333
+ }
334
+ })
335
+ }
336
+ }
337
+
338
+ const handleDownloadImg = (evnt: MouseEvent) => {
339
+ const { activeIndex } = reactData
340
+ const toolbarOpts = computeToolbarOpts.value
341
+ const btnConf = toolbarOpts.download
342
+ const btnOpts = XEUtils.isBoolean(btnConf) ? {} : btnConf ? Object.assign({}, btnConf) : {}
343
+ const imgList = computeImgList.value
344
+ const imgUrl = imgList[activeIndex || 0]
345
+ const beforeDownloadFn = props.beforeDownloadMethod || btnOpts.beforeDownloadMethod || getConfig().imagePreview.beforeDownloadMethod
346
+ const downloadFn = props.downloadMethod || btnOpts.downloadMethod || getConfig().imagePreview.downloadMethod
347
+ Promise.resolve(
348
+ beforeDownloadFn
349
+ ? beforeDownloadFn({
350
+ $imagePreview: $xeImagePreview,
351
+ url: imgUrl,
352
+ index: activeIndex || 0
353
+ })
354
+ : true
355
+ ).then((status) => {
356
+ if (status) {
357
+ if (downloadFn) {
358
+ Promise.resolve(
359
+ downloadFn({
360
+ $imagePreview: $xeImagePreview,
361
+ url: imgUrl,
362
+ index: activeIndex || 0
363
+ })
364
+ )
365
+ .then(() => {
366
+ handleDownloadEvent(evnt, imgUrl)
367
+ })
368
+ .catch((e) => e)
369
+ } else {
370
+ handleDefaultDownload(evnt, imgUrl)
371
+ }
372
+ }
373
+ })
374
+ }
375
+
376
+ const handleOperationBtn = (evnt: MouseEvent, code: VxeImagePreviewDefines.ToolbarCode) => {
377
+ const { activeIndex } = reactData
378
+ const imgList = computeImgList.value
379
+ const imgUrl = imgList[activeIndex || 0]
380
+ if (imgUrl) {
381
+ switch (code) {
382
+ case 'zoomOut':
383
+ handleZoom(false)
384
+ break
385
+ case 'zoomIn':
386
+ handleZoom(true)
387
+ break
388
+ case 'pctFull':
389
+ resetStyle()
390
+ break
391
+ case 'pct11':
392
+ handlePct11()
393
+ break
394
+ case 'rotateLeft':
395
+ handleRotateImgEvent(evnt, false)
396
+ break
397
+ case 'rotateRight':
398
+ handleRotateImgEvent(evnt, true)
399
+ break
400
+ case 'print':
401
+ handlePrintImg()
402
+ break
403
+ case 'download':
404
+ handleDownloadImg(evnt)
405
+ break
406
+ }
407
+ }
408
+ }
409
+
410
+ const wheelEvent = (evnt: WheelEvent) => {
411
+ const delta = evnt.deltaY
412
+ if (delta > 0) {
413
+ evnt.preventDefault()
414
+ handleZoom(false)
415
+ } else if (delta < 0) {
416
+ evnt.preventDefault()
417
+ handleZoom(true)
418
+ }
419
+ }
420
+
421
+ const moveEvent = (evnt: MouseEvent) => {
422
+ const { offsetTop, offsetLeft } = reactData
423
+ const elem = refElem.value
424
+ evnt.preventDefault()
425
+ const domMousemove = document.onmousemove
426
+ const domMouseup = document.onmouseup
427
+ const startX = evnt.pageX
428
+ const startY = evnt.pageY
429
+ const marginSize = computeMarginSize.value
430
+ document.onmousemove = (et) => {
431
+ const { pageX, pageY } = et
432
+ const { visibleHeight, visibleWidth } = getDomNode()
433
+ et.preventDefault()
434
+ addClass(elem, 'is--move')
435
+ // 限制边界值
436
+ if (pageX > marginSize && pageY > marginSize && pageX < visibleWidth - marginSize && pageY < visibleHeight - marginSize) {
437
+ reactData.offsetLeft = offsetLeft + pageX - startX
438
+ reactData.offsetTop = offsetTop + pageY - startY
439
+ }
440
+ }
441
+ document.onmouseup = () => {
442
+ document.onmousemove = domMousemove
443
+ document.onmouseup = domMouseup
444
+ removeClass(elem, 'is--move')
445
+ }
446
+ }
447
+
448
+ const handleGlobalKeydownEvent = (evnt: KeyboardEvent) => {
449
+ const isControlKey = hasControlKey(evnt)
450
+ const hasShiftKey = evnt.shiftKey
451
+ const isUpArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_UP)
452
+ const isDownArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_DOWN)
453
+ const isLeftArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_LEFT)
454
+ const isRightArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_RIGHT)
455
+ const isR = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.R)
456
+ const isP = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.P)
457
+ if (isUpArrow) {
458
+ evnt.preventDefault()
459
+ if (hasShiftKey) {
460
+ reactData.offsetTop -= 1
461
+ } else {
462
+ handleZoom(true)
463
+ }
464
+ } else if (isDownArrow) {
465
+ evnt.preventDefault()
466
+ if (hasShiftKey) {
467
+ reactData.offsetTop += 1
468
+ } else {
469
+ handleZoom(false)
470
+ }
471
+ } else if (isLeftArrow) {
472
+ evnt.preventDefault()
473
+ if (hasShiftKey) {
474
+ reactData.offsetLeft -= 1
475
+ } else {
476
+ handleChangeEvent(evnt, false)
477
+ }
478
+ } else if (isRightArrow) {
479
+ evnt.preventDefault()
480
+ if (hasShiftKey) {
481
+ reactData.offsetLeft += 1
482
+ } else {
483
+ handleChangeEvent(evnt, true)
484
+ }
485
+ } else if (isR && isControlKey) {
486
+ evnt.preventDefault()
487
+ if (hasShiftKey) {
488
+ handleRotateImgEvent(evnt, false)
489
+ } else {
490
+ handleRotateImgEvent(evnt, true)
491
+ }
492
+ } else if (isP && isControlKey) {
493
+ evnt.preventDefault()
494
+ handlePrintImg()
495
+ }
496
+ }
497
+
498
+ const handleClickMaskEvent = (evnt: MouseEvent) => {
499
+ if (props.maskClosable) {
500
+ if (evnt.target === evnt.currentTarget) {
501
+ dispatchEvent('close', {}, evnt)
502
+ }
503
+ }
504
+ }
505
+
506
+ Object.assign($xeImagePreview, imagePreviewMethods, imagePreviewPrivateMethods)
507
+
508
+ const renderImgWrapper = () => {
509
+ const { activeIndex } = reactData
510
+ const imgList = computeImgList.value
511
+ const imgTransform = computeImgTransform.value
512
+ return h(
513
+ 'div',
514
+ {
515
+ class: 'vxe-image-preview--img-list',
516
+ onClick: handleClickMaskEvent
517
+ },
518
+ imgList.map((url, index) => {
519
+ const isActive = activeIndex === index
520
+ return h('img', {
521
+ class: [
522
+ 'vxe-image-preview--img-item',
523
+ {
524
+ 'is--active': isActive
525
+ }
526
+ ],
527
+ src: url,
528
+ style: isActive
529
+ ? {
530
+ transform: imgTransform
531
+ }
532
+ : null,
533
+ onMousedown(evnt) {
534
+ moveEvent(evnt)
535
+ }
536
+ })
537
+ })
538
+ )
539
+ }
540
+
541
+ const renderOperationBtn = (code: VxeImagePreviewDefines.ToolbarCode, icon: keyof VxeGlobalIcon) => {
542
+ const toolbarOpts = computeToolbarOpts.value
543
+ const btnConf = toolbarOpts[code]
544
+ const btnOpts = XEUtils.isBoolean(btnConf) ? {} : btnConf ? Object.assign({}, btnConf) : {}
545
+ const showBtn = btnConf !== false
546
+ return showBtn
547
+ ? h(
548
+ 'div',
549
+ {
550
+ class: 'vxe-image-preview--operation-btn',
551
+ title: getI18n(`vxe.imagePreview.operBtn.${code}`),
552
+ onClick(evnt) {
553
+ handleOperationBtn(evnt, code)
554
+ }
555
+ },
556
+ [
557
+ h('i', {
558
+ class: btnOpts.icon || getIcon()[icon]
559
+ })
560
+ ]
561
+ )
562
+ : renderEmptyElement($xeImagePreview)
563
+ }
564
+
565
+ const renderBtnWrapper = () => {
566
+ const { showPrintButton, showDownloadButton } = props
567
+ const { activeIndex } = reactData
568
+ const imgList = computeImgList.value
569
+ const rotateText = computeRotateText.value
570
+ const scaleText = computeScaleText.value
571
+ const toolbarOpts = computeToolbarOpts.value
572
+
573
+ return h(
574
+ 'div',
575
+ {
576
+ class: 'vxe-image-preview--btn-wrapper'
577
+ },
578
+ [
579
+ h(
580
+ 'div',
581
+ {
582
+ class: 'vxe-image-preview--close-wrapper'
583
+ },
584
+ [
585
+ h(
586
+ 'div',
587
+ {
588
+ class: 'vxe-image-preview--close-btn',
589
+ onClick: handleCloseEvent
590
+ },
591
+ [
592
+ h('i', {
593
+ class: getIcon().IMAGE_PREVIEW_CLOSE
594
+ })
595
+ ]
596
+ ),
597
+ h('div', {
598
+ class: 'vxe-image-preview--close-bg'
599
+ })
600
+ ]
601
+ ),
602
+ imgList.length > 1
603
+ ? h(
604
+ 'div',
605
+ {
606
+ class: 'vxe-image-preview--previous-btn',
607
+ onClick(evnt) {
608
+ handleChangeEvent(evnt, false)
609
+ }
610
+ },
611
+ [
612
+ h('i', {
613
+ class: getIcon().IMAGE_PREVIEW_PREVIOUS
614
+ })
615
+ ]
616
+ )
617
+ : renderEmptyElement($xeImagePreview),
618
+ imgList.length > 1
619
+ ? h(
620
+ 'div',
621
+ {
622
+ class: 'vxe-image-preview--next-btn',
623
+ onClick(evnt) {
624
+ handleChangeEvent(evnt, true)
625
+ }
626
+ },
627
+ [
628
+ h('i', {
629
+ class: getIcon().IMAGE_PREVIEW_NEXT
630
+ })
631
+ ]
632
+ )
633
+ : renderEmptyElement($xeImagePreview),
634
+ h(
635
+ 'div',
636
+ {
637
+ class: 'vxe-image-preview--operation-info'
638
+ },
639
+ [
640
+ h(
641
+ 'div',
642
+ {
643
+ class: 'vxe-image-preview--operation-deg'
644
+ },
645
+ rotateText
646
+ ),
647
+ h(
648
+ 'div',
649
+ {
650
+ class: 'vxe-image-preview--operation-pct'
651
+ },
652
+ scaleText
653
+ )
654
+ ]
655
+ ),
656
+ h(
657
+ 'div',
658
+ {
659
+ class: 'vxe-image-preview--operation-wrapper'
660
+ },
661
+ [
662
+ h(
663
+ 'div',
664
+ {
665
+ class: 'vxe-image-preview--operation-active-count'
666
+ },
667
+ [
668
+ h(
669
+ 'span',
670
+ {
671
+ class: 'vxe-image-preview--operation-active-current'
672
+ },
673
+ `${(activeIndex || 0) + 1}`
674
+ ),
675
+ h(
676
+ 'span',
677
+ {
678
+ class: 'vxe-image-preview--operation-active-total'
679
+ },
680
+ `/${imgList.length}`
681
+ )
682
+ ]
683
+ ),
684
+ renderOperationBtn('zoomOut', 'IMAGE_PREVIEW_ZOOM_OUT'),
685
+ renderOperationBtn('zoomIn', 'IMAGE_PREVIEW_ZOOM_IN'),
686
+ renderOperationBtn('pctFull', 'IMAGE_PREVIEW_PCT_FULL'),
687
+ renderOperationBtn('pct11', 'IMAGE_PREVIEW_PCT_1_1'),
688
+ renderOperationBtn('rotateLeft', 'IMAGE_PREVIEW_ROTATE_LEFT'),
689
+ renderOperationBtn('rotateRight', 'IMAGE_PREVIEW_ROTATE_RIGHT'),
690
+ showPrintButton || toolbarOpts.print ? renderOperationBtn('print', 'IMAGE_PREVIEW_PRINT') : renderEmptyElement($xeImagePreview),
691
+ showDownloadButton || toolbarOpts.download ? renderOperationBtn('download', 'IMAGE_PREVIEW_DOWNLOAD') : renderEmptyElement($xeImagePreview)
692
+ ]
693
+ )
694
+ ]
695
+ )
696
+ }
697
+
698
+ const renderVN = () => {
699
+ const { offsetPct11 } = reactData
700
+ return h(
701
+ 'div',
702
+ {
703
+ ref: refElem,
704
+ class: [
705
+ 'vxe-image-preview',
706
+ {
707
+ 'is--pct11': offsetPct11
708
+ }
709
+ ]
710
+ },
711
+ [renderImgWrapper(), renderBtnWrapper()]
712
+ )
713
+ }
714
+
715
+ watch(
716
+ () => props.modelValue,
717
+ (val) => {
718
+ reactData.activeIndex = val
719
+ resetStyle()
720
+ }
721
+ )
722
+
723
+ onMounted(() => {
724
+ const elem = refElem.value
725
+ if (elem) {
726
+ elem.addEventListener('wheel', wheelEvent, { passive: false })
727
+ }
728
+ globalEvents.on($xeImagePreview, 'keydown', handleGlobalKeydownEvent)
729
+ })
730
+
731
+ onBeforeUnmount(() => {
732
+ const elem = refElem.value
733
+ if (elem) {
734
+ elem.removeEventListener('wheel', wheelEvent)
735
+ removeClass(elem, 'is--move')
736
+ }
737
+ })
738
+
739
+ onUnmounted(() => {
740
+ globalEvents.off($xeImagePreview, 'keydown')
741
+ })
742
+
743
+ provide('$xeImagePreview', $xeImagePreview)
744
+
745
+ $xeImagePreview.renderVN = renderVN
746
+
747
+ return renderVN
748
+ }
749
+ })