vxe-pc-ui 4.20.25 → 4.20.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (626) hide show
  1. package/dist/all.esm.js +15059 -10308
  2. package/dist/style.css +1 -1
  3. package/dist/style.mini.css +1 -1
  4. package/es/alert/src/alert.js +61 -36
  5. package/es/anchor/src/anchor-link.js +39 -20
  6. package/es/anchor/src/anchor.js +74 -45
  7. package/es/avatar/src/avatar.js +47 -27
  8. package/es/backtop/src/backtop.js +65 -40
  9. package/es/badge/src/badge.js +32 -16
  10. package/es/breadcrumb/src/breadcrumb-item.js +52 -27
  11. package/es/breadcrumb/src/breadcrumb.js +11 -8
  12. package/es/button/src/button-group.js +24 -18
  13. package/es/button/src/button.js +284 -185
  14. package/es/calendar/src/calendar.js +571 -358
  15. package/es/card/src/card.js +123 -68
  16. package/es/carousel/src/carousel-item.js +14 -7
  17. package/es/carousel/src/carousel.js +174 -112
  18. package/es/cascader/src/cascader.js +526 -380
  19. package/es/checkbox/src/button.js +90 -55
  20. package/es/checkbox/src/checkbox.js +60 -40
  21. package/es/checkbox/src/group.js +34 -26
  22. package/es/collapse/src/collapse-pane.js +33 -16
  23. package/es/collapse/src/collapse.js +133 -79
  24. package/es/color-picker/src/color-picker.js +489 -350
  25. package/es/components.d.ts +3 -1
  26. package/es/components.js +3 -2
  27. package/es/context-menu/src/context-menu.js +190 -110
  28. package/es/countdown/src/countdown.js +91 -59
  29. package/es/date-panel/src/date-panel.js +760 -450
  30. package/es/date-picker/src/date-picker.js +331 -228
  31. package/es/date-range-picker/src/date-range-picker.js +366 -265
  32. package/es/divider/src/divider.js +26 -12
  33. package/es/drawer/src/drawer.js +254 -154
  34. package/es/dynamics/index.js +38 -25
  35. package/es/empty/src/empty.js +53 -29
  36. package/es/form/render/index.js +66 -41
  37. package/es/form/src/form-config-item.js +22 -16
  38. package/es/form/src/form-group.js +23 -14
  39. package/es/form/src/form-item.js +23 -17
  40. package/es/form/src/form.js +139 -95
  41. package/es/form/src/itemInfo.js +2 -1
  42. package/es/form/src/render.js +207 -127
  43. package/es/form/src/util.js +8 -4
  44. package/es/icon/src/icon.js +14 -10
  45. package/es/icon/style.css +1 -1
  46. package/es/icon/style.mini.css +1 -1
  47. package/es/icon-picker/src/icon-picker.js +250 -157
  48. package/es/image/src/group.js +26 -20
  49. package/es/image/src/image.js +33 -32
  50. package/es/image/src/preview.js +182 -122
  51. package/es/image/src/util.js +6 -3
  52. package/es/index.esm.js +9 -8
  53. package/es/index.js +9 -8
  54. package/es/input/src/input.js +820 -507
  55. package/es/layout-aside/src/layout-aside.js +54 -38
  56. package/es/layout-body/src/layout-body.js +39 -27
  57. package/es/layout-container/src/layout-container.js +16 -9
  58. package/es/layout-footer/src/layout-footer.js +16 -7
  59. package/es/layout-header/src/layout-header.js +15 -7
  60. package/es/link/src/link.js +65 -44
  61. package/es/list/src/list.js +453 -333
  62. package/es/loading/index.js +8 -5
  63. package/es/loading/src/loading.js +60 -33
  64. package/es/mention/src/mention.js +2 -1
  65. package/es/menu/src/menu.js +341 -210
  66. package/es/modal/index.js +60 -37
  67. package/es/modal/src/modal.js +303 -205
  68. package/es/notice-bar/src/notice-bar.js +64 -37
  69. package/es/number-input/src/number-input.js +249 -172
  70. package/es/pager/src/pager.js +346 -202
  71. package/es/password-input/src/password-input.js +145 -105
  72. package/es/print/src/page-break.js +2 -1
  73. package/es/print/src/print.js +184 -99
  74. package/es/pulldown/src/pulldown.js +113 -71
  75. package/es/radio/src/button.js +92 -57
  76. package/es/radio/src/group.js +33 -25
  77. package/es/radio/src/radio.js +61 -41
  78. package/es/rate/src/rate.js +48 -36
  79. package/es/result/src/result.js +67 -35
  80. package/es/row/src/col.js +30 -16
  81. package/es/row/src/row.js +21 -14
  82. package/es/scrollbar/src/scrollbar.js +177 -145
  83. package/es/segmented/src/segmented.js +93 -60
  84. package/es/select/src/optgroup.js +7 -3
  85. package/es/select/src/select.js +483 -340
  86. package/es/select/src/util.js +6 -3
  87. package/es/slider/src/slider.js +108 -80
  88. package/es/space/src/space.js +40 -23
  89. package/es/splitter/src/splitter-panel.js +50 -25
  90. package/es/splitter/src/splitter.js +219 -144
  91. package/es/steps/src/steps.js +10 -5
  92. package/es/style.css +1 -1
  93. package/es/style.mini.css +1 -1
  94. package/es/switch/src/switch.js +85 -57
  95. package/es/table-select/src/table-select.js +232 -153
  96. package/es/table-transfer/src/table-transfer.js +10 -5
  97. package/es/tabs/src/tab-pane.js +33 -16
  98. package/es/tabs/src/tabs.js +363 -230
  99. package/es/tag/src/tag.js +61 -43
  100. package/es/text/src/text.js +89 -65
  101. package/es/text-ellipsis/src/text-ellipsis.js +82 -51
  102. package/es/textarea/src/textarea.js +116 -86
  103. package/es/timeline/src/timeline-item.js +2 -1
  104. package/es/timeline/src/timeline.js +2 -1
  105. package/es/tip/src/tip.js +53 -29
  106. package/es/tooltip/src/tooltip.js +114 -74
  107. package/es/tour/src/tour.js +2 -1
  108. package/es/transfer/src/transfer.js +42 -25
  109. package/es/tree/src/tree.js +709 -492
  110. package/es/tree-select/src/tree-select.js +320 -225
  111. package/es/ui/index.d.ts +0 -1
  112. package/es/ui/index.js +46 -3
  113. package/es/ui/src/dom.js +9 -6
  114. package/es/ui/src/log.js +1 -1
  115. package/es/ui/src/utils.d.ts +1 -1
  116. package/es/upload/src/upload.js +614 -398
  117. package/es/vxe-icon/style.css +1 -1
  118. package/es/vxe-icon/style.mini.css +1 -1
  119. package/es/watermark/src/util.js +15 -12
  120. package/es/watermark/src/watermark.js +55 -25
  121. package/lib/alert/src/alert.js +62 -37
  122. package/lib/anchor/src/anchor-link.js +39 -20
  123. package/lib/anchor/src/anchor.js +75 -46
  124. package/lib/avatar/src/avatar.js +52 -32
  125. package/lib/backtop/src/backtop.js +81 -56
  126. package/lib/badge/src/badge.js +35 -19
  127. package/lib/breadcrumb/src/breadcrumb-item.js +52 -27
  128. package/lib/breadcrumb/src/breadcrumb.js +13 -10
  129. package/lib/button/src/button-group.js +27 -21
  130. package/lib/button/src/button.js +306 -207
  131. package/lib/calendar/src/calendar.js +575 -362
  132. package/lib/card/src/card.js +133 -78
  133. package/lib/carousel/src/carousel-item.js +15 -8
  134. package/lib/carousel/src/carousel.js +182 -120
  135. package/lib/cascader/src/cascader.js +555 -409
  136. package/lib/checkbox/src/button.js +93 -58
  137. package/lib/checkbox/src/checkbox.js +63 -43
  138. package/lib/checkbox/src/group.js +37 -29
  139. package/lib/collapse/src/collapse-pane.js +34 -17
  140. package/lib/collapse/src/collapse.js +139 -85
  141. package/lib/color-picker/src/color-picker.js +516 -377
  142. package/lib/components.js +3 -2
  143. package/lib/context-menu/src/context-menu.js +212 -132
  144. package/lib/countdown/src/countdown.js +95 -63
  145. package/lib/date-panel/src/date-panel.js +776 -466
  146. package/lib/date-picker/src/date-picker.js +377 -274
  147. package/lib/date-range-picker/src/date-range-picker.js +401 -300
  148. package/lib/divider/src/divider.js +31 -17
  149. package/lib/drawer/src/drawer.js +255 -155
  150. package/lib/dynamics/index.js +38 -25
  151. package/lib/empty/src/empty.js +55 -31
  152. package/lib/form/render/index.js +68 -43
  153. package/lib/form/src/form-config-item.js +24 -18
  154. package/lib/form/src/form-group.js +25 -16
  155. package/lib/form/src/form-item.js +25 -19
  156. package/lib/form/src/form.js +140 -96
  157. package/lib/form/src/itemInfo.js +4 -3
  158. package/lib/form/src/render.js +214 -134
  159. package/lib/form/src/util.js +9 -5
  160. package/lib/icon/src/icon.js +17 -13
  161. package/lib/icon/style/style.css +1 -1
  162. package/lib/icon/style/style.mini.css +1 -1
  163. package/lib/icon-picker/src/icon-picker.js +251 -158
  164. package/lib/image/src/group.js +26 -20
  165. package/lib/image/src/image.js +41 -40
  166. package/lib/image/src/preview.js +206 -146
  167. package/lib/image/src/util.js +6 -3
  168. package/lib/index.common.js +9 -8
  169. package/lib/index.js +9 -8
  170. package/lib/index.umd.js +15131 -10364
  171. package/lib/index.umd.min.js +3 -3
  172. package/lib/input/src/input.js +878 -565
  173. package/lib/layout-aside/src/layout-aside.js +61 -45
  174. package/lib/layout-body/src/layout-body.js +47 -35
  175. package/lib/layout-container/src/layout-container.js +18 -11
  176. package/lib/layout-footer/src/layout-footer.js +17 -8
  177. package/lib/layout-header/src/layout-header.js +16 -8
  178. package/lib/link/src/link.js +69 -48
  179. package/lib/list/src/list.js +456 -336
  180. package/lib/loading/index.js +8 -5
  181. package/lib/loading/src/loading.js +69 -42
  182. package/lib/mention/src/mention.js +4 -3
  183. package/lib/menu/src/menu.js +351 -220
  184. package/lib/modal/index.js +60 -37
  185. package/lib/modal/src/modal.js +306 -208
  186. package/lib/notice-bar/src/notice-bar.js +70 -43
  187. package/lib/number-input/src/number-input.js +290 -213
  188. package/lib/pager/src/pager.js +347 -203
  189. package/lib/password-input/src/password-input.js +155 -115
  190. package/lib/print/src/page-break.js +3 -2
  191. package/lib/print/src/print.js +193 -108
  192. package/lib/pulldown/src/pulldown.js +128 -86
  193. package/lib/radio/src/button.js +96 -61
  194. package/lib/radio/src/group.js +37 -29
  195. package/lib/radio/src/radio.js +65 -45
  196. package/lib/rate/src/rate.js +50 -38
  197. package/lib/result/src/result.js +68 -36
  198. package/lib/row/src/col.js +32 -18
  199. package/lib/row/src/row.js +25 -18
  200. package/lib/scrollbar/src/scrollbar.js +178 -146
  201. package/lib/segmented/src/segmented.js +97 -64
  202. package/lib/select/src/optgroup.js +7 -3
  203. package/lib/select/src/select.js +486 -343
  204. package/lib/select/src/util.js +6 -3
  205. package/lib/slider/src/slider.js +122 -94
  206. package/lib/space/src/space.js +54 -37
  207. package/lib/splitter/src/splitter-panel.js +51 -26
  208. package/lib/splitter/src/splitter.js +233 -158
  209. package/lib/steps/src/steps.js +11 -6
  210. package/lib/style.css +1 -1
  211. package/lib/style.mini.css +1 -1
  212. package/lib/switch/src/switch.js +87 -59
  213. package/lib/table-select/src/table-select.js +234 -155
  214. package/lib/table-transfer/src/table-transfer.js +12 -7
  215. package/lib/tabs/src/tab-pane.js +34 -17
  216. package/lib/tabs/src/tabs.js +365 -232
  217. package/lib/tag/src/tag.js +67 -49
  218. package/lib/text/src/text.js +100 -76
  219. package/lib/text-ellipsis/src/text-ellipsis.js +86 -55
  220. package/lib/textarea/src/textarea.js +127 -97
  221. package/lib/timeline/src/timeline-item.js +3 -2
  222. package/lib/timeline/src/timeline.js +4 -3
  223. package/lib/tip/src/tip.js +58 -34
  224. package/lib/tooltip/src/tooltip.js +116 -76
  225. package/lib/tour/src/tour.js +4 -3
  226. package/lib/transfer/src/transfer.js +44 -27
  227. package/lib/tree/src/tree.js +717 -500
  228. package/lib/tree-select/src/tree-select.js +351 -256
  229. package/lib/ui/index.js +46 -4
  230. package/lib/ui/src/dom.js +9 -6
  231. package/lib/ui/src/log.js +1 -1
  232. package/lib/upload/src/upload.js +708 -492
  233. package/lib/vxe-icon/style/style.css +1 -1
  234. package/lib/vxe-icon/style/style.mini.css +1 -1
  235. package/lib/watermark/src/util.js +15 -12
  236. package/lib/watermark/src/watermark.js +60 -30
  237. package/package.json +10 -4
  238. package/packages/alert/index.ts +16 -16
  239. package/packages/alert/src/alert.ts +148 -126
  240. package/packages/anchor/index.ts +16 -16
  241. package/packages/anchor/src/anchor-link.ts +139 -121
  242. package/packages/anchor/src/anchor.ts +266 -237
  243. package/packages/anchor/src/util.ts +23 -23
  244. package/packages/anchor-link/index.ts +16 -16
  245. package/packages/avatar/index.ts +16 -16
  246. package/packages/avatar/src/avatar.ts +166 -149
  247. package/packages/backtop/index.ts +16 -16
  248. package/packages/backtop/src/backtop.ts +337 -313
  249. package/packages/badge/index.ts +16 -16
  250. package/packages/badge/src/badge.ts +131 -118
  251. package/packages/breadcrumb/index.ts +16 -16
  252. package/packages/breadcrumb/src/breadcrumb-item.ts +129 -106
  253. package/packages/breadcrumb/src/breadcrumb.ts +94 -92
  254. package/packages/breadcrumb-item/index.ts +16 -16
  255. package/packages/button/index.ts +16 -16
  256. package/packages/button/src/button-group.ts +116 -110
  257. package/packages/button/src/button.ts +975 -855
  258. package/packages/button-group/index.ts +16 -16
  259. package/packages/calendar/index.ts +16 -16
  260. package/packages/calendar/src/calendar.ts +1566 -1352
  261. package/packages/card/index.ts +16 -16
  262. package/packages/card/src/card.ts +285 -236
  263. package/packages/carousel/index.ts +16 -16
  264. package/packages/carousel/src/carousel-item.ts +120 -102
  265. package/packages/carousel/src/carousel.ts +475 -414
  266. package/packages/carousel/src/util.ts +21 -21
  267. package/packages/carousel-item/index.ts +16 -16
  268. package/packages/cascader/index.ts +16 -16
  269. package/packages/cascader/src/cascader.ts +2074 -1896
  270. package/packages/cascader/src/util.ts +9 -9
  271. package/packages/checkbox/index.ts +16 -16
  272. package/packages/checkbox/src/button.ts +267 -221
  273. package/packages/checkbox/src/checkbox.ts +219 -199
  274. package/packages/checkbox/src/group.ts +292 -269
  275. package/packages/checkbox-button/index.ts +16 -16
  276. package/packages/checkbox-group/index.ts +16 -16
  277. package/packages/col/index.ts +16 -16
  278. package/packages/collapse/index.ts +16 -16
  279. package/packages/collapse/src/collapse-pane.ts +142 -114
  280. package/packages/collapse/src/collapse.ts +453 -384
  281. package/packages/collapse/src/util.ts +21 -21
  282. package/packages/collapse-pane/index.ts +16 -16
  283. package/packages/color-picker/index.ts +31 -31
  284. package/packages/color-picker/src/color-picker.ts +1310 -1147
  285. package/packages/color-picker/src/util.ts +436 -423
  286. package/packages/components.ts +350 -349
  287. package/packages/context-menu/index.ts +54 -54
  288. package/packages/context-menu/src/context-menu.ts +773 -681
  289. package/packages/countdown/index.ts +16 -16
  290. package/packages/countdown/src/countdown.ts +295 -262
  291. package/packages/date-panel/index.ts +16 -16
  292. package/packages/date-panel/src/date-panel.ts +2214 -1900
  293. package/packages/date-panel/src/util.ts +354 -326
  294. package/packages/date-picker/index.ts +16 -16
  295. package/packages/date-picker/src/date-picker.ts +1884 -1752
  296. package/packages/date-range-picker/index.ts +16 -16
  297. package/packages/date-range-picker/src/date-range-picker.ts +1728 -1604
  298. package/packages/divider/index.ts +16 -16
  299. package/packages/divider/src/divider.ts +105 -93
  300. package/packages/drawer/index.ts +78 -78
  301. package/packages/drawer/src/drawer.ts +920 -802
  302. package/packages/drawer/src/store.ts +3 -3
  303. package/packages/dynamics/index.ts +124 -117
  304. package/packages/empty/index.ts +16 -16
  305. package/packages/empty/src/empty.ts +124 -103
  306. package/packages/form/index.ts +16 -16
  307. package/packages/form/render/index.ts +646 -614
  308. package/packages/form/src/form-config-item.ts +85 -80
  309. package/packages/form/src/form-group.ts +96 -86
  310. package/packages/form/src/form-item.ts +181 -174
  311. package/packages/form/src/form.ts +1122 -1069
  312. package/packages/form/src/itemInfo.ts +84 -82
  313. package/packages/form/src/render.ts +470 -387
  314. package/packages/form/src/util.ts +98 -93
  315. package/packages/form-gather/index.ts +26 -26
  316. package/packages/form-group/index.ts +16 -16
  317. package/packages/form-item/index.ts +16 -16
  318. package/packages/icon/index.ts +16 -16
  319. package/packages/icon/src/icon.ts +78 -75
  320. package/packages/icon-picker/index.ts +16 -16
  321. package/packages/icon-picker/src/icon-picker.ts +922 -809
  322. package/packages/image/index.ts +16 -16
  323. package/packages/image/src/group.ts +159 -153
  324. package/packages/image/src/image.ts +298 -298
  325. package/packages/image/src/preview.ts +749 -672
  326. package/packages/image/src/util.ts +62 -59
  327. package/packages/image-group/index.ts +16 -16
  328. package/packages/image-preview/index.ts +19 -19
  329. package/packages/index.ts +20 -21
  330. package/packages/input/index.ts +16 -16
  331. package/packages/input/src/input.ts +3201 -2863
  332. package/packages/language/fr-FR.ts +15 -15
  333. package/packages/language/it-IT.ts +4 -4
  334. package/packages/language/uk-UA.ts +1 -1
  335. package/packages/language/uz-UZ.ts +13 -13
  336. package/packages/language/zh-CN.ts +907 -907
  337. package/packages/layout-aside/index.ts +16 -16
  338. package/packages/layout-aside/src/layout-aside.ts +172 -156
  339. package/packages/layout-body/index.ts +16 -16
  340. package/packages/layout-body/src/layout-body.ts +191 -181
  341. package/packages/layout-container/index.ts +16 -16
  342. package/packages/layout-container/src/layout-container.ts +108 -92
  343. package/packages/layout-footer/index.ts +16 -16
  344. package/packages/layout-footer/src/layout-footer.ts +81 -74
  345. package/packages/layout-header/index.ts +16 -16
  346. package/packages/layout-header/src/layout-header.ts +79 -73
  347. package/packages/link/index.ts +16 -16
  348. package/packages/link/src/link.ts +180 -161
  349. package/packages/list/index.ts +16 -16
  350. package/packages/list/src/list.ts +2690 -2564
  351. package/packages/list/src/store.ts +10 -10
  352. package/packages/list/src/util.ts +10 -11
  353. package/packages/loading/index.ts +39 -36
  354. package/packages/loading/src/loading.ts +179 -152
  355. package/packages/mention/index.ts +16 -16
  356. package/packages/mention/src/mention.ts +69 -71
  357. package/packages/menu/index.ts +16 -16
  358. package/packages/menu/src/menu.ts +1000 -857
  359. package/packages/modal/index.ts +164 -141
  360. package/packages/modal/src/modal.ts +1803 -1681
  361. package/packages/modal/src/store.ts +3 -3
  362. package/packages/notice-bar/index.ts +16 -16
  363. package/packages/notice-bar/src/notice-bar.ts +207 -181
  364. package/packages/number-input/index.ts +16 -16
  365. package/packages/number-input/src/number-input.ts +1322 -1242
  366. package/packages/number-input/src/util.ts +25 -25
  367. package/packages/optgroup/index.ts +16 -16
  368. package/packages/option/index.ts +16 -16
  369. package/packages/pager/index.ts +16 -16
  370. package/packages/pager/src/pager.ts +919 -775
  371. package/packages/password-input/index.ts +16 -16
  372. package/packages/password-input/src/password-input.ts +523 -482
  373. package/packages/print/index.ts +18 -18
  374. package/packages/print/src/page-break.ts +104 -92
  375. package/packages/print/src/print.ts +366 -281
  376. package/packages/print/src/util.ts +299 -304
  377. package/packages/print-page-break/index.ts +16 -16
  378. package/packages/pulldown/index.ts +16 -16
  379. package/packages/pulldown/src/pulldown.ts +505 -445
  380. package/packages/radio/index.ts +16 -16
  381. package/packages/radio/src/button.ts +290 -243
  382. package/packages/radio/src/group.ts +275 -252
  383. package/packages/radio/src/radio.ts +237 -218
  384. package/packages/radio-button/index.ts +16 -16
  385. package/packages/radio-group/index.ts +16 -16
  386. package/packages/rate/index.ts +16 -16
  387. package/packages/rate/src/rate.ts +203 -192
  388. package/packages/result/index.ts +16 -16
  389. package/packages/result/src/result.ts +141 -112
  390. package/packages/row/index.ts +16 -16
  391. package/packages/row/src/col.ts +171 -159
  392. package/packages/row/src/row.ts +143 -138
  393. package/packages/scrollbar/index.ts +16 -16
  394. package/packages/scrollbar/src/scrollbar.ts +626 -595
  395. package/packages/segmented/index.ts +16 -16
  396. package/packages/segmented/src/segmented.ts +297 -264
  397. package/packages/select/index.ts +16 -16
  398. package/packages/select/src/optgroup.ts +53 -49
  399. package/packages/select/src/option-info.ts +20 -20
  400. package/packages/select/src/option.ts +47 -47
  401. package/packages/select/src/select.ts +2390 -2214
  402. package/packages/select/src/util.ts +50 -47
  403. package/packages/slider/index.ts +16 -16
  404. package/packages/slider/src/slider.ts +547 -506
  405. package/packages/space/index.ts +16 -16
  406. package/packages/space/src/space.ts +225 -209
  407. package/packages/split/index.ts +16 -16
  408. package/packages/split-pane/index.ts +17 -17
  409. package/packages/splitter/index.ts +16 -16
  410. package/packages/splitter/src/splitter-panel.ts +199 -163
  411. package/packages/splitter/src/splitter.ts +1110 -1020
  412. package/packages/splitter/src/util.ts +21 -21
  413. package/packages/splitter-panel/index.ts +16 -16
  414. package/packages/steps/index.ts +16 -16
  415. package/packages/steps/src/steps.ts +69 -68
  416. package/packages/switch/index.ts +16 -16
  417. package/packages/switch/src/switch.ts +300 -271
  418. package/packages/tab-pane/index.ts +16 -16
  419. package/packages/table-select/index.ts +16 -16
  420. package/packages/table-select/src/table-select.ts +1103 -999
  421. package/packages/table-transfer/index.ts +16 -16
  422. package/packages/table-transfer/src/table-transfer.ts +104 -91
  423. package/packages/tabs/index.ts +16 -16
  424. package/packages/tabs/src/tab-pane.ts +132 -117
  425. package/packages/tabs/src/tabs.ts +1137 -997
  426. package/packages/tabs/src/util.ts +21 -21
  427. package/packages/tag/index.ts +16 -16
  428. package/packages/tag/src/tag.ts +204 -187
  429. package/packages/text/index.ts +16 -16
  430. package/packages/text/src/text.ts +282 -260
  431. package/packages/text-ellipsis/index.ts +16 -16
  432. package/packages/text-ellipsis/src/text-ellipsis.ts +312 -282
  433. package/packages/textarea/index.ts +16 -16
  434. package/packages/textarea/src/textarea.ts +526 -495
  435. package/packages/timeline/index.ts +16 -16
  436. package/packages/timeline/src/timeline-item.ts +65 -67
  437. package/packages/timeline/src/timeline.ts +70 -71
  438. package/packages/timeline-item/index.ts +16 -16
  439. package/packages/tip/index.ts +19 -19
  440. package/packages/tip/src/tip.ts +150 -129
  441. package/packages/tooltip/index.ts +72 -72
  442. package/packages/tooltip/src/tooltip.ts +669 -627
  443. package/packages/tour/index.ts +16 -16
  444. package/packages/tour/src/tour.ts +70 -71
  445. package/packages/transfer/index.ts +16 -16
  446. package/packages/transfer/src/transfer.ts +130 -117
  447. package/packages/tree/index.ts +16 -16
  448. package/packages/tree/src/store.ts +10 -10
  449. package/packages/tree/src/tree.ts +4077 -3852
  450. package/packages/tree/src/util.ts +51 -51
  451. package/packages/tree-select/index.ts +16 -16
  452. package/packages/tree-select/src/tree-select.ts +1217 -1094
  453. package/packages/ui/index.ts +836 -793
  454. package/packages/ui/src/anime.ts +51 -52
  455. package/packages/ui/src/comp.ts +3 -3
  456. package/packages/ui/src/dom.ts +357 -354
  457. package/packages/ui/src/log.ts +19 -19
  458. package/packages/ui/src/utils.ts +79 -79
  459. package/packages/ui/src/vn.ts +39 -39
  460. package/packages/upload/index.ts +20 -20
  461. package/packages/upload/src/upload.ts +2271 -2021
  462. package/packages/upload/src/util.ts +109 -109
  463. package/packages/watermark/index.ts +33 -33
  464. package/packages/watermark/src/util.ts +186 -180
  465. package/packages/watermark/src/watermark.ts +196 -168
  466. package/types/all.d.ts +552 -552
  467. package/types/components/alert.d.ts +83 -87
  468. package/types/components/anchor-link.d.ts +88 -91
  469. package/types/components/anchor.d.ts +97 -104
  470. package/types/components/avatar.d.ts +85 -88
  471. package/types/components/backtop.d.ts +119 -122
  472. package/types/components/badge.d.ts +77 -80
  473. package/types/components/breadcrumb-item.d.ts +77 -80
  474. package/types/components/breadcrumb.d.ts +83 -87
  475. package/types/components/button-group.d.ts +118 -120
  476. package/types/components/button.d.ts +331 -339
  477. package/types/components/calendar.d.ts +247 -264
  478. package/types/components/card.d.ts +111 -113
  479. package/types/components/carousel-item.d.ts +73 -75
  480. package/types/components/carousel.d.ts +130 -134
  481. package/types/components/cascader.d.ts +336 -386
  482. package/types/components/checkbox-button.d.ts +109 -114
  483. package/types/components/checkbox-group.d.ts +152 -154
  484. package/types/components/checkbox.d.ts +123 -128
  485. package/types/components/col.d.ts +77 -80
  486. package/types/components/colgroup.d.ts +64 -69
  487. package/types/components/collapse-pane.d.ts +86 -89
  488. package/types/components/collapse.d.ts +123 -133
  489. package/types/components/color-picker.d.ts +275 -280
  490. package/types/components/column.d.ts +834 -851
  491. package/types/components/context-menu.d.ts +282 -289
  492. package/types/components/countdown.d.ts +108 -112
  493. package/types/components/date-panel.d.ts +319 -331
  494. package/types/components/date-picker.d.ts +361 -384
  495. package/types/components/date-range-picker.d.ts +351 -371
  496. package/types/components/divider.d.ts +72 -75
  497. package/types/components/drawer.d.ts +333 -344
  498. package/types/components/empty.d.ts +75 -78
  499. package/types/components/flow-design.d.ts +73 -85
  500. package/types/components/flow-view.d.ts +73 -85
  501. package/types/components/form-design.d.ts +370 -376
  502. package/types/components/form-gather.d.ts +120 -124
  503. package/types/components/form-group.d.ts +73 -77
  504. package/types/components/form-item.d.ts +395 -413
  505. package/types/components/form-view.d.ts +179 -183
  506. package/types/components/form.d.ts +499 -495
  507. package/types/components/gantt-module/gantt-view.d.ts +195 -200
  508. package/types/components/gantt-module/index.d.ts +1 -1
  509. package/types/components/gantt-plugins/extend-gantt-chart.d.ts +137 -131
  510. package/types/components/gantt-plugins/index.d.ts +1 -1
  511. package/types/components/gantt.d.ts +1248 -1399
  512. package/types/components/grid.d.ts +1289 -1317
  513. package/types/components/icon-picker.d.ts +242 -253
  514. package/types/components/icon.d.ts +332 -87
  515. package/types/components/image-group.d.ts +124 -127
  516. package/types/components/image-preview.d.ts +167 -167
  517. package/types/components/image.d.ts +166 -173
  518. package/types/components/input.d.ts +429 -453
  519. package/types/components/layout-aside.d.ts +123 -123
  520. package/types/components/layout-body.d.ts +110 -113
  521. package/types/components/layout-container.d.ts +73 -75
  522. package/types/components/layout-footer.d.ts +71 -73
  523. package/types/components/layout-header.d.ts +67 -69
  524. package/types/components/link.d.ts +107 -111
  525. package/types/components/list-design.d.ts +189 -190
  526. package/types/components/list-view.d.ts +193 -199
  527. package/types/components/list.d.ts +678 -715
  528. package/types/components/loading.d.ts +98 -103
  529. package/types/components/mention.d.ts +70 -77
  530. package/types/components/menu.d.ts +284 -295
  531. package/types/components/modal.d.ts +567 -584
  532. package/types/components/notice-bar.d.ts +102 -106
  533. package/types/components/number-input.d.ts +359 -365
  534. package/types/components/optgroup.d.ts +85 -88
  535. package/types/components/option.d.ts +94 -103
  536. package/types/components/pager.d.ts +330 -335
  537. package/types/components/password-input.d.ts +143 -156
  538. package/types/components/print-page-break.d.ts +65 -69
  539. package/types/components/print.d.ts +243 -245
  540. package/types/components/pulldown.d.ts +231 -239
  541. package/types/components/radio-button.d.ts +113 -118
  542. package/types/components/radio-group.d.ts +151 -153
  543. package/types/components/radio.d.ts +129 -134
  544. package/types/components/rate.d.ts +83 -88
  545. package/types/components/result.d.ts +81 -84
  546. package/types/components/row.d.ts +77 -81
  547. package/types/components/scrollbar.d.ts +299 -305
  548. package/types/components/segmented.d.ts +119 -123
  549. package/types/components/select.d.ts +598 -616
  550. package/types/components/slider.d.ts +137 -151
  551. package/types/components/space.d.ts +120 -127
  552. package/types/components/split-pane.d.ts +126 -133
  553. package/types/components/split.d.ts +301 -312
  554. package/types/components/splitter-panel.d.ts +123 -130
  555. package/types/components/splitter.d.ts +290 -301
  556. package/types/components/steps.d.ts +63 -68
  557. package/types/components/switch.d.ts +127 -133
  558. package/types/components/tab-pane.d.ts +111 -114
  559. package/types/components/table-module/custom.d.ts +123 -123
  560. package/types/components/table-module/edit.d.ts +297 -276
  561. package/types/components/table-module/export.d.ts +88 -96
  562. package/types/components/table-module/filter.d.ts +144 -144
  563. package/types/components/table-module/index.d.ts +7 -7
  564. package/types/components/table-module/keyboard.d.ts +26 -26
  565. package/types/components/table-module/menu.d.ts +46 -46
  566. package/types/components/table-module/validator.d.ts +53 -53
  567. package/types/components/table-plugins/extend-cell-area.d.ts +781 -781
  568. package/types/components/table-plugins/extend-pivot-table.d.ts +59 -58
  569. package/types/components/table-plugins/filters-combination.d.ts +15 -15
  570. package/types/components/table-plugins/filters-complex-input.d.ts +9 -9
  571. package/types/components/table-plugins/index.d.ts +4 -4
  572. package/types/components/table-select.d.ts +268 -276
  573. package/types/components/table-transfer.d.ts +80 -84
  574. package/types/components/table.d.ts +7530 -8000
  575. package/types/components/tabs.d.ts +314 -352
  576. package/types/components/tag.d.ts +108 -114
  577. package/types/components/text-ellipsis.d.ts +107 -112
  578. package/types/components/text.d.ts +112 -122
  579. package/types/components/textarea.d.ts +261 -275
  580. package/types/components/timeline-item.d.ts +66 -75
  581. package/types/components/timeline.d.ts +70 -77
  582. package/types/components/tip.d.ts +81 -83
  583. package/types/components/toolbar.d.ts +327 -336
  584. package/types/components/tooltip.d.ts +250 -255
  585. package/types/components/tour.d.ts +70 -77
  586. package/types/components/transfer.d.ts +80 -84
  587. package/types/components/tree-select.d.ts +361 -376
  588. package/types/components/tree.d.ts +994 -1036
  589. package/types/components/upload.d.ts +477 -518
  590. package/types/components/watermark.d.ts +116 -120
  591. package/types/handles/form-design.d.ts +50 -50
  592. package/types/handles/index.d.ts +3 -3
  593. package/types/handles/list-design.d.ts +1 -2
  594. package/types/handles/table.d.ts +15 -15
  595. package/types/index.d.ts +8 -8
  596. package/types/ui/commands.d.ts +57 -57
  597. package/types/ui/formats.d.ts +62 -62
  598. package/types/ui/global-config.d.ts +269 -269
  599. package/types/ui/global-icon.d.ts +315 -315
  600. package/types/ui/hooks.d.ts +13 -13
  601. package/types/ui/index.d.ts +100 -100
  602. package/types/ui/interceptor.d.ts +52 -52
  603. package/types/ui/menus.d.ts +89 -89
  604. package/types/ui/renderer.d.ts +1033 -1047
  605. package/types/ui/validators.d.ts +37 -38
  606. /package/dist/{iconfont.1792992046297.ttf → iconfont.1793007755017.ttf} +0 -0
  607. /package/dist/{iconfont.1792992046297.woff → iconfont.1793007755017.woff} +0 -0
  608. /package/dist/{iconfont.1792992046297.woff2 → iconfont.1793007755017.woff2} +0 -0
  609. /package/es/icon/{iconfont.1792992046297.ttf → iconfont.1793007755017.ttf} +0 -0
  610. /package/es/icon/{iconfont.1792992046297.woff → iconfont.1793007755017.woff} +0 -0
  611. /package/es/icon/{iconfont.1792992046297.woff2 → iconfont.1793007755017.woff2} +0 -0
  612. /package/es/{iconfont.1792992046297.ttf → iconfont.1793007755017.ttf} +0 -0
  613. /package/es/{iconfont.1792992046297.woff → iconfont.1793007755017.woff} +0 -0
  614. /package/es/{iconfont.1792992046297.woff2 → iconfont.1793007755017.woff2} +0 -0
  615. /package/es/vxe-icon/{iconfont.1792992046297.ttf → iconfont.1793007755017.ttf} +0 -0
  616. /package/es/vxe-icon/{iconfont.1792992046297.woff → iconfont.1793007755017.woff} +0 -0
  617. /package/es/vxe-icon/{iconfont.1792992046297.woff2 → iconfont.1793007755017.woff2} +0 -0
  618. /package/lib/icon/style/{iconfont.1792992046297.ttf → iconfont.1793007755017.ttf} +0 -0
  619. /package/lib/icon/style/{iconfont.1792992046297.woff → iconfont.1793007755017.woff} +0 -0
  620. /package/lib/icon/style/{iconfont.1792992046297.woff2 → iconfont.1793007755017.woff2} +0 -0
  621. /package/lib/{iconfont.1792992046297.ttf → iconfont.1793007755017.ttf} +0 -0
  622. /package/lib/{iconfont.1792992046297.woff → iconfont.1793007755017.woff} +0 -0
  623. /package/lib/{iconfont.1792992046297.woff2 → iconfont.1793007755017.woff2} +0 -0
  624. /package/lib/vxe-icon/style/{iconfont.1792992046297.ttf → iconfont.1793007755017.ttf} +0 -0
  625. /package/lib/vxe-icon/style/{iconfont.1792992046297.woff → iconfont.1793007755017.woff} +0 -0
  626. /package/lib/vxe-icon/style/{iconfont.1792992046297.woff2 → iconfont.1793007755017.woff2} +0 -0
@@ -1,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
+ })