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,1681 +1,1803 @@
1
- import { h, Teleport, ref, Ref, inject, computed, reactive, provide, nextTick, watch, PropType, VNode, onMounted, onUnmounted } from 'vue'
2
- import { defineVxeComponent } from '../../ui/src/comp'
3
- import XEUtils from 'xe-utils'
4
- import { getEventTargetNode, getPopupContainer, getPopupWrapperElement, isScale, toCssUnit } from '../../ui/src/dom'
5
- import { getLastZIndex, nextZIndex, getSubLastZIndex, nextSubZIndex, getFuncText, handleBooleanDefaultValue, getDefaultConfig } from '../../ui/src/utils'
6
- import { VxeUI } from '../../ui'
7
- import { getSlotVNs } from '../../ui/src/vn'
8
- import { createComponentLog } from '../../ui/src/log'
9
- import { allActiveModals } from './store'
10
- import VxeButtonComponent from '../../button'
11
- import VxeLoadingComponent from '../../loading'
12
- import VxeScrollbarComponent from '../../scrollbar'
13
-
14
- import type { VxeModalConstructor, VxeModalPropTypes, ModalReactData, ModalInternalData, VxeModalEmits, VxeModalPrivateComputed, ModalEventTypes, VxeButtonInstance, ModalMethods, ModalPrivateRef, VxeModalMethods, ValueOf, VxeDrawerConstructor, VxeDrawerMethods, VxeFormConstructor, VxeFormPrivateMethods } from '../../../types'
15
- import type { VxeTableConstructor, VxeTablePrivateMethods } from '../../../types/components/table'
16
-
17
- const { getConfig, getIcon, getI18n, globalEvents, GLOBAL_EVENT_KEYS, createEvent, useFns, renderEmptyElement } = VxeUI
18
-
19
- const { warnLog, errLog } = createComponentLog('modal')
20
-
21
- function createInternalData (): ModalInternalData {
22
- return {
23
- // msgTimeout: undefined,
24
- isMoveStatus: false
25
- }
26
- }
27
-
28
- function createReactData (): ModalReactData {
29
- return {
30
- initialized: false,
31
- visible: false,
32
- contentVisible: false,
33
- modalTop: 0,
34
- modalZindex: 0,
35
- prevZoomStatus: '',
36
- zoomStatus: '',
37
- revertLocat: null,
38
- prevLocat: null,
39
- firstOpen: true,
40
- resizeFlag: 1
41
- }
42
- }
43
-
44
- const msgQueue: VxeModalConstructor[] = []
45
- const notifyQueue: VxeModalConstructor[] = []
46
-
47
- const lockScrollAttrKey = 'data-vxe-lock-scroll'
48
- const lockScrollCssWidthKey = '--vxe-ui-modal-lock-scroll-view-width'
49
-
50
- export default defineVxeComponent({
51
- name: 'VxeModal',
52
- props: {
53
- modelValue: Boolean as PropType<VxeModalPropTypes.ModelValue>,
54
- id: String as PropType<VxeModalPropTypes.ID>,
55
- type: {
56
- type: String as PropType<VxeModalPropTypes.Type>,
57
- default: 'modal'
58
- },
59
- loading: {
60
- type: Boolean as PropType<VxeModalPropTypes.Loading>,
61
- default: null
62
- },
63
- status: String as PropType<VxeModalPropTypes.Status>,
64
- iconStatus: String as PropType<VxeModalPropTypes.IconStatus>,
65
- className: String as PropType<VxeModalPropTypes.ClassName>,
66
- top: {
67
- type: [Number, String] as PropType<VxeModalPropTypes.Top>,
68
- default: () => getConfig().modal.top
69
- },
70
- position: [String, Object] as PropType<VxeModalPropTypes.Position>,
71
- title: String as PropType<VxeModalPropTypes.Title>,
72
- duration: {
73
- type: [Number, String] as PropType<VxeModalPropTypes.Duration>,
74
- default: () => getConfig().modal.duration
75
- },
76
- content: [Number, String] as PropType<VxeModalPropTypes.Content>,
77
- useHtml: {
78
- type: Boolean as PropType<VxeModalPropTypes.UseHtml>,
79
- default: () => getConfig().modal.useHtml
80
- },
81
- showCancelButton: {
82
- type: Boolean as PropType<VxeModalPropTypes.ShowCancelButton>,
83
- default: null
84
- },
85
- cancelButtonText: {
86
- type: String as PropType<VxeModalPropTypes.CancelButtonText>,
87
- default: () => getConfig().modal.cancelButtonText
88
- },
89
- showConfirmButton: {
90
- type: Boolean as PropType<VxeModalPropTypes.ShowConfirmButton>,
91
- default: () => getConfig().modal.showConfirmButton
92
- },
93
- confirmButtonText: {
94
- type: String as PropType<VxeModalPropTypes.ConfirmButtonText>,
95
- default: () => getConfig().modal.confirmButtonText
96
- },
97
- lockView: {
98
- type: Boolean as PropType<VxeModalPropTypes.LockView>,
99
- default: () => getConfig().modal.lockView
100
- },
101
- lockScroll: Boolean as PropType<VxeModalPropTypes.LockScroll>,
102
- mask: {
103
- type: Boolean as PropType<VxeModalPropTypes.Mask>,
104
- default: () => getConfig().modal.mask
105
- },
106
- maskClosable: {
107
- type: Boolean as PropType<VxeModalPropTypes.MaskClosable>,
108
- default: () => getConfig().modal.maskClosable
109
- },
110
- escClosable: {
111
- type: Boolean as PropType<VxeModalPropTypes.EscClosable>,
112
- default: () => getConfig().modal.escClosable
113
- },
114
- cancelClosable: {
115
- type: Boolean as PropType<VxeModalPropTypes.CancelClosable>,
116
- default: () => getConfig().modal.cancelClosable
117
- },
118
- confirmClosable: {
119
- type: Boolean as PropType<VxeModalPropTypes.ConfirmClosable>,
120
- default: () => getConfig().modal.confirmClosable
121
- },
122
- resize: Boolean as PropType<VxeModalPropTypes.Resize>,
123
- border: {
124
- type: Boolean as PropType<VxeModalPropTypes.Border>,
125
- default: () => getConfig().modal.border
126
- },
127
- showTitleBackground: {
128
- type: Boolean as PropType<VxeModalPropTypes.ShowTitleBackground>,
129
- default: () => getConfig().modal.showTitleBackground
130
- },
131
- showHeader: {
132
- type: Boolean as PropType<VxeModalPropTypes.ShowHeader>,
133
- default: () => getConfig().modal.showHeader
134
- },
135
- showFooter: {
136
- type: Boolean as PropType<VxeModalPropTypes.ShowFooter>,
137
- default: () => getConfig().modal.showFooter
138
- },
139
- preload: Boolean as PropType<VxeModalPropTypes.Preload>,
140
- showZoom: Boolean as PropType<VxeModalPropTypes.ShowZoom>,
141
- zoomConfig: Object as PropType<VxeModalPropTypes.ZoomConfig>,
142
- showMaximize: {
143
- type: Boolean as PropType<VxeModalPropTypes.ShowMaximize>,
144
- default: () => handleBooleanDefaultValue(getConfig().modal.showMaximize)
145
- },
146
- showMinimize: {
147
- type: Boolean as PropType<VxeModalPropTypes.ShowMinimize>,
148
- default: () => handleBooleanDefaultValue(getConfig().modal.showMinimize)
149
- },
150
- showClose: {
151
- type: Boolean as PropType<VxeModalPropTypes.ShowClose>,
152
- default: () => getConfig().modal.showClose
153
- },
154
- dblclickZoom: {
155
- type: Boolean as PropType<VxeModalPropTypes.DblclickZoom>,
156
- default: () => getConfig().modal.dblclickZoom
157
- },
158
- width: {
159
- type: [Number, String] as PropType<VxeModalPropTypes.Width>,
160
- default: () => getConfig().modal.width
161
- },
162
- height: {
163
- type: [Number, String] as PropType<VxeModalPropTypes.Height>,
164
- default: () => getConfig().modal.height
165
- },
166
- minWidth: {
167
- type: [Number, String] as PropType<VxeModalPropTypes.MinWidth>,
168
- default: () => getConfig().modal.minWidth
169
- },
170
- minHeight: {
171
- type: [Number, String] as PropType<VxeModalPropTypes.MinHeight>,
172
- default: () => getConfig().modal.minHeight
173
- },
174
- zIndex: Number as PropType<VxeModalPropTypes.ZIndex>,
175
- marginSize: {
176
- type: [Number, String] as PropType<VxeModalPropTypes.MarginSize>,
177
- default: () => getConfig().modal.marginSize
178
- },
179
- fullscreen: {
180
- type: Boolean as PropType<VxeModalPropTypes.Fullscreen>,
181
- default: () => getConfig().modal.fullscreen
182
- },
183
- draggable: {
184
- type: Boolean as PropType<VxeModalPropTypes.Draggable>,
185
- default: () => getConfig().modal.draggable
186
- },
187
- remember: {
188
- type: Boolean,
189
- default: () => getConfig().modal.remember
190
- },
191
- destroyOnClose: {
192
- type: Boolean as PropType<VxeModalPropTypes.DestroyOnClose>,
193
- default: () => getConfig().modal.destroyOnClose
194
- },
195
- showTitleOverflow: {
196
- type: Boolean as PropType<VxeModalPropTypes.ShowTitleOverflow>,
197
- default: () => getConfig().modal.showTitleOverflow
198
- },
199
- transfer: {
200
- type: Boolean as PropType<VxeModalPropTypes.Transfer>,
201
- default: () => getConfig().modal.transfer
202
- },
203
- appendTo: {
204
- type: [String, Function] as PropType<VxeModalPropTypes.AppendTo>,
205
- default: () => getConfig().modal.appendTo
206
- },
207
- isWithinAppendTo: {
208
- type: Boolean as PropType<VxeModalPropTypes.IsWithinAppendTo>,
209
- default: () => getConfig().modal.isWithinAppendTo
210
- },
211
- storage: {
212
- type: Boolean as PropType<VxeModalPropTypes.Storage>,
213
- default: () => getConfig().modal.storage
214
- },
215
- storageKey: {
216
- type: String as PropType<VxeModalPropTypes.StorageKey>,
217
- default: () => getConfig().modal.storageKey
218
- },
219
- padding: {
220
- type: Boolean as PropType<VxeModalPropTypes.Padding>,
221
- default: () => getConfig().modal.padding
222
- },
223
- size: {
224
- type: String as PropType<VxeModalPropTypes.Size>,
225
- default: () => getConfig().modal.size || getConfig().size
226
- },
227
- beforeHideMethod: Function as PropType<VxeModalPropTypes.BeforeHideMethod>,
228
- slots: Object as PropType<VxeModalPropTypes.Slots>,
229
- useScrollbar: {
230
- type: Boolean as PropType<VxeModalPropTypes.UseScrollbar>,
231
- default: () => getDefaultConfig(getConfig().modal.useScrollbar, getConfig().useScrollbar)
232
- },
233
- scrollbarConfig: Object as PropType<VxeModalPropTypes.ScrollbarConfig>,
234
-
235
- /**
236
- * 已废弃
237
- * @deprecated
238
- */
239
- message: [Number, String] as PropType<VxeModalPropTypes.Message>,
240
- /**
241
- * 已废弃
242
- * @deprecated
243
- */
244
- animat: {
245
- type: Boolean as PropType<VxeModalPropTypes.Animat>,
246
- default: () => getConfig().modal.animat
247
- }
248
- },
249
- emits: [
250
- 'update:modelValue',
251
- 'show',
252
- 'hide',
253
- 'before-hide',
254
- 'close',
255
- 'confirm',
256
- 'cancel',
257
- 'zoom',
258
- 'resize',
259
- 'move'
260
- ] as VxeModalEmits,
261
- setup (props, context) {
262
- const { slots, emit } = context
263
-
264
- const xID = XEUtils.uniqueId()
265
-
266
- const $xeParentModal = inject<(VxeModalConstructor & VxeModalMethods)| null>('$xeModal', null)
267
- const $xeDrawer = inject<(VxeDrawerConstructor & VxeDrawerMethods) | null>('$xeDrawer', null)
268
- const $xeTable = inject<(VxeTableConstructor & VxeTablePrivateMethods) | null>('$xeTable', null)
269
- const $xeForm = inject<(VxeFormConstructor & VxeFormPrivateMethods)| null>('$xeForm', null)
270
-
271
- const { computeSize } = useFns.useSize(props)
272
- const { computeIsVScrollbar } = useFns.useVScrollbar(props)
273
-
274
- const reactData = reactive(createReactData())
275
- const internalData = createInternalData()
276
-
277
- const refElem = ref<HTMLDivElement>()
278
- const refModalBox = ref() as Ref<HTMLDivElement>
279
- const refHeaderElem = ref() as Ref<HTMLDivElement>
280
- const refConfirmBtn = ref<VxeButtonInstance>()
281
- const refCancelBtn = ref<VxeButtonInstance>()
282
-
283
- const refMaps: ModalPrivateRef = {
284
- refElem
285
- }
286
-
287
- const computeBtnTransfer = computed(() => {
288
- const { transfer } = props
289
- if (transfer === null) {
290
- const globalTransfer = getConfig().modal.transfer
291
- if (XEUtils.isBoolean(globalTransfer)) {
292
- return globalTransfer
293
- }
294
- if ($xeTable || $xeParentModal || $xeDrawer || $xeForm) {
295
- return true
296
- }
297
- }
298
- return transfer
299
- })
300
-
301
- const computeIsMsg = computed(() => {
302
- const { type } = props
303
- return type === 'message' || type === 'notification'
304
- })
305
-
306
- const computeIsModal = computed(() => {
307
- return props.type === 'modal'
308
- })
309
-
310
- const computeIsMinimizeStatus = computed(() => {
311
- return reactData.zoomStatus === 'minimize'
312
- })
313
-
314
- const computeIsMaximizeStatus = computed(() => {
315
- return reactData.zoomStatus === 'maximize'
316
- })
317
-
318
- const computeZoomOpts = computed(() => {
319
- return Object.assign({}, getConfig().modal.zoomConfig, props.zoomConfig)
320
- })
321
-
322
- const computeScrollbarOpts = computed(() => {
323
- return Object.assign({}, getConfig().modal.scrollbarConfig, props.scrollbarConfig)
324
- })
325
-
326
- const computeScrollbarProps = computed(() => {
327
- const scrollbarOpts = computeScrollbarOpts.value
328
- const { viewClassName, viewInnerClassName } = scrollbarOpts
329
- return {
330
- width: scrollbarOpts.width,
331
- height: scrollbarOpts.height,
332
- autoHide: scrollbarOpts.autoHide,
333
- visible: scrollbarOpts.visible,
334
- xConfig: scrollbarOpts.xConfig,
335
- yConfig: scrollbarOpts.yConfig,
336
- className: scrollbarOpts.className,
337
- viewAttrs: scrollbarOpts.viewAttrs,
338
- viewClassName: 'vxe-modal--scrollbar-content-view' + (viewClassName ? (' ' + viewClassName) : ''),
339
- viewInnerClassName: 'vxe-modal--scrollbar-content-inner' + (viewClassName ? (' ' + viewInnerClassName) : '')
340
- }
341
- })
342
-
343
- const computeMaps: VxeModalPrivateComputed = {
344
- computeSize,
345
- computeZoomOpts
346
- }
347
-
348
- const $xeModal = {
349
- xID,
350
- props,
351
- context,
352
- reactData,
353
- internalData,
354
- getRefMaps: () => refMaps,
355
- getComputeMaps: () => computeMaps
356
- } as unknown as VxeModalConstructor & VxeModalMethods
357
-
358
- let modalMethods = {} as ModalMethods
359
-
360
- const getBox = () => {
361
- const boxElem = refModalBox.value
362
- return boxElem
363
- }
364
-
365
- const recalculate = () => {
366
- const { width, height, minWidth, minHeight } = props
367
- const isMsg = computeIsMsg.value
368
- const isMinimizeStatus = computeIsMinimizeStatus.value
369
- const boxElem = getBox()
370
- if (boxElem) {
371
- boxElem.style.width = width ? toCssUnit(width) : ''
372
- boxElem.style.height = height ? toCssUnit(height) : ''
373
- boxElem.style.minWidth = !isMsg && !isMinimizeStatus && minWidth ? (isScale(minWidth) ? (minWidth as string) : toCssUnit(minWidth)) : ''
374
- boxElem.style.minHeight = !isMsg && !isMinimizeStatus && minHeight ? (isScale(minHeight) ? (minHeight as string) : toCssUnit(minHeight)) : ''
375
- }
376
- return nextTick()
377
- }
378
-
379
- const updateZindex = () => {
380
- const { zIndex } = props
381
- const { modalZindex } = reactData
382
- if (zIndex) {
383
- reactData.modalZindex = zIndex
384
- } else {
385
- const isMsg = computeIsMsg.value
386
- if (isMsg) {
387
- if (modalZindex < getSubLastZIndex()) {
388
- reactData.modalZindex = nextSubZIndex()
389
- }
390
- } else {
391
- if (modalZindex < getLastZIndex()) {
392
- reactData.modalZindex = nextZIndex()
393
- }
394
- }
395
- }
396
- }
397
-
398
- const updatePosition = () => {
399
- return nextTick().then(() => {
400
- const { position, isWithinAppendTo } = props
401
- const el = refElem.value
402
- const boxElem = getBox()
403
- if (!boxElem) {
404
- return
405
- }
406
- const parentWrapperEl = getPopupWrapperElement(isWithinAppendTo ? el : document.body)
407
- if (!parentWrapperEl) {
408
- return
409
- }
410
- const clientVisibleWidth = parentWrapperEl.clientWidth
411
- const clientVisibleHeight = parentWrapperEl.clientHeight
412
- const marginSize = XEUtils.toNumber(props.marginSize)
413
- const isPosCenter = position === 'center'
414
- const { top, left } = XEUtils.isString(position) ? { top: position, left: position } : Object.assign({}, position)
415
- const topCenter = isPosCenter || top === 'center'
416
- const leftCenter = isPosCenter || left === 'center'
417
- let posTop = ''
418
- let posLeft = ''
419
- if (left && !leftCenter) {
420
- posLeft = toCssUnit(left)
421
- } else {
422
- posLeft = `${Math.max(marginSize, clientVisibleWidth / 2 - boxElem.offsetWidth / 2)}px`
423
- }
424
- if (top && !topCenter) {
425
- posTop = toCssUnit(top)
426
- } else {
427
- posTop = `${Math.max(marginSize, clientVisibleHeight / 2 - boxElem.offsetHeight / 2)}px`
428
- }
429
- boxElem.style.top = posTop
430
- boxElem.style.left = posLeft
431
- })
432
- }
433
-
434
- const updateStyle = () => {
435
- nextTick(() => {
436
- const { type } = props
437
- const queueList = type === 'notification' ? notifyQueue : msgQueue
438
- let offsetTop = 0
439
- queueList.forEach(comp => {
440
- const boxElem = comp.getBox()
441
- if (boxElem) {
442
- offsetTop += XEUtils.toNumber(comp.props.top)
443
- comp.reactData.modalTop = offsetTop
444
- offsetTop += boxElem.clientHeight
445
- }
446
- })
447
- })
448
- }
449
-
450
- const removeActiveQueue = () => {
451
- if (allActiveModals.indexOf($xeModal) > -1) {
452
- XEUtils.remove(allActiveModals, item => item === $xeModal)
453
- }
454
- }
455
-
456
- const removeMsgQueue = () => {
457
- const { type } = props
458
- const queueList = type === 'notification' ? notifyQueue : msgQueue
459
- if (queueList.indexOf($xeModal) > -1) {
460
- XEUtils.remove(queueList, comp => comp === $xeModal)
461
- }
462
- updateStyle()
463
- }
464
-
465
- const closeModal = (type: ModalEventTypes) => {
466
- const { remember } = props
467
- const { visible } = reactData
468
- const isMsg = computeIsMsg.value
469
- const beforeHideFn = props.beforeHideMethod || getConfig().modal.beforeHideMethod
470
- const params = { type }
471
- if (visible) {
472
- Promise.resolve(beforeHideFn ? beforeHideFn(params) : null).then((rest) => {
473
- if (!XEUtils.isError(rest)) {
474
- const el = refElem.value
475
- if (el) {
476
- el.setAttribute('data-effect', 'y')
477
- }
478
- if (isMsg) {
479
- removeMsgQueue()
480
- }
481
- reactData.contentVisible = false
482
- if (!remember) {
483
- handleRevert()
484
- }
485
- removeActiveQueue()
486
- dispatchEvent('before-hide', params, null)
487
- setTimeout(() => {
488
- reactData.visible = false
489
- emitModel(false)
490
- dispatchEvent('hide', params, null)
491
- }, 200)
492
- removeBodyLockScroll()
493
- setTimeout(() => {
494
- const el = refElem.value
495
- if (el) {
496
- el.removeAttribute('data-effect')
497
- }
498
- }, 350)
499
- }
500
- }).catch(e => e)
501
- }
502
- return nextTick()
503
- }
504
-
505
- const closeEvent = (evnt: Event) => {
506
- const type = 'close'
507
- dispatchEvent(type, { type }, evnt)
508
- closeModal(type)
509
- }
510
-
511
- const confirmEvent = (evnt: Event) => {
512
- const { confirmClosable } = props
513
- const type = 'confirm'
514
- dispatchEvent(type, { type }, evnt)
515
- if (confirmClosable) {
516
- closeModal(type)
517
- }
518
- }
519
-
520
- const cancelEvent = (evnt: Event) => {
521
- const { cancelClosable } = props
522
- const type = 'cancel'
523
- dispatchEvent(type, { type }, evnt)
524
- if (cancelClosable) {
525
- closeModal(type)
526
- }
527
- }
528
-
529
- const getStorageMap = (key: string) => {
530
- const version = getConfig().version
531
- const rest = XEUtils.toStringJSON(localStorage.getItem(key) || '')
532
- return rest && rest._v === version ? rest : { _v: version }
533
- }
534
-
535
- const hasPosStorage = () => {
536
- const { id, storage, storageKey } = props
537
- return !!(id && storage && getStorageMap(storageKey)[id])
538
- }
539
-
540
- const restorePosStorage = () => {
541
- const { id, storage, storageKey } = props
542
- if (id && storage) {
543
- const posStorage = getStorageMap(storageKey)[id]
544
- if (posStorage) {
545
- const boxElem = getBox()
546
- const [left, top, width, height, zoomLeft, zoomTop, zoomWidth, zoomHeight] = posStorage.split(',')
547
- if (boxElem) {
548
- if (left) {
549
- boxElem.style.left = `${left}px`
550
- }
551
- if (top) {
552
- boxElem.style.top = `${top}px`
553
- }
554
- if (width) {
555
- boxElem.style.width = `${width}px`
556
- }
557
- if (height) {
558
- boxElem.style.height = `${height}px`
559
- }
560
- }
561
- if (zoomLeft && zoomTop) {
562
- reactData.revertLocat = {
563
- left: zoomLeft,
564
- top: zoomTop,
565
- width: zoomWidth,
566
- height: zoomHeight
567
- }
568
- }
569
- }
570
- }
571
- }
572
-
573
- const addMsgQueue = () => {
574
- const { type } = props
575
- const queueList = type === 'notification' ? notifyQueue : msgQueue
576
- if (queueList.indexOf($xeModal) === -1) {
577
- queueList.push($xeModal)
578
- }
579
- updateStyle()
580
- }
581
-
582
- const savePosStorage = () => {
583
- const { id, storage, storageKey } = props
584
- const { zoomStatus, revertLocat } = reactData
585
- if (zoomStatus) {
586
- return
587
- }
588
- if (id && storage) {
589
- const boxElem = getBox()
590
- if (!boxElem) {
591
- return
592
- }
593
- const posStorageMap = getStorageMap(storageKey)
594
- posStorageMap[id] = ([
595
- boxElem.style.left,
596
- boxElem.style.top,
597
- boxElem.clientWidth,
598
- boxElem.clientHeight
599
- ] as (string | number)[]).concat(revertLocat
600
- ? [
601
- revertLocat.left,
602
- revertLocat.top,
603
- revertLocat.width,
604
- revertLocat.height
605
- ]
606
- : []).map(val => val ? XEUtils.toNumber(val) : '').join(',')
607
- localStorage.setItem(storageKey, XEUtils.toJSONString(posStorageMap))
608
- }
609
- }
610
-
611
- const handleMinimize = () => {
612
- const { isWithinAppendTo } = props
613
- const zoomOpts = computeZoomOpts.value
614
- const { minimizeLayout, minimizeMaxSize, minimizeHorizontalOffset, minimizeVerticalOffset, minimizeOffsetMethod } = zoomOpts
615
- const isHorizontalLayout = minimizeLayout === 'horizontal'
616
- const prevZoomStatus = reactData.zoomStatus
617
- const hlMList: VxeModalConstructor[] = []
618
- const vlMList: VxeModalConstructor[] = []
619
- allActiveModals.forEach(item => {
620
- if (item.xID !== $xeModal.xID && item.props.type === 'modal' && item.reactData.zoomStatus === 'minimize') {
621
- const itemZoomOpts = item.getComputeMaps().computeZoomOpts.value
622
- if (itemZoomOpts.minimizeLayout === 'horizontal') {
623
- hlMList.push(item)
624
- } else {
625
- vlMList.push(item)
626
- }
627
- }
628
- })
629
- const mList = isHorizontalLayout ? hlMList : vlMList
630
- // 如果配置最小化最大数量
631
- if (minimizeMaxSize && mList.length >= minimizeMaxSize) {
632
- if (VxeUI.modal) {
633
- VxeUI.modal.message({
634
- status: 'error',
635
- content: getI18n('vxe.modal.miniMaxSize', [minimizeMaxSize])
636
- })
637
- }
638
- return Promise.resolve({
639
- status: false
640
- })
641
- }
642
- reactData.prevZoomStatus = prevZoomStatus
643
- reactData.zoomStatus = 'minimize'
644
- return nextTick().then(() => {
645
- const el = refElem.value
646
- const boxElem = getBox()
647
- if (!boxElem) {
648
- return {
649
- status: false
650
- }
651
- }
652
- const headerEl = refHeaderElem.value
653
- if (!headerEl) {
654
- return {
655
- status: false
656
- }
657
- }
658
- const parentWrapperEl = getPopupWrapperElement(isWithinAppendTo ? el : document.body)
659
- if (!parentWrapperEl) {
660
- return {
661
- status: false
662
- }
663
- }
664
- const visibleHeight = parentWrapperEl.clientHeight
665
- // 如果当前处于复原状态
666
- if (!prevZoomStatus) {
667
- reactData.revertLocat = {
668
- top: boxElem.offsetTop,
669
- left: boxElem.offsetLeft,
670
- width: boxElem.offsetWidth + (boxElem.style.width ? 0 : 1),
671
- height: boxElem.offsetHeight + (boxElem.style.height ? 0 : 1)
672
- }
673
- }
674
- const targetModal = XEUtils[isHorizontalLayout ? 'max' : 'min'](mList, ($modal) => {
675
- const boxElem = $modal.getBox()
676
- return boxElem ? XEUtils.toNumber(boxElem.style[isHorizontalLayout ? 'left' : 'top']) : 0
677
- })
678
- let targetTop = visibleHeight - headerEl.offsetHeight - 16
679
- let targetLeft = 16
680
- if (targetModal) {
681
- const minBoxElem = targetModal.getBox()
682
- if (minBoxElem) {
683
- const boxLeft = XEUtils.toNumber(minBoxElem.style.left)
684
- const boxTop = XEUtils.toNumber(minBoxElem.style.top)
685
- let offsetObj: {
686
- top?: number
687
- left?: number
688
- } = {}
689
- if (isHorizontalLayout) {
690
- offsetObj = Object.assign({}, minimizeHorizontalOffset)
691
- } else {
692
- offsetObj = Object.assign({}, minimizeVerticalOffset)
693
- }
694
- targetLeft = boxLeft + XEUtils.toNumber(offsetObj.left)
695
- targetTop = boxTop + XEUtils.toNumber(offsetObj.top)
696
- if (minimizeOffsetMethod) {
697
- offsetObj = minimizeOffsetMethod({
698
- $modal: $xeModal,
699
- left: targetLeft,
700
- top: targetTop
701
- })
702
- targetLeft = XEUtils.toNumber(offsetObj.left)
703
- targetTop = XEUtils.toNumber(offsetObj.top)
704
- }
705
- }
706
- }
707
- Object.assign(boxElem.style, {
708
- top: `${targetTop}px`,
709
- left: `${targetLeft}px`,
710
- width: '200px',
711
- height: `${headerEl.offsetHeight}px`,
712
- minHeight: '',
713
- minWidth: ''
714
- })
715
- savePosStorage()
716
- return {
717
- status: true
718
- }
719
- })
720
- }
721
-
722
- const handleMaximize = () => {
723
- const { isWithinAppendTo } = props
724
- const prevZoomStatus = reactData.zoomStatus
725
- reactData.prevZoomStatus = prevZoomStatus
726
- reactData.zoomStatus = 'maximize'
727
- return nextTick().then(() => {
728
- const boxElem = getBox()
729
- if (boxElem) {
730
- // 如果当前处于复原状态
731
- if (!prevZoomStatus) {
732
- const el = refElem.value
733
- const parentWrapperEl = getPopupWrapperElement(isWithinAppendTo ? el : document.body)
734
- if (!parentWrapperEl) {
735
- return {
736
- status: false
737
- }
738
- }
739
- const clientVisibleWidth = parentWrapperEl.clientWidth
740
- const clientVisibleHeight = parentWrapperEl.clientHeight
741
- const marginSize = XEUtils.toNumber(props.marginSize)
742
- reactData.revertLocat = {
743
- top: Math.max(marginSize, clientVisibleHeight / 2 - boxElem.offsetHeight / 2),
744
- left: Math.max(marginSize, clientVisibleWidth / 2 - boxElem.offsetWidth / 2),
745
- width: boxElem.offsetWidth + (boxElem.style.width ? 0 : 1),
746
- height: boxElem.offsetHeight + (boxElem.style.height ? 0 : 1)
747
- }
748
- }
749
- Object.assign(boxElem.style, {
750
- top: '0',
751
- left: '0',
752
- width: '100%',
753
- height: '100%',
754
- minHeight: '',
755
- minWidth: ''
756
- })
757
- }
758
- savePosStorage()
759
- return {
760
- status: true
761
- }
762
- })
763
- }
764
-
765
- const handleMsgAutoClose = () => {
766
- const { duration } = props
767
- if (duration !== -1) {
768
- internalData.msgTimeout = setTimeout(() => closeModal('close'), XEUtils.toNumber(duration))
769
- }
770
- }
771
-
772
- const removeBodyLockScroll = () => {
773
- const htmlElem = document.documentElement
774
- const lockData = htmlElem.getAttribute(lockScrollAttrKey)
775
- if (lockData) {
776
- const lockList = lockData.split(',').filter(key => key !== xID)
777
- if (lockList.length) {
778
- htmlElem.setAttribute(lockScrollAttrKey, lockList.join(','))
779
- } else {
780
- htmlElem.removeAttribute(lockScrollAttrKey)
781
- htmlElem.style.removeProperty(lockScrollCssWidthKey)
782
- }
783
- }
784
- }
785
-
786
- const addBodyLockScroll = () => {
787
- const { lockScroll } = props
788
- const isMsg = computeIsMsg.value
789
- if (lockScroll && !isMsg) {
790
- const htmlElem = document.documentElement
791
- const clientWidth = document.body.clientWidth
792
- const lockData = htmlElem.getAttribute(lockScrollAttrKey)
793
- const lockList = lockData ? lockData.split(',') : []
794
- if (!lockList.includes(xID)) {
795
- lockList.push(xID)
796
- htmlElem.setAttribute(lockScrollAttrKey, lockList.join(','))
797
- }
798
- htmlElem.style.setProperty(lockScrollCssWidthKey, `${clientWidth}px`)
799
- }
800
- }
801
-
802
- const openModal = () => {
803
- const { remember, showFooter, fullscreen } = props
804
- const { initialized, visible } = reactData
805
- const isMsg = computeIsMsg.value
806
- const isModal = computeIsModal.value
807
- if (!initialized) {
808
- reactData.initialized = true
809
- }
810
- if (!visible) {
811
- addBodyLockScroll()
812
- internalData.isMoveStatus = false
813
- reactData.visible = true
814
- reactData.contentVisible = false
815
- updateZindex()
816
- allActiveModals.push($xeModal)
817
- setTimeout(() => {
818
- reactData.contentVisible = true
819
- nextTick(() => {
820
- if (!(isModal && fullscreen)) {
821
- recalculate()
822
- }
823
- if (showFooter) {
824
- const confirmBtn = refConfirmBtn.value
825
- const cancelBtn = refCancelBtn.value
826
- const operBtn = confirmBtn || cancelBtn
827
- if (operBtn) {
828
- operBtn.focus()
829
- }
830
- }
831
- const type = ''
832
- const params = { type }
833
- emitModel(true)
834
- dispatchEvent('show', params, null)
835
- })
836
- }, 10)
837
- if (isMsg) {
838
- addMsgQueue()
839
- handleMsgAutoClose()
840
- } else {
841
- nextTick(() => {
842
- const { firstOpen } = reactData
843
- const el = refElem.value
844
- if (el) {
845
- el.setAttribute('data-effect', 'y')
846
- }
847
- if (firstOpen) {
848
- reactData.firstOpen = false
849
- if (hasPosStorage()) {
850
- restorePosStorage()
851
- } else {
852
- if (isModal && fullscreen) {
853
- nextTick(() => handleMaximize())
854
- } else {
855
- recalculate()
856
- updatePosition().then(() => {
857
- setTimeout(() => updatePosition(), 20)
858
- })
859
- }
860
- }
861
- } else {
862
- if (!remember) {
863
- recalculate()
864
- updatePosition().then(() => {
865
- setTimeout(() => updatePosition(), 20)
866
- })
867
- }
868
- }
869
- })
870
- setTimeout(() => {
871
- const el = refElem.value
872
- if (el) {
873
- el.removeAttribute('data-effect')
874
- }
875
- }, 350)
876
- }
877
- }
878
- return nextTick()
879
- }
880
-
881
- const selfClickEvent = (evnt: Event) => {
882
- const el = refElem.value
883
- if (props.maskClosable && evnt.target === el) {
884
- const type = 'mask'
885
- closeModal(type)
886
- }
887
- }
888
-
889
- const selfMouseoverEvent = () => {
890
- const { msgTimeout } = internalData
891
- if (!msgTimeout) {
892
- return
893
- }
894
- const isMsg = computeIsMsg.value
895
- if (isMsg) {
896
- clearTimeout(msgTimeout)
897
- internalData.msgTimeout = undefined
898
- }
899
- }
900
-
901
- const selfMouseoutEvent = () => {
902
- const { msgTimeout } = internalData
903
- if (!msgTimeout) {
904
- const isMsg = computeIsMsg.value
905
- if (isMsg) {
906
- handleMsgAutoClose()
907
- }
908
- }
909
- }
910
-
911
- const handleGlobalKeydownEvent = (evnt: KeyboardEvent) => {
912
- const isEsc = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ESCAPE)
913
- if (isEsc) {
914
- const lastModal = XEUtils.max(allActiveModals.filter(item => item.reactData.zoomStatus !== 'minimize'), (item) => item.reactData.modalZindex)
915
- // 多个时,只关掉最上层的窗口
916
- if (lastModal) {
917
- setTimeout(() => {
918
- if (lastModal === $xeModal && lastModal.props.escClosable) {
919
- const type = 'exit'
920
- dispatchEvent('close', { type }, evnt)
921
- closeModal(type)
922
- }
923
- }, 10)
924
- }
925
- }
926
- }
927
-
928
- const handleGlobalResizeEvent = () => {
929
- if (!internalData.isMoveStatus) {
930
- updatePosition()
931
- }
932
- }
933
-
934
- const isMinimized = () => {
935
- return reactData.zoomStatus === 'minimize'
936
- }
937
-
938
- const isMaximized = () => {
939
- return reactData.zoomStatus === 'maximize'
940
- }
941
-
942
- const handleRevert = () => {
943
- reactData.prevZoomStatus = reactData.zoomStatus
944
- reactData.zoomStatus = ''
945
- return nextTick().then(() => {
946
- const { revertLocat } = reactData
947
- if (revertLocat) {
948
- const boxElem = getBox()
949
- reactData.revertLocat = null
950
- if (boxElem) {
951
- Object.assign(boxElem.style, {
952
- top: `${revertLocat.top}px`,
953
- left: `${revertLocat.left}px`,
954
- width: `${revertLocat.width}px`,
955
- height: `${revertLocat.height}px`
956
- })
957
- }
958
- savePosStorage()
959
- return nextTick().then(() => {
960
- return {
961
- status: true
962
- }
963
- })
964
- }
965
- return {
966
- status: false
967
- }
968
- })
969
- }
970
-
971
- const handleZoom = (type?: 'minimize' | 'revert' | 'maximize') => {
972
- const { zoomStatus } = reactData
973
- return new Promise(resolve => {
974
- if (type) {
975
- if (type === 'maximize') {
976
- resolve(handleMaximize())
977
- return
978
- }
979
- if (type === 'minimize') {
980
- resolve(handleMinimize())
981
- return
982
- }
983
- resolve(handleRevert())
984
- return
985
- }
986
- resolve(zoomStatus ? handleRevert() : handleMaximize())
987
- }).then(() => {
988
- return reactData.zoomStatus || 'revert'
989
- })
990
- }
991
-
992
- const toggleZoomMinEvent = (evnt: Event) => {
993
- const { zoomStatus, prevZoomStatus } = reactData
994
- return handleZoom(zoomStatus === 'minimize' ? (prevZoomStatus || 'revert') : 'minimize').then((type) => {
995
- const params = { type }
996
- dispatchEvent('zoom', params, evnt)
997
- })
998
- }
999
-
1000
- const toggleZoomMaxEvent = (evnt: Event) => {
1001
- return handleZoom().then((type) => {
1002
- const params = { type }
1003
- dispatchEvent('zoom', params, evnt)
1004
- })
1005
- }
1006
-
1007
- const getPosition = () => {
1008
- const isMsg = computeIsMsg.value
1009
- if (!isMsg) {
1010
- const boxElem = getBox()
1011
- if (boxElem) {
1012
- return {
1013
- top: boxElem.offsetTop,
1014
- left: boxElem.offsetLeft
1015
- }
1016
- }
1017
- }
1018
- return null
1019
- }
1020
-
1021
- const setPosition = (top?: number, left?: number) => {
1022
- const isMsg = computeIsMsg.value
1023
- if (!isMsg) {
1024
- const boxElem = getBox()
1025
- if (boxElem) {
1026
- if (XEUtils.isNumber(top)) {
1027
- boxElem.style.top = `${top}px`
1028
- }
1029
- if (XEUtils.isNumber(left)) {
1030
- boxElem.style.left = `${left}px`
1031
- }
1032
- }
1033
- }
1034
- return nextTick()
1035
- }
1036
-
1037
- const boxMousedownEvent = () => {
1038
- const { modalZindex } = reactData
1039
- if (allActiveModals.some(comp => comp.reactData.visible && comp.reactData.modalZindex > modalZindex)) {
1040
- updateZindex()
1041
- }
1042
- }
1043
-
1044
- const mousedownEvent = (evnt: MouseEvent) => {
1045
- const { storage, isWithinAppendTo } = props
1046
- const { zoomStatus } = reactData
1047
- const marginSize = XEUtils.toNumber(props.marginSize)
1048
- const boxElem = getBox()
1049
- if (!boxElem) {
1050
- return
1051
- }
1052
- if (zoomStatus !== 'maximize' && evnt.button === 0 && !getEventTargetNode(evnt, boxElem, 'trigger--btn').flag) {
1053
- evnt.preventDefault()
1054
- const el = refElem.value
1055
- const parentWrapperEl = getPopupWrapperElement(isWithinAppendTo ? el : document.body)
1056
- if (!parentWrapperEl) {
1057
- return
1058
- }
1059
- const visibleWidth = parentWrapperEl.clientWidth
1060
- const visibleHeight = parentWrapperEl.clientHeight
1061
- const disX = evnt.clientX - boxElem.offsetLeft
1062
- const disY = evnt.clientY - boxElem.offsetTop
1063
- document.onmousemove = evnt => {
1064
- evnt.preventDefault()
1065
- const offsetWidth = boxElem.offsetWidth
1066
- const offsetHeight = boxElem.offsetHeight
1067
- const minX = marginSize
1068
- const maxX = visibleWidth - offsetWidth - marginSize - 1
1069
- const minY = marginSize
1070
- const maxY = visibleHeight - offsetHeight - marginSize - 1
1071
- let left = evnt.clientX - disX
1072
- let top = evnt.clientY - disY
1073
- if (left > maxX) {
1074
- left = maxX
1075
- }
1076
- if (left < minX) {
1077
- left = minX
1078
- }
1079
- if (top > maxY) {
1080
- top = maxY
1081
- }
1082
- if (top < minY) {
1083
- top = minY
1084
- }
1085
- boxElem.style.left = `${left}px`
1086
- boxElem.style.top = `${top}px`
1087
- boxElem.className = boxElem.className.replace(/\s?is--drag/, '') + ' is--drag'
1088
- dispatchEvent('move', { type: 'move' }, evnt)
1089
- internalData.isMoveStatus = true
1090
- reactData.resizeFlag++
1091
- }
1092
- document.onmouseup = () => {
1093
- document.onmousemove = null
1094
- document.onmouseup = null
1095
- if (storage) {
1096
- nextTick(() => {
1097
- savePosStorage()
1098
- })
1099
- }
1100
- reactData.resizeFlag++
1101
- setTimeout(() => {
1102
- boxElem.className = boxElem.className.replace(/\s?is--drag/, '')
1103
- }, 50)
1104
- }
1105
- }
1106
- }
1107
-
1108
- const dragEvent = (evnt: MouseEvent) => {
1109
- evnt.preventDefault()
1110
- const { minWidth, minHeight, storage, isWithinAppendTo } = props
1111
- const el = refElem.value
1112
- const parentWrapperEl = getPopupWrapperElement(isWithinAppendTo ? el : document.body)
1113
- if (!parentWrapperEl) {
1114
- return
1115
- }
1116
- const visibleWidth = parentWrapperEl.clientWidth
1117
- const visibleHeight = parentWrapperEl.clientHeight
1118
- const marginSize = XEUtils.toNumber(props.marginSize)
1119
- const targetElem = evnt.target as HTMLSpanElement
1120
- const type = targetElem.getAttribute('data-type')
1121
- const dragMinWidth = isScale(minWidth) ? (XEUtils.toNumber(minWidth) * visibleWidth / 100) : XEUtils.toNumber(minWidth)
1122
- const dragMinHeight = isScale(minHeight) ? (XEUtils.toNumber(minHeight) * visibleHeight / 100) : XEUtils.toNumber(minHeight)
1123
- const maxWidth = visibleWidth
1124
- const maxHeight = visibleHeight
1125
- const boxElem = getBox()
1126
- const clientWidth = boxElem.clientWidth
1127
- const clientHeight = boxElem.clientHeight
1128
- const disX = evnt.clientX
1129
- const disY = evnt.clientY
1130
- const offsetTop = boxElem.offsetTop
1131
- const offsetLeft = boxElem.offsetLeft
1132
- const params = { type: 'resize' }
1133
- document.onmousemove = evnt => {
1134
- evnt.preventDefault()
1135
- let dragLeft
1136
- let dragTop
1137
- let width
1138
- let height
1139
- switch (type) {
1140
- case 'wl':
1141
- dragLeft = disX - evnt.clientX
1142
- width = dragLeft + clientWidth
1143
- if (offsetLeft - dragLeft > marginSize) {
1144
- if (width > dragMinWidth) {
1145
- boxElem.style.width = `${width < maxWidth ? width : maxWidth}px`
1146
- boxElem.style.left = `${offsetLeft - dragLeft}px`
1147
- }
1148
- }
1149
- break
1150
- case 'swst':
1151
- dragLeft = disX - evnt.clientX
1152
- dragTop = disY - evnt.clientY
1153
- width = dragLeft + clientWidth
1154
- height = dragTop + clientHeight
1155
- if (offsetLeft - dragLeft > marginSize) {
1156
- if (width > dragMinWidth) {
1157
- boxElem.style.width = `${width < maxWidth ? width : maxWidth}px`
1158
- boxElem.style.left = `${offsetLeft - dragLeft}px`
1159
- }
1160
- }
1161
- if (offsetTop - dragTop > marginSize) {
1162
- if (height > dragMinHeight) {
1163
- boxElem.style.height = `${height < maxHeight ? height : maxHeight}px`
1164
- boxElem.style.top = `${offsetTop - dragTop}px`
1165
- }
1166
- }
1167
- break
1168
- case 'swlb':
1169
- dragLeft = disX - evnt.clientX
1170
- dragTop = evnt.clientY - disY
1171
- width = dragLeft + clientWidth
1172
- height = dragTop + clientHeight
1173
- if (offsetLeft - dragLeft > marginSize) {
1174
- if (width > dragMinWidth) {
1175
- boxElem.style.width = `${width < maxWidth ? width : maxWidth}px`
1176
- boxElem.style.left = `${offsetLeft - dragLeft}px`
1177
- }
1178
- }
1179
- if (offsetTop + height + marginSize < visibleHeight) {
1180
- if (height > dragMinHeight) {
1181
- boxElem.style.height = `${height < maxHeight ? height : maxHeight}px`
1182
- }
1183
- }
1184
- break
1185
- case 'st':
1186
- dragTop = disY - evnt.clientY
1187
- height = clientHeight + dragTop
1188
- if (offsetTop - dragTop > marginSize) {
1189
- if (height > dragMinHeight) {
1190
- boxElem.style.height = `${height < maxHeight ? height : maxHeight}px`
1191
- boxElem.style.top = `${offsetTop - dragTop}px`
1192
- }
1193
- }
1194
- break
1195
- case 'wr':
1196
- dragLeft = evnt.clientX - disX
1197
- width = dragLeft + clientWidth
1198
- if (offsetLeft + width + marginSize < visibleWidth) {
1199
- if (width > dragMinWidth) {
1200
- boxElem.style.width = `${width < maxWidth ? width : maxWidth}px`
1201
- }
1202
- }
1203
- break
1204
- case 'sest':
1205
- dragLeft = evnt.clientX - disX
1206
- dragTop = disY - evnt.clientY
1207
- width = dragLeft + clientWidth
1208
- height = dragTop + clientHeight
1209
- if (offsetLeft + width + marginSize < visibleWidth) {
1210
- if (width > dragMinWidth) {
1211
- boxElem.style.width = `${width < maxWidth ? width : maxWidth}px`
1212
- }
1213
- }
1214
- if (offsetTop - dragTop > marginSize) {
1215
- if (height > dragMinHeight) {
1216
- boxElem.style.height = `${height < maxHeight ? height : maxHeight}px`
1217
- boxElem.style.top = `${offsetTop - dragTop}px`
1218
- }
1219
- }
1220
- break
1221
- case 'selb':
1222
- dragLeft = evnt.clientX - disX
1223
- dragTop = evnt.clientY - disY
1224
- width = dragLeft + clientWidth
1225
- height = dragTop + clientHeight
1226
- if (offsetLeft + width + marginSize < visibleWidth) {
1227
- if (width > dragMinWidth) {
1228
- boxElem.style.width = `${width < maxWidth ? width : maxWidth}px`
1229
- }
1230
- }
1231
- if (offsetTop + height + marginSize < visibleHeight) {
1232
- if (height > dragMinHeight) {
1233
- boxElem.style.height = `${height < maxHeight ? height : maxHeight}px`
1234
- }
1235
- }
1236
- break
1237
- case 'sb':
1238
- dragTop = evnt.clientY - disY
1239
- height = dragTop + clientHeight
1240
- if (offsetTop + height + marginSize < visibleHeight) {
1241
- if (height > dragMinHeight) {
1242
- boxElem.style.height = `${height < maxHeight ? height : maxHeight}px`
1243
- }
1244
- }
1245
- break
1246
- }
1247
- boxElem.className = boxElem.className.replace(/\s?is--drag/, '') + ' is--drag'
1248
- if (storage) {
1249
- savePosStorage()
1250
- }
1251
- dispatchEvent('resize', params, evnt)
1252
- }
1253
- document.onmouseup = () => {
1254
- reactData.revertLocat = null
1255
- document.onmousemove = null
1256
- document.onmouseup = null
1257
- setTimeout(() => {
1258
- boxElem.className = boxElem.className.replace(/\s?is--drag/, '')
1259
- }, 50)
1260
- }
1261
- }
1262
-
1263
- const dispatchEvent = (type: ValueOf<VxeModalEmits>, params: Record<string, any>, evnt: Event | null) => {
1264
- emit(type, createEvent(evnt, { $modal: $xeModal }, params))
1265
- }
1266
-
1267
- const emitModel = (value: any) => {
1268
- emit('update:modelValue', value)
1269
- }
1270
-
1271
- modalMethods = {
1272
- dispatchEvent,
1273
- open: openModal,
1274
- close () {
1275
- return closeModal('close')
1276
- },
1277
- getBox,
1278
- getPosition,
1279
- setPosition,
1280
- isMinimized,
1281
- isMaximized,
1282
- zoom () {
1283
- return handleZoom()
1284
- },
1285
- minimize () {
1286
- const { visible } = reactData
1287
- const isModal = computeIsModal.value
1288
- if (!isModal || !visible) {
1289
- return Promise.resolve({
1290
- status: false
1291
- })
1292
- }
1293
- return handleMinimize()
1294
- },
1295
- maximize () {
1296
- const { visible } = reactData
1297
- const isModal = computeIsModal.value
1298
- if (!isModal || !visible) {
1299
- return Promise.resolve({
1300
- status: false
1301
- })
1302
- }
1303
- return handleMaximize()
1304
- },
1305
- revert () {
1306
- const { visible } = reactData
1307
- const isModal = computeIsModal.value
1308
- if (!isModal || !visible) {
1309
- return Promise.resolve({
1310
- status: false
1311
- })
1312
- }
1313
- return handleRevert()
1314
- }
1315
- }
1316
-
1317
- Object.assign($xeModal, modalMethods)
1318
-
1319
- const renderTitles = () => {
1320
- const { slots: propSlots = {}, showClose, showZoom, showMaximize, showMinimize, title } = props
1321
- const { zoomStatus } = reactData
1322
- const titleSlot = slots.title || propSlots.title
1323
- const cornerSlot = slots.corner || propSlots.corner
1324
- const isMinimizeStatus = computeIsMinimizeStatus.value
1325
- const isMaximizeStatus = computeIsMaximizeStatus.value
1326
- return [
1327
- h('div', {
1328
- class: 'vxe-modal--header-title'
1329
- }, titleSlot
1330
- ? getSlotVNs(titleSlot({
1331
- $modal: $xeModal,
1332
- minimized: isMinimizeStatus,
1333
- maximized: isMaximizeStatus
1334
- }))
1335
- : (title ? getFuncText(title) : getI18n('vxe.alert.title'))),
1336
- h('div', {
1337
- class: 'vxe-modal--header-right'
1338
- }, [
1339
- cornerSlot && !isMinimizeStatus
1340
- ? h('div', {
1341
- class: 'vxe-modal--corner-wrapper'
1342
- }, getSlotVNs(cornerSlot({ $modal: $xeModal })))
1343
- : renderEmptyElement($xeModal),
1344
- (XEUtils.isBoolean(showMinimize) ? showMinimize : showZoom)
1345
- ? h('div', {
1346
- class: ['vxe-modal--zoom-btn', 'trigger--btn'],
1347
- title: getI18n(`vxe.modal.zoom${zoomStatus === 'minimize' ? 'Out' : 'Min'}`),
1348
- onClick: toggleZoomMinEvent
1349
- }, [
1350
- h('i', {
1351
- class: zoomStatus === 'minimize' ? getIcon().MODAL_ZOOM_REVERT : getIcon().MODAL_ZOOM_MIN
1352
- })
1353
- ])
1354
- : renderEmptyElement($xeModal),
1355
- (XEUtils.isBoolean(showMaximize) ? showMaximize : showZoom) && zoomStatus !== 'minimize'
1356
- ? h('div', {
1357
- class: ['vxe-modal--zoom-btn', 'trigger--btn'],
1358
- title: getI18n(`vxe.modal.zoom${zoomStatus === 'maximize' ? 'Out' : 'In'}`),
1359
- onClick: toggleZoomMaxEvent
1360
- }, [
1361
- h('i', {
1362
- class: zoomStatus === 'maximize' ? getIcon().MODAL_ZOOM_OUT : getIcon().MODAL_ZOOM_IN
1363
- })
1364
- ])
1365
- : renderEmptyElement($xeModal),
1366
- showClose
1367
- ? h('div', {
1368
- class: ['vxe-modal--close-btn', 'trigger--btn'],
1369
- title: getI18n('vxe.modal.close'),
1370
- onClick: closeEvent
1371
- }, [
1372
- h('i', {
1373
- class: getIcon().MODAL_CLOSE
1374
- })
1375
- ])
1376
- : renderEmptyElement($xeModal)
1377
- ])
1378
- ]
1379
- }
1380
-
1381
- const renderHeader = () => {
1382
- const { slots: propSlots = {}, showZoom, showMaximize, draggable } = props
1383
- const headerSlot = slots.header || propSlots.header
1384
- if (props.showHeader) {
1385
- const headerOns: Record<string, any> = {}
1386
- if (draggable) {
1387
- headerOns.onMousedown = mousedownEvent
1388
- }
1389
- if ((XEUtils.isBoolean(showMaximize) ? showMaximize : showZoom) && props.dblclickZoom && props.type === 'modal') {
1390
- headerOns.onDblclick = toggleZoomMaxEvent
1391
- }
1392
- return h('div', {
1393
- ref: refHeaderElem,
1394
- class: ['vxe-modal--header', {
1395
- 'is--ellipsis': props.showTitleOverflow
1396
- }],
1397
- ...headerOns
1398
- }, headerSlot ? getSlotVNs(headerSlot({ $modal: $xeModal })) : renderTitles())
1399
- }
1400
- return renderEmptyElement($xeModal)
1401
- }
1402
-
1403
- const renderBody = () => {
1404
- const { slots: propSlots = {}, status, message, iconStatus, useHtml } = props
1405
- const content = props.content || message
1406
- const isVScrollbar = computeIsVScrollbar.value
1407
- const isMsg = computeIsMsg.value
1408
- const scrollbarProps = computeScrollbarProps.value
1409
- const defaultSlot = slots.default || propSlots.default
1410
- const leftSlot = slots.left || propSlots.left
1411
- const rightSlot = slots.right || propSlots.right
1412
- const contVNs: VNode[] = []
1413
- if (!isMsg && (status || iconStatus)) {
1414
- contVNs.push(
1415
- h('div', {
1416
- class: 'vxe-modal--status-wrapper'
1417
- }, [
1418
- h('i', {
1419
- class: ['vxe-modal--status-icon', iconStatus || getIcon()[`MODAL_${status}`.toLocaleUpperCase() as 'MODAL_SUCCESS' | 'MODAL_ERROR']]
1420
- })
1421
- ])
1422
- )
1423
- }
1424
-
1425
- if (useHtml && !defaultSlot) {
1426
- contVNs.push(
1427
- isVScrollbar
1428
- ? h(VxeScrollbarComponent, {
1429
- key: 'shc',
1430
- class: 'vxe-modal--scrollbar-content',
1431
- ...scrollbarProps
1432
- }, {
1433
- default () {
1434
- return [
1435
- h('div', {
1436
- class: 'vxe-modal--scrollbar-content-html',
1437
- innerHTML: getFuncText(content)
1438
- })
1439
- ]
1440
- }
1441
- })
1442
- : h('div', {
1443
- key: 'hc',
1444
- class: 'vxe-modal--content',
1445
- innerHTML: getFuncText(content)
1446
- })
1447
- )
1448
- } else {
1449
- contVNs.push(
1450
- isVScrollbar
1451
- ? h(VxeScrollbarComponent, {
1452
- key: 'sdc',
1453
- class: 'vxe-modal--scrollbar-content',
1454
- ...scrollbarProps
1455
- }, {
1456
- default: () => defaultSlot ? getSlotVNs(defaultSlot({ $modal: $xeModal })) : getFuncText(content)
1457
- })
1458
- : h('div', {
1459
- key: 'dc',
1460
- class: 'vxe-modal--content'
1461
- }, defaultSlot ? getSlotVNs(defaultSlot({ $modal: $xeModal })) : getFuncText(content))
1462
- )
1463
- }
1464
-
1465
- return h('div', {
1466
- class: 'vxe-modal--body'
1467
- }, [
1468
- leftSlot
1469
- ? h('div', {
1470
- class: 'vxe-modal--body-left'
1471
- }, getSlotVNs(leftSlot({ $modal: $xeModal })))
1472
- : renderEmptyElement($xeModal),
1473
- h('div', {
1474
- class: 'vxe-modal--body-default'
1475
- }, contVNs),
1476
- rightSlot
1477
- ? h('div', {
1478
- class: 'vxe-modal--body-right'
1479
- }, getSlotVNs(rightSlot({ $modal: $xeModal })))
1480
- : renderEmptyElement($xeModal),
1481
- isMsg
1482
- ? renderEmptyElement($xeModal)
1483
- : h(VxeLoadingComponent, {
1484
- class: 'vxe-modal--loading',
1485
- modelValue: props.loading
1486
- })
1487
- ])
1488
- }
1489
-
1490
- const renderDefaultFooter = () => {
1491
- const { slots: propSlots = {}, showCancelButton, showConfirmButton, type, loading } = props
1492
- const lfSlot = slots.leftfoot || propSlots.leftfoot
1493
- const rfSlot = slots.rightfoot || propSlots.rightfoot
1494
- const btnVNs = []
1495
- if (XEUtils.isBoolean(showCancelButton) ? showCancelButton : type === 'confirm') {
1496
- btnVNs.push(
1497
- h(VxeButtonComponent, {
1498
- key: 1,
1499
- ref: refCancelBtn,
1500
- content: props.cancelButtonText || getI18n('vxe.button.cancel'),
1501
- onClick: cancelEvent
1502
- })
1503
- )
1504
- }
1505
- if (XEUtils.isBoolean(showConfirmButton) ? showConfirmButton : (type === 'confirm' || type === 'alert')) {
1506
- btnVNs.push(
1507
- h(VxeButtonComponent, {
1508
- key: 2,
1509
- ref: refConfirmBtn,
1510
- loading: loading,
1511
- status: 'primary',
1512
- content: props.confirmButtonText || getI18n('vxe.button.confirm'),
1513
- onClick: confirmEvent
1514
- })
1515
- )
1516
- }
1517
- return h('div', {
1518
- class: 'vxe-modal--footer-wrapper'
1519
- }, [
1520
- h('div', {
1521
- class: 'vxe-modal--footer-left'
1522
- }, lfSlot ? getSlotVNs(lfSlot({ $modal: $xeModal })) : []),
1523
- h('div', {
1524
- class: 'vxe-modal--footer-right'
1525
- }, rfSlot ? getSlotVNs(rfSlot({ $modal: $xeModal })) : btnVNs)
1526
- ])
1527
- }
1528
-
1529
- const renderFooter = () => {
1530
- const { slots: propSlots = {} } = props
1531
- const footerSlot = slots.footer || propSlots.footer
1532
- if (props.showFooter) {
1533
- return h('div', {
1534
- class: 'vxe-modal--footer'
1535
- }, footerSlot ? getSlotVNs(footerSlot({ $modal: $xeModal })) : [renderDefaultFooter()])
1536
- }
1537
- return renderEmptyElement($xeModal)
1538
- }
1539
-
1540
- const renderVN = () => {
1541
- const { border, showTitleBackground, slots: propSlots = {}, className, type, animat, draggable, iconStatus, position, loading, destroyOnClose, status, lockScroll, padding, lockView, mask, resize, appendTo, isWithinAppendTo } = props
1542
- const { initialized, modalTop, contentVisible, visible, zoomStatus } = reactData
1543
- const asideSlot = slots.aside || propSlots.aside
1544
- const vSize = computeSize.value
1545
- const isMsg = computeIsMsg.value
1546
- const isMinimizeStatus = computeIsMinimizeStatus.value
1547
- const btnTransfer = computeBtnTransfer.value
1548
- const ons: Record<string, any> = {}
1549
- if (isMsg) {
1550
- ons.onMouseover = selfMouseoverEvent
1551
- ons.onMouseout = selfMouseoutEvent
1552
- }
1553
- return h(Teleport, {
1554
- to: getPopupContainer(appendTo),
1555
- disabled: btnTransfer ? !initialized : true
1556
- }, [
1557
- h('div', {
1558
- ref: refElem,
1559
- class: ['vxe-modal--wrapper', `type--${type}`, `zoom--${zoomStatus || 'revert'}`, position ? `pos--${position}` : '', isWithinAppendTo ? 'ctx--within' : 'ctx--free', className || '', {
1560
- [`size--${vSize}`]: vSize,
1561
- [`status--${status}`]: status,
1562
- 'is--padding': padding,
1563
- 'is--border': border,
1564
- 'is--title-bg': showTitleBackground,
1565
- 'is--animat': animat,
1566
- 'lock--scroll': lockScroll,
1567
- 'lock--view': lockView,
1568
- 'is--draggable': draggable,
1569
- 'is--resize': resize,
1570
- 'is--mask': mask,
1571
- 'is--visible': contentVisible,
1572
- 'is--active': visible,
1573
- 'is--loading': loading
1574
- }],
1575
- style: {
1576
- zIndex: reactData.modalZindex,
1577
- top: modalTop ? `${modalTop}px` : null
1578
- },
1579
- onClick: selfClickEvent,
1580
- ...ons
1581
- }, [
1582
- h('div', {
1583
- ref: refModalBox,
1584
- class: 'vxe-modal--box',
1585
- onMousedown: boxMousedownEvent
1586
- }, [
1587
- (isMsg || asideSlot) && !isMinimizeStatus
1588
- ? h('div', {
1589
- class: 'vxe-modal--aside'
1590
- },
1591
- asideSlot
1592
- ? getSlotVNs(asideSlot({ $modal: $xeModal }))
1593
- : [
1594
- status || iconStatus
1595
- ? h('div', {
1596
- class: 'vxe-modal--status-wrapper'
1597
- }, [
1598
- h('i', {
1599
- class: ['vxe-modal--status-icon', iconStatus || getIcon()[`MODAL_${status}`.toLocaleUpperCase() as 'MODAL_SUCCESS' | 'MODAL_ERROR']]
1600
- })
1601
- ])
1602
- : renderEmptyElement($xeModal)
1603
- ]
1604
- )
1605
- : renderEmptyElement($xeModal),
1606
- h('div', {
1607
- class: 'vxe-modal--container'
1608
- }, !reactData.initialized || (destroyOnClose && !reactData.visible)
1609
- ? []
1610
- : [
1611
- renderHeader(),
1612
- renderBody(),
1613
- renderFooter(),
1614
- !isMsg && resize
1615
- ? h('span', {
1616
- class: 'vxe-modal--resize'
1617
- }, ['wl', 'wr', 'swst', 'sest', 'st', 'swlb', 'selb', 'sb'].map(type => {
1618
- return h('span', {
1619
- class: `${type}-resize`,
1620
- 'data-type': type,
1621
- onMousedown: dragEvent
1622
- })
1623
- }))
1624
- : renderEmptyElement($xeModal)
1625
- ])
1626
- ])
1627
- ])
1628
- ])
1629
- }
1630
-
1631
- $xeModal.renderVN = renderVN
1632
-
1633
- watch(() => props.width, recalculate)
1634
- watch(() => props.height, recalculate)
1635
-
1636
- watch(() => props.modelValue, (value) => {
1637
- if (value) {
1638
- openModal()
1639
- } else {
1640
- closeModal('model')
1641
- }
1642
- })
1643
-
1644
- onMounted(() => {
1645
- if (props.type === 'modal' && props.showFooter && !(props.showConfirmButton || props.showCancelButton || slots.footer)) {
1646
- warnLog('vxe.modal.footPropErr')
1647
- }
1648
- reactData.initialized = !!props.preload
1649
- nextTick(() => {
1650
- if (props.storage && !props.id) {
1651
- errLog('vxe.error.reqProp', ['id'])
1652
- }
1653
- if (props.modelValue) {
1654
- openModal()
1655
- }
1656
- recalculate()
1657
- })
1658
- if (props.escClosable) {
1659
- globalEvents.on($xeModal, 'keydown', handleGlobalKeydownEvent)
1660
- }
1661
- globalEvents.on($xeModal, 'resize', handleGlobalResizeEvent)
1662
- })
1663
-
1664
- onUnmounted(() => {
1665
- globalEvents.off($xeModal, 'keydown')
1666
- globalEvents.off($xeModal, 'resize')
1667
- removeMsgQueue()
1668
- removeActiveQueue()
1669
- removeBodyLockScroll()
1670
- XEUtils.assign(reactData, createReactData())
1671
- XEUtils.assign(internalData, createInternalData())
1672
- })
1673
-
1674
- provide('$xeModal', $xeModal)
1675
-
1676
- return $xeModal
1677
- },
1678
- render () {
1679
- return this.renderVN()
1680
- }
1681
- })
1
+ import { h, Teleport, ref, Ref, inject, computed, reactive, provide, nextTick, watch, PropType, VNode, onMounted, onUnmounted } from 'vue'
2
+ import { defineVxeComponent } from '../../ui/src/comp'
3
+ import XEUtils from 'xe-utils'
4
+ import { getEventTargetNode, getPopupContainer, getPopupWrapperElement, isScale, toCssUnit } from '../../ui/src/dom'
5
+ import { getLastZIndex, nextZIndex, getSubLastZIndex, nextSubZIndex, getFuncText, handleBooleanDefaultValue, getDefaultConfig } from '../../ui/src/utils'
6
+ import { VxeUI } from '@vxe-ui/core'
7
+ import { getSlotVNs } from '../../ui/src/vn'
8
+ import { createComponentLog } from '../../ui/src/log'
9
+ import { allActiveModals } from './store'
10
+ import VxeButtonComponent from '../../button'
11
+ import VxeLoadingComponent from '../../loading'
12
+ import VxeScrollbarComponent from '../../scrollbar'
13
+
14
+ import type {
15
+ VxeModalConstructor,
16
+ VxeModalPropTypes,
17
+ ModalReactData,
18
+ ModalInternalData,
19
+ VxeModalEmits,
20
+ VxeModalPrivateComputed,
21
+ ModalEventTypes,
22
+ VxeButtonInstance,
23
+ ModalMethods,
24
+ ModalPrivateRef,
25
+ VxeModalMethods,
26
+ ValueOf,
27
+ VxeDrawerConstructor,
28
+ VxeDrawerMethods,
29
+ VxeFormConstructor,
30
+ VxeFormPrivateMethods
31
+ } from '../../../types'
32
+ import type { VxeTableConstructor, VxeTablePrivateMethods } from '../../../types/components/table'
33
+
34
+ const { getConfig, getIcon, getI18n, globalEvents, GLOBAL_EVENT_KEYS, createEvent, useFns, renderEmptyElement } = VxeUI
35
+
36
+ const { warnLog, errLog } = createComponentLog('modal')
37
+
38
+ function createInternalData(): ModalInternalData {
39
+ return {
40
+ // msgTimeout: undefined,
41
+ isMoveStatus: false
42
+ }
43
+ }
44
+
45
+ function createReactData(): ModalReactData {
46
+ return {
47
+ initialized: false,
48
+ visible: false,
49
+ contentVisible: false,
50
+ modalTop: 0,
51
+ modalZindex: 0,
52
+ prevZoomStatus: '',
53
+ zoomStatus: '',
54
+ revertLocat: null,
55
+ prevLocat: null,
56
+ firstOpen: true,
57
+ resizeFlag: 1
58
+ }
59
+ }
60
+
61
+ const msgQueue: VxeModalConstructor[] = []
62
+ const notifyQueue: VxeModalConstructor[] = []
63
+
64
+ const lockScrollAttrKey = 'data-vxe-lock-scroll'
65
+ const lockScrollCssWidthKey = '--vxe-ui-modal-lock-scroll-view-width'
66
+
67
+ export default defineVxeComponent({
68
+ name: 'VxeModal',
69
+ props: {
70
+ modelValue: Boolean as PropType<VxeModalPropTypes.ModelValue>,
71
+ id: String as PropType<VxeModalPropTypes.ID>,
72
+ type: {
73
+ type: String as PropType<VxeModalPropTypes.Type>,
74
+ default: 'modal'
75
+ },
76
+ loading: {
77
+ type: Boolean as PropType<VxeModalPropTypes.Loading>,
78
+ default: null
79
+ },
80
+ status: String as PropType<VxeModalPropTypes.Status>,
81
+ iconStatus: String as PropType<VxeModalPropTypes.IconStatus>,
82
+ className: String as PropType<VxeModalPropTypes.ClassName>,
83
+ top: {
84
+ type: [Number, String] as PropType<VxeModalPropTypes.Top>,
85
+ default: () => getConfig().modal.top
86
+ },
87
+ position: [String, Object] as PropType<VxeModalPropTypes.Position>,
88
+ title: String as PropType<VxeModalPropTypes.Title>,
89
+ duration: {
90
+ type: [Number, String] as PropType<VxeModalPropTypes.Duration>,
91
+ default: () => getConfig().modal.duration
92
+ },
93
+ content: [Number, String] as PropType<VxeModalPropTypes.Content>,
94
+ useHtml: {
95
+ type: Boolean as PropType<VxeModalPropTypes.UseHtml>,
96
+ default: () => getConfig().modal.useHtml
97
+ },
98
+ showCancelButton: {
99
+ type: Boolean as PropType<VxeModalPropTypes.ShowCancelButton>,
100
+ default: null
101
+ },
102
+ cancelButtonText: {
103
+ type: String as PropType<VxeModalPropTypes.CancelButtonText>,
104
+ default: () => getConfig().modal.cancelButtonText
105
+ },
106
+ showConfirmButton: {
107
+ type: Boolean as PropType<VxeModalPropTypes.ShowConfirmButton>,
108
+ default: () => getConfig().modal.showConfirmButton
109
+ },
110
+ confirmButtonText: {
111
+ type: String as PropType<VxeModalPropTypes.ConfirmButtonText>,
112
+ default: () => getConfig().modal.confirmButtonText
113
+ },
114
+ lockView: {
115
+ type: Boolean as PropType<VxeModalPropTypes.LockView>,
116
+ default: () => getConfig().modal.lockView
117
+ },
118
+ lockScroll: Boolean as PropType<VxeModalPropTypes.LockScroll>,
119
+ mask: {
120
+ type: Boolean as PropType<VxeModalPropTypes.Mask>,
121
+ default: () => getConfig().modal.mask
122
+ },
123
+ maskClosable: {
124
+ type: Boolean as PropType<VxeModalPropTypes.MaskClosable>,
125
+ default: () => getConfig().modal.maskClosable
126
+ },
127
+ escClosable: {
128
+ type: Boolean as PropType<VxeModalPropTypes.EscClosable>,
129
+ default: () => getConfig().modal.escClosable
130
+ },
131
+ cancelClosable: {
132
+ type: Boolean as PropType<VxeModalPropTypes.CancelClosable>,
133
+ default: () => getConfig().modal.cancelClosable
134
+ },
135
+ confirmClosable: {
136
+ type: Boolean as PropType<VxeModalPropTypes.ConfirmClosable>,
137
+ default: () => getConfig().modal.confirmClosable
138
+ },
139
+ resize: Boolean as PropType<VxeModalPropTypes.Resize>,
140
+ border: {
141
+ type: Boolean as PropType<VxeModalPropTypes.Border>,
142
+ default: () => getConfig().modal.border
143
+ },
144
+ showTitleBackground: {
145
+ type: Boolean as PropType<VxeModalPropTypes.ShowTitleBackground>,
146
+ default: () => getConfig().modal.showTitleBackground
147
+ },
148
+ showHeader: {
149
+ type: Boolean as PropType<VxeModalPropTypes.ShowHeader>,
150
+ default: () => getConfig().modal.showHeader
151
+ },
152
+ showFooter: {
153
+ type: Boolean as PropType<VxeModalPropTypes.ShowFooter>,
154
+ default: () => getConfig().modal.showFooter
155
+ },
156
+ preload: Boolean as PropType<VxeModalPropTypes.Preload>,
157
+ showZoom: Boolean as PropType<VxeModalPropTypes.ShowZoom>,
158
+ zoomConfig: Object as PropType<VxeModalPropTypes.ZoomConfig>,
159
+ showMaximize: {
160
+ type: Boolean as PropType<VxeModalPropTypes.ShowMaximize>,
161
+ default: () => handleBooleanDefaultValue(getConfig().modal.showMaximize)
162
+ },
163
+ showMinimize: {
164
+ type: Boolean as PropType<VxeModalPropTypes.ShowMinimize>,
165
+ default: () => handleBooleanDefaultValue(getConfig().modal.showMinimize)
166
+ },
167
+ showClose: {
168
+ type: Boolean as PropType<VxeModalPropTypes.ShowClose>,
169
+ default: () => getConfig().modal.showClose
170
+ },
171
+ dblclickZoom: {
172
+ type: Boolean as PropType<VxeModalPropTypes.DblclickZoom>,
173
+ default: () => getConfig().modal.dblclickZoom
174
+ },
175
+ width: {
176
+ type: [Number, String] as PropType<VxeModalPropTypes.Width>,
177
+ default: () => getConfig().modal.width
178
+ },
179
+ height: {
180
+ type: [Number, String] as PropType<VxeModalPropTypes.Height>,
181
+ default: () => getConfig().modal.height
182
+ },
183
+ minWidth: {
184
+ type: [Number, String] as PropType<VxeModalPropTypes.MinWidth>,
185
+ default: () => getConfig().modal.minWidth
186
+ },
187
+ minHeight: {
188
+ type: [Number, String] as PropType<VxeModalPropTypes.MinHeight>,
189
+ default: () => getConfig().modal.minHeight
190
+ },
191
+ zIndex: Number as PropType<VxeModalPropTypes.ZIndex>,
192
+ marginSize: {
193
+ type: [Number, String] as PropType<VxeModalPropTypes.MarginSize>,
194
+ default: () => getConfig().modal.marginSize
195
+ },
196
+ fullscreen: {
197
+ type: Boolean as PropType<VxeModalPropTypes.Fullscreen>,
198
+ default: () => getConfig().modal.fullscreen
199
+ },
200
+ draggable: {
201
+ type: Boolean as PropType<VxeModalPropTypes.Draggable>,
202
+ default: () => getConfig().modal.draggable
203
+ },
204
+ remember: {
205
+ type: Boolean,
206
+ default: () => getConfig().modal.remember
207
+ },
208
+ destroyOnClose: {
209
+ type: Boolean as PropType<VxeModalPropTypes.DestroyOnClose>,
210
+ default: () => getConfig().modal.destroyOnClose
211
+ },
212
+ showTitleOverflow: {
213
+ type: Boolean as PropType<VxeModalPropTypes.ShowTitleOverflow>,
214
+ default: () => getConfig().modal.showTitleOverflow
215
+ },
216
+ transfer: {
217
+ type: Boolean as PropType<VxeModalPropTypes.Transfer>,
218
+ default: () => getConfig().modal.transfer
219
+ },
220
+ appendTo: {
221
+ type: [String, Function] as PropType<VxeModalPropTypes.AppendTo>,
222
+ default: () => getConfig().modal.appendTo
223
+ },
224
+ isWithinAppendTo: {
225
+ type: Boolean as PropType<VxeModalPropTypes.IsWithinAppendTo>,
226
+ default: () => getConfig().modal.isWithinAppendTo
227
+ },
228
+ storage: {
229
+ type: Boolean as PropType<VxeModalPropTypes.Storage>,
230
+ default: () => getConfig().modal.storage
231
+ },
232
+ storageKey: {
233
+ type: String as PropType<VxeModalPropTypes.StorageKey>,
234
+ default: () => getConfig().modal.storageKey
235
+ },
236
+ padding: {
237
+ type: Boolean as PropType<VxeModalPropTypes.Padding>,
238
+ default: () => getConfig().modal.padding
239
+ },
240
+ size: {
241
+ type: String as PropType<VxeModalPropTypes.Size>,
242
+ default: () => getConfig().modal.size || getConfig().size
243
+ },
244
+ beforeHideMethod: Function as PropType<VxeModalPropTypes.BeforeHideMethod>,
245
+ slots: Object as PropType<VxeModalPropTypes.Slots>,
246
+ useScrollbar: {
247
+ type: Boolean as PropType<VxeModalPropTypes.UseScrollbar>,
248
+ default: () => getDefaultConfig(getConfig().modal.useScrollbar, getConfig().useScrollbar)
249
+ },
250
+ scrollbarConfig: Object as PropType<VxeModalPropTypes.ScrollbarConfig>,
251
+
252
+ /**
253
+ * 已废弃
254
+ * @deprecated
255
+ */
256
+ message: [Number, String] as PropType<VxeModalPropTypes.Message>,
257
+ /**
258
+ * 已废弃
259
+ * @deprecated
260
+ */
261
+ animat: {
262
+ type: Boolean as PropType<VxeModalPropTypes.Animat>,
263
+ default: () => getConfig().modal.animat
264
+ }
265
+ },
266
+ emits: ['update:modelValue', 'show', 'hide', 'before-hide', 'close', 'confirm', 'cancel', 'zoom', 'resize', 'move'] as VxeModalEmits,
267
+ setup(props, context) {
268
+ const { slots, emit } = context
269
+
270
+ const xID = XEUtils.uniqueId()
271
+
272
+ const $xeParentModal = inject<(VxeModalConstructor & VxeModalMethods) | null>('$xeModal', null)
273
+ const $xeDrawer = inject<(VxeDrawerConstructor & VxeDrawerMethods) | null>('$xeDrawer', null)
274
+ const $xeTable = inject<(VxeTableConstructor & VxeTablePrivateMethods) | null>('$xeTable', null)
275
+ const $xeForm = inject<(VxeFormConstructor & VxeFormPrivateMethods) | null>('$xeForm', null)
276
+
277
+ const { computeSize } = useFns.useSize(props)
278
+ const { computeIsVScrollbar } = useFns.useVScrollbar(props)
279
+
280
+ const reactData = reactive(createReactData())
281
+ const internalData = createInternalData()
282
+
283
+ const refElem = ref<HTMLDivElement>()
284
+ const refModalBox = ref() as Ref<HTMLDivElement>
285
+ const refHeaderElem = ref() as Ref<HTMLDivElement>
286
+ const refConfirmBtn = ref<VxeButtonInstance>()
287
+ const refCancelBtn = ref<VxeButtonInstance>()
288
+
289
+ const refMaps: ModalPrivateRef = {
290
+ refElem
291
+ }
292
+
293
+ const computeBtnTransfer = computed(() => {
294
+ const { transfer } = props
295
+ if (transfer === null) {
296
+ const globalTransfer = getConfig().modal.transfer
297
+ if (XEUtils.isBoolean(globalTransfer)) {
298
+ return globalTransfer
299
+ }
300
+ if ($xeTable || $xeParentModal || $xeDrawer || $xeForm) {
301
+ return true
302
+ }
303
+ }
304
+ return transfer
305
+ })
306
+
307
+ const computeIsMsg = computed(() => {
308
+ const { type } = props
309
+ return type === 'message' || type === 'notification'
310
+ })
311
+
312
+ const computeIsModal = computed(() => {
313
+ return props.type === 'modal'
314
+ })
315
+
316
+ const computeIsMinimizeStatus = computed(() => {
317
+ return reactData.zoomStatus === 'minimize'
318
+ })
319
+
320
+ const computeIsMaximizeStatus = computed(() => {
321
+ return reactData.zoomStatus === 'maximize'
322
+ })
323
+
324
+ const computeZoomOpts = computed(() => {
325
+ return Object.assign({}, getConfig().modal.zoomConfig, props.zoomConfig)
326
+ })
327
+
328
+ const computeScrollbarOpts = computed(() => {
329
+ return Object.assign({}, getConfig().modal.scrollbarConfig, props.scrollbarConfig)
330
+ })
331
+
332
+ const computeScrollbarProps = computed(() => {
333
+ const scrollbarOpts = computeScrollbarOpts.value
334
+ const { viewClassName, viewInnerClassName } = scrollbarOpts
335
+ return {
336
+ width: scrollbarOpts.width,
337
+ height: scrollbarOpts.height,
338
+ autoHide: scrollbarOpts.autoHide,
339
+ visible: scrollbarOpts.visible,
340
+ xConfig: scrollbarOpts.xConfig,
341
+ yConfig: scrollbarOpts.yConfig,
342
+ className: scrollbarOpts.className,
343
+ viewAttrs: scrollbarOpts.viewAttrs,
344
+ viewClassName: 'vxe-modal--scrollbar-content-view' + (viewClassName ? ' ' + viewClassName : ''),
345
+ viewInnerClassName: 'vxe-modal--scrollbar-content-inner' + (viewClassName ? ' ' + viewInnerClassName : '')
346
+ }
347
+ })
348
+
349
+ const computeMaps: VxeModalPrivateComputed = {
350
+ computeSize,
351
+ computeZoomOpts
352
+ }
353
+
354
+ const $xeModal = {
355
+ xID,
356
+ props,
357
+ context,
358
+ reactData,
359
+ internalData,
360
+ getRefMaps: () => refMaps,
361
+ getComputeMaps: () => computeMaps
362
+ } as unknown as VxeModalConstructor & VxeModalMethods
363
+
364
+ let modalMethods = {} as ModalMethods
365
+
366
+ const getBox = () => {
367
+ const boxElem = refModalBox.value
368
+ return boxElem
369
+ }
370
+
371
+ const recalculate = () => {
372
+ const { width, height, minWidth, minHeight } = props
373
+ const isMsg = computeIsMsg.value
374
+ const isMinimizeStatus = computeIsMinimizeStatus.value
375
+ const boxElem = getBox()
376
+ if (boxElem) {
377
+ boxElem.style.width = width ? toCssUnit(width) : ''
378
+ boxElem.style.height = height ? toCssUnit(height) : ''
379
+ boxElem.style.minWidth = !isMsg && !isMinimizeStatus && minWidth ? (isScale(minWidth) ? (minWidth as string) : toCssUnit(minWidth)) : ''
380
+ boxElem.style.minHeight = !isMsg && !isMinimizeStatus && minHeight ? (isScale(minHeight) ? (minHeight as string) : toCssUnit(minHeight)) : ''
381
+ }
382
+ return nextTick()
383
+ }
384
+
385
+ const updateZindex = () => {
386
+ const { zIndex } = props
387
+ const { modalZindex } = reactData
388
+ if (zIndex) {
389
+ reactData.modalZindex = zIndex
390
+ } else {
391
+ const isMsg = computeIsMsg.value
392
+ if (isMsg) {
393
+ if (modalZindex < getSubLastZIndex()) {
394
+ reactData.modalZindex = nextSubZIndex()
395
+ }
396
+ } else {
397
+ if (modalZindex < getLastZIndex()) {
398
+ reactData.modalZindex = nextZIndex()
399
+ }
400
+ }
401
+ }
402
+ }
403
+
404
+ const updatePosition = () => {
405
+ return nextTick().then(() => {
406
+ const { position, isWithinAppendTo } = props
407
+ const el = refElem.value
408
+ const boxElem = getBox()
409
+ if (!boxElem) {
410
+ return
411
+ }
412
+ const parentWrapperEl = getPopupWrapperElement(isWithinAppendTo ? el : document.body)
413
+ if (!parentWrapperEl) {
414
+ return
415
+ }
416
+ const clientVisibleWidth = parentWrapperEl.clientWidth
417
+ const clientVisibleHeight = parentWrapperEl.clientHeight
418
+ const marginSize = XEUtils.toNumber(props.marginSize)
419
+ const isPosCenter = position === 'center'
420
+ const { top, left } = XEUtils.isString(position) ? { top: position, left: position } : Object.assign({}, position)
421
+ const topCenter = isPosCenter || top === 'center'
422
+ const leftCenter = isPosCenter || left === 'center'
423
+ let posTop = ''
424
+ let posLeft = ''
425
+ if (left && !leftCenter) {
426
+ posLeft = toCssUnit(left)
427
+ } else {
428
+ posLeft = `${Math.max(marginSize, clientVisibleWidth / 2 - boxElem.offsetWidth / 2)}px`
429
+ }
430
+ if (top && !topCenter) {
431
+ posTop = toCssUnit(top)
432
+ } else {
433
+ posTop = `${Math.max(marginSize, clientVisibleHeight / 2 - boxElem.offsetHeight / 2)}px`
434
+ }
435
+ boxElem.style.top = posTop
436
+ boxElem.style.left = posLeft
437
+ })
438
+ }
439
+
440
+ const updateStyle = () => {
441
+ nextTick(() => {
442
+ const { type } = props
443
+ const queueList = type === 'notification' ? notifyQueue : msgQueue
444
+ let offsetTop = 0
445
+ queueList.forEach((comp) => {
446
+ const boxElem = comp.getBox()
447
+ if (boxElem) {
448
+ offsetTop += XEUtils.toNumber(comp.props.top)
449
+ comp.reactData.modalTop = offsetTop
450
+ offsetTop += boxElem.clientHeight
451
+ }
452
+ })
453
+ })
454
+ }
455
+
456
+ const removeActiveQueue = () => {
457
+ if (allActiveModals.indexOf($xeModal) > -1) {
458
+ XEUtils.remove(allActiveModals, (item) => item === $xeModal)
459
+ }
460
+ }
461
+
462
+ const removeMsgQueue = () => {
463
+ const { type } = props
464
+ const queueList = type === 'notification' ? notifyQueue : msgQueue
465
+ if (queueList.indexOf($xeModal) > -1) {
466
+ XEUtils.remove(queueList, (comp) => comp === $xeModal)
467
+ }
468
+ updateStyle()
469
+ }
470
+
471
+ const closeModal = (type: ModalEventTypes) => {
472
+ const { remember } = props
473
+ const { visible } = reactData
474
+ const isMsg = computeIsMsg.value
475
+ const beforeHideFn = props.beforeHideMethod || getConfig().modal.beforeHideMethod
476
+ const params = { type }
477
+ if (visible) {
478
+ Promise.resolve(beforeHideFn ? beforeHideFn(params) : null)
479
+ .then((rest) => {
480
+ if (!XEUtils.isError(rest)) {
481
+ const el = refElem.value
482
+ if (el) {
483
+ el.setAttribute('data-effect', 'y')
484
+ }
485
+ if (isMsg) {
486
+ removeMsgQueue()
487
+ }
488
+ reactData.contentVisible = false
489
+ if (!remember) {
490
+ handleRevert()
491
+ }
492
+ removeActiveQueue()
493
+ dispatchEvent('before-hide', params, null)
494
+ setTimeout(() => {
495
+ reactData.visible = false
496
+ emitModel(false)
497
+ dispatchEvent('hide', params, null)
498
+ }, 200)
499
+ removeBodyLockScroll()
500
+ setTimeout(() => {
501
+ const el = refElem.value
502
+ if (el) {
503
+ el.removeAttribute('data-effect')
504
+ }
505
+ }, 350)
506
+ }
507
+ })
508
+ .catch((e) => e)
509
+ }
510
+ return nextTick()
511
+ }
512
+
513
+ const closeEvent = (evnt: Event) => {
514
+ const type = 'close'
515
+ dispatchEvent(type, { type }, evnt)
516
+ closeModal(type)
517
+ }
518
+
519
+ const confirmEvent = (evnt: Event) => {
520
+ const { confirmClosable } = props
521
+ const type = 'confirm'
522
+ dispatchEvent(type, { type }, evnt)
523
+ if (confirmClosable) {
524
+ closeModal(type)
525
+ }
526
+ }
527
+
528
+ const cancelEvent = (evnt: Event) => {
529
+ const { cancelClosable } = props
530
+ const type = 'cancel'
531
+ dispatchEvent(type, { type }, evnt)
532
+ if (cancelClosable) {
533
+ closeModal(type)
534
+ }
535
+ }
536
+
537
+ const getStorageMap = (key: string) => {
538
+ const version = getConfig().version
539
+ const rest = XEUtils.toStringJSON(localStorage.getItem(key) || '')
540
+ return rest && rest._v === version ? rest : { _v: version }
541
+ }
542
+
543
+ const hasPosStorage = () => {
544
+ const { id, storage, storageKey } = props
545
+ return !!(id && storage && getStorageMap(storageKey)[id])
546
+ }
547
+
548
+ const restorePosStorage = () => {
549
+ const { id, storage, storageKey } = props
550
+ if (id && storage) {
551
+ const posStorage = getStorageMap(storageKey)[id]
552
+ if (posStorage) {
553
+ const boxElem = getBox()
554
+ const [left, top, width, height, zoomLeft, zoomTop, zoomWidth, zoomHeight] = posStorage.split(',')
555
+ if (boxElem) {
556
+ if (left) {
557
+ boxElem.style.left = `${left}px`
558
+ }
559
+ if (top) {
560
+ boxElem.style.top = `${top}px`
561
+ }
562
+ if (width) {
563
+ boxElem.style.width = `${width}px`
564
+ }
565
+ if (height) {
566
+ boxElem.style.height = `${height}px`
567
+ }
568
+ }
569
+ if (zoomLeft && zoomTop) {
570
+ reactData.revertLocat = {
571
+ left: zoomLeft,
572
+ top: zoomTop,
573
+ width: zoomWidth,
574
+ height: zoomHeight
575
+ }
576
+ }
577
+ }
578
+ }
579
+ }
580
+
581
+ const addMsgQueue = () => {
582
+ const { type } = props
583
+ const queueList = type === 'notification' ? notifyQueue : msgQueue
584
+ if (queueList.indexOf($xeModal) === -1) {
585
+ queueList.push($xeModal)
586
+ }
587
+ updateStyle()
588
+ }
589
+
590
+ const savePosStorage = () => {
591
+ const { id, storage, storageKey } = props
592
+ const { zoomStatus, revertLocat } = reactData
593
+ if (zoomStatus) {
594
+ return
595
+ }
596
+ if (id && storage) {
597
+ const boxElem = getBox()
598
+ if (!boxElem) {
599
+ return
600
+ }
601
+ const posStorageMap = getStorageMap(storageKey)
602
+ posStorageMap[id] = ([boxElem.style.left, boxElem.style.top, boxElem.clientWidth, boxElem.clientHeight] as (string | number)[])
603
+ .concat(revertLocat ? [revertLocat.left, revertLocat.top, revertLocat.width, revertLocat.height] : [])
604
+ .map((val) => (val ? XEUtils.toNumber(val) : ''))
605
+ .join(',')
606
+ localStorage.setItem(storageKey, XEUtils.toJSONString(posStorageMap))
607
+ }
608
+ }
609
+
610
+ const handleMinimize = () => {
611
+ const { isWithinAppendTo } = props
612
+ const zoomOpts = computeZoomOpts.value
613
+ const { minimizeLayout, minimizeMaxSize, minimizeHorizontalOffset, minimizeVerticalOffset, minimizeOffsetMethod } = zoomOpts
614
+ const isHorizontalLayout = minimizeLayout === 'horizontal'
615
+ const prevZoomStatus = reactData.zoomStatus
616
+ const hlMList: VxeModalConstructor[] = []
617
+ const vlMList: VxeModalConstructor[] = []
618
+ allActiveModals.forEach((item) => {
619
+ if (item.xID !== $xeModal.xID && item.props.type === 'modal' && item.reactData.zoomStatus === 'minimize') {
620
+ const itemZoomOpts = item.getComputeMaps().computeZoomOpts.value
621
+ if (itemZoomOpts.minimizeLayout === 'horizontal') {
622
+ hlMList.push(item)
623
+ } else {
624
+ vlMList.push(item)
625
+ }
626
+ }
627
+ })
628
+ const mList = isHorizontalLayout ? hlMList : vlMList
629
+ // 如果配置最小化最大数量
630
+ if (minimizeMaxSize && mList.length >= minimizeMaxSize) {
631
+ if (VxeUI.modal) {
632
+ VxeUI.modal.message({
633
+ status: 'error',
634
+ content: getI18n('vxe.modal.miniMaxSize', [minimizeMaxSize])
635
+ })
636
+ }
637
+ return Promise.resolve({
638
+ status: false
639
+ })
640
+ }
641
+ reactData.prevZoomStatus = prevZoomStatus
642
+ reactData.zoomStatus = 'minimize'
643
+ return nextTick().then(() => {
644
+ const el = refElem.value
645
+ const boxElem = getBox()
646
+ if (!boxElem) {
647
+ return {
648
+ status: false
649
+ }
650
+ }
651
+ const headerEl = refHeaderElem.value
652
+ if (!headerEl) {
653
+ return {
654
+ status: false
655
+ }
656
+ }
657
+ const parentWrapperEl = getPopupWrapperElement(isWithinAppendTo ? el : document.body)
658
+ if (!parentWrapperEl) {
659
+ return {
660
+ status: false
661
+ }
662
+ }
663
+ const visibleHeight = parentWrapperEl.clientHeight
664
+ // 如果当前处于复原状态
665
+ if (!prevZoomStatus) {
666
+ reactData.revertLocat = {
667
+ top: boxElem.offsetTop,
668
+ left: boxElem.offsetLeft,
669
+ width: boxElem.offsetWidth + (boxElem.style.width ? 0 : 1),
670
+ height: boxElem.offsetHeight + (boxElem.style.height ? 0 : 1)
671
+ }
672
+ }
673
+ const targetModal = XEUtils[isHorizontalLayout ? 'max' : 'min'](mList, ($modal) => {
674
+ const boxElem = $modal.getBox()
675
+ return boxElem ? XEUtils.toNumber(boxElem.style[isHorizontalLayout ? 'left' : 'top']) : 0
676
+ })
677
+ let targetTop = visibleHeight - headerEl.offsetHeight - 16
678
+ let targetLeft = 16
679
+ if (targetModal) {
680
+ const minBoxElem = targetModal.getBox()
681
+ if (minBoxElem) {
682
+ const boxLeft = XEUtils.toNumber(minBoxElem.style.left)
683
+ const boxTop = XEUtils.toNumber(minBoxElem.style.top)
684
+ let offsetObj: {
685
+ top?: number
686
+ left?: number
687
+ } = {}
688
+ if (isHorizontalLayout) {
689
+ offsetObj = Object.assign({}, minimizeHorizontalOffset)
690
+ } else {
691
+ offsetObj = Object.assign({}, minimizeVerticalOffset)
692
+ }
693
+ targetLeft = boxLeft + XEUtils.toNumber(offsetObj.left)
694
+ targetTop = boxTop + XEUtils.toNumber(offsetObj.top)
695
+ if (minimizeOffsetMethod) {
696
+ offsetObj = minimizeOffsetMethod({
697
+ $modal: $xeModal,
698
+ left: targetLeft,
699
+ top: targetTop
700
+ })
701
+ targetLeft = XEUtils.toNumber(offsetObj.left)
702
+ targetTop = XEUtils.toNumber(offsetObj.top)
703
+ }
704
+ }
705
+ }
706
+ Object.assign(boxElem.style, {
707
+ top: `${targetTop}px`,
708
+ left: `${targetLeft}px`,
709
+ width: '200px',
710
+ height: `${headerEl.offsetHeight}px`,
711
+ minHeight: '',
712
+ minWidth: ''
713
+ })
714
+ savePosStorage()
715
+ return {
716
+ status: true
717
+ }
718
+ })
719
+ }
720
+
721
+ const handleMaximize = () => {
722
+ const { isWithinAppendTo } = props
723
+ const prevZoomStatus = reactData.zoomStatus
724
+ reactData.prevZoomStatus = prevZoomStatus
725
+ reactData.zoomStatus = 'maximize'
726
+ return nextTick().then(() => {
727
+ const boxElem = getBox()
728
+ if (boxElem) {
729
+ // 如果当前处于复原状态
730
+ if (!prevZoomStatus) {
731
+ const el = refElem.value
732
+ const parentWrapperEl = getPopupWrapperElement(isWithinAppendTo ? el : document.body)
733
+ if (!parentWrapperEl) {
734
+ return {
735
+ status: false
736
+ }
737
+ }
738
+ const clientVisibleWidth = parentWrapperEl.clientWidth
739
+ const clientVisibleHeight = parentWrapperEl.clientHeight
740
+ const marginSize = XEUtils.toNumber(props.marginSize)
741
+ reactData.revertLocat = {
742
+ top: Math.max(marginSize, clientVisibleHeight / 2 - boxElem.offsetHeight / 2),
743
+ left: Math.max(marginSize, clientVisibleWidth / 2 - boxElem.offsetWidth / 2),
744
+ width: boxElem.offsetWidth + (boxElem.style.width ? 0 : 1),
745
+ height: boxElem.offsetHeight + (boxElem.style.height ? 0 : 1)
746
+ }
747
+ }
748
+ Object.assign(boxElem.style, {
749
+ top: '0',
750
+ left: '0',
751
+ width: '100%',
752
+ height: '100%',
753
+ minHeight: '',
754
+ minWidth: ''
755
+ })
756
+ }
757
+ savePosStorage()
758
+ return {
759
+ status: true
760
+ }
761
+ })
762
+ }
763
+
764
+ const handleMsgAutoClose = () => {
765
+ const { duration } = props
766
+ if (duration !== -1) {
767
+ internalData.msgTimeout = setTimeout(() => closeModal('close'), XEUtils.toNumber(duration))
768
+ }
769
+ }
770
+
771
+ const removeBodyLockScroll = () => {
772
+ const htmlElem = document.documentElement
773
+ const lockData = htmlElem.getAttribute(lockScrollAttrKey)
774
+ if (lockData) {
775
+ const lockList = lockData.split(',').filter((key) => key !== xID)
776
+ if (lockList.length) {
777
+ htmlElem.setAttribute(lockScrollAttrKey, lockList.join(','))
778
+ } else {
779
+ htmlElem.removeAttribute(lockScrollAttrKey)
780
+ htmlElem.style.removeProperty(lockScrollCssWidthKey)
781
+ }
782
+ }
783
+ }
784
+
785
+ const addBodyLockScroll = () => {
786
+ const { lockScroll } = props
787
+ const isMsg = computeIsMsg.value
788
+ if (lockScroll && !isMsg) {
789
+ const htmlElem = document.documentElement
790
+ const clientWidth = document.body.clientWidth
791
+ const lockData = htmlElem.getAttribute(lockScrollAttrKey)
792
+ const lockList = lockData ? lockData.split(',') : []
793
+ if (!lockList.includes(xID)) {
794
+ lockList.push(xID)
795
+ htmlElem.setAttribute(lockScrollAttrKey, lockList.join(','))
796
+ }
797
+ htmlElem.style.setProperty(lockScrollCssWidthKey, `${clientWidth}px`)
798
+ }
799
+ }
800
+
801
+ const openModal = () => {
802
+ const { remember, showFooter, fullscreen } = props
803
+ const { initialized, visible } = reactData
804
+ const isMsg = computeIsMsg.value
805
+ const isModal = computeIsModal.value
806
+ if (!initialized) {
807
+ reactData.initialized = true
808
+ }
809
+ if (!visible) {
810
+ addBodyLockScroll()
811
+ internalData.isMoveStatus = false
812
+ reactData.visible = true
813
+ reactData.contentVisible = false
814
+ updateZindex()
815
+ allActiveModals.push($xeModal)
816
+ setTimeout(() => {
817
+ reactData.contentVisible = true
818
+ nextTick(() => {
819
+ if (!(isModal && fullscreen)) {
820
+ recalculate()
821
+ }
822
+ if (showFooter) {
823
+ const confirmBtn = refConfirmBtn.value
824
+ const cancelBtn = refCancelBtn.value
825
+ const operBtn = confirmBtn || cancelBtn
826
+ if (operBtn) {
827
+ operBtn.focus()
828
+ }
829
+ }
830
+ const type = ''
831
+ const params = { type }
832
+ emitModel(true)
833
+ dispatchEvent('show', params, null)
834
+ })
835
+ }, 10)
836
+ if (isMsg) {
837
+ addMsgQueue()
838
+ handleMsgAutoClose()
839
+ } else {
840
+ nextTick(() => {
841
+ const { firstOpen } = reactData
842
+ const el = refElem.value
843
+ if (el) {
844
+ el.setAttribute('data-effect', 'y')
845
+ }
846
+ if (firstOpen) {
847
+ reactData.firstOpen = false
848
+ if (hasPosStorage()) {
849
+ restorePosStorage()
850
+ } else {
851
+ if (isModal && fullscreen) {
852
+ nextTick(() => handleMaximize())
853
+ } else {
854
+ recalculate()
855
+ updatePosition().then(() => {
856
+ setTimeout(() => updatePosition(), 20)
857
+ })
858
+ }
859
+ }
860
+ } else {
861
+ if (!remember) {
862
+ recalculate()
863
+ updatePosition().then(() => {
864
+ setTimeout(() => updatePosition(), 20)
865
+ })
866
+ }
867
+ }
868
+ })
869
+ setTimeout(() => {
870
+ const el = refElem.value
871
+ if (el) {
872
+ el.removeAttribute('data-effect')
873
+ }
874
+ }, 350)
875
+ }
876
+ }
877
+ return nextTick()
878
+ }
879
+
880
+ const selfClickEvent = (evnt: Event) => {
881
+ const el = refElem.value
882
+ if (props.maskClosable && evnt.target === el) {
883
+ const type = 'mask'
884
+ closeModal(type)
885
+ }
886
+ }
887
+
888
+ const selfMouseoverEvent = () => {
889
+ const { msgTimeout } = internalData
890
+ if (!msgTimeout) {
891
+ return
892
+ }
893
+ const isMsg = computeIsMsg.value
894
+ if (isMsg) {
895
+ clearTimeout(msgTimeout)
896
+ internalData.msgTimeout = undefined
897
+ }
898
+ }
899
+
900
+ const selfMouseoutEvent = () => {
901
+ const { msgTimeout } = internalData
902
+ if (!msgTimeout) {
903
+ const isMsg = computeIsMsg.value
904
+ if (isMsg) {
905
+ handleMsgAutoClose()
906
+ }
907
+ }
908
+ }
909
+
910
+ const handleGlobalKeydownEvent = (evnt: KeyboardEvent) => {
911
+ const isEsc = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ESCAPE)
912
+ if (isEsc) {
913
+ const lastModal = XEUtils.max(
914
+ allActiveModals.filter((item) => item.reactData.zoomStatus !== 'minimize'),
915
+ (item) => item.reactData.modalZindex
916
+ )
917
+ // 多个时,只关掉最上层的窗口
918
+ if (lastModal) {
919
+ setTimeout(() => {
920
+ if (lastModal === $xeModal && lastModal.props.escClosable) {
921
+ const type = 'exit'
922
+ dispatchEvent('close', { type }, evnt)
923
+ closeModal(type)
924
+ }
925
+ }, 10)
926
+ }
927
+ }
928
+ }
929
+
930
+ const handleGlobalResizeEvent = () => {
931
+ if (!internalData.isMoveStatus) {
932
+ updatePosition()
933
+ }
934
+ }
935
+
936
+ const isMinimized = () => {
937
+ return reactData.zoomStatus === 'minimize'
938
+ }
939
+
940
+ const isMaximized = () => {
941
+ return reactData.zoomStatus === 'maximize'
942
+ }
943
+
944
+ const handleRevert = () => {
945
+ reactData.prevZoomStatus = reactData.zoomStatus
946
+ reactData.zoomStatus = ''
947
+ return nextTick().then(() => {
948
+ const { revertLocat } = reactData
949
+ if (revertLocat) {
950
+ const boxElem = getBox()
951
+ reactData.revertLocat = null
952
+ if (boxElem) {
953
+ Object.assign(boxElem.style, {
954
+ top: `${revertLocat.top}px`,
955
+ left: `${revertLocat.left}px`,
956
+ width: `${revertLocat.width}px`,
957
+ height: `${revertLocat.height}px`
958
+ })
959
+ }
960
+ savePosStorage()
961
+ return nextTick().then(() => {
962
+ return {
963
+ status: true
964
+ }
965
+ })
966
+ }
967
+ return {
968
+ status: false
969
+ }
970
+ })
971
+ }
972
+
973
+ const handleZoom = (type?: 'minimize' | 'revert' | 'maximize') => {
974
+ const { zoomStatus } = reactData
975
+ return new Promise((resolve) => {
976
+ if (type) {
977
+ if (type === 'maximize') {
978
+ resolve(handleMaximize())
979
+ return
980
+ }
981
+ if (type === 'minimize') {
982
+ resolve(handleMinimize())
983
+ return
984
+ }
985
+ resolve(handleRevert())
986
+ return
987
+ }
988
+ resolve(zoomStatus ? handleRevert() : handleMaximize())
989
+ }).then(() => {
990
+ return reactData.zoomStatus || 'revert'
991
+ })
992
+ }
993
+
994
+ const toggleZoomMinEvent = (evnt: Event) => {
995
+ const { zoomStatus, prevZoomStatus } = reactData
996
+ return handleZoom(zoomStatus === 'minimize' ? prevZoomStatus || 'revert' : 'minimize').then((type) => {
997
+ const params = { type }
998
+ dispatchEvent('zoom', params, evnt)
999
+ })
1000
+ }
1001
+
1002
+ const toggleZoomMaxEvent = (evnt: Event) => {
1003
+ return handleZoom().then((type) => {
1004
+ const params = { type }
1005
+ dispatchEvent('zoom', params, evnt)
1006
+ })
1007
+ }
1008
+
1009
+ const getPosition = () => {
1010
+ const isMsg = computeIsMsg.value
1011
+ if (!isMsg) {
1012
+ const boxElem = getBox()
1013
+ if (boxElem) {
1014
+ return {
1015
+ top: boxElem.offsetTop,
1016
+ left: boxElem.offsetLeft
1017
+ }
1018
+ }
1019
+ }
1020
+ return null
1021
+ }
1022
+
1023
+ const setPosition = (top?: number, left?: number) => {
1024
+ const isMsg = computeIsMsg.value
1025
+ if (!isMsg) {
1026
+ const boxElem = getBox()
1027
+ if (boxElem) {
1028
+ if (XEUtils.isNumber(top)) {
1029
+ boxElem.style.top = `${top}px`
1030
+ }
1031
+ if (XEUtils.isNumber(left)) {
1032
+ boxElem.style.left = `${left}px`
1033
+ }
1034
+ }
1035
+ }
1036
+ return nextTick()
1037
+ }
1038
+
1039
+ const boxMousedownEvent = () => {
1040
+ const { modalZindex } = reactData
1041
+ if (allActiveModals.some((comp) => comp.reactData.visible && comp.reactData.modalZindex > modalZindex)) {
1042
+ updateZindex()
1043
+ }
1044
+ }
1045
+
1046
+ const mousedownEvent = (evnt: MouseEvent) => {
1047
+ const { storage, isWithinAppendTo } = props
1048
+ const { zoomStatus } = reactData
1049
+ const marginSize = XEUtils.toNumber(props.marginSize)
1050
+ const boxElem = getBox()
1051
+ if (!boxElem) {
1052
+ return
1053
+ }
1054
+ if (zoomStatus !== 'maximize' && evnt.button === 0 && !getEventTargetNode(evnt, boxElem, 'trigger--btn').flag) {
1055
+ evnt.preventDefault()
1056
+ const el = refElem.value
1057
+ const parentWrapperEl = getPopupWrapperElement(isWithinAppendTo ? el : document.body)
1058
+ if (!parentWrapperEl) {
1059
+ return
1060
+ }
1061
+ const visibleWidth = parentWrapperEl.clientWidth
1062
+ const visibleHeight = parentWrapperEl.clientHeight
1063
+ const disX = evnt.clientX - boxElem.offsetLeft
1064
+ const disY = evnt.clientY - boxElem.offsetTop
1065
+ document.onmousemove = (evnt) => {
1066
+ evnt.preventDefault()
1067
+ const offsetWidth = boxElem.offsetWidth
1068
+ const offsetHeight = boxElem.offsetHeight
1069
+ const minX = marginSize
1070
+ const maxX = visibleWidth - offsetWidth - marginSize - 1
1071
+ const minY = marginSize
1072
+ const maxY = visibleHeight - offsetHeight - marginSize - 1
1073
+ let left = evnt.clientX - disX
1074
+ let top = evnt.clientY - disY
1075
+ if (left > maxX) {
1076
+ left = maxX
1077
+ }
1078
+ if (left < minX) {
1079
+ left = minX
1080
+ }
1081
+ if (top > maxY) {
1082
+ top = maxY
1083
+ }
1084
+ if (top < minY) {
1085
+ top = minY
1086
+ }
1087
+ boxElem.style.left = `${left}px`
1088
+ boxElem.style.top = `${top}px`
1089
+ boxElem.className = boxElem.className.replace(/\s?is--drag/, '') + ' is--drag'
1090
+ dispatchEvent('move', { type: 'move' }, evnt)
1091
+ internalData.isMoveStatus = true
1092
+ reactData.resizeFlag++
1093
+ }
1094
+ document.onmouseup = () => {
1095
+ document.onmousemove = null
1096
+ document.onmouseup = null
1097
+ if (storage) {
1098
+ nextTick(() => {
1099
+ savePosStorage()
1100
+ })
1101
+ }
1102
+ reactData.resizeFlag++
1103
+ setTimeout(() => {
1104
+ boxElem.className = boxElem.className.replace(/\s?is--drag/, '')
1105
+ }, 50)
1106
+ }
1107
+ }
1108
+ }
1109
+
1110
+ const dragEvent = (evnt: MouseEvent) => {
1111
+ evnt.preventDefault()
1112
+ const { minWidth, minHeight, storage, isWithinAppendTo } = props
1113
+ const el = refElem.value
1114
+ const parentWrapperEl = getPopupWrapperElement(isWithinAppendTo ? el : document.body)
1115
+ if (!parentWrapperEl) {
1116
+ return
1117
+ }
1118
+ const visibleWidth = parentWrapperEl.clientWidth
1119
+ const visibleHeight = parentWrapperEl.clientHeight
1120
+ const marginSize = XEUtils.toNumber(props.marginSize)
1121
+ const targetElem = evnt.target as HTMLSpanElement
1122
+ const type = targetElem.getAttribute('data-type')
1123
+ const dragMinWidth = isScale(minWidth) ? (XEUtils.toNumber(minWidth) * visibleWidth) / 100 : XEUtils.toNumber(minWidth)
1124
+ const dragMinHeight = isScale(minHeight) ? (XEUtils.toNumber(minHeight) * visibleHeight) / 100 : XEUtils.toNumber(minHeight)
1125
+ const maxWidth = visibleWidth
1126
+ const maxHeight = visibleHeight
1127
+ const boxElem = getBox()
1128
+ const clientWidth = boxElem.clientWidth
1129
+ const clientHeight = boxElem.clientHeight
1130
+ const disX = evnt.clientX
1131
+ const disY = evnt.clientY
1132
+ const offsetTop = boxElem.offsetTop
1133
+ const offsetLeft = boxElem.offsetLeft
1134
+ const params = { type: 'resize' }
1135
+ document.onmousemove = (evnt) => {
1136
+ evnt.preventDefault()
1137
+ let dragLeft
1138
+ let dragTop
1139
+ let width
1140
+ let height
1141
+ switch (type) {
1142
+ case 'wl':
1143
+ dragLeft = disX - evnt.clientX
1144
+ width = dragLeft + clientWidth
1145
+ if (offsetLeft - dragLeft > marginSize) {
1146
+ if (width > dragMinWidth) {
1147
+ boxElem.style.width = `${width < maxWidth ? width : maxWidth}px`
1148
+ boxElem.style.left = `${offsetLeft - dragLeft}px`
1149
+ }
1150
+ }
1151
+ break
1152
+ case 'swst':
1153
+ dragLeft = disX - evnt.clientX
1154
+ dragTop = disY - evnt.clientY
1155
+ width = dragLeft + clientWidth
1156
+ height = dragTop + clientHeight
1157
+ if (offsetLeft - dragLeft > marginSize) {
1158
+ if (width > dragMinWidth) {
1159
+ boxElem.style.width = `${width < maxWidth ? width : maxWidth}px`
1160
+ boxElem.style.left = `${offsetLeft - dragLeft}px`
1161
+ }
1162
+ }
1163
+ if (offsetTop - dragTop > marginSize) {
1164
+ if (height > dragMinHeight) {
1165
+ boxElem.style.height = `${height < maxHeight ? height : maxHeight}px`
1166
+ boxElem.style.top = `${offsetTop - dragTop}px`
1167
+ }
1168
+ }
1169
+ break
1170
+ case 'swlb':
1171
+ dragLeft = disX - evnt.clientX
1172
+ dragTop = evnt.clientY - disY
1173
+ width = dragLeft + clientWidth
1174
+ height = dragTop + clientHeight
1175
+ if (offsetLeft - dragLeft > marginSize) {
1176
+ if (width > dragMinWidth) {
1177
+ boxElem.style.width = `${width < maxWidth ? width : maxWidth}px`
1178
+ boxElem.style.left = `${offsetLeft - dragLeft}px`
1179
+ }
1180
+ }
1181
+ if (offsetTop + height + marginSize < visibleHeight) {
1182
+ if (height > dragMinHeight) {
1183
+ boxElem.style.height = `${height < maxHeight ? height : maxHeight}px`
1184
+ }
1185
+ }
1186
+ break
1187
+ case 'st':
1188
+ dragTop = disY - evnt.clientY
1189
+ height = clientHeight + dragTop
1190
+ if (offsetTop - dragTop > marginSize) {
1191
+ if (height > dragMinHeight) {
1192
+ boxElem.style.height = `${height < maxHeight ? height : maxHeight}px`
1193
+ boxElem.style.top = `${offsetTop - dragTop}px`
1194
+ }
1195
+ }
1196
+ break
1197
+ case 'wr':
1198
+ dragLeft = evnt.clientX - disX
1199
+ width = dragLeft + clientWidth
1200
+ if (offsetLeft + width + marginSize < visibleWidth) {
1201
+ if (width > dragMinWidth) {
1202
+ boxElem.style.width = `${width < maxWidth ? width : maxWidth}px`
1203
+ }
1204
+ }
1205
+ break
1206
+ case 'sest':
1207
+ dragLeft = evnt.clientX - disX
1208
+ dragTop = disY - evnt.clientY
1209
+ width = dragLeft + clientWidth
1210
+ height = dragTop + clientHeight
1211
+ if (offsetLeft + width + marginSize < visibleWidth) {
1212
+ if (width > dragMinWidth) {
1213
+ boxElem.style.width = `${width < maxWidth ? width : maxWidth}px`
1214
+ }
1215
+ }
1216
+ if (offsetTop - dragTop > marginSize) {
1217
+ if (height > dragMinHeight) {
1218
+ boxElem.style.height = `${height < maxHeight ? height : maxHeight}px`
1219
+ boxElem.style.top = `${offsetTop - dragTop}px`
1220
+ }
1221
+ }
1222
+ break
1223
+ case 'selb':
1224
+ dragLeft = evnt.clientX - disX
1225
+ dragTop = evnt.clientY - disY
1226
+ width = dragLeft + clientWidth
1227
+ height = dragTop + clientHeight
1228
+ if (offsetLeft + width + marginSize < visibleWidth) {
1229
+ if (width > dragMinWidth) {
1230
+ boxElem.style.width = `${width < maxWidth ? width : maxWidth}px`
1231
+ }
1232
+ }
1233
+ if (offsetTop + height + marginSize < visibleHeight) {
1234
+ if (height > dragMinHeight) {
1235
+ boxElem.style.height = `${height < maxHeight ? height : maxHeight}px`
1236
+ }
1237
+ }
1238
+ break
1239
+ case 'sb':
1240
+ dragTop = evnt.clientY - disY
1241
+ height = dragTop + clientHeight
1242
+ if (offsetTop + height + marginSize < visibleHeight) {
1243
+ if (height > dragMinHeight) {
1244
+ boxElem.style.height = `${height < maxHeight ? height : maxHeight}px`
1245
+ }
1246
+ }
1247
+ break
1248
+ }
1249
+ boxElem.className = boxElem.className.replace(/\s?is--drag/, '') + ' is--drag'
1250
+ if (storage) {
1251
+ savePosStorage()
1252
+ }
1253
+ dispatchEvent('resize', params, evnt)
1254
+ }
1255
+ document.onmouseup = () => {
1256
+ reactData.revertLocat = null
1257
+ document.onmousemove = null
1258
+ document.onmouseup = null
1259
+ setTimeout(() => {
1260
+ boxElem.className = boxElem.className.replace(/\s?is--drag/, '')
1261
+ }, 50)
1262
+ }
1263
+ }
1264
+
1265
+ const dispatchEvent = (type: ValueOf<VxeModalEmits>, params: Record<string, any>, evnt: Event | null) => {
1266
+ emit(type, createEvent(evnt, { $modal: $xeModal }, params))
1267
+ }
1268
+
1269
+ const emitModel = (value: any) => {
1270
+ emit('update:modelValue', value)
1271
+ }
1272
+
1273
+ modalMethods = {
1274
+ dispatchEvent,
1275
+ open: openModal,
1276
+ close() {
1277
+ return closeModal('close')
1278
+ },
1279
+ getBox,
1280
+ getPosition,
1281
+ setPosition,
1282
+ isMinimized,
1283
+ isMaximized,
1284
+ zoom() {
1285
+ return handleZoom()
1286
+ },
1287
+ minimize() {
1288
+ const { visible } = reactData
1289
+ const isModal = computeIsModal.value
1290
+ if (!isModal || !visible) {
1291
+ return Promise.resolve({
1292
+ status: false
1293
+ })
1294
+ }
1295
+ return handleMinimize()
1296
+ },
1297
+ maximize() {
1298
+ const { visible } = reactData
1299
+ const isModal = computeIsModal.value
1300
+ if (!isModal || !visible) {
1301
+ return Promise.resolve({
1302
+ status: false
1303
+ })
1304
+ }
1305
+ return handleMaximize()
1306
+ },
1307
+ revert() {
1308
+ const { visible } = reactData
1309
+ const isModal = computeIsModal.value
1310
+ if (!isModal || !visible) {
1311
+ return Promise.resolve({
1312
+ status: false
1313
+ })
1314
+ }
1315
+ return handleRevert()
1316
+ }
1317
+ }
1318
+
1319
+ Object.assign($xeModal, modalMethods)
1320
+
1321
+ const renderTitles = () => {
1322
+ const { slots: propSlots = {}, showClose, showZoom, showMaximize, showMinimize, title } = props
1323
+ const { zoomStatus } = reactData
1324
+ const titleSlot = slots.title || propSlots.title
1325
+ const cornerSlot = slots.corner || propSlots.corner
1326
+ const isMinimizeStatus = computeIsMinimizeStatus.value
1327
+ const isMaximizeStatus = computeIsMaximizeStatus.value
1328
+ return [
1329
+ h(
1330
+ 'div',
1331
+ {
1332
+ class: 'vxe-modal--header-title'
1333
+ },
1334
+ titleSlot
1335
+ ? getSlotVNs(
1336
+ titleSlot({
1337
+ $modal: $xeModal,
1338
+ minimized: isMinimizeStatus,
1339
+ maximized: isMaximizeStatus
1340
+ })
1341
+ )
1342
+ : title
1343
+ ? getFuncText(title)
1344
+ : getI18n('vxe.alert.title')
1345
+ ),
1346
+ h(
1347
+ 'div',
1348
+ {
1349
+ class: 'vxe-modal--header-right'
1350
+ },
1351
+ [
1352
+ cornerSlot && !isMinimizeStatus
1353
+ ? h(
1354
+ 'div',
1355
+ {
1356
+ class: 'vxe-modal--corner-wrapper'
1357
+ },
1358
+ getSlotVNs(cornerSlot({ $modal: $xeModal }))
1359
+ )
1360
+ : renderEmptyElement($xeModal),
1361
+ (XEUtils.isBoolean(showMinimize) ? showMinimize : showZoom)
1362
+ ? h(
1363
+ 'div',
1364
+ {
1365
+ class: ['vxe-modal--zoom-btn', 'trigger--btn'],
1366
+ title: getI18n(`vxe.modal.zoom${zoomStatus === 'minimize' ? 'Out' : 'Min'}`),
1367
+ onClick: toggleZoomMinEvent
1368
+ },
1369
+ [
1370
+ h('i', {
1371
+ class: zoomStatus === 'minimize' ? getIcon().MODAL_ZOOM_REVERT : getIcon().MODAL_ZOOM_MIN
1372
+ })
1373
+ ]
1374
+ )
1375
+ : renderEmptyElement($xeModal),
1376
+ (XEUtils.isBoolean(showMaximize) ? showMaximize : showZoom) && zoomStatus !== 'minimize'
1377
+ ? h(
1378
+ 'div',
1379
+ {
1380
+ class: ['vxe-modal--zoom-btn', 'trigger--btn'],
1381
+ title: getI18n(`vxe.modal.zoom${zoomStatus === 'maximize' ? 'Out' : 'In'}`),
1382
+ onClick: toggleZoomMaxEvent
1383
+ },
1384
+ [
1385
+ h('i', {
1386
+ class: zoomStatus === 'maximize' ? getIcon().MODAL_ZOOM_OUT : getIcon().MODAL_ZOOM_IN
1387
+ })
1388
+ ]
1389
+ )
1390
+ : renderEmptyElement($xeModal),
1391
+ showClose
1392
+ ? h(
1393
+ 'div',
1394
+ {
1395
+ class: ['vxe-modal--close-btn', 'trigger--btn'],
1396
+ title: getI18n('vxe.modal.close'),
1397
+ onClick: closeEvent
1398
+ },
1399
+ [
1400
+ h('i', {
1401
+ class: getIcon().MODAL_CLOSE
1402
+ })
1403
+ ]
1404
+ )
1405
+ : renderEmptyElement($xeModal)
1406
+ ]
1407
+ )
1408
+ ]
1409
+ }
1410
+
1411
+ const renderHeader = () => {
1412
+ const { slots: propSlots = {}, showZoom, showMaximize, draggable } = props
1413
+ const headerSlot = slots.header || propSlots.header
1414
+ if (props.showHeader) {
1415
+ const headerOns: Record<string, any> = {}
1416
+ if (draggable) {
1417
+ headerOns.onMousedown = mousedownEvent
1418
+ }
1419
+ if ((XEUtils.isBoolean(showMaximize) ? showMaximize : showZoom) && props.dblclickZoom && props.type === 'modal') {
1420
+ headerOns.onDblclick = toggleZoomMaxEvent
1421
+ }
1422
+ return h(
1423
+ 'div',
1424
+ {
1425
+ ref: refHeaderElem,
1426
+ class: [
1427
+ 'vxe-modal--header',
1428
+ {
1429
+ 'is--ellipsis': props.showTitleOverflow
1430
+ }
1431
+ ],
1432
+ ...headerOns
1433
+ },
1434
+ headerSlot ? getSlotVNs(headerSlot({ $modal: $xeModal })) : renderTitles()
1435
+ )
1436
+ }
1437
+ return renderEmptyElement($xeModal)
1438
+ }
1439
+
1440
+ const renderBody = () => {
1441
+ const { slots: propSlots = {}, status, message, iconStatus, useHtml } = props
1442
+ const content = props.content || message
1443
+ const isVScrollbar = computeIsVScrollbar.value
1444
+ const isMsg = computeIsMsg.value
1445
+ const scrollbarProps = computeScrollbarProps.value
1446
+ const defaultSlot = slots.default || propSlots.default
1447
+ const leftSlot = slots.left || propSlots.left
1448
+ const rightSlot = slots.right || propSlots.right
1449
+ const contVNs: VNode[] = []
1450
+ if (!isMsg && (status || iconStatus)) {
1451
+ contVNs.push(
1452
+ h(
1453
+ 'div',
1454
+ {
1455
+ class: 'vxe-modal--status-wrapper'
1456
+ },
1457
+ [
1458
+ h('i', {
1459
+ class: ['vxe-modal--status-icon', iconStatus || getIcon()[`MODAL_${status}`.toLocaleUpperCase() as 'MODAL_SUCCESS' | 'MODAL_ERROR']]
1460
+ })
1461
+ ]
1462
+ )
1463
+ )
1464
+ }
1465
+
1466
+ if (useHtml && !defaultSlot) {
1467
+ contVNs.push(
1468
+ isVScrollbar
1469
+ ? h(
1470
+ VxeScrollbarComponent,
1471
+ {
1472
+ key: 'shc',
1473
+ class: 'vxe-modal--scrollbar-content',
1474
+ ...scrollbarProps
1475
+ },
1476
+ {
1477
+ default() {
1478
+ return [
1479
+ h('div', {
1480
+ class: 'vxe-modal--scrollbar-content-html',
1481
+ innerHTML: getFuncText(content)
1482
+ })
1483
+ ]
1484
+ }
1485
+ }
1486
+ )
1487
+ : h('div', {
1488
+ key: 'hc',
1489
+ class: 'vxe-modal--content',
1490
+ innerHTML: getFuncText(content)
1491
+ })
1492
+ )
1493
+ } else {
1494
+ contVNs.push(
1495
+ isVScrollbar
1496
+ ? h(
1497
+ VxeScrollbarComponent,
1498
+ {
1499
+ key: 'sdc',
1500
+ class: 'vxe-modal--scrollbar-content',
1501
+ ...scrollbarProps
1502
+ },
1503
+ {
1504
+ default: () => (defaultSlot ? getSlotVNs(defaultSlot({ $modal: $xeModal })) : getFuncText(content))
1505
+ }
1506
+ )
1507
+ : h(
1508
+ 'div',
1509
+ {
1510
+ key: 'dc',
1511
+ class: 'vxe-modal--content'
1512
+ },
1513
+ defaultSlot ? getSlotVNs(defaultSlot({ $modal: $xeModal })) : getFuncText(content)
1514
+ )
1515
+ )
1516
+ }
1517
+
1518
+ return h(
1519
+ 'div',
1520
+ {
1521
+ class: 'vxe-modal--body'
1522
+ },
1523
+ [
1524
+ leftSlot
1525
+ ? h(
1526
+ 'div',
1527
+ {
1528
+ class: 'vxe-modal--body-left'
1529
+ },
1530
+ getSlotVNs(leftSlot({ $modal: $xeModal }))
1531
+ )
1532
+ : renderEmptyElement($xeModal),
1533
+ h(
1534
+ 'div',
1535
+ {
1536
+ class: 'vxe-modal--body-default'
1537
+ },
1538
+ contVNs
1539
+ ),
1540
+ rightSlot
1541
+ ? h(
1542
+ 'div',
1543
+ {
1544
+ class: 'vxe-modal--body-right'
1545
+ },
1546
+ getSlotVNs(rightSlot({ $modal: $xeModal }))
1547
+ )
1548
+ : renderEmptyElement($xeModal),
1549
+ isMsg
1550
+ ? renderEmptyElement($xeModal)
1551
+ : h(VxeLoadingComponent, {
1552
+ class: 'vxe-modal--loading',
1553
+ modelValue: props.loading
1554
+ })
1555
+ ]
1556
+ )
1557
+ }
1558
+
1559
+ const renderDefaultFooter = () => {
1560
+ const { slots: propSlots = {}, showCancelButton, showConfirmButton, type, loading } = props
1561
+ const lfSlot = slots.leftfoot || propSlots.leftfoot
1562
+ const rfSlot = slots.rightfoot || propSlots.rightfoot
1563
+ const btnVNs = []
1564
+ if (XEUtils.isBoolean(showCancelButton) ? showCancelButton : type === 'confirm') {
1565
+ btnVNs.push(
1566
+ h(VxeButtonComponent, {
1567
+ key: 1,
1568
+ ref: refCancelBtn,
1569
+ content: props.cancelButtonText || getI18n('vxe.button.cancel'),
1570
+ onClick: cancelEvent
1571
+ })
1572
+ )
1573
+ }
1574
+ if (XEUtils.isBoolean(showConfirmButton) ? showConfirmButton : type === 'confirm' || type === 'alert') {
1575
+ btnVNs.push(
1576
+ h(VxeButtonComponent, {
1577
+ key: 2,
1578
+ ref: refConfirmBtn,
1579
+ loading: loading,
1580
+ status: 'primary',
1581
+ content: props.confirmButtonText || getI18n('vxe.button.confirm'),
1582
+ onClick: confirmEvent
1583
+ })
1584
+ )
1585
+ }
1586
+ return h(
1587
+ 'div',
1588
+ {
1589
+ class: 'vxe-modal--footer-wrapper'
1590
+ },
1591
+ [
1592
+ h(
1593
+ 'div',
1594
+ {
1595
+ class: 'vxe-modal--footer-left'
1596
+ },
1597
+ lfSlot ? getSlotVNs(lfSlot({ $modal: $xeModal })) : []
1598
+ ),
1599
+ h(
1600
+ 'div',
1601
+ {
1602
+ class: 'vxe-modal--footer-right'
1603
+ },
1604
+ rfSlot ? getSlotVNs(rfSlot({ $modal: $xeModal })) : btnVNs
1605
+ )
1606
+ ]
1607
+ )
1608
+ }
1609
+
1610
+ const renderFooter = () => {
1611
+ const { slots: propSlots = {} } = props
1612
+ const footerSlot = slots.footer || propSlots.footer
1613
+ if (props.showFooter) {
1614
+ return h(
1615
+ 'div',
1616
+ {
1617
+ class: 'vxe-modal--footer'
1618
+ },
1619
+ footerSlot ? getSlotVNs(footerSlot({ $modal: $xeModal })) : [renderDefaultFooter()]
1620
+ )
1621
+ }
1622
+ return renderEmptyElement($xeModal)
1623
+ }
1624
+
1625
+ const renderVN = () => {
1626
+ const { border, showTitleBackground, slots: propSlots = {}, className, type, animat, draggable, iconStatus, position, loading, destroyOnClose, status, lockScroll, padding, lockView, mask, resize, appendTo, isWithinAppendTo } = props
1627
+ const { initialized, modalTop, contentVisible, visible, zoomStatus } = reactData
1628
+ const asideSlot = slots.aside || propSlots.aside
1629
+ const vSize = computeSize.value
1630
+ const isMsg = computeIsMsg.value
1631
+ const isMinimizeStatus = computeIsMinimizeStatus.value
1632
+ const btnTransfer = computeBtnTransfer.value
1633
+ const ons: Record<string, any> = {}
1634
+ if (isMsg) {
1635
+ ons.onMouseover = selfMouseoverEvent
1636
+ ons.onMouseout = selfMouseoutEvent
1637
+ }
1638
+ return h(
1639
+ Teleport,
1640
+ {
1641
+ to: getPopupContainer(appendTo),
1642
+ disabled: btnTransfer ? !initialized : true
1643
+ },
1644
+ [
1645
+ h(
1646
+ 'div',
1647
+ {
1648
+ ref: refElem,
1649
+ class: [
1650
+ 'vxe-modal--wrapper',
1651
+ `type--${type}`,
1652
+ `zoom--${zoomStatus || 'revert'}`,
1653
+ position ? `pos--${position}` : '',
1654
+ isWithinAppendTo ? 'ctx--within' : 'ctx--free',
1655
+ className || '',
1656
+ {
1657
+ [`size--${vSize}`]: vSize,
1658
+ [`status--${status}`]: status,
1659
+ 'is--padding': padding,
1660
+ 'is--border': border,
1661
+ 'is--title-bg': showTitleBackground,
1662
+ 'is--animat': animat,
1663
+ 'lock--scroll': lockScroll,
1664
+ 'lock--view': lockView,
1665
+ 'is--draggable': draggable,
1666
+ 'is--resize': resize,
1667
+ 'is--mask': mask,
1668
+ 'is--visible': contentVisible,
1669
+ 'is--active': visible,
1670
+ 'is--loading': loading
1671
+ }
1672
+ ],
1673
+ style: {
1674
+ zIndex: reactData.modalZindex,
1675
+ top: modalTop ? `${modalTop}px` : null
1676
+ },
1677
+ onClick: selfClickEvent,
1678
+ ...ons
1679
+ },
1680
+ [
1681
+ h(
1682
+ 'div',
1683
+ {
1684
+ ref: refModalBox,
1685
+ class: 'vxe-modal--box',
1686
+ onMousedown: boxMousedownEvent
1687
+ },
1688
+ [
1689
+ (isMsg || asideSlot) && !isMinimizeStatus
1690
+ ? h(
1691
+ 'div',
1692
+ {
1693
+ class: 'vxe-modal--aside'
1694
+ },
1695
+ asideSlot
1696
+ ? getSlotVNs(asideSlot({ $modal: $xeModal }))
1697
+ : [
1698
+ status || iconStatus
1699
+ ? h(
1700
+ 'div',
1701
+ {
1702
+ class: 'vxe-modal--status-wrapper'
1703
+ },
1704
+ [
1705
+ h('i', {
1706
+ class: ['vxe-modal--status-icon', iconStatus || getIcon()[`MODAL_${status}`.toLocaleUpperCase() as 'MODAL_SUCCESS' | 'MODAL_ERROR']]
1707
+ })
1708
+ ]
1709
+ )
1710
+ : renderEmptyElement($xeModal)
1711
+ ]
1712
+ )
1713
+ : renderEmptyElement($xeModal),
1714
+ h(
1715
+ 'div',
1716
+ {
1717
+ class: 'vxe-modal--container'
1718
+ },
1719
+ !reactData.initialized || (destroyOnClose && !reactData.visible)
1720
+ ? []
1721
+ : [
1722
+ renderHeader(),
1723
+ renderBody(),
1724
+ renderFooter(),
1725
+ !isMsg && resize
1726
+ ? h(
1727
+ 'span',
1728
+ {
1729
+ class: 'vxe-modal--resize'
1730
+ },
1731
+ ['wl', 'wr', 'swst', 'sest', 'st', 'swlb', 'selb', 'sb'].map((type) => {
1732
+ return h('span', {
1733
+ class: `${type}-resize`,
1734
+ 'data-type': type,
1735
+ onMousedown: dragEvent
1736
+ })
1737
+ })
1738
+ )
1739
+ : renderEmptyElement($xeModal)
1740
+ ]
1741
+ )
1742
+ ]
1743
+ )
1744
+ ]
1745
+ )
1746
+ ]
1747
+ )
1748
+ }
1749
+
1750
+ $xeModal.renderVN = renderVN
1751
+
1752
+ watch(() => props.width, recalculate)
1753
+ watch(() => props.height, recalculate)
1754
+
1755
+ watch(
1756
+ () => props.modelValue,
1757
+ (value) => {
1758
+ if (value) {
1759
+ openModal()
1760
+ } else {
1761
+ closeModal('model')
1762
+ }
1763
+ }
1764
+ )
1765
+
1766
+ onMounted(() => {
1767
+ if (props.type === 'modal' && props.showFooter && !(props.showConfirmButton || props.showCancelButton || slots.footer)) {
1768
+ warnLog('vxe.modal.footPropErr')
1769
+ }
1770
+ reactData.initialized = !!props.preload
1771
+ nextTick(() => {
1772
+ if (props.storage && !props.id) {
1773
+ errLog('vxe.error.reqProp', ['id'])
1774
+ }
1775
+ if (props.modelValue) {
1776
+ openModal()
1777
+ }
1778
+ recalculate()
1779
+ })
1780
+ if (props.escClosable) {
1781
+ globalEvents.on($xeModal, 'keydown', handleGlobalKeydownEvent)
1782
+ }
1783
+ globalEvents.on($xeModal, 'resize', handleGlobalResizeEvent)
1784
+ })
1785
+
1786
+ onUnmounted(() => {
1787
+ globalEvents.off($xeModal, 'keydown')
1788
+ globalEvents.off($xeModal, 'resize')
1789
+ removeMsgQueue()
1790
+ removeActiveQueue()
1791
+ removeBodyLockScroll()
1792
+ XEUtils.assign(reactData, createReactData())
1793
+ XEUtils.assign(internalData, createInternalData())
1794
+ })
1795
+
1796
+ provide('$xeModal', $xeModal)
1797
+
1798
+ return $xeModal
1799
+ },
1800
+ render() {
1801
+ return this.renderVN()
1802
+ }
1803
+ })