vxe-pc-ui 4.20.24 → 4.20.26

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