vxe-pc-ui 4.14.6 → 4.14.7

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 (611) hide show
  1. package/LICENSE +21 -21
  2. package/README.en.md +72 -72
  3. package/README.ja-JP.md +72 -72
  4. package/README.md +364 -364
  5. package/README.zh-TW.md +73 -73
  6. package/es/checkbox/src/button.js +26 -5
  7. package/es/checkbox/src/checkbox.js +26 -5
  8. package/es/checkbox/src/group.js +23 -3
  9. package/es/checkbox/style.css +6 -3
  10. package/es/checkbox/style.min.css +1 -1
  11. package/es/language/ar-EG.js +4 -0
  12. package/es/language/de-DE.js +4 -0
  13. package/es/language/en-US.js +4 -0
  14. package/es/language/es-ES.js +4 -0
  15. package/es/language/fr-FR.js +4 -0
  16. package/es/language/hu-HU.js +4 -0
  17. package/es/language/hy-AM.js +4 -0
  18. package/es/language/id-ID.js +4 -0
  19. package/es/language/it-IT.js +4 -0
  20. package/es/language/ja-JP.js +4 -0
  21. package/es/language/ko-KR.js +4 -0
  22. package/es/language/ms-MY.js +4 -0
  23. package/es/language/nb-NO.js +4 -0
  24. package/es/language/pt-BR.js +4 -0
  25. package/es/language/ru-RU.js +4 -0
  26. package/es/language/th-TH.js +4 -0
  27. package/es/language/ug-CN.js +4 -0
  28. package/es/language/uk-UA.js +4 -0
  29. package/es/language/uz-UZ.js +4 -0
  30. package/es/language/vi-VN.js +4 -0
  31. package/es/language/zh-CHT.js +4 -0
  32. package/es/language/zh-CN.js +4 -0
  33. package/es/radio/src/button.js +27 -5
  34. package/es/radio/src/group.js +17 -2
  35. package/es/radio/src/radio.js +27 -5
  36. package/es/radio/style.css +5 -3
  37. package/es/radio/style.min.css +1 -1
  38. package/es/style.css +1 -1
  39. package/es/style.min.css +1 -1
  40. package/es/switch/src/switch.js +19 -11
  41. package/es/tree/style.css +11 -6
  42. package/es/tree/style.min.css +1 -1
  43. package/es/ui/index.js +1 -1
  44. package/es/ui/src/log.js +1 -1
  45. package/es/vxe-checkbox/style.css +6 -3
  46. package/es/vxe-checkbox/style.min.css +1 -1
  47. package/es/vxe-radio/style.css +5 -3
  48. package/es/vxe-radio/style.min.css +1 -1
  49. package/es/vxe-tree/style.css +11 -6
  50. package/es/vxe-tree/style.min.css +1 -1
  51. package/lib/checkbox/src/button.js +26 -3
  52. package/lib/checkbox/src/button.min.js +1 -1
  53. package/lib/checkbox/src/checkbox.js +26 -3
  54. package/lib/checkbox/src/checkbox.min.js +1 -1
  55. package/lib/checkbox/src/group.js +25 -3
  56. package/lib/checkbox/src/group.min.js +1 -1
  57. package/lib/checkbox/style/style.css +6 -3
  58. package/lib/checkbox/style/style.min.css +1 -1
  59. package/lib/index.umd.js +2446 -2376
  60. package/lib/index.umd.min.js +1 -1
  61. package/lib/language/ar-EG.js +4 -0
  62. package/lib/language/ar-EG.min.js +1 -1
  63. package/lib/language/ar-EG.umd.js +4 -0
  64. package/lib/language/de-DE.js +4 -0
  65. package/lib/language/de-DE.min.js +1 -1
  66. package/lib/language/de-DE.umd.js +4 -0
  67. package/lib/language/en-US.js +4 -0
  68. package/lib/language/en-US.min.js +1 -1
  69. package/lib/language/en-US.umd.js +4 -0
  70. package/lib/language/es-ES.js +4 -0
  71. package/lib/language/es-ES.min.js +1 -1
  72. package/lib/language/es-ES.umd.js +4 -0
  73. package/lib/language/fr-FR.js +4 -0
  74. package/lib/language/fr-FR.min.js +1 -1
  75. package/lib/language/fr-FR.umd.js +4 -0
  76. package/lib/language/hu-HU.js +4 -0
  77. package/lib/language/hu-HU.min.js +1 -1
  78. package/lib/language/hu-HU.umd.js +4 -0
  79. package/lib/language/hy-AM.js +4 -0
  80. package/lib/language/hy-AM.min.js +1 -1
  81. package/lib/language/hy-AM.umd.js +4 -0
  82. package/lib/language/id-ID.js +4 -0
  83. package/lib/language/id-ID.min.js +1 -1
  84. package/lib/language/id-ID.umd.js +4 -0
  85. package/lib/language/it-IT.js +4 -0
  86. package/lib/language/it-IT.min.js +1 -1
  87. package/lib/language/it-IT.umd.js +4 -0
  88. package/lib/language/ja-JP.js +4 -0
  89. package/lib/language/ja-JP.min.js +1 -1
  90. package/lib/language/ja-JP.umd.js +4 -0
  91. package/lib/language/ko-KR.js +4 -0
  92. package/lib/language/ko-KR.min.js +1 -1
  93. package/lib/language/ko-KR.umd.js +4 -0
  94. package/lib/language/ms-MY.js +4 -0
  95. package/lib/language/ms-MY.min.js +1 -1
  96. package/lib/language/ms-MY.umd.js +4 -0
  97. package/lib/language/nb-NO.js +4 -0
  98. package/lib/language/nb-NO.min.js +1 -1
  99. package/lib/language/nb-NO.umd.js +4 -0
  100. package/lib/language/pt-BR.js +4 -0
  101. package/lib/language/pt-BR.min.js +1 -1
  102. package/lib/language/pt-BR.umd.js +4 -0
  103. package/lib/language/ru-RU.js +4 -0
  104. package/lib/language/ru-RU.min.js +1 -1
  105. package/lib/language/ru-RU.umd.js +4 -0
  106. package/lib/language/th-TH.js +4 -0
  107. package/lib/language/th-TH.min.js +1 -1
  108. package/lib/language/th-TH.umd.js +4 -0
  109. package/lib/language/ug-CN.js +4 -0
  110. package/lib/language/ug-CN.min.js +1 -1
  111. package/lib/language/ug-CN.umd.js +4 -0
  112. package/lib/language/uk-UA.js +4 -0
  113. package/lib/language/uk-UA.min.js +1 -1
  114. package/lib/language/uk-UA.umd.js +4 -0
  115. package/lib/language/uz-UZ.js +4 -0
  116. package/lib/language/uz-UZ.min.js +1 -1
  117. package/lib/language/uz-UZ.umd.js +4 -0
  118. package/lib/language/vi-VN.js +4 -0
  119. package/lib/language/vi-VN.min.js +1 -1
  120. package/lib/language/vi-VN.umd.js +4 -0
  121. package/lib/language/zh-CHT.js +4 -0
  122. package/lib/language/zh-CHT.min.js +1 -1
  123. package/lib/language/zh-CHT.umd.js +4 -0
  124. package/lib/language/zh-CN.js +4 -0
  125. package/lib/language/zh-CN.min.js +1 -1
  126. package/lib/language/zh-CN.umd.js +4 -0
  127. package/lib/radio/src/button.js +27 -3
  128. package/lib/radio/src/button.min.js +1 -1
  129. package/lib/radio/src/group.js +19 -2
  130. package/lib/radio/src/group.min.js +1 -1
  131. package/lib/radio/src/radio.js +27 -3
  132. package/lib/radio/src/radio.min.js +1 -1
  133. package/lib/radio/style/style.css +5 -3
  134. package/lib/radio/style/style.min.css +1 -1
  135. package/lib/style.css +1 -1
  136. package/lib/style.min.css +1 -1
  137. package/lib/switch/src/switch.js +18 -10
  138. package/lib/switch/src/switch.min.js +1 -1
  139. package/lib/tree/style/style.css +11 -6
  140. package/lib/tree/style/style.min.css +1 -1
  141. package/lib/ui/index.js +1 -1
  142. package/lib/ui/index.min.js +1 -1
  143. package/lib/ui/src/log.js +1 -1
  144. package/lib/ui/src/log.min.js +1 -1
  145. package/lib/vxe-checkbox/style/style.css +6 -3
  146. package/lib/vxe-checkbox/style/style.min.css +1 -1
  147. package/lib/vxe-radio/style/style.css +5 -3
  148. package/lib/vxe-radio/style/style.min.css +1 -1
  149. package/lib/vxe-tree/style/style.css +11 -6
  150. package/lib/vxe-tree/style/style.min.css +1 -1
  151. package/package.json +88 -88
  152. package/packages/alert/index.ts +16 -16
  153. package/packages/alert/src/alert.ts +124 -124
  154. package/packages/anchor/index.ts +16 -16
  155. package/packages/anchor/src/anchor-link.ts +121 -121
  156. package/packages/anchor/src/anchor.ts +237 -237
  157. package/packages/anchor/src/util.ts +23 -23
  158. package/packages/anchor-link/index.ts +16 -16
  159. package/packages/avatar/index.ts +16 -16
  160. package/packages/avatar/src/avatar.ts +149 -149
  161. package/packages/backtop/index.ts +16 -16
  162. package/packages/backtop/src/backtop.ts +314 -314
  163. package/packages/badge/index.ts +16 -16
  164. package/packages/badge/src/badge.ts +100 -100
  165. package/packages/breadcrumb/index.ts +16 -16
  166. package/packages/breadcrumb/src/breadcrumb-item.ts +106 -106
  167. package/packages/breadcrumb/src/breadcrumb.ts +92 -92
  168. package/packages/breadcrumb-item/index.ts +16 -16
  169. package/packages/button/index.ts +16 -16
  170. package/packages/button/src/button-group.ts +110 -110
  171. package/packages/button/src/button.ts +841 -841
  172. package/packages/button-group/index.ts +16 -16
  173. package/packages/calendar/index.ts +16 -16
  174. package/packages/calendar/src/calendar.ts +1351 -1351
  175. package/packages/card/index.ts +16 -16
  176. package/packages/card/src/card.ts +175 -175
  177. package/packages/carousel/index.ts +16 -16
  178. package/packages/carousel/src/carousel-item.ts +102 -102
  179. package/packages/carousel/src/carousel.ts +414 -414
  180. package/packages/carousel/src/util.ts +21 -21
  181. package/packages/carousel-item/index.ts +16 -16
  182. package/packages/cascader/index.ts +16 -16
  183. package/packages/cascader/src/cascader.ts +741 -741
  184. package/packages/checkbox/index.ts +16 -16
  185. package/packages/checkbox/src/button.ts +165 -144
  186. package/packages/checkbox/src/checkbox.ts +176 -154
  187. package/packages/checkbox/src/group.ts +243 -222
  188. package/packages/checkbox-button/index.ts +16 -16
  189. package/packages/checkbox-group/index.ts +16 -16
  190. package/packages/col/index.ts +16 -16
  191. package/packages/collapse/index.ts +16 -16
  192. package/packages/collapse/src/collapse-pane.ts +114 -114
  193. package/packages/collapse/src/collapse.ts +284 -284
  194. package/packages/collapse/src/util.ts +21 -21
  195. package/packages/collapse-pane/index.ts +16 -16
  196. package/packages/color-picker/index.ts +16 -16
  197. package/packages/color-picker/src/color-picker.ts +1109 -1109
  198. package/packages/color-picker/src/util.ts +198 -198
  199. package/packages/components.ts +307 -307
  200. package/packages/context-menu/index.ts +54 -54
  201. package/packages/context-menu/src/context-menu.ts +681 -681
  202. package/packages/countdown/index.ts +16 -16
  203. package/packages/countdown/src/countdown.ts +262 -262
  204. package/packages/date-panel/index.ts +16 -16
  205. package/packages/date-panel/src/date-panel.ts +1809 -1809
  206. package/packages/date-panel/src/util.ts +244 -244
  207. package/packages/date-picker/index.ts +16 -16
  208. package/packages/date-picker/src/date-picker.ts +1071 -1071
  209. package/packages/date-range-picker/index.ts +16 -16
  210. package/packages/date-range-picker/src/date-range-picker.ts +1280 -1280
  211. package/packages/drawer/index.ts +77 -77
  212. package/packages/drawer/src/drawer.ts +657 -657
  213. package/packages/dynamics/index.ts +89 -89
  214. package/packages/empty/index.ts +16 -16
  215. package/packages/empty/src/empty.ts +100 -100
  216. package/packages/form/index.ts +16 -16
  217. package/packages/form/render/index.ts +598 -598
  218. package/packages/form/src/form-config-item.ts +72 -72
  219. package/packages/form/src/form-group.ts +86 -86
  220. package/packages/form/src/form-item.ts +174 -174
  221. package/packages/form/src/form.ts +987 -987
  222. package/packages/form/src/itemInfo.ts +80 -80
  223. package/packages/form/src/render.ts +387 -387
  224. package/packages/form/src/util.ts +93 -93
  225. package/packages/form-gather/index.ts +26 -26
  226. package/packages/form-group/index.ts +16 -16
  227. package/packages/form-item/index.ts +16 -16
  228. package/packages/icon/index.ts +16 -16
  229. package/packages/icon/src/icon.ts +75 -75
  230. package/packages/icon-picker/index.ts +16 -16
  231. package/packages/icon-picker/src/icon-picker.ts +626 -626
  232. package/packages/image/index.ts +16 -16
  233. package/packages/image/src/group.ts +153 -153
  234. package/packages/image/src/image.ts +298 -298
  235. package/packages/image/src/preview.ts +672 -672
  236. package/packages/image/src/util.ts +59 -59
  237. package/packages/image-group/index.ts +16 -16
  238. package/packages/image-preview/index.ts +19 -19
  239. package/packages/index.ts +4 -4
  240. package/packages/input/index.ts +16 -16
  241. package/packages/input/src/input.ts +2788 -2788
  242. package/packages/language/ar-EG.ts +844 -840
  243. package/packages/language/de-DE.ts +844 -840
  244. package/packages/language/en-US.ts +844 -840
  245. package/packages/language/es-ES.ts +844 -840
  246. package/packages/language/fr-FR.ts +844 -840
  247. package/packages/language/hu-HU.ts +844 -840
  248. package/packages/language/hy-AM.ts +844 -840
  249. package/packages/language/id-ID.ts +844 -840
  250. package/packages/language/it-IT.ts +844 -840
  251. package/packages/language/ja-JP.ts +844 -840
  252. package/packages/language/ko-KR.ts +844 -840
  253. package/packages/language/ms-MY.ts +844 -840
  254. package/packages/language/nb-NO.ts +844 -840
  255. package/packages/language/pt-BR.ts +844 -840
  256. package/packages/language/ru-RU.ts +844 -840
  257. package/packages/language/th-TH.ts +844 -840
  258. package/packages/language/ug-CN.ts +844 -840
  259. package/packages/language/uk-UA.ts +844 -840
  260. package/packages/language/uz-UZ.ts +844 -840
  261. package/packages/language/vi-VN.ts +844 -840
  262. package/packages/language/zh-CHT.ts +844 -840
  263. package/packages/language/zh-CN.ts +844 -840
  264. package/packages/language/zh-HK.ts +3 -3
  265. package/packages/language/zh-MO.ts +3 -3
  266. package/packages/language/zh-TC.ts +3 -3
  267. package/packages/language/zh-TW.ts +3 -3
  268. package/packages/layout-aside/index.ts +16 -16
  269. package/packages/layout-aside/src/layout-aside.ts +123 -123
  270. package/packages/layout-body/index.ts +16 -16
  271. package/packages/layout-body/src/layout-body.ts +142 -142
  272. package/packages/layout-container/index.ts +16 -16
  273. package/packages/layout-container/src/layout-container.ts +82 -82
  274. package/packages/layout-footer/index.ts +16 -16
  275. package/packages/layout-footer/src/layout-footer.ts +74 -74
  276. package/packages/layout-header/index.ts +16 -16
  277. package/packages/layout-header/src/layout-header.ts +73 -73
  278. package/packages/link/index.ts +16 -16
  279. package/packages/link/src/link.ts +161 -161
  280. package/packages/list/index.ts +16 -16
  281. package/packages/list/src/list.ts +442 -442
  282. package/packages/loading/index.ts +34 -34
  283. package/packages/loading/src/loading.ts +152 -152
  284. package/packages/mention/index.ts +16 -16
  285. package/packages/mention/src/mention.ts +71 -71
  286. package/packages/menu/index.ts +16 -16
  287. package/packages/menu/src/menu.ts +581 -581
  288. package/packages/modal/index.ts +136 -136
  289. package/packages/modal/src/modal.ts +1494 -1494
  290. package/packages/notice-bar/index.ts +16 -16
  291. package/packages/notice-bar/src/notice-bar.ts +181 -181
  292. package/packages/number-input/index.ts +16 -16
  293. package/packages/number-input/src/number-input.ts +1096 -1096
  294. package/packages/number-input/src/util.ts +12 -12
  295. package/packages/optgroup/index.ts +16 -16
  296. package/packages/option/index.ts +16 -16
  297. package/packages/pager/index.ts +16 -16
  298. package/packages/pager/src/pager.ts +769 -769
  299. package/packages/password-input/index.ts +16 -16
  300. package/packages/password-input/src/password-input.ts +378 -378
  301. package/packages/print/index.ts +18 -18
  302. package/packages/print/src/page-break.ts +92 -92
  303. package/packages/print/src/print.ts +272 -272
  304. package/packages/print/src/util.ts +284 -284
  305. package/packages/print-page-break/index.ts +16 -16
  306. package/packages/pulldown/index.ts +16 -16
  307. package/packages/pulldown/src/pulldown.ts +457 -457
  308. package/packages/radio/index.ts +16 -16
  309. package/packages/radio/src/button.ts +195 -173
  310. package/packages/radio/src/group.ts +229 -213
  311. package/packages/radio/src/radio.ts +203 -180
  312. package/packages/radio-button/index.ts +16 -16
  313. package/packages/radio-group/index.ts +16 -16
  314. package/packages/rate/index.ts +16 -16
  315. package/packages/rate/src/rate.ts +192 -192
  316. package/packages/result/index.ts +16 -16
  317. package/packages/result/src/result.ts +112 -112
  318. package/packages/row/index.ts +16 -16
  319. package/packages/row/src/col.ts +136 -136
  320. package/packages/row/src/row.ts +119 -119
  321. package/packages/segmented/index.ts +16 -16
  322. package/packages/segmented/src/segmented.ts +264 -264
  323. package/packages/select/index.ts +16 -16
  324. package/packages/select/src/optgroup.ts +49 -49
  325. package/packages/select/src/option-info.ts +20 -20
  326. package/packages/select/src/option.ts +47 -47
  327. package/packages/select/src/select.ts +1699 -1699
  328. package/packages/select/src/util.ts +47 -47
  329. package/packages/slider/index.ts +16 -16
  330. package/packages/slider/src/slider.ts +304 -304
  331. package/packages/split/index.ts +16 -16
  332. package/packages/split-pane/index.ts +17 -17
  333. package/packages/splitter/index.ts +16 -16
  334. package/packages/splitter/src/splitter-panel.ts +145 -145
  335. package/packages/splitter/src/splitter.ts +1009 -1009
  336. package/packages/splitter/src/util.ts +21 -21
  337. package/packages/splitter-panel/index.ts +16 -16
  338. package/packages/steps/index.ts +16 -16
  339. package/packages/steps/src/steps.ts +68 -68
  340. package/packages/switch/index.ts +16 -16
  341. package/packages/switch/src/switch.ts +245 -237
  342. package/packages/tab-pane/index.ts +16 -16
  343. package/packages/table-select/index.ts +16 -16
  344. package/packages/table-select/src/table-select.ts +800 -800
  345. package/packages/tabs/index.ts +16 -16
  346. package/packages/tabs/src/tab-pane.ts +117 -117
  347. package/packages/tabs/src/tabs.ts +940 -940
  348. package/packages/tabs/src/util.ts +21 -21
  349. package/packages/tag/index.ts +16 -16
  350. package/packages/tag/src/tag.ts +187 -187
  351. package/packages/text/index.ts +16 -16
  352. package/packages/text/src/text.ts +260 -260
  353. package/packages/text-ellipsis/index.ts +16 -16
  354. package/packages/text-ellipsis/src/text-ellipsis.ts +282 -282
  355. package/packages/textarea/index.ts +16 -16
  356. package/packages/textarea/src/textarea.ts +373 -373
  357. package/packages/timeline/index.ts +16 -16
  358. package/packages/timeline/src/timeline-item.ts +67 -67
  359. package/packages/timeline/src/timeline.ts +71 -71
  360. package/packages/timeline-item/index.ts +16 -16
  361. package/packages/tip/index.ts +19 -19
  362. package/packages/tip/src/tip.ts +129 -129
  363. package/packages/tooltip/index.ts +16 -16
  364. package/packages/tooltip/src/tooltip.ts +589 -589
  365. package/packages/tour/index.ts +16 -16
  366. package/packages/tour/src/tour.ts +71 -71
  367. package/packages/tree/index.ts +16 -16
  368. package/packages/tree/src/store.ts +14 -14
  369. package/packages/tree/src/tree.ts +2825 -2825
  370. package/packages/tree/src/util.ts +45 -45
  371. package/packages/tree-select/index.ts +16 -16
  372. package/packages/tree-select/src/tree-select.ts +979 -979
  373. package/packages/ui/index.ts +697 -697
  374. package/packages/ui/src/anime.ts +52 -52
  375. package/packages/ui/src/comp.ts +3 -3
  376. package/packages/ui/src/dom.ts +279 -279
  377. package/packages/ui/src/log.ts +6 -6
  378. package/packages/ui/src/utils.ts +49 -49
  379. package/packages/ui/src/vn.ts +39 -39
  380. package/packages/upload/index.ts +20 -20
  381. package/packages/upload/src/upload.ts +1919 -1919
  382. package/packages/upload/src/util.ts +109 -109
  383. package/packages/watermark/index.ts +31 -31
  384. package/packages/watermark/src/util.ts +176 -176
  385. package/packages/watermark/src/watermark.ts +168 -168
  386. package/styles/all.scss +90 -90
  387. package/styles/base.scss +16 -16
  388. package/styles/components/alert.scss +101 -101
  389. package/styles/components/anchor.scss +44 -44
  390. package/styles/components/avatar.scss +115 -115
  391. package/styles/components/backtop.scss +82 -82
  392. package/styles/components/badge.scss +45 -45
  393. package/styles/components/breadcrumb.scss +29 -29
  394. package/styles/components/button-group.scss +30 -30
  395. package/styles/components/button.scss +415 -415
  396. package/styles/components/calendar.scss +471 -471
  397. package/styles/components/card.scss +121 -121
  398. package/styles/components/carousel.scss +184 -184
  399. package/styles/components/cascader.scss +140 -140
  400. package/styles/components/checkbox-button.scss +57 -57
  401. package/styles/components/checkbox.scss +81 -81
  402. package/styles/components/collapse.scss +56 -56
  403. package/styles/components/color-picker.scss +409 -409
  404. package/styles/components/context-menu.scss +102 -102
  405. package/styles/components/countdown.scss +35 -35
  406. package/styles/components/date-panel.scss +505 -505
  407. package/styles/components/date-picker.scss +247 -247
  408. package/styles/components/date-range-picker.scss +252 -252
  409. package/styles/components/drawer.scss +298 -298
  410. package/styles/components/empty.scss +79 -79
  411. package/styles/components/form.scss +668 -668
  412. package/styles/components/icon-picker.scss +211 -211
  413. package/styles/components/icon.scss +1048 -1048
  414. package/styles/components/image-group.scss +2 -2
  415. package/styles/components/image-preview.scss +215 -215
  416. package/styles/components/image.scss +16 -16
  417. package/styles/components/input.scss +846 -846
  418. package/styles/components/layout-aside.scss +22 -22
  419. package/styles/components/layout-body.scss +14 -14
  420. package/styles/components/layout-container.scss +13 -13
  421. package/styles/components/layout-footer.scss +14 -14
  422. package/styles/components/layout-header.scss +11 -11
  423. package/styles/components/link.scss +115 -115
  424. package/styles/components/list.scss +40 -40
  425. package/styles/components/loading.scss +137 -137
  426. package/styles/components/menu.scss +150 -150
  427. package/styles/components/modal.scss +480 -480
  428. package/styles/components/notice-bar.scss +91 -91
  429. package/styles/components/number-input.scss +283 -283
  430. package/styles/components/old-icon.scss +4 -4
  431. package/styles/components/pager.scss +282 -282
  432. package/styles/components/password-input.scss +374 -374
  433. package/styles/components/print.scss +3 -3
  434. package/styles/components/pulldown.scss +75 -75
  435. package/styles/components/radio-button.scss +57 -57
  436. package/styles/components/radio.scss +79 -79
  437. package/styles/components/rate.scss +76 -76
  438. package/styles/components/result.scss +91 -91
  439. package/styles/components/row.scss +69 -69
  440. package/styles/components/segmented.scss +215 -215
  441. package/styles/components/select.scss +244 -244
  442. package/styles/components/slider.scss +139 -139
  443. package/styles/components/split.scss +1 -1
  444. package/styles/components/splitter.scss +318 -318
  445. package/styles/components/switch.scss +128 -128
  446. package/styles/components/table-select.scss +105 -105
  447. package/styles/components/tabs.scss +745 -745
  448. package/styles/components/tag.scss +184 -184
  449. package/styles/components/text-ellipsis.scss +130 -130
  450. package/styles/components/text.scss +123 -123
  451. package/styles/components/textarea.scss +106 -106
  452. package/styles/components/tip.scss +97 -97
  453. package/styles/components/tooltip.scss +141 -141
  454. package/styles/components/tree-select.scss +166 -166
  455. package/styles/components/tree.scss +294 -294
  456. package/styles/components/upload.scss +497 -497
  457. package/styles/components/watermark.scss +26 -26
  458. package/styles/helpers/baseMixin.scss +104 -95
  459. package/styles/helpers/baseVar.scss +3 -3
  460. package/styles/helpers/placement.scss +38 -38
  461. package/styles/theme/base.scss +214 -214
  462. package/styles/theme/dark.scss +119 -119
  463. package/styles/theme/light.scss +118 -118
  464. package/styles/variable.scss +111 -111
  465. package/types/all.d.ts +327 -327
  466. package/types/components/alert.d.ts +87 -87
  467. package/types/components/anchor-link.d.ts +91 -91
  468. package/types/components/anchor.d.ts +104 -104
  469. package/types/components/avatar.d.ts +88 -88
  470. package/types/components/backtop.d.ts +122 -122
  471. package/types/components/badge.d.ts +76 -76
  472. package/types/components/breadcrumb-item.d.ts +80 -80
  473. package/types/components/breadcrumb.d.ts +87 -87
  474. package/types/components/button-group.d.ts +120 -120
  475. package/types/components/button.d.ts +323 -323
  476. package/types/components/calendar.d.ts +264 -264
  477. package/types/components/card.d.ts +93 -93
  478. package/types/components/carousel-item.d.ts +75 -75
  479. package/types/components/carousel.d.ts +134 -134
  480. package/types/components/cascader.d.ts +263 -263
  481. package/types/components/checkbox-button.d.ts +103 -103
  482. package/types/components/checkbox-group.d.ts +146 -143
  483. package/types/components/checkbox.d.ts +123 -123
  484. package/types/components/col.d.ts +80 -80
  485. package/types/components/colgroup.d.ts +137 -137
  486. package/types/components/collapse-pane.d.ts +89 -89
  487. package/types/components/collapse.d.ts +121 -121
  488. package/types/components/color-picker.d.ts +176 -176
  489. package/types/components/column.d.ts +841 -841
  490. package/types/components/context-menu.d.ts +289 -289
  491. package/types/components/countdown.d.ts +112 -112
  492. package/types/components/date-panel.d.ts +280 -280
  493. package/types/components/date-picker.d.ts +332 -332
  494. package/types/components/date-range-picker.d.ts +352 -352
  495. package/types/components/drawer.d.ts +299 -299
  496. package/types/components/empty.d.ts +78 -78
  497. package/types/components/flow-design.d.ts +85 -85
  498. package/types/components/flow-view.d.ts +85 -85
  499. package/types/components/form-design.d.ts +376 -376
  500. package/types/components/form-gather.d.ts +124 -124
  501. package/types/components/form-group.d.ts +77 -77
  502. package/types/components/form-item.d.ts +411 -411
  503. package/types/components/form-view.d.ts +183 -183
  504. package/types/components/form.d.ts +468 -468
  505. package/types/components/gantt-module/gantt-view.d.ts +177 -177
  506. package/types/components/gantt-module/index.d.ts +1 -1
  507. package/types/components/gantt-plugins/extend-gantt-chart.d.ts +131 -131
  508. package/types/components/gantt-plugins/index.d.ts +1 -1
  509. package/types/components/gantt.d.ts +1194 -1194
  510. package/types/components/grid.d.ts +1040 -1040
  511. package/types/components/icon-picker.d.ts +196 -196
  512. package/types/components/icon.d.ts +87 -87
  513. package/types/components/image-group.d.ts +127 -127
  514. package/types/components/image-preview.d.ts +167 -167
  515. package/types/components/image.d.ts +173 -173
  516. package/types/components/input.d.ts +435 -435
  517. package/types/components/layout-aside.d.ts +80 -80
  518. package/types/components/layout-body.d.ts +91 -91
  519. package/types/components/layout-container.d.ts +73 -73
  520. package/types/components/layout-footer.d.ts +73 -73
  521. package/types/components/layout-header.d.ts +69 -69
  522. package/types/components/link.d.ts +111 -111
  523. package/types/components/list-design.d.ts +190 -190
  524. package/types/components/list-view.d.ts +199 -199
  525. package/types/components/list.d.ts +204 -204
  526. package/types/components/loading.d.ts +103 -103
  527. package/types/components/mention.d.ts +77 -77
  528. package/types/components/menu.d.ts +211 -211
  529. package/types/components/modal.d.ts +542 -542
  530. package/types/components/notice-bar.d.ts +102 -102
  531. package/types/components/number-input.d.ts +309 -309
  532. package/types/components/optgroup.d.ts +88 -88
  533. package/types/components/option.d.ts +103 -103
  534. package/types/components/pager.d.ts +335 -335
  535. package/types/components/password-input.d.ts +142 -142
  536. package/types/components/print-page-break.d.ts +69 -69
  537. package/types/components/print.d.ts +206 -206
  538. package/types/components/pulldown.d.ts +231 -231
  539. package/types/components/radio-button.d.ts +114 -114
  540. package/types/components/radio-group.d.ts +147 -144
  541. package/types/components/radio.d.ts +129 -129
  542. package/types/components/rate.d.ts +88 -88
  543. package/types/components/result.d.ts +84 -84
  544. package/types/components/row.d.ts +79 -79
  545. package/types/components/segmented.d.ts +123 -123
  546. package/types/components/select.d.ts +527 -527
  547. package/types/components/slider.d.ts +126 -126
  548. package/types/components/split-pane.d.ts +133 -133
  549. package/types/components/split.d.ts +312 -312
  550. package/types/components/splitter-panel.d.ts +105 -105
  551. package/types/components/splitter.d.ts +288 -288
  552. package/types/components/steps.d.ts +68 -68
  553. package/types/components/switch.d.ts +133 -133
  554. package/types/components/tab-pane.d.ts +114 -114
  555. package/types/components/table-module/custom.d.ts +123 -123
  556. package/types/components/table-module/edit.d.ts +243 -243
  557. package/types/components/table-module/export.d.ts +96 -96
  558. package/types/components/table-module/filter.d.ts +140 -140
  559. package/types/components/table-module/index.d.ts +7 -7
  560. package/types/components/table-module/keyboard.d.ts +26 -26
  561. package/types/components/table-module/menu.d.ts +28 -28
  562. package/types/components/table-module/validator.d.ts +53 -53
  563. package/types/components/table-plugins/extend-cell-area.d.ts +770 -770
  564. package/types/components/table-plugins/extend-pivot-table.d.ts +58 -58
  565. package/types/components/table-plugins/filters-combination.d.ts +15 -15
  566. package/types/components/table-plugins/filters-complex-input.d.ts +9 -9
  567. package/types/components/table-plugins/index.d.ts +4 -4
  568. package/types/components/table-select.d.ts +219 -219
  569. package/types/components/table.d.ts +7465 -7465
  570. package/types/components/tabs.d.ts +332 -332
  571. package/types/components/tag.d.ts +114 -114
  572. package/types/components/text-ellipsis.d.ts +112 -112
  573. package/types/components/text.d.ts +122 -122
  574. package/types/components/textarea.d.ts +247 -247
  575. package/types/components/timeline-item.d.ts +75 -75
  576. package/types/components/timeline.d.ts +77 -77
  577. package/types/components/tip.d.ts +83 -83
  578. package/types/components/toolbar.d.ts +336 -336
  579. package/types/components/tooltip.d.ts +180 -180
  580. package/types/components/tour.d.ts +77 -77
  581. package/types/components/tree-select.d.ts +310 -310
  582. package/types/components/tree.d.ts +843 -843
  583. package/types/components/upload.d.ts +437 -437
  584. package/types/components/watermark.d.ts +120 -120
  585. package/types/handles/form-design.d.ts +50 -50
  586. package/types/handles/index.d.ts +3 -3
  587. package/types/handles/list-design.d.ts +2 -2
  588. package/types/handles/table.d.ts +15 -15
  589. package/types/index.d.ts +8 -8
  590. package/types/ui/commands.d.ts +57 -57
  591. package/types/ui/formats.d.ts +62 -62
  592. package/types/ui/global-config.d.ts +254 -254
  593. package/types/ui/global-icon.d.ts +292 -292
  594. package/types/ui/hooks.d.ts +13 -13
  595. package/types/ui/index.d.ts +96 -96
  596. package/types/ui/interceptor.d.ts +52 -52
  597. package/types/ui/menus.d.ts +77 -77
  598. package/types/ui/renderer.d.ts +1041 -1041
  599. package/types/ui/validators.d.ts +38 -38
  600. /package/es/icon/{iconfont.1778317220469.ttf → iconfont.1778465063324.ttf} +0 -0
  601. /package/es/icon/{iconfont.1778317220469.woff → iconfont.1778465063324.woff} +0 -0
  602. /package/es/icon/{iconfont.1778317220469.woff2 → iconfont.1778465063324.woff2} +0 -0
  603. /package/es/{iconfont.1778317220469.ttf → iconfont.1778465063324.ttf} +0 -0
  604. /package/es/{iconfont.1778317220469.woff → iconfont.1778465063324.woff} +0 -0
  605. /package/es/{iconfont.1778317220469.woff2 → iconfont.1778465063324.woff2} +0 -0
  606. /package/lib/icon/style/{iconfont.1778317220469.ttf → iconfont.1778465063324.ttf} +0 -0
  607. /package/lib/icon/style/{iconfont.1778317220469.woff → iconfont.1778465063324.woff} +0 -0
  608. /package/lib/icon/style/{iconfont.1778317220469.woff2 → iconfont.1778465063324.woff2} +0 -0
  609. /package/lib/{iconfont.1778317220469.ttf → iconfont.1778465063324.ttf} +0 -0
  610. /package/lib/{iconfont.1778317220469.woff → iconfont.1778465063324.woff} +0 -0
  611. /package/lib/{iconfont.1778317220469.woff2 → iconfont.1778465063324.woff2} +0 -0
@@ -1,1494 +1,1494 @@
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 { getDomNode, getEventTargetNode, toCssUnit } from '../../ui/src/dom'
5
- import { getLastZIndex, nextZIndex, getSubLastZIndex, nextSubZIndex, getFuncText, handleBooleanDefaultValue } from '../../ui/src/utils'
6
- import { VxeUI, getConfig, getIcon, getI18n, globalEvents, GLOBAL_EVENT_KEYS, createEvent, useSize, renderEmptyElement } from '../../ui'
7
- import VxeButtonComponent from '../../button/src/button'
8
- import VxeLoadingComponent from '../../loading/index'
9
- import { getSlotVNs } from '../../ui/src/vn'
10
- import { warnLog, errLog } from '../../ui/src/log'
11
-
12
- import type { VxeModalConstructor, VxeModalPropTypes, ModalReactData, ModalInternalData, VxeModalEmits, VxeModalPrivateComputed, ModalEventTypes, VxeButtonInstance, ModalMethods, ModalPrivateRef, VxeModalMethods, ValueOf, VxeDrawerConstructor, VxeDrawerMethods, VxeFormConstructor, VxeFormPrivateMethods } from '../../../types'
13
- import type { VxeTableConstructor, VxeTablePrivateMethods } from '../../../types/components/table'
14
-
15
- export const allActiveModals: VxeModalConstructor[] = []
16
- const msgQueue: VxeModalConstructor[] = []
17
- const notifyQueue: VxeModalConstructor[] = []
18
-
19
- const lockScrollAttrKey = 'data-vxe-lock-scroll'
20
- const lockScrollCssWidthKey = '--vxe-ui-modal-lock-scroll-view-width'
21
-
22
- export default defineVxeComponent({
23
- name: 'VxeModal',
24
- props: {
25
- modelValue: Boolean as PropType<VxeModalPropTypes.ModelValue>,
26
- id: String as PropType<VxeModalPropTypes.ID>,
27
- type: {
28
- type: String as PropType<VxeModalPropTypes.Type>,
29
- default: 'modal'
30
- },
31
- loading: {
32
- type: Boolean as PropType<VxeModalPropTypes.Loading>,
33
- default: null
34
- },
35
- status: String as PropType<VxeModalPropTypes.Status>,
36
- iconStatus: String as PropType<VxeModalPropTypes.IconStatus>,
37
- className: String as PropType<VxeModalPropTypes.ClassName>,
38
- top: {
39
- type: [Number, String] as PropType<VxeModalPropTypes.Top>,
40
- default: () => getConfig().modal.top
41
- },
42
- position: [String, Object] as PropType<VxeModalPropTypes.Position>,
43
- title: String as PropType<VxeModalPropTypes.Title>,
44
- duration: {
45
- type: [Number, String] as PropType<VxeModalPropTypes.Duration>,
46
- default: () => getConfig().modal.duration
47
- },
48
- content: [Number, String] as PropType<VxeModalPropTypes.Content>,
49
- showCancelButton: {
50
- type: Boolean as PropType<VxeModalPropTypes.ShowCancelButton>,
51
- default: null
52
- },
53
- cancelButtonText: {
54
- type: String as PropType<VxeModalPropTypes.CancelButtonText>,
55
- default: () => getConfig().modal.cancelButtonText
56
- },
57
- showConfirmButton: {
58
- type: Boolean as PropType<VxeModalPropTypes.ShowConfirmButton>,
59
- default: () => getConfig().modal.showConfirmButton
60
- },
61
- confirmButtonText: {
62
- type: String as PropType<VxeModalPropTypes.ConfirmButtonText>,
63
- default: () => getConfig().modal.confirmButtonText
64
- },
65
- lockView: {
66
- type: Boolean as PropType<VxeModalPropTypes.LockView>,
67
- default: () => getConfig().modal.lockView
68
- },
69
- lockScroll: Boolean as PropType<VxeModalPropTypes.LockScroll>,
70
- mask: {
71
- type: Boolean as PropType<VxeModalPropTypes.Mask>,
72
- default: () => getConfig().modal.mask
73
- },
74
- maskClosable: {
75
- type: Boolean as PropType<VxeModalPropTypes.MaskClosable>,
76
- default: () => getConfig().modal.maskClosable
77
- },
78
- escClosable: {
79
- type: Boolean as PropType<VxeModalPropTypes.EscClosable>,
80
- default: () => getConfig().modal.escClosable
81
- },
82
- cancelClosable: {
83
- type: Boolean as PropType<VxeModalPropTypes.CancelClosable>,
84
- default: () => getConfig().modal.cancelClosable
85
- },
86
- confirmClosable: {
87
- type: Boolean as PropType<VxeModalPropTypes.ConfirmClosable>,
88
- default: () => getConfig().modal.confirmClosable
89
- },
90
- resize: Boolean as PropType<VxeModalPropTypes.Resize>,
91
- showHeader: {
92
- type: Boolean as PropType<VxeModalPropTypes.ShowHeader>,
93
- default: () => getConfig().modal.showHeader
94
- },
95
- showFooter: {
96
- type: Boolean as PropType<VxeModalPropTypes.ShowFooter>,
97
- default: () => getConfig().modal.showFooter
98
- },
99
- showZoom: Boolean as PropType<VxeModalPropTypes.ShowZoom>,
100
- zoomConfig: Object as PropType<VxeModalPropTypes.ZoomConfig>,
101
- showMaximize: {
102
- type: Boolean as PropType<VxeModalPropTypes.ShowMaximize>,
103
- default: () => handleBooleanDefaultValue(getConfig().modal.showMaximize)
104
- },
105
- showMinimize: {
106
- type: Boolean as PropType<VxeModalPropTypes.ShowMinimize>,
107
- default: () => handleBooleanDefaultValue(getConfig().modal.showMinimize)
108
- },
109
- showClose: {
110
- type: Boolean as PropType<VxeModalPropTypes.ShowClose>,
111
- default: () => getConfig().modal.showClose
112
- },
113
- dblclickZoom: {
114
- type: Boolean as PropType<VxeModalPropTypes.DblclickZoom>,
115
- default: () => getConfig().modal.dblclickZoom
116
- },
117
- width: {
118
- type: [Number, String] as PropType<VxeModalPropTypes.Width>,
119
- default: () => getConfig().modal.width
120
- },
121
- height: {
122
- type: [Number, String] as PropType<VxeModalPropTypes.Height>,
123
- default: () => getConfig().modal.height
124
- },
125
- minWidth: {
126
- type: [Number, String] as PropType<VxeModalPropTypes.MinWidth>,
127
- default: () => getConfig().modal.minWidth
128
- },
129
- minHeight: {
130
- type: [Number, String] as PropType<VxeModalPropTypes.MinHeight>,
131
- default: () => getConfig().modal.minHeight
132
- },
133
- zIndex: Number as PropType<VxeModalPropTypes.ZIndex>,
134
- marginSize: {
135
- type: [Number, String] as PropType<VxeModalPropTypes.MarginSize>,
136
- default: () => getConfig().modal.marginSize
137
- },
138
- fullscreen: Boolean as PropType<VxeModalPropTypes.Fullscreen>,
139
- draggable: {
140
- type: Boolean as PropType<VxeModalPropTypes.Draggable>,
141
- default: () => getConfig().modal.draggable
142
- },
143
- remember: {
144
- type: Boolean,
145
- default: () => getConfig().modal.remember
146
- },
147
- destroyOnClose: {
148
- type: Boolean as PropType<VxeModalPropTypes.DestroyOnClose>,
149
- default: () => getConfig().modal.destroyOnClose
150
- },
151
- showTitleOverflow: {
152
- type: Boolean as PropType<VxeModalPropTypes.ShowTitleOverflow>,
153
- default: () => getConfig().modal.showTitleOverflow
154
- },
155
- transfer: {
156
- type: Boolean as PropType<VxeModalPropTypes.Transfer>,
157
- default: () => getConfig().modal.transfer
158
- },
159
- storage: {
160
- type: Boolean as PropType<VxeModalPropTypes.Storage>,
161
- default: () => getConfig().modal.storage
162
- },
163
- storageKey: {
164
- type: String as PropType<VxeModalPropTypes.StorageKey>,
165
- default: () => getConfig().modal.storageKey
166
- },
167
- padding: {
168
- type: Boolean as PropType<VxeModalPropTypes.Padding>,
169
- default: () => getConfig().modal.padding
170
- },
171
- size: {
172
- type: String as PropType<VxeModalPropTypes.Size>,
173
- default: () => getConfig().modal.size || getConfig().size
174
- },
175
- beforeHideMethod: Function as PropType<VxeModalPropTypes.BeforeHideMethod>,
176
- slots: Object as PropType<VxeModalPropTypes.Slots>,
177
-
178
- /**
179
- * 已废弃
180
- * @deprecated
181
- */
182
- message: [Number, String] as PropType<VxeModalPropTypes.Message>,
183
- /**
184
- * 已废弃
185
- * @deprecated
186
- */
187
- animat: {
188
- type: Boolean as PropType<VxeModalPropTypes.Animat>,
189
- default: () => getConfig().modal.animat
190
- }
191
- },
192
- emits: [
193
- 'update:modelValue',
194
- 'show',
195
- 'hide',
196
- 'before-hide',
197
- 'close',
198
- 'confirm',
199
- 'cancel',
200
- 'zoom',
201
- 'resize',
202
- 'move'
203
- ] as VxeModalEmits,
204
- setup (props, context) {
205
- const { slots, emit } = context
206
-
207
- const xID = XEUtils.uniqueId()
208
-
209
- const $xeParentModal = inject<(VxeModalConstructor & VxeModalMethods)| null>('$xeModal', null)
210
- const $xeDrawer = inject<(VxeDrawerConstructor & VxeDrawerMethods) | null>('$xeDrawer', null)
211
- const $xeTable = inject<(VxeTableConstructor & VxeTablePrivateMethods) | null>('$xeTable', null)
212
- const $xeForm = inject<(VxeFormConstructor & VxeFormPrivateMethods)| null>('$xeForm', null)
213
-
214
- const { computeSize } = useSize(props)
215
-
216
- const reactData = reactive<ModalReactData>({
217
- initialized: false,
218
- visible: false,
219
- contentVisible: false,
220
- modalTop: 0,
221
- modalZindex: 0,
222
- prevZoomStatus: '',
223
- zoomStatus: '',
224
- revertLocat: null,
225
- prevLocat: null,
226
- firstOpen: true,
227
- resizeFlag: 1
228
- })
229
-
230
- const internalData: ModalInternalData = {
231
- msgTimeout: undefined
232
- }
233
-
234
- const refElem = ref<HTMLDivElement>()
235
- const refModalBox = ref() as Ref<HTMLDivElement>
236
- const refHeaderElem = ref() as Ref<HTMLDivElement>
237
- const refConfirmBtn = ref<VxeButtonInstance>()
238
- const refCancelBtn = ref<VxeButtonInstance>()
239
-
240
- const refMaps: ModalPrivateRef = {
241
- refElem
242
- }
243
-
244
- const computeBtnTransfer = computed(() => {
245
- const { transfer } = props
246
- if (transfer === null) {
247
- const globalTransfer = getConfig().modal.transfer
248
- if (XEUtils.isBoolean(globalTransfer)) {
249
- return globalTransfer
250
- }
251
- if ($xeTable || $xeParentModal || $xeDrawer || $xeForm) {
252
- return true
253
- }
254
- }
255
- return transfer
256
- })
257
-
258
- const computeIsMsg = computed(() => {
259
- return props.type === 'message' || props.type === 'notification'
260
- })
261
-
262
- const computeIsMinimizeStatus = computed(() => {
263
- return reactData.zoomStatus === 'minimize'
264
- })
265
-
266
- const computeIsMaximizeStatus = computed(() => {
267
- return reactData.zoomStatus === 'maximize'
268
- })
269
-
270
- const computeZoomOpts = computed(() => {
271
- return Object.assign({}, getConfig().modal.zoomConfig, props.zoomConfig)
272
- })
273
-
274
- const computeMaps: VxeModalPrivateComputed = {
275
- computeSize,
276
- computeZoomOpts
277
- }
278
-
279
- const $xeModal = {
280
- xID,
281
- props,
282
- context,
283
- reactData,
284
- internalData,
285
- getRefMaps: () => refMaps,
286
- getComputeMaps: () => computeMaps
287
- } as unknown as VxeModalConstructor & VxeModalMethods
288
-
289
- let modalMethods = {} as ModalMethods
290
-
291
- const getBox = () => {
292
- const boxElem = refModalBox.value
293
- return boxElem
294
- }
295
-
296
- const recalculate = () => {
297
- const { width, height, minWidth, minHeight } = props
298
- const isMsg = computeIsMsg.value
299
- const boxElem = getBox()
300
- if (boxElem) {
301
- boxElem.style.width = width ? toCssUnit(width) : ''
302
- boxElem.style.height = height ? toCssUnit(height) : ''
303
- boxElem.style.minWidth = !isMsg && minWidth ? toCssUnit(minWidth) : ''
304
- boxElem.style.minHeight = !isMsg && minHeight ? toCssUnit(minHeight) : ''
305
- }
306
- return nextTick()
307
- }
308
-
309
- const updateZindex = () => {
310
- const { zIndex } = props
311
- const { modalZindex } = reactData
312
- if (zIndex) {
313
- reactData.modalZindex = zIndex
314
- } else {
315
- const isMsg = computeIsMsg.value
316
- if (isMsg) {
317
- if (modalZindex < getSubLastZIndex()) {
318
- reactData.modalZindex = nextSubZIndex()
319
- }
320
- } else {
321
- if (modalZindex < getLastZIndex()) {
322
- reactData.modalZindex = nextZIndex()
323
- }
324
- }
325
- }
326
- }
327
-
328
- const updatePosition = () => {
329
- return nextTick().then(() => {
330
- const { position } = props
331
- const marginSize = XEUtils.toNumber(props.marginSize)
332
- const boxElem = getBox()
333
- if (!boxElem) {
334
- return
335
- }
336
- const clientVisibleWidth = document.documentElement.clientWidth || document.body.clientWidth
337
- const clientVisibleHeight = document.documentElement.clientHeight || document.body.clientHeight
338
- const isPosCenter = position === 'center'
339
- const { top, left }: any = XEUtils.isString(position) ? { top: position, left: position } : Object.assign({}, position)
340
- const topCenter = isPosCenter || top === 'center'
341
- const leftCenter = isPosCenter || left === 'center'
342
- let posTop = ''
343
- let posLeft = ''
344
- if (left && !leftCenter) {
345
- posLeft = isNaN(left) ? left : `${left}px`
346
- } else {
347
- posLeft = `${Math.max(marginSize, clientVisibleWidth / 2 - boxElem.offsetWidth / 2)}px`
348
- }
349
- if (top && !topCenter) {
350
- posTop = isNaN(top) ? top : `${top}px`
351
- } else {
352
- posTop = `${Math.max(marginSize, clientVisibleHeight / 2 - boxElem.offsetHeight / 2)}px`
353
- }
354
- boxElem.style.top = posTop
355
- boxElem.style.left = posLeft
356
- })
357
- }
358
-
359
- const updateStyle = () => {
360
- nextTick(() => {
361
- const { type } = props
362
- const queueList = type === 'notification' ? notifyQueue : msgQueue
363
- let offsetTop = 0
364
- queueList.forEach(comp => {
365
- const boxElem = comp.getBox()
366
- if (boxElem) {
367
- offsetTop += XEUtils.toNumber(comp.props.top)
368
- comp.reactData.modalTop = offsetTop
369
- offsetTop += boxElem.clientHeight
370
- }
371
- })
372
- })
373
- }
374
-
375
- const removeActiveQueue = () => {
376
- if (allActiveModals.indexOf($xeModal) > -1) {
377
- XEUtils.remove(allActiveModals, item => item === $xeModal)
378
- }
379
- }
380
-
381
- const removeMsgQueue = () => {
382
- const { type } = props
383
- const queueList = type === 'notification' ? notifyQueue : msgQueue
384
- if (queueList.indexOf($xeModal) > -1) {
385
- XEUtils.remove(queueList, comp => comp === $xeModal)
386
- }
387
- updateStyle()
388
- }
389
-
390
- const closeModal = (type: ModalEventTypes) => {
391
- const { remember } = props
392
- const { visible } = reactData
393
- const isMsg = computeIsMsg.value
394
- const beforeHideFn = props.beforeHideMethod || getConfig().modal.beforeHideMethod
395
- const params = { type }
396
- if (visible) {
397
- Promise.resolve(beforeHideFn ? beforeHideFn(params) : null).then((rest) => {
398
- if (!XEUtils.isError(rest)) {
399
- if (isMsg) {
400
- removeMsgQueue()
401
- }
402
- reactData.contentVisible = false
403
- if (!remember) {
404
- handleRevert()
405
- }
406
- removeActiveQueue()
407
- dispatchEvent('before-hide', params, null)
408
- setTimeout(() => {
409
- reactData.visible = false
410
- emitModel(false)
411
- dispatchEvent('hide', params, null)
412
- }, 200)
413
- removeBodyLockScroll()
414
- }
415
- }).catch(e => e)
416
- }
417
- return nextTick()
418
- }
419
-
420
- const closeEvent = (evnt: Event) => {
421
- const type = 'close'
422
- dispatchEvent(type, { type }, evnt)
423
- closeModal(type)
424
- }
425
-
426
- const confirmEvent = (evnt: Event) => {
427
- const { confirmClosable } = props
428
- const type = 'confirm'
429
- dispatchEvent(type, { type }, evnt)
430
- if (confirmClosable) {
431
- closeModal(type)
432
- }
433
- }
434
-
435
- const cancelEvent = (evnt: Event) => {
436
- const { cancelClosable } = props
437
- const type = 'cancel'
438
- dispatchEvent(type, { type }, evnt)
439
- if (cancelClosable) {
440
- closeModal(type)
441
- }
442
- }
443
-
444
- const getStorageMap = (key: string) => {
445
- const version = getConfig().version
446
- const rest = XEUtils.toStringJSON(localStorage.getItem(key) || '')
447
- return rest && rest._v === version ? rest : { _v: version }
448
- }
449
-
450
- const hasPosStorage = () => {
451
- const { id, storage, storageKey } = props
452
- return !!(id && storage && getStorageMap(storageKey)[id])
453
- }
454
-
455
- const restorePosStorage = () => {
456
- const { id, storage, storageKey } = props
457
- if (id && storage) {
458
- const posStorage = getStorageMap(storageKey)[id]
459
- if (posStorage) {
460
- const boxElem = getBox()
461
- const [left, top, width, height, zoomLeft, zoomTop, zoomWidth, zoomHeight] = posStorage.split(',')
462
- if (boxElem) {
463
- if (left) {
464
- boxElem.style.left = `${left}px`
465
- }
466
- if (top) {
467
- boxElem.style.top = `${top}px`
468
- }
469
- if (width) {
470
- boxElem.style.width = `${width}px`
471
- }
472
- if (height) {
473
- boxElem.style.height = `${height}px`
474
- }
475
- }
476
- if (zoomLeft && zoomTop) {
477
- reactData.revertLocat = {
478
- left: zoomLeft,
479
- top: zoomTop,
480
- width: zoomWidth,
481
- height: zoomHeight
482
- }
483
- }
484
- }
485
- }
486
- }
487
-
488
- const addMsgQueue = () => {
489
- const { type } = props
490
- const queueList = type === 'notification' ? notifyQueue : msgQueue
491
- if (queueList.indexOf($xeModal) === -1) {
492
- queueList.push($xeModal)
493
- }
494
- updateStyle()
495
- }
496
-
497
- const savePosStorage = () => {
498
- const { id, storage, storageKey } = props
499
- const { zoomStatus, revertLocat } = reactData
500
- if (zoomStatus) {
501
- return
502
- }
503
- if (id && storage) {
504
- const boxElem = getBox()
505
- if (!boxElem) {
506
- return
507
- }
508
- const posStorageMap = getStorageMap(storageKey)
509
- posStorageMap[id] = ([
510
- boxElem.style.left,
511
- boxElem.style.top,
512
- boxElem.clientWidth,
513
- boxElem.clientHeight
514
- ] as (string | number)[]).concat(revertLocat
515
- ? [
516
- revertLocat.left,
517
- revertLocat.top,
518
- revertLocat.width,
519
- revertLocat.height
520
- ]
521
- : []).map(val => val ? XEUtils.toNumber(val) : '').join(',')
522
- localStorage.setItem(storageKey, XEUtils.toJSONString(posStorageMap))
523
- }
524
- }
525
-
526
- const handleMinimize = () => {
527
- const zoomOpts = computeZoomOpts.value
528
- const { minimizeLayout, minimizeMaxSize, minimizeHorizontalOffset, minimizeVerticalOffset, minimizeOffsetMethod } = zoomOpts
529
- const isHorizontalLayout = minimizeLayout === 'horizontal'
530
- const prevZoomStatus = reactData.zoomStatus
531
- const hlMList: VxeModalConstructor[] = []
532
- const vlMList: VxeModalConstructor[] = []
533
- allActiveModals.forEach(item => {
534
- if (item.xID !== $xeModal.xID && item.props.type === 'modal' && item.reactData.zoomStatus === 'minimize') {
535
- const itemZoomOpts = item.getComputeMaps().computeZoomOpts.value
536
- if (itemZoomOpts.minimizeLayout === 'horizontal') {
537
- hlMList.push(item)
538
- } else {
539
- vlMList.push(item)
540
- }
541
- }
542
- })
543
- const mList = isHorizontalLayout ? hlMList : vlMList
544
- // 如果配置最小化最大数量
545
- if (minimizeMaxSize && mList.length >= minimizeMaxSize) {
546
- if (VxeUI.modal) {
547
- VxeUI.modal.message({
548
- status: 'error',
549
- content: getI18n('vxe.modal.miniMaxSize', [minimizeMaxSize])
550
- })
551
- }
552
- return Promise.resolve({
553
- status: false
554
- })
555
- }
556
- reactData.prevZoomStatus = prevZoomStatus
557
- reactData.zoomStatus = 'minimize'
558
- return nextTick().then(() => {
559
- const boxElem = getBox()
560
- if (!boxElem) {
561
- return {
562
- status: false
563
- }
564
- }
565
- const headerEl = refHeaderElem.value
566
- if (!headerEl) {
567
- return {
568
- status: false
569
- }
570
- }
571
- const { visibleHeight } = getDomNode()
572
- // 如果当前处于复原状态
573
- if (!prevZoomStatus) {
574
- reactData.revertLocat = {
575
- top: boxElem.offsetTop,
576
- left: boxElem.offsetLeft,
577
- width: boxElem.offsetWidth + (boxElem.style.width ? 0 : 1),
578
- height: boxElem.offsetHeight + (boxElem.style.height ? 0 : 1)
579
- }
580
- }
581
- const targetModal = XEUtils[isHorizontalLayout ? 'max' : 'min'](mList, ($modal) => {
582
- const boxElem = $modal.getBox()
583
- return boxElem ? XEUtils.toNumber(boxElem.style[isHorizontalLayout ? 'left' : 'top']) : 0
584
- })
585
- let targetTop = visibleHeight - headerEl.offsetHeight - 16
586
- let targetLeft = 16
587
- if (targetModal) {
588
- const minBoxElem = targetModal.getBox()
589
- if (minBoxElem) {
590
- const boxLeft = XEUtils.toNumber(minBoxElem.style.left)
591
- const boxTop = XEUtils.toNumber(minBoxElem.style.top)
592
- let offsetObj: {
593
- top?: number
594
- left?: number
595
- } = {}
596
- if (isHorizontalLayout) {
597
- offsetObj = Object.assign({}, minimizeHorizontalOffset)
598
- } else {
599
- offsetObj = Object.assign({}, minimizeVerticalOffset)
600
- }
601
- targetLeft = boxLeft + XEUtils.toNumber(offsetObj.left)
602
- targetTop = boxTop + XEUtils.toNumber(offsetObj.top)
603
- if (minimizeOffsetMethod) {
604
- offsetObj = minimizeOffsetMethod({
605
- $modal: $xeModal,
606
- left: targetLeft,
607
- top: targetTop
608
- })
609
- targetLeft = XEUtils.toNumber(offsetObj.left)
610
- targetTop = XEUtils.toNumber(offsetObj.top)
611
- }
612
- }
613
- }
614
- Object.assign(boxElem.style, {
615
- top: `${targetTop}px`,
616
- left: `${targetLeft}px`,
617
- width: '200px',
618
- height: `${headerEl.offsetHeight}px`
619
- })
620
- savePosStorage()
621
- return {
622
- status: true
623
- }
624
- })
625
- }
626
-
627
- const handleMaximize = () => {
628
- const prevZoomStatus = reactData.zoomStatus
629
- reactData.prevZoomStatus = prevZoomStatus
630
- reactData.zoomStatus = 'maximize'
631
- return nextTick().then(() => {
632
- const boxElem = getBox()
633
- if (boxElem) {
634
- // 如果当前处于复原状态
635
- if (!prevZoomStatus) {
636
- const marginSize = XEUtils.toNumber(props.marginSize)
637
- const clientVisibleWidth = document.documentElement.clientWidth || document.body.clientWidth
638
- const clientVisibleHeight = document.documentElement.clientHeight || document.body.clientHeight
639
- reactData.revertLocat = {
640
- top: Math.max(marginSize, clientVisibleHeight / 2 - boxElem.offsetHeight / 2),
641
- left: Math.max(marginSize, clientVisibleWidth / 2 - boxElem.offsetWidth / 2),
642
- width: boxElem.offsetWidth + (boxElem.style.width ? 0 : 1),
643
- height: boxElem.offsetHeight + (boxElem.style.height ? 0 : 1)
644
- }
645
- }
646
- Object.assign(boxElem.style, {
647
- top: '0',
648
- left: '0',
649
- width: '100%',
650
- height: '100%'
651
- })
652
- }
653
- savePosStorage()
654
- return {
655
- status: true
656
- }
657
- })
658
- }
659
-
660
- const handleMsgAutoClose = () => {
661
- const { duration } = props
662
- if (duration !== -1) {
663
- internalData.msgTimeout = setTimeout(() => closeModal('close'), XEUtils.toNumber(duration))
664
- }
665
- }
666
-
667
- const removeBodyLockScroll = () => {
668
- const htmlElem = document.documentElement
669
- const lockData = htmlElem.getAttribute(lockScrollAttrKey)
670
- if (lockData) {
671
- const lockList = lockData.split(',').filter(key => key !== xID)
672
- if (lockList.length) {
673
- htmlElem.setAttribute(lockScrollAttrKey, lockList.join(','))
674
- } else {
675
- htmlElem.removeAttribute(lockScrollAttrKey)
676
- htmlElem.style.removeProperty(lockScrollCssWidthKey)
677
- }
678
- }
679
- }
680
-
681
- const addBodyLockScroll = () => {
682
- const { lockScroll } = props
683
- const isMsg = computeIsMsg.value
684
- if (lockScroll && !isMsg) {
685
- const htmlElem = document.documentElement
686
- const clientWidth = document.body.clientWidth
687
- const lockData = htmlElem.getAttribute(lockScrollAttrKey)
688
- const lockList = lockData ? lockData.split(',') : []
689
- if (!lockList.includes(xID)) {
690
- lockList.push(xID)
691
- htmlElem.setAttribute(lockScrollAttrKey, lockList.join(','))
692
- }
693
- htmlElem.style.setProperty(lockScrollCssWidthKey, `${clientWidth}px`)
694
- }
695
- }
696
-
697
- const openModal = () => {
698
- const { remember, showFooter } = props
699
- const { initialized, visible } = reactData
700
- const isMsg = computeIsMsg.value
701
- if (!initialized) {
702
- reactData.initialized = true
703
- }
704
- if (!visible) {
705
- addBodyLockScroll()
706
- reactData.visible = true
707
- reactData.contentVisible = false
708
- updateZindex()
709
- allActiveModals.push($xeModal)
710
- setTimeout(() => {
711
- reactData.contentVisible = true
712
- nextTick(() => {
713
- if (!props.fullscreen) {
714
- recalculate()
715
- }
716
- if (showFooter) {
717
- const confirmBtn = refConfirmBtn.value
718
- const cancelBtn = refCancelBtn.value
719
- const operBtn = confirmBtn || cancelBtn
720
- if (operBtn) {
721
- operBtn.focus()
722
- }
723
- }
724
- const type = ''
725
- const params = { type }
726
- emitModel(true)
727
- dispatchEvent('show', params, null)
728
- })
729
- }, 10)
730
- if (isMsg) {
731
- addMsgQueue()
732
- handleMsgAutoClose()
733
- } else {
734
- nextTick(() => {
735
- const { firstOpen } = reactData
736
- if (firstOpen) {
737
- reactData.firstOpen = false
738
- if (hasPosStorage()) {
739
- restorePosStorage()
740
- } else {
741
- if (props.fullscreen) {
742
- nextTick(() => handleMaximize())
743
- } else {
744
- recalculate()
745
- updatePosition().then(() => {
746
- setTimeout(() => updatePosition(), 20)
747
- })
748
- }
749
- }
750
- } else {
751
- if (!remember) {
752
- recalculate()
753
- updatePosition().then(() => {
754
- setTimeout(() => updatePosition(), 20)
755
- })
756
- }
757
- }
758
- })
759
- }
760
- }
761
- return nextTick()
762
- }
763
-
764
- const selfClickEvent = (evnt: Event) => {
765
- const el = refElem.value
766
- if (props.maskClosable && evnt.target === el) {
767
- const type = 'mask'
768
- closeModal(type)
769
- }
770
- }
771
-
772
- const selfMouseoverEvent = () => {
773
- const { msgTimeout } = internalData
774
- if (!msgTimeout) {
775
- return
776
- }
777
- const isMsg = computeIsMsg.value
778
- if (isMsg) {
779
- clearTimeout(msgTimeout)
780
- internalData.msgTimeout = undefined
781
- }
782
- }
783
-
784
- const selfMouseoutEvent = () => {
785
- const { msgTimeout } = internalData
786
- if (!msgTimeout) {
787
- const isMsg = computeIsMsg.value
788
- if (isMsg) {
789
- handleMsgAutoClose()
790
- }
791
- }
792
- }
793
-
794
- const handleGlobalKeydownEvent = (evnt: KeyboardEvent) => {
795
- const isEsc = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ESCAPE)
796
- if (isEsc) {
797
- const lastModal = XEUtils.max(allActiveModals, (item) => item.reactData.modalZindex)
798
- // 多个时,只关掉最上层的窗口
799
- if (lastModal) {
800
- setTimeout(() => {
801
- if (lastModal === $xeModal && lastModal.props.escClosable) {
802
- const type = 'exit'
803
- dispatchEvent('close', { type }, evnt)
804
- closeModal(type)
805
- }
806
- }, 10)
807
- }
808
- }
809
- }
810
-
811
- const isMinimized = () => {
812
- return reactData.zoomStatus === 'minimize'
813
- }
814
-
815
- const isMaximized = () => {
816
- return reactData.zoomStatus === 'maximize'
817
- }
818
-
819
- const handleRevert = () => {
820
- reactData.prevZoomStatus = reactData.zoomStatus
821
- reactData.zoomStatus = ''
822
- return nextTick().then(() => {
823
- const { revertLocat } = reactData
824
- if (revertLocat) {
825
- const boxElem = getBox()
826
- reactData.revertLocat = null
827
- if (boxElem) {
828
- Object.assign(boxElem.style, {
829
- top: `${revertLocat.top}px`,
830
- left: `${revertLocat.left}px`,
831
- width: `${revertLocat.width}px`,
832
- height: `${revertLocat.height}px`
833
- })
834
- }
835
- savePosStorage()
836
- return nextTick().then(() => {
837
- return {
838
- status: true
839
- }
840
- })
841
- }
842
- return {
843
- status: false
844
- }
845
- })
846
- }
847
-
848
- const handleZoom = (type?: 'minimize' | 'revert' | 'maximize') => {
849
- const { zoomStatus } = reactData
850
- return new Promise(resolve => {
851
- if (type) {
852
- if (type === 'maximize') {
853
- resolve(handleMaximize())
854
- return
855
- }
856
- if (type === 'minimize') {
857
- resolve(handleMinimize())
858
- return
859
- }
860
- resolve(handleRevert())
861
- return
862
- }
863
- resolve(zoomStatus ? handleRevert() : handleMaximize())
864
- }).then(() => {
865
- return reactData.zoomStatus || 'revert'
866
- })
867
- }
868
-
869
- const toggleZoomMinEvent = (evnt: Event) => {
870
- const { zoomStatus, prevZoomStatus } = reactData
871
- return handleZoom(zoomStatus === 'minimize' ? (prevZoomStatus || 'revert') : 'minimize').then((type) => {
872
- const params = { type }
873
- dispatchEvent('zoom', params, evnt)
874
- })
875
- }
876
-
877
- const toggleZoomMaxEvent = (evnt: Event) => {
878
- return handleZoom().then((type) => {
879
- const params = { type }
880
- dispatchEvent('zoom', params, evnt)
881
- })
882
- }
883
-
884
- const getPosition = () => {
885
- const isMsg = computeIsMsg.value
886
- if (!isMsg) {
887
- const boxElem = getBox()
888
- if (boxElem) {
889
- return {
890
- top: boxElem.offsetTop,
891
- left: boxElem.offsetLeft
892
- }
893
- }
894
- }
895
- return null
896
- }
897
-
898
- const setPosition = (top?: number, left?: number) => {
899
- const isMsg = computeIsMsg.value
900
- if (!isMsg) {
901
- const boxElem = getBox()
902
- if (boxElem) {
903
- if (XEUtils.isNumber(top)) {
904
- boxElem.style.top = `${top}px`
905
- }
906
- if (XEUtils.isNumber(left)) {
907
- boxElem.style.left = `${left}px`
908
- }
909
- }
910
- }
911
- return nextTick()
912
- }
913
-
914
- const boxMousedownEvent = () => {
915
- const { modalZindex } = reactData
916
- if (allActiveModals.some(comp => comp.reactData.visible && comp.reactData.modalZindex > modalZindex)) {
917
- updateZindex()
918
- }
919
- }
920
-
921
- const mousedownEvent = (evnt: MouseEvent) => {
922
- const { storage } = props
923
- const { zoomStatus } = reactData
924
- const marginSize = XEUtils.toNumber(props.marginSize)
925
- const boxElem = getBox()
926
- if (!boxElem) {
927
- return
928
- }
929
- if (zoomStatus !== 'maximize' && evnt.button === 0 && !getEventTargetNode(evnt, boxElem, 'trigger--btn').flag) {
930
- evnt.preventDefault()
931
- const disX = evnt.clientX - boxElem.offsetLeft
932
- const disY = evnt.clientY - boxElem.offsetTop
933
- const { visibleHeight, visibleWidth } = getDomNode()
934
- document.onmousemove = evnt => {
935
- evnt.preventDefault()
936
- const offsetWidth = boxElem.offsetWidth
937
- const offsetHeight = boxElem.offsetHeight
938
- const minX = marginSize
939
- const maxX = visibleWidth - offsetWidth - marginSize - 1
940
- const minY = marginSize
941
- const maxY = visibleHeight - offsetHeight - marginSize - 1
942
- let left = evnt.clientX - disX
943
- let top = evnt.clientY - disY
944
- if (left > maxX) {
945
- left = maxX
946
- }
947
- if (left < minX) {
948
- left = minX
949
- }
950
- if (top > maxY) {
951
- top = maxY
952
- }
953
- if (top < minY) {
954
- top = minY
955
- }
956
- boxElem.style.left = `${left}px`
957
- boxElem.style.top = `${top}px`
958
- boxElem.className = boxElem.className.replace(/\s?is--drag/, '') + ' is--drag'
959
- dispatchEvent('move', { type: 'move' }, evnt)
960
- reactData.resizeFlag++
961
- }
962
- document.onmouseup = () => {
963
- document.onmousemove = null
964
- document.onmouseup = null
965
- if (storage) {
966
- nextTick(() => {
967
- savePosStorage()
968
- })
969
- }
970
- reactData.resizeFlag++
971
- setTimeout(() => {
972
- boxElem.className = boxElem.className.replace(/\s?is--drag/, '')
973
- }, 50)
974
- }
975
- }
976
- }
977
-
978
- const dragEvent = (evnt: MouseEvent) => {
979
- evnt.preventDefault()
980
- const { storage } = props
981
- const { visibleHeight, visibleWidth } = getDomNode()
982
- const marginSize = XEUtils.toNumber(props.marginSize)
983
- const targetElem = evnt.target as HTMLSpanElement
984
- const type = targetElem.getAttribute('type')
985
- const minWidth = XEUtils.toNumber(props.minWidth)
986
- const minHeight = XEUtils.toNumber(props.minHeight)
987
- const maxWidth = visibleWidth
988
- const maxHeight = visibleHeight
989
- const boxElem = getBox()
990
- const clientWidth = boxElem.clientWidth
991
- const clientHeight = boxElem.clientHeight
992
- const disX = evnt.clientX
993
- const disY = evnt.clientY
994
- const offsetTop = boxElem.offsetTop
995
- const offsetLeft = boxElem.offsetLeft
996
- const params = { type: 'resize' }
997
- document.onmousemove = evnt => {
998
- evnt.preventDefault()
999
- let dragLeft
1000
- let dragTop
1001
- let width
1002
- let height
1003
- switch (type) {
1004
- case 'wl':
1005
- dragLeft = disX - evnt.clientX
1006
- width = dragLeft + clientWidth
1007
- if (offsetLeft - dragLeft > marginSize) {
1008
- if (width > minWidth) {
1009
- boxElem.style.width = `${width < maxWidth ? width : maxWidth}px`
1010
- boxElem.style.left = `${offsetLeft - dragLeft}px`
1011
- }
1012
- }
1013
- break
1014
- case 'swst':
1015
- dragLeft = disX - evnt.clientX
1016
- dragTop = disY - evnt.clientY
1017
- width = dragLeft + clientWidth
1018
- height = dragTop + clientHeight
1019
- if (offsetLeft - dragLeft > marginSize) {
1020
- if (width > minWidth) {
1021
- boxElem.style.width = `${width < maxWidth ? width : maxWidth}px`
1022
- boxElem.style.left = `${offsetLeft - dragLeft}px`
1023
- }
1024
- }
1025
- if (offsetTop - dragTop > marginSize) {
1026
- if (height > minHeight) {
1027
- boxElem.style.height = `${height < maxHeight ? height : maxHeight}px`
1028
- boxElem.style.top = `${offsetTop - dragTop}px`
1029
- }
1030
- }
1031
- break
1032
- case 'swlb':
1033
- dragLeft = disX - evnt.clientX
1034
- dragTop = evnt.clientY - disY
1035
- width = dragLeft + clientWidth
1036
- height = dragTop + clientHeight
1037
- if (offsetLeft - dragLeft > marginSize) {
1038
- if (width > minWidth) {
1039
- boxElem.style.width = `${width < maxWidth ? width : maxWidth}px`
1040
- boxElem.style.left = `${offsetLeft - dragLeft}px`
1041
- }
1042
- }
1043
- if (offsetTop + height + marginSize < visibleHeight) {
1044
- if (height > minHeight) {
1045
- boxElem.style.height = `${height < maxHeight ? height : maxHeight}px`
1046
- }
1047
- }
1048
- break
1049
- case 'st':
1050
- dragTop = disY - evnt.clientY
1051
- height = clientHeight + dragTop
1052
- if (offsetTop - dragTop > marginSize) {
1053
- if (height > minHeight) {
1054
- boxElem.style.height = `${height < maxHeight ? height : maxHeight}px`
1055
- boxElem.style.top = `${offsetTop - dragTop}px`
1056
- }
1057
- }
1058
- break
1059
- case 'wr':
1060
- dragLeft = evnt.clientX - disX
1061
- width = dragLeft + clientWidth
1062
- if (offsetLeft + width + marginSize < visibleWidth) {
1063
- if (width > minWidth) {
1064
- boxElem.style.width = `${width < maxWidth ? width : maxWidth}px`
1065
- }
1066
- }
1067
- break
1068
- case 'sest':
1069
- dragLeft = evnt.clientX - disX
1070
- dragTop = disY - evnt.clientY
1071
- width = dragLeft + clientWidth
1072
- height = dragTop + clientHeight
1073
- if (offsetLeft + width + marginSize < visibleWidth) {
1074
- if (width > minWidth) {
1075
- boxElem.style.width = `${width < maxWidth ? width : maxWidth}px`
1076
- }
1077
- }
1078
- if (offsetTop - dragTop > marginSize) {
1079
- if (height > minHeight) {
1080
- boxElem.style.height = `${height < maxHeight ? height : maxHeight}px`
1081
- boxElem.style.top = `${offsetTop - dragTop}px`
1082
- }
1083
- }
1084
- break
1085
- case 'selb':
1086
- dragLeft = evnt.clientX - disX
1087
- dragTop = evnt.clientY - disY
1088
- width = dragLeft + clientWidth
1089
- height = dragTop + clientHeight
1090
- if (offsetLeft + width + marginSize < visibleWidth) {
1091
- if (width > minWidth) {
1092
- boxElem.style.width = `${width < maxWidth ? width : maxWidth}px`
1093
- }
1094
- }
1095
- if (offsetTop + height + marginSize < visibleHeight) {
1096
- if (height > minHeight) {
1097
- boxElem.style.height = `${height < maxHeight ? height : maxHeight}px`
1098
- }
1099
- }
1100
- break
1101
- case 'sb':
1102
- dragTop = evnt.clientY - disY
1103
- height = dragTop + clientHeight
1104
- if (offsetTop + height + marginSize < visibleHeight) {
1105
- if (height > minHeight) {
1106
- boxElem.style.height = `${height < maxHeight ? height : maxHeight}px`
1107
- }
1108
- }
1109
- break
1110
- }
1111
- boxElem.className = boxElem.className.replace(/\s?is--drag/, '') + ' is--drag'
1112
- if (storage) {
1113
- savePosStorage()
1114
- }
1115
- dispatchEvent('resize', params, evnt)
1116
- }
1117
- document.onmouseup = () => {
1118
- reactData.revertLocat = null
1119
- document.onmousemove = null
1120
- document.onmouseup = null
1121
- setTimeout(() => {
1122
- boxElem.className = boxElem.className.replace(/\s?is--drag/, '')
1123
- }, 50)
1124
- }
1125
- }
1126
-
1127
- const dispatchEvent = (type: ValueOf<VxeModalEmits>, params: Record<string, any>, evnt: Event | null) => {
1128
- emit(type, createEvent(evnt, { $modal: $xeModal }, params))
1129
- }
1130
-
1131
- const emitModel = (value: any) => {
1132
- emit('update:modelValue', value)
1133
- }
1134
-
1135
- modalMethods = {
1136
- dispatchEvent,
1137
- open: openModal,
1138
- close () {
1139
- return closeModal('close')
1140
- },
1141
- getBox,
1142
- getPosition,
1143
- setPosition,
1144
- isMinimized,
1145
- isMaximized,
1146
- zoom () {
1147
- return handleZoom()
1148
- },
1149
- minimize () {
1150
- if (!reactData.visible) {
1151
- return Promise.resolve({
1152
- status: false
1153
- })
1154
- }
1155
- return handleMinimize()
1156
- },
1157
- maximize () {
1158
- if (!reactData.visible) {
1159
- return Promise.resolve({
1160
- status: false
1161
- })
1162
- }
1163
- return handleMaximize()
1164
- },
1165
- revert () {
1166
- if (!reactData.visible) {
1167
- return Promise.resolve({
1168
- status: false
1169
- })
1170
- }
1171
- return handleRevert()
1172
- }
1173
- }
1174
-
1175
- Object.assign($xeModal, modalMethods)
1176
-
1177
- const renderTitles = () => {
1178
- const { slots: propSlots = {}, showClose, showZoom, showMaximize, showMinimize, title } = props
1179
- const { zoomStatus } = reactData
1180
- const titleSlot = slots.title || propSlots.title
1181
- const cornerSlot = slots.corner || propSlots.corner
1182
- const isMinimizeStatus = computeIsMinimizeStatus.value
1183
- const isMaximizeStatus = computeIsMaximizeStatus.value
1184
- return [
1185
- h('div', {
1186
- class: 'vxe-modal--header-title'
1187
- }, titleSlot
1188
- ? getSlotVNs(titleSlot({
1189
- $modal: $xeModal,
1190
- minimized: isMinimizeStatus,
1191
- maximized: isMaximizeStatus
1192
- }))
1193
- : (title ? getFuncText(title) : getI18n('vxe.alert.title'))),
1194
- h('div', {
1195
- class: 'vxe-modal--header-right'
1196
- }, [
1197
- cornerSlot && !isMinimizeStatus
1198
- ? h('div', {
1199
- class: 'vxe-modal--corner-wrapper'
1200
- }, getSlotVNs(cornerSlot({ $modal: $xeModal })))
1201
- : renderEmptyElement($xeModal),
1202
- (XEUtils.isBoolean(showMinimize) ? showMinimize : showZoom)
1203
- ? h('div', {
1204
- class: ['vxe-modal--zoom-btn', 'trigger--btn'],
1205
- title: getI18n(`vxe.modal.zoom${zoomStatus === 'minimize' ? 'Out' : 'Min'}`),
1206
- onClick: toggleZoomMinEvent
1207
- }, [
1208
- h('i', {
1209
- class: zoomStatus === 'minimize' ? getIcon().MODAL_ZOOM_REVERT : getIcon().MODAL_ZOOM_MIN
1210
- })
1211
- ])
1212
- : renderEmptyElement($xeModal),
1213
- (XEUtils.isBoolean(showMaximize) ? showMaximize : showZoom) && zoomStatus !== 'minimize'
1214
- ? h('div', {
1215
- class: ['vxe-modal--zoom-btn', 'trigger--btn'],
1216
- title: getI18n(`vxe.modal.zoom${zoomStatus === 'maximize' ? 'Out' : 'In'}`),
1217
- onClick: toggleZoomMaxEvent
1218
- }, [
1219
- h('i', {
1220
- class: zoomStatus === 'maximize' ? getIcon().MODAL_ZOOM_OUT : getIcon().MODAL_ZOOM_IN
1221
- })
1222
- ])
1223
- : renderEmptyElement($xeModal),
1224
- showClose
1225
- ? h('div', {
1226
- class: ['vxe-modal--close-btn', 'trigger--btn'],
1227
- title: getI18n('vxe.modal.close'),
1228
- onClick: closeEvent
1229
- }, [
1230
- h('i', {
1231
- class: getIcon().MODAL_CLOSE
1232
- })
1233
- ])
1234
- : renderEmptyElement($xeModal)
1235
- ])
1236
- ]
1237
- }
1238
-
1239
- const renderHeader = () => {
1240
- const { slots: propSlots = {}, showZoom, showMaximize, draggable } = props
1241
- const headerSlot = slots.header || propSlots.header
1242
- if (props.showHeader) {
1243
- const headerOns: Record<string, any> = {}
1244
- if (draggable) {
1245
- headerOns.onMousedown = mousedownEvent
1246
- }
1247
- if ((XEUtils.isBoolean(showMaximize) ? showMaximize : showZoom) && props.dblclickZoom && props.type === 'modal') {
1248
- headerOns.onDblclick = toggleZoomMaxEvent
1249
- }
1250
- return h('div', {
1251
- ref: refHeaderElem,
1252
- class: ['vxe-modal--header', {
1253
- 'is--ellipsis': props.showTitleOverflow
1254
- }],
1255
- ...headerOns
1256
- }, headerSlot ? getSlotVNs(headerSlot({ $modal: $xeModal })) : renderTitles())
1257
- }
1258
- return renderEmptyElement($xeModal)
1259
- }
1260
-
1261
- const renderBody = () => {
1262
- const { slots: propSlots = {}, status, message, iconStatus } = props
1263
- const content = props.content || message
1264
- const isMsg = computeIsMsg.value
1265
- const defaultSlot = slots.default || propSlots.default
1266
- const leftSlot = slots.left || propSlots.left
1267
- const rightSlot = slots.right || propSlots.right
1268
- const contVNs: VNode[] = []
1269
- if (!isMsg && (status || iconStatus)) {
1270
- contVNs.push(
1271
- h('div', {
1272
- class: 'vxe-modal--status-wrapper'
1273
- }, [
1274
- h('i', {
1275
- class: ['vxe-modal--status-icon', iconStatus || getIcon()[`MODAL_${status}`.toLocaleUpperCase() as 'MODAL_SUCCESS' | 'MODAL_ERROR']]
1276
- })
1277
- ])
1278
- )
1279
- }
1280
- contVNs.push(
1281
- h('div', {
1282
- class: 'vxe-modal--content'
1283
- }, defaultSlot ? getSlotVNs(defaultSlot({ $modal: $xeModal })) : getFuncText(content))
1284
- )
1285
- return h('div', {
1286
- class: 'vxe-modal--body'
1287
- }, [
1288
- leftSlot
1289
- ? h('div', {
1290
- class: 'vxe-modal--body-left'
1291
- }, getSlotVNs(leftSlot({ $modal: $xeModal })))
1292
- : renderEmptyElement($xeModal),
1293
- h('div', {
1294
- class: 'vxe-modal--body-default'
1295
- }, contVNs),
1296
- rightSlot
1297
- ? h('div', {
1298
- class: 'vxe-modal--body-right'
1299
- }, getSlotVNs(rightSlot({ $modal: $xeModal })))
1300
- : renderEmptyElement($xeModal),
1301
- isMsg
1302
- ? renderEmptyElement($xeModal)
1303
- : h(VxeLoadingComponent, {
1304
- class: 'vxe-modal--loading',
1305
- modelValue: props.loading
1306
- })
1307
- ])
1308
- }
1309
-
1310
- const renderDefaultFooter = () => {
1311
- const { slots: propSlots = {}, showCancelButton, showConfirmButton, type, loading } = props
1312
- const lfSlot = slots.leftfoot || propSlots.leftfoot
1313
- const rfSlot = slots.rightfoot || propSlots.rightfoot
1314
- const btnVNs = []
1315
- if (XEUtils.isBoolean(showCancelButton) ? showCancelButton : type === 'confirm') {
1316
- btnVNs.push(
1317
- h(VxeButtonComponent, {
1318
- key: 1,
1319
- ref: refCancelBtn,
1320
- content: props.cancelButtonText || getI18n('vxe.button.cancel'),
1321
- onClick: cancelEvent
1322
- })
1323
- )
1324
- }
1325
- if (XEUtils.isBoolean(showConfirmButton) ? showConfirmButton : (type === 'confirm' || type === 'alert')) {
1326
- btnVNs.push(
1327
- h(VxeButtonComponent, {
1328
- key: 2,
1329
- ref: refConfirmBtn,
1330
- loading: loading,
1331
- status: 'primary',
1332
- content: props.confirmButtonText || getI18n('vxe.button.confirm'),
1333
- onClick: confirmEvent
1334
- })
1335
- )
1336
- }
1337
- return h('div', {
1338
- class: 'vxe-modal--footer-wrapper'
1339
- }, [
1340
- h('div', {
1341
- class: 'vxe-modal--footer-left'
1342
- }, lfSlot ? getSlotVNs(lfSlot({ $modal: $xeModal })) : []),
1343
- h('div', {
1344
- class: 'vxe-modal--footer-right'
1345
- }, rfSlot ? getSlotVNs(rfSlot({ $modal: $xeModal })) : btnVNs)
1346
- ])
1347
- }
1348
-
1349
- const renderFooter = () => {
1350
- const { slots: propSlots = {} } = props
1351
- const footerSlot = slots.footer || propSlots.footer
1352
- if (props.showFooter) {
1353
- return h('div', {
1354
- class: 'vxe-modal--footer'
1355
- }, footerSlot ? getSlotVNs(footerSlot({ $modal: $xeModal })) : [renderDefaultFooter()])
1356
- }
1357
- return renderEmptyElement($xeModal)
1358
- }
1359
-
1360
- const renderVN = () => {
1361
- const { slots: propSlots = {}, className, type, animat, draggable, iconStatus, position, loading, destroyOnClose, status, lockScroll, padding, lockView, mask, resize } = props
1362
- const { initialized, modalTop, contentVisible, visible, zoomStatus } = reactData
1363
- const asideSlot = slots.aside || propSlots.aside
1364
- const vSize = computeSize.value
1365
- const isMsg = computeIsMsg.value
1366
- const isMinimizeStatus = computeIsMinimizeStatus.value
1367
- const btnTransfer = computeBtnTransfer.value
1368
- const ons: Record<string, any> = {}
1369
- if (isMsg) {
1370
- ons.onMouseover = selfMouseoverEvent
1371
- ons.onMouseout = selfMouseoutEvent
1372
- }
1373
- return h(Teleport, {
1374
- to: 'body',
1375
- disabled: btnTransfer ? !initialized : true
1376
- }, [
1377
- h('div', {
1378
- ref: refElem,
1379
- class: ['vxe-modal--wrapper', `type--${type}`, `zoom--${zoomStatus || 'revert'}`, className || '', position ? `pos--${position}` : '', {
1380
- [`size--${vSize}`]: vSize,
1381
- [`status--${status}`]: status,
1382
- 'is--padding': padding,
1383
- 'is--animat': animat,
1384
- 'lock--scroll': lockScroll,
1385
- 'lock--view': lockView,
1386
- 'is--draggable': draggable,
1387
- 'is--resize': resize,
1388
- 'is--mask': mask,
1389
- 'is--visible': contentVisible,
1390
- 'is--active': visible,
1391
- 'is--loading': loading
1392
- }],
1393
- style: {
1394
- zIndex: reactData.modalZindex,
1395
- top: modalTop ? `${modalTop}px` : null
1396
- },
1397
- onClick: selfClickEvent,
1398
- ...ons
1399
- }, [
1400
- h('div', {
1401
- ref: refModalBox,
1402
- class: 'vxe-modal--box',
1403
- onMousedown: boxMousedownEvent
1404
- }, [
1405
- (isMsg || asideSlot) && !isMinimizeStatus
1406
- ? h('div', {
1407
- class: 'vxe-modal--aside'
1408
- },
1409
- asideSlot
1410
- ? getSlotVNs(asideSlot({ $modal: $xeModal }))
1411
- : [
1412
- status || iconStatus
1413
- ? h('div', {
1414
- class: 'vxe-modal--status-wrapper'
1415
- }, [
1416
- h('i', {
1417
- class: ['vxe-modal--status-icon', iconStatus || getIcon()[`MODAL_${status}`.toLocaleUpperCase() as 'MODAL_SUCCESS' | 'MODAL_ERROR']]
1418
- })
1419
- ])
1420
- : renderEmptyElement($xeModal)
1421
- ]
1422
- )
1423
- : renderEmptyElement($xeModal),
1424
- h('div', {
1425
- class: 'vxe-modal--container'
1426
- }, !reactData.initialized || (destroyOnClose && !reactData.visible)
1427
- ? []
1428
- : [
1429
- renderHeader(),
1430
- renderBody(),
1431
- renderFooter(),
1432
- !isMsg && resize
1433
- ? h('span', {
1434
- class: 'vxe-modal--resize'
1435
- }, ['wl', 'wr', 'swst', 'sest', 'st', 'swlb', 'selb', 'sb'].map(type => {
1436
- return h('span', {
1437
- class: `${type}-resize`,
1438
- type: type,
1439
- onMousedown: dragEvent
1440
- })
1441
- }))
1442
- : renderEmptyElement($xeModal)
1443
- ])
1444
- ])
1445
- ])
1446
- ])
1447
- }
1448
-
1449
- $xeModal.renderVN = renderVN
1450
-
1451
- watch(() => props.width, recalculate)
1452
- watch(() => props.height, recalculate)
1453
-
1454
- watch(() => props.modelValue, (value) => {
1455
- if (value) {
1456
- openModal()
1457
- } else {
1458
- closeModal('model')
1459
- }
1460
- })
1461
-
1462
- onMounted(() => {
1463
- if (props.type === 'modal' && props.showFooter && !(props.showConfirmButton || props.showCancelButton || slots.footer)) {
1464
- warnLog('vxe.modal.footPropErr')
1465
- }
1466
- nextTick(() => {
1467
- if (props.storage && !props.id) {
1468
- errLog('vxe.error.reqProp', ['[modal] id'])
1469
- }
1470
- if (props.modelValue) {
1471
- openModal()
1472
- }
1473
- recalculate()
1474
- })
1475
- if (props.escClosable) {
1476
- globalEvents.on($xeModal, 'keydown', handleGlobalKeydownEvent)
1477
- }
1478
- })
1479
-
1480
- onUnmounted(() => {
1481
- globalEvents.off($xeModal, 'keydown')
1482
- removeMsgQueue()
1483
- removeActiveQueue()
1484
- removeBodyLockScroll()
1485
- })
1486
-
1487
- provide('$xeModal', $xeModal)
1488
-
1489
- return $xeModal
1490
- },
1491
- render () {
1492
- return this.renderVN()
1493
- }
1494
- })
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 { getDomNode, getEventTargetNode, toCssUnit } from '../../ui/src/dom'
5
+ import { getLastZIndex, nextZIndex, getSubLastZIndex, nextSubZIndex, getFuncText, handleBooleanDefaultValue } from '../../ui/src/utils'
6
+ import { VxeUI, getConfig, getIcon, getI18n, globalEvents, GLOBAL_EVENT_KEYS, createEvent, useSize, renderEmptyElement } from '../../ui'
7
+ import VxeButtonComponent from '../../button/src/button'
8
+ import VxeLoadingComponent from '../../loading/index'
9
+ import { getSlotVNs } from '../../ui/src/vn'
10
+ import { warnLog, errLog } from '../../ui/src/log'
11
+
12
+ import type { VxeModalConstructor, VxeModalPropTypes, ModalReactData, ModalInternalData, VxeModalEmits, VxeModalPrivateComputed, ModalEventTypes, VxeButtonInstance, ModalMethods, ModalPrivateRef, VxeModalMethods, ValueOf, VxeDrawerConstructor, VxeDrawerMethods, VxeFormConstructor, VxeFormPrivateMethods } from '../../../types'
13
+ import type { VxeTableConstructor, VxeTablePrivateMethods } from '../../../types/components/table'
14
+
15
+ export const allActiveModals: VxeModalConstructor[] = []
16
+ const msgQueue: VxeModalConstructor[] = []
17
+ const notifyQueue: VxeModalConstructor[] = []
18
+
19
+ const lockScrollAttrKey = 'data-vxe-lock-scroll'
20
+ const lockScrollCssWidthKey = '--vxe-ui-modal-lock-scroll-view-width'
21
+
22
+ export default defineVxeComponent({
23
+ name: 'VxeModal',
24
+ props: {
25
+ modelValue: Boolean as PropType<VxeModalPropTypes.ModelValue>,
26
+ id: String as PropType<VxeModalPropTypes.ID>,
27
+ type: {
28
+ type: String as PropType<VxeModalPropTypes.Type>,
29
+ default: 'modal'
30
+ },
31
+ loading: {
32
+ type: Boolean as PropType<VxeModalPropTypes.Loading>,
33
+ default: null
34
+ },
35
+ status: String as PropType<VxeModalPropTypes.Status>,
36
+ iconStatus: String as PropType<VxeModalPropTypes.IconStatus>,
37
+ className: String as PropType<VxeModalPropTypes.ClassName>,
38
+ top: {
39
+ type: [Number, String] as PropType<VxeModalPropTypes.Top>,
40
+ default: () => getConfig().modal.top
41
+ },
42
+ position: [String, Object] as PropType<VxeModalPropTypes.Position>,
43
+ title: String as PropType<VxeModalPropTypes.Title>,
44
+ duration: {
45
+ type: [Number, String] as PropType<VxeModalPropTypes.Duration>,
46
+ default: () => getConfig().modal.duration
47
+ },
48
+ content: [Number, String] as PropType<VxeModalPropTypes.Content>,
49
+ showCancelButton: {
50
+ type: Boolean as PropType<VxeModalPropTypes.ShowCancelButton>,
51
+ default: null
52
+ },
53
+ cancelButtonText: {
54
+ type: String as PropType<VxeModalPropTypes.CancelButtonText>,
55
+ default: () => getConfig().modal.cancelButtonText
56
+ },
57
+ showConfirmButton: {
58
+ type: Boolean as PropType<VxeModalPropTypes.ShowConfirmButton>,
59
+ default: () => getConfig().modal.showConfirmButton
60
+ },
61
+ confirmButtonText: {
62
+ type: String as PropType<VxeModalPropTypes.ConfirmButtonText>,
63
+ default: () => getConfig().modal.confirmButtonText
64
+ },
65
+ lockView: {
66
+ type: Boolean as PropType<VxeModalPropTypes.LockView>,
67
+ default: () => getConfig().modal.lockView
68
+ },
69
+ lockScroll: Boolean as PropType<VxeModalPropTypes.LockScroll>,
70
+ mask: {
71
+ type: Boolean as PropType<VxeModalPropTypes.Mask>,
72
+ default: () => getConfig().modal.mask
73
+ },
74
+ maskClosable: {
75
+ type: Boolean as PropType<VxeModalPropTypes.MaskClosable>,
76
+ default: () => getConfig().modal.maskClosable
77
+ },
78
+ escClosable: {
79
+ type: Boolean as PropType<VxeModalPropTypes.EscClosable>,
80
+ default: () => getConfig().modal.escClosable
81
+ },
82
+ cancelClosable: {
83
+ type: Boolean as PropType<VxeModalPropTypes.CancelClosable>,
84
+ default: () => getConfig().modal.cancelClosable
85
+ },
86
+ confirmClosable: {
87
+ type: Boolean as PropType<VxeModalPropTypes.ConfirmClosable>,
88
+ default: () => getConfig().modal.confirmClosable
89
+ },
90
+ resize: Boolean as PropType<VxeModalPropTypes.Resize>,
91
+ showHeader: {
92
+ type: Boolean as PropType<VxeModalPropTypes.ShowHeader>,
93
+ default: () => getConfig().modal.showHeader
94
+ },
95
+ showFooter: {
96
+ type: Boolean as PropType<VxeModalPropTypes.ShowFooter>,
97
+ default: () => getConfig().modal.showFooter
98
+ },
99
+ showZoom: Boolean as PropType<VxeModalPropTypes.ShowZoom>,
100
+ zoomConfig: Object as PropType<VxeModalPropTypes.ZoomConfig>,
101
+ showMaximize: {
102
+ type: Boolean as PropType<VxeModalPropTypes.ShowMaximize>,
103
+ default: () => handleBooleanDefaultValue(getConfig().modal.showMaximize)
104
+ },
105
+ showMinimize: {
106
+ type: Boolean as PropType<VxeModalPropTypes.ShowMinimize>,
107
+ default: () => handleBooleanDefaultValue(getConfig().modal.showMinimize)
108
+ },
109
+ showClose: {
110
+ type: Boolean as PropType<VxeModalPropTypes.ShowClose>,
111
+ default: () => getConfig().modal.showClose
112
+ },
113
+ dblclickZoom: {
114
+ type: Boolean as PropType<VxeModalPropTypes.DblclickZoom>,
115
+ default: () => getConfig().modal.dblclickZoom
116
+ },
117
+ width: {
118
+ type: [Number, String] as PropType<VxeModalPropTypes.Width>,
119
+ default: () => getConfig().modal.width
120
+ },
121
+ height: {
122
+ type: [Number, String] as PropType<VxeModalPropTypes.Height>,
123
+ default: () => getConfig().modal.height
124
+ },
125
+ minWidth: {
126
+ type: [Number, String] as PropType<VxeModalPropTypes.MinWidth>,
127
+ default: () => getConfig().modal.minWidth
128
+ },
129
+ minHeight: {
130
+ type: [Number, String] as PropType<VxeModalPropTypes.MinHeight>,
131
+ default: () => getConfig().modal.minHeight
132
+ },
133
+ zIndex: Number as PropType<VxeModalPropTypes.ZIndex>,
134
+ marginSize: {
135
+ type: [Number, String] as PropType<VxeModalPropTypes.MarginSize>,
136
+ default: () => getConfig().modal.marginSize
137
+ },
138
+ fullscreen: Boolean as PropType<VxeModalPropTypes.Fullscreen>,
139
+ draggable: {
140
+ type: Boolean as PropType<VxeModalPropTypes.Draggable>,
141
+ default: () => getConfig().modal.draggable
142
+ },
143
+ remember: {
144
+ type: Boolean,
145
+ default: () => getConfig().modal.remember
146
+ },
147
+ destroyOnClose: {
148
+ type: Boolean as PropType<VxeModalPropTypes.DestroyOnClose>,
149
+ default: () => getConfig().modal.destroyOnClose
150
+ },
151
+ showTitleOverflow: {
152
+ type: Boolean as PropType<VxeModalPropTypes.ShowTitleOverflow>,
153
+ default: () => getConfig().modal.showTitleOverflow
154
+ },
155
+ transfer: {
156
+ type: Boolean as PropType<VxeModalPropTypes.Transfer>,
157
+ default: () => getConfig().modal.transfer
158
+ },
159
+ storage: {
160
+ type: Boolean as PropType<VxeModalPropTypes.Storage>,
161
+ default: () => getConfig().modal.storage
162
+ },
163
+ storageKey: {
164
+ type: String as PropType<VxeModalPropTypes.StorageKey>,
165
+ default: () => getConfig().modal.storageKey
166
+ },
167
+ padding: {
168
+ type: Boolean as PropType<VxeModalPropTypes.Padding>,
169
+ default: () => getConfig().modal.padding
170
+ },
171
+ size: {
172
+ type: String as PropType<VxeModalPropTypes.Size>,
173
+ default: () => getConfig().modal.size || getConfig().size
174
+ },
175
+ beforeHideMethod: Function as PropType<VxeModalPropTypes.BeforeHideMethod>,
176
+ slots: Object as PropType<VxeModalPropTypes.Slots>,
177
+
178
+ /**
179
+ * 已废弃
180
+ * @deprecated
181
+ */
182
+ message: [Number, String] as PropType<VxeModalPropTypes.Message>,
183
+ /**
184
+ * 已废弃
185
+ * @deprecated
186
+ */
187
+ animat: {
188
+ type: Boolean as PropType<VxeModalPropTypes.Animat>,
189
+ default: () => getConfig().modal.animat
190
+ }
191
+ },
192
+ emits: [
193
+ 'update:modelValue',
194
+ 'show',
195
+ 'hide',
196
+ 'before-hide',
197
+ 'close',
198
+ 'confirm',
199
+ 'cancel',
200
+ 'zoom',
201
+ 'resize',
202
+ 'move'
203
+ ] as VxeModalEmits,
204
+ setup (props, context) {
205
+ const { slots, emit } = context
206
+
207
+ const xID = XEUtils.uniqueId()
208
+
209
+ const $xeParentModal = inject<(VxeModalConstructor & VxeModalMethods)| null>('$xeModal', null)
210
+ const $xeDrawer = inject<(VxeDrawerConstructor & VxeDrawerMethods) | null>('$xeDrawer', null)
211
+ const $xeTable = inject<(VxeTableConstructor & VxeTablePrivateMethods) | null>('$xeTable', null)
212
+ const $xeForm = inject<(VxeFormConstructor & VxeFormPrivateMethods)| null>('$xeForm', null)
213
+
214
+ const { computeSize } = useSize(props)
215
+
216
+ const reactData = reactive<ModalReactData>({
217
+ initialized: false,
218
+ visible: false,
219
+ contentVisible: false,
220
+ modalTop: 0,
221
+ modalZindex: 0,
222
+ prevZoomStatus: '',
223
+ zoomStatus: '',
224
+ revertLocat: null,
225
+ prevLocat: null,
226
+ firstOpen: true,
227
+ resizeFlag: 1
228
+ })
229
+
230
+ const internalData: ModalInternalData = {
231
+ msgTimeout: undefined
232
+ }
233
+
234
+ const refElem = ref<HTMLDivElement>()
235
+ const refModalBox = ref() as Ref<HTMLDivElement>
236
+ const refHeaderElem = ref() as Ref<HTMLDivElement>
237
+ const refConfirmBtn = ref<VxeButtonInstance>()
238
+ const refCancelBtn = ref<VxeButtonInstance>()
239
+
240
+ const refMaps: ModalPrivateRef = {
241
+ refElem
242
+ }
243
+
244
+ const computeBtnTransfer = computed(() => {
245
+ const { transfer } = props
246
+ if (transfer === null) {
247
+ const globalTransfer = getConfig().modal.transfer
248
+ if (XEUtils.isBoolean(globalTransfer)) {
249
+ return globalTransfer
250
+ }
251
+ if ($xeTable || $xeParentModal || $xeDrawer || $xeForm) {
252
+ return true
253
+ }
254
+ }
255
+ return transfer
256
+ })
257
+
258
+ const computeIsMsg = computed(() => {
259
+ return props.type === 'message' || props.type === 'notification'
260
+ })
261
+
262
+ const computeIsMinimizeStatus = computed(() => {
263
+ return reactData.zoomStatus === 'minimize'
264
+ })
265
+
266
+ const computeIsMaximizeStatus = computed(() => {
267
+ return reactData.zoomStatus === 'maximize'
268
+ })
269
+
270
+ const computeZoomOpts = computed(() => {
271
+ return Object.assign({}, getConfig().modal.zoomConfig, props.zoomConfig)
272
+ })
273
+
274
+ const computeMaps: VxeModalPrivateComputed = {
275
+ computeSize,
276
+ computeZoomOpts
277
+ }
278
+
279
+ const $xeModal = {
280
+ xID,
281
+ props,
282
+ context,
283
+ reactData,
284
+ internalData,
285
+ getRefMaps: () => refMaps,
286
+ getComputeMaps: () => computeMaps
287
+ } as unknown as VxeModalConstructor & VxeModalMethods
288
+
289
+ let modalMethods = {} as ModalMethods
290
+
291
+ const getBox = () => {
292
+ const boxElem = refModalBox.value
293
+ return boxElem
294
+ }
295
+
296
+ const recalculate = () => {
297
+ const { width, height, minWidth, minHeight } = props
298
+ const isMsg = computeIsMsg.value
299
+ const boxElem = getBox()
300
+ if (boxElem) {
301
+ boxElem.style.width = width ? toCssUnit(width) : ''
302
+ boxElem.style.height = height ? toCssUnit(height) : ''
303
+ boxElem.style.minWidth = !isMsg && minWidth ? toCssUnit(minWidth) : ''
304
+ boxElem.style.minHeight = !isMsg && minHeight ? toCssUnit(minHeight) : ''
305
+ }
306
+ return nextTick()
307
+ }
308
+
309
+ const updateZindex = () => {
310
+ const { zIndex } = props
311
+ const { modalZindex } = reactData
312
+ if (zIndex) {
313
+ reactData.modalZindex = zIndex
314
+ } else {
315
+ const isMsg = computeIsMsg.value
316
+ if (isMsg) {
317
+ if (modalZindex < getSubLastZIndex()) {
318
+ reactData.modalZindex = nextSubZIndex()
319
+ }
320
+ } else {
321
+ if (modalZindex < getLastZIndex()) {
322
+ reactData.modalZindex = nextZIndex()
323
+ }
324
+ }
325
+ }
326
+ }
327
+
328
+ const updatePosition = () => {
329
+ return nextTick().then(() => {
330
+ const { position } = props
331
+ const marginSize = XEUtils.toNumber(props.marginSize)
332
+ const boxElem = getBox()
333
+ if (!boxElem) {
334
+ return
335
+ }
336
+ const clientVisibleWidth = document.documentElement.clientWidth || document.body.clientWidth
337
+ const clientVisibleHeight = document.documentElement.clientHeight || document.body.clientHeight
338
+ const isPosCenter = position === 'center'
339
+ const { top, left }: any = XEUtils.isString(position) ? { top: position, left: position } : Object.assign({}, position)
340
+ const topCenter = isPosCenter || top === 'center'
341
+ const leftCenter = isPosCenter || left === 'center'
342
+ let posTop = ''
343
+ let posLeft = ''
344
+ if (left && !leftCenter) {
345
+ posLeft = isNaN(left) ? left : `${left}px`
346
+ } else {
347
+ posLeft = `${Math.max(marginSize, clientVisibleWidth / 2 - boxElem.offsetWidth / 2)}px`
348
+ }
349
+ if (top && !topCenter) {
350
+ posTop = isNaN(top) ? top : `${top}px`
351
+ } else {
352
+ posTop = `${Math.max(marginSize, clientVisibleHeight / 2 - boxElem.offsetHeight / 2)}px`
353
+ }
354
+ boxElem.style.top = posTop
355
+ boxElem.style.left = posLeft
356
+ })
357
+ }
358
+
359
+ const updateStyle = () => {
360
+ nextTick(() => {
361
+ const { type } = props
362
+ const queueList = type === 'notification' ? notifyQueue : msgQueue
363
+ let offsetTop = 0
364
+ queueList.forEach(comp => {
365
+ const boxElem = comp.getBox()
366
+ if (boxElem) {
367
+ offsetTop += XEUtils.toNumber(comp.props.top)
368
+ comp.reactData.modalTop = offsetTop
369
+ offsetTop += boxElem.clientHeight
370
+ }
371
+ })
372
+ })
373
+ }
374
+
375
+ const removeActiveQueue = () => {
376
+ if (allActiveModals.indexOf($xeModal) > -1) {
377
+ XEUtils.remove(allActiveModals, item => item === $xeModal)
378
+ }
379
+ }
380
+
381
+ const removeMsgQueue = () => {
382
+ const { type } = props
383
+ const queueList = type === 'notification' ? notifyQueue : msgQueue
384
+ if (queueList.indexOf($xeModal) > -1) {
385
+ XEUtils.remove(queueList, comp => comp === $xeModal)
386
+ }
387
+ updateStyle()
388
+ }
389
+
390
+ const closeModal = (type: ModalEventTypes) => {
391
+ const { remember } = props
392
+ const { visible } = reactData
393
+ const isMsg = computeIsMsg.value
394
+ const beforeHideFn = props.beforeHideMethod || getConfig().modal.beforeHideMethod
395
+ const params = { type }
396
+ if (visible) {
397
+ Promise.resolve(beforeHideFn ? beforeHideFn(params) : null).then((rest) => {
398
+ if (!XEUtils.isError(rest)) {
399
+ if (isMsg) {
400
+ removeMsgQueue()
401
+ }
402
+ reactData.contentVisible = false
403
+ if (!remember) {
404
+ handleRevert()
405
+ }
406
+ removeActiveQueue()
407
+ dispatchEvent('before-hide', params, null)
408
+ setTimeout(() => {
409
+ reactData.visible = false
410
+ emitModel(false)
411
+ dispatchEvent('hide', params, null)
412
+ }, 200)
413
+ removeBodyLockScroll()
414
+ }
415
+ }).catch(e => e)
416
+ }
417
+ return nextTick()
418
+ }
419
+
420
+ const closeEvent = (evnt: Event) => {
421
+ const type = 'close'
422
+ dispatchEvent(type, { type }, evnt)
423
+ closeModal(type)
424
+ }
425
+
426
+ const confirmEvent = (evnt: Event) => {
427
+ const { confirmClosable } = props
428
+ const type = 'confirm'
429
+ dispatchEvent(type, { type }, evnt)
430
+ if (confirmClosable) {
431
+ closeModal(type)
432
+ }
433
+ }
434
+
435
+ const cancelEvent = (evnt: Event) => {
436
+ const { cancelClosable } = props
437
+ const type = 'cancel'
438
+ dispatchEvent(type, { type }, evnt)
439
+ if (cancelClosable) {
440
+ closeModal(type)
441
+ }
442
+ }
443
+
444
+ const getStorageMap = (key: string) => {
445
+ const version = getConfig().version
446
+ const rest = XEUtils.toStringJSON(localStorage.getItem(key) || '')
447
+ return rest && rest._v === version ? rest : { _v: version }
448
+ }
449
+
450
+ const hasPosStorage = () => {
451
+ const { id, storage, storageKey } = props
452
+ return !!(id && storage && getStorageMap(storageKey)[id])
453
+ }
454
+
455
+ const restorePosStorage = () => {
456
+ const { id, storage, storageKey } = props
457
+ if (id && storage) {
458
+ const posStorage = getStorageMap(storageKey)[id]
459
+ if (posStorage) {
460
+ const boxElem = getBox()
461
+ const [left, top, width, height, zoomLeft, zoomTop, zoomWidth, zoomHeight] = posStorage.split(',')
462
+ if (boxElem) {
463
+ if (left) {
464
+ boxElem.style.left = `${left}px`
465
+ }
466
+ if (top) {
467
+ boxElem.style.top = `${top}px`
468
+ }
469
+ if (width) {
470
+ boxElem.style.width = `${width}px`
471
+ }
472
+ if (height) {
473
+ boxElem.style.height = `${height}px`
474
+ }
475
+ }
476
+ if (zoomLeft && zoomTop) {
477
+ reactData.revertLocat = {
478
+ left: zoomLeft,
479
+ top: zoomTop,
480
+ width: zoomWidth,
481
+ height: zoomHeight
482
+ }
483
+ }
484
+ }
485
+ }
486
+ }
487
+
488
+ const addMsgQueue = () => {
489
+ const { type } = props
490
+ const queueList = type === 'notification' ? notifyQueue : msgQueue
491
+ if (queueList.indexOf($xeModal) === -1) {
492
+ queueList.push($xeModal)
493
+ }
494
+ updateStyle()
495
+ }
496
+
497
+ const savePosStorage = () => {
498
+ const { id, storage, storageKey } = props
499
+ const { zoomStatus, revertLocat } = reactData
500
+ if (zoomStatus) {
501
+ return
502
+ }
503
+ if (id && storage) {
504
+ const boxElem = getBox()
505
+ if (!boxElem) {
506
+ return
507
+ }
508
+ const posStorageMap = getStorageMap(storageKey)
509
+ posStorageMap[id] = ([
510
+ boxElem.style.left,
511
+ boxElem.style.top,
512
+ boxElem.clientWidth,
513
+ boxElem.clientHeight
514
+ ] as (string | number)[]).concat(revertLocat
515
+ ? [
516
+ revertLocat.left,
517
+ revertLocat.top,
518
+ revertLocat.width,
519
+ revertLocat.height
520
+ ]
521
+ : []).map(val => val ? XEUtils.toNumber(val) : '').join(',')
522
+ localStorage.setItem(storageKey, XEUtils.toJSONString(posStorageMap))
523
+ }
524
+ }
525
+
526
+ const handleMinimize = () => {
527
+ const zoomOpts = computeZoomOpts.value
528
+ const { minimizeLayout, minimizeMaxSize, minimizeHorizontalOffset, minimizeVerticalOffset, minimizeOffsetMethod } = zoomOpts
529
+ const isHorizontalLayout = minimizeLayout === 'horizontal'
530
+ const prevZoomStatus = reactData.zoomStatus
531
+ const hlMList: VxeModalConstructor[] = []
532
+ const vlMList: VxeModalConstructor[] = []
533
+ allActiveModals.forEach(item => {
534
+ if (item.xID !== $xeModal.xID && item.props.type === 'modal' && item.reactData.zoomStatus === 'minimize') {
535
+ const itemZoomOpts = item.getComputeMaps().computeZoomOpts.value
536
+ if (itemZoomOpts.minimizeLayout === 'horizontal') {
537
+ hlMList.push(item)
538
+ } else {
539
+ vlMList.push(item)
540
+ }
541
+ }
542
+ })
543
+ const mList = isHorizontalLayout ? hlMList : vlMList
544
+ // 如果配置最小化最大数量
545
+ if (minimizeMaxSize && mList.length >= minimizeMaxSize) {
546
+ if (VxeUI.modal) {
547
+ VxeUI.modal.message({
548
+ status: 'error',
549
+ content: getI18n('vxe.modal.miniMaxSize', [minimizeMaxSize])
550
+ })
551
+ }
552
+ return Promise.resolve({
553
+ status: false
554
+ })
555
+ }
556
+ reactData.prevZoomStatus = prevZoomStatus
557
+ reactData.zoomStatus = 'minimize'
558
+ return nextTick().then(() => {
559
+ const boxElem = getBox()
560
+ if (!boxElem) {
561
+ return {
562
+ status: false
563
+ }
564
+ }
565
+ const headerEl = refHeaderElem.value
566
+ if (!headerEl) {
567
+ return {
568
+ status: false
569
+ }
570
+ }
571
+ const { visibleHeight } = getDomNode()
572
+ // 如果当前处于复原状态
573
+ if (!prevZoomStatus) {
574
+ reactData.revertLocat = {
575
+ top: boxElem.offsetTop,
576
+ left: boxElem.offsetLeft,
577
+ width: boxElem.offsetWidth + (boxElem.style.width ? 0 : 1),
578
+ height: boxElem.offsetHeight + (boxElem.style.height ? 0 : 1)
579
+ }
580
+ }
581
+ const targetModal = XEUtils[isHorizontalLayout ? 'max' : 'min'](mList, ($modal) => {
582
+ const boxElem = $modal.getBox()
583
+ return boxElem ? XEUtils.toNumber(boxElem.style[isHorizontalLayout ? 'left' : 'top']) : 0
584
+ })
585
+ let targetTop = visibleHeight - headerEl.offsetHeight - 16
586
+ let targetLeft = 16
587
+ if (targetModal) {
588
+ const minBoxElem = targetModal.getBox()
589
+ if (minBoxElem) {
590
+ const boxLeft = XEUtils.toNumber(minBoxElem.style.left)
591
+ const boxTop = XEUtils.toNumber(minBoxElem.style.top)
592
+ let offsetObj: {
593
+ top?: number
594
+ left?: number
595
+ } = {}
596
+ if (isHorizontalLayout) {
597
+ offsetObj = Object.assign({}, minimizeHorizontalOffset)
598
+ } else {
599
+ offsetObj = Object.assign({}, minimizeVerticalOffset)
600
+ }
601
+ targetLeft = boxLeft + XEUtils.toNumber(offsetObj.left)
602
+ targetTop = boxTop + XEUtils.toNumber(offsetObj.top)
603
+ if (minimizeOffsetMethod) {
604
+ offsetObj = minimizeOffsetMethod({
605
+ $modal: $xeModal,
606
+ left: targetLeft,
607
+ top: targetTop
608
+ })
609
+ targetLeft = XEUtils.toNumber(offsetObj.left)
610
+ targetTop = XEUtils.toNumber(offsetObj.top)
611
+ }
612
+ }
613
+ }
614
+ Object.assign(boxElem.style, {
615
+ top: `${targetTop}px`,
616
+ left: `${targetLeft}px`,
617
+ width: '200px',
618
+ height: `${headerEl.offsetHeight}px`
619
+ })
620
+ savePosStorage()
621
+ return {
622
+ status: true
623
+ }
624
+ })
625
+ }
626
+
627
+ const handleMaximize = () => {
628
+ const prevZoomStatus = reactData.zoomStatus
629
+ reactData.prevZoomStatus = prevZoomStatus
630
+ reactData.zoomStatus = 'maximize'
631
+ return nextTick().then(() => {
632
+ const boxElem = getBox()
633
+ if (boxElem) {
634
+ // 如果当前处于复原状态
635
+ if (!prevZoomStatus) {
636
+ const marginSize = XEUtils.toNumber(props.marginSize)
637
+ const clientVisibleWidth = document.documentElement.clientWidth || document.body.clientWidth
638
+ const clientVisibleHeight = document.documentElement.clientHeight || document.body.clientHeight
639
+ reactData.revertLocat = {
640
+ top: Math.max(marginSize, clientVisibleHeight / 2 - boxElem.offsetHeight / 2),
641
+ left: Math.max(marginSize, clientVisibleWidth / 2 - boxElem.offsetWidth / 2),
642
+ width: boxElem.offsetWidth + (boxElem.style.width ? 0 : 1),
643
+ height: boxElem.offsetHeight + (boxElem.style.height ? 0 : 1)
644
+ }
645
+ }
646
+ Object.assign(boxElem.style, {
647
+ top: '0',
648
+ left: '0',
649
+ width: '100%',
650
+ height: '100%'
651
+ })
652
+ }
653
+ savePosStorage()
654
+ return {
655
+ status: true
656
+ }
657
+ })
658
+ }
659
+
660
+ const handleMsgAutoClose = () => {
661
+ const { duration } = props
662
+ if (duration !== -1) {
663
+ internalData.msgTimeout = setTimeout(() => closeModal('close'), XEUtils.toNumber(duration))
664
+ }
665
+ }
666
+
667
+ const removeBodyLockScroll = () => {
668
+ const htmlElem = document.documentElement
669
+ const lockData = htmlElem.getAttribute(lockScrollAttrKey)
670
+ if (lockData) {
671
+ const lockList = lockData.split(',').filter(key => key !== xID)
672
+ if (lockList.length) {
673
+ htmlElem.setAttribute(lockScrollAttrKey, lockList.join(','))
674
+ } else {
675
+ htmlElem.removeAttribute(lockScrollAttrKey)
676
+ htmlElem.style.removeProperty(lockScrollCssWidthKey)
677
+ }
678
+ }
679
+ }
680
+
681
+ const addBodyLockScroll = () => {
682
+ const { lockScroll } = props
683
+ const isMsg = computeIsMsg.value
684
+ if (lockScroll && !isMsg) {
685
+ const htmlElem = document.documentElement
686
+ const clientWidth = document.body.clientWidth
687
+ const lockData = htmlElem.getAttribute(lockScrollAttrKey)
688
+ const lockList = lockData ? lockData.split(',') : []
689
+ if (!lockList.includes(xID)) {
690
+ lockList.push(xID)
691
+ htmlElem.setAttribute(lockScrollAttrKey, lockList.join(','))
692
+ }
693
+ htmlElem.style.setProperty(lockScrollCssWidthKey, `${clientWidth}px`)
694
+ }
695
+ }
696
+
697
+ const openModal = () => {
698
+ const { remember, showFooter } = props
699
+ const { initialized, visible } = reactData
700
+ const isMsg = computeIsMsg.value
701
+ if (!initialized) {
702
+ reactData.initialized = true
703
+ }
704
+ if (!visible) {
705
+ addBodyLockScroll()
706
+ reactData.visible = true
707
+ reactData.contentVisible = false
708
+ updateZindex()
709
+ allActiveModals.push($xeModal)
710
+ setTimeout(() => {
711
+ reactData.contentVisible = true
712
+ nextTick(() => {
713
+ if (!props.fullscreen) {
714
+ recalculate()
715
+ }
716
+ if (showFooter) {
717
+ const confirmBtn = refConfirmBtn.value
718
+ const cancelBtn = refCancelBtn.value
719
+ const operBtn = confirmBtn || cancelBtn
720
+ if (operBtn) {
721
+ operBtn.focus()
722
+ }
723
+ }
724
+ const type = ''
725
+ const params = { type }
726
+ emitModel(true)
727
+ dispatchEvent('show', params, null)
728
+ })
729
+ }, 10)
730
+ if (isMsg) {
731
+ addMsgQueue()
732
+ handleMsgAutoClose()
733
+ } else {
734
+ nextTick(() => {
735
+ const { firstOpen } = reactData
736
+ if (firstOpen) {
737
+ reactData.firstOpen = false
738
+ if (hasPosStorage()) {
739
+ restorePosStorage()
740
+ } else {
741
+ if (props.fullscreen) {
742
+ nextTick(() => handleMaximize())
743
+ } else {
744
+ recalculate()
745
+ updatePosition().then(() => {
746
+ setTimeout(() => updatePosition(), 20)
747
+ })
748
+ }
749
+ }
750
+ } else {
751
+ if (!remember) {
752
+ recalculate()
753
+ updatePosition().then(() => {
754
+ setTimeout(() => updatePosition(), 20)
755
+ })
756
+ }
757
+ }
758
+ })
759
+ }
760
+ }
761
+ return nextTick()
762
+ }
763
+
764
+ const selfClickEvent = (evnt: Event) => {
765
+ const el = refElem.value
766
+ if (props.maskClosable && evnt.target === el) {
767
+ const type = 'mask'
768
+ closeModal(type)
769
+ }
770
+ }
771
+
772
+ const selfMouseoverEvent = () => {
773
+ const { msgTimeout } = internalData
774
+ if (!msgTimeout) {
775
+ return
776
+ }
777
+ const isMsg = computeIsMsg.value
778
+ if (isMsg) {
779
+ clearTimeout(msgTimeout)
780
+ internalData.msgTimeout = undefined
781
+ }
782
+ }
783
+
784
+ const selfMouseoutEvent = () => {
785
+ const { msgTimeout } = internalData
786
+ if (!msgTimeout) {
787
+ const isMsg = computeIsMsg.value
788
+ if (isMsg) {
789
+ handleMsgAutoClose()
790
+ }
791
+ }
792
+ }
793
+
794
+ const handleGlobalKeydownEvent = (evnt: KeyboardEvent) => {
795
+ const isEsc = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ESCAPE)
796
+ if (isEsc) {
797
+ const lastModal = XEUtils.max(allActiveModals, (item) => item.reactData.modalZindex)
798
+ // 多个时,只关掉最上层的窗口
799
+ if (lastModal) {
800
+ setTimeout(() => {
801
+ if (lastModal === $xeModal && lastModal.props.escClosable) {
802
+ const type = 'exit'
803
+ dispatchEvent('close', { type }, evnt)
804
+ closeModal(type)
805
+ }
806
+ }, 10)
807
+ }
808
+ }
809
+ }
810
+
811
+ const isMinimized = () => {
812
+ return reactData.zoomStatus === 'minimize'
813
+ }
814
+
815
+ const isMaximized = () => {
816
+ return reactData.zoomStatus === 'maximize'
817
+ }
818
+
819
+ const handleRevert = () => {
820
+ reactData.prevZoomStatus = reactData.zoomStatus
821
+ reactData.zoomStatus = ''
822
+ return nextTick().then(() => {
823
+ const { revertLocat } = reactData
824
+ if (revertLocat) {
825
+ const boxElem = getBox()
826
+ reactData.revertLocat = null
827
+ if (boxElem) {
828
+ Object.assign(boxElem.style, {
829
+ top: `${revertLocat.top}px`,
830
+ left: `${revertLocat.left}px`,
831
+ width: `${revertLocat.width}px`,
832
+ height: `${revertLocat.height}px`
833
+ })
834
+ }
835
+ savePosStorage()
836
+ return nextTick().then(() => {
837
+ return {
838
+ status: true
839
+ }
840
+ })
841
+ }
842
+ return {
843
+ status: false
844
+ }
845
+ })
846
+ }
847
+
848
+ const handleZoom = (type?: 'minimize' | 'revert' | 'maximize') => {
849
+ const { zoomStatus } = reactData
850
+ return new Promise(resolve => {
851
+ if (type) {
852
+ if (type === 'maximize') {
853
+ resolve(handleMaximize())
854
+ return
855
+ }
856
+ if (type === 'minimize') {
857
+ resolve(handleMinimize())
858
+ return
859
+ }
860
+ resolve(handleRevert())
861
+ return
862
+ }
863
+ resolve(zoomStatus ? handleRevert() : handleMaximize())
864
+ }).then(() => {
865
+ return reactData.zoomStatus || 'revert'
866
+ })
867
+ }
868
+
869
+ const toggleZoomMinEvent = (evnt: Event) => {
870
+ const { zoomStatus, prevZoomStatus } = reactData
871
+ return handleZoom(zoomStatus === 'minimize' ? (prevZoomStatus || 'revert') : 'minimize').then((type) => {
872
+ const params = { type }
873
+ dispatchEvent('zoom', params, evnt)
874
+ })
875
+ }
876
+
877
+ const toggleZoomMaxEvent = (evnt: Event) => {
878
+ return handleZoom().then((type) => {
879
+ const params = { type }
880
+ dispatchEvent('zoom', params, evnt)
881
+ })
882
+ }
883
+
884
+ const getPosition = () => {
885
+ const isMsg = computeIsMsg.value
886
+ if (!isMsg) {
887
+ const boxElem = getBox()
888
+ if (boxElem) {
889
+ return {
890
+ top: boxElem.offsetTop,
891
+ left: boxElem.offsetLeft
892
+ }
893
+ }
894
+ }
895
+ return null
896
+ }
897
+
898
+ const setPosition = (top?: number, left?: number) => {
899
+ const isMsg = computeIsMsg.value
900
+ if (!isMsg) {
901
+ const boxElem = getBox()
902
+ if (boxElem) {
903
+ if (XEUtils.isNumber(top)) {
904
+ boxElem.style.top = `${top}px`
905
+ }
906
+ if (XEUtils.isNumber(left)) {
907
+ boxElem.style.left = `${left}px`
908
+ }
909
+ }
910
+ }
911
+ return nextTick()
912
+ }
913
+
914
+ const boxMousedownEvent = () => {
915
+ const { modalZindex } = reactData
916
+ if (allActiveModals.some(comp => comp.reactData.visible && comp.reactData.modalZindex > modalZindex)) {
917
+ updateZindex()
918
+ }
919
+ }
920
+
921
+ const mousedownEvent = (evnt: MouseEvent) => {
922
+ const { storage } = props
923
+ const { zoomStatus } = reactData
924
+ const marginSize = XEUtils.toNumber(props.marginSize)
925
+ const boxElem = getBox()
926
+ if (!boxElem) {
927
+ return
928
+ }
929
+ if (zoomStatus !== 'maximize' && evnt.button === 0 && !getEventTargetNode(evnt, boxElem, 'trigger--btn').flag) {
930
+ evnt.preventDefault()
931
+ const disX = evnt.clientX - boxElem.offsetLeft
932
+ const disY = evnt.clientY - boxElem.offsetTop
933
+ const { visibleHeight, visibleWidth } = getDomNode()
934
+ document.onmousemove = evnt => {
935
+ evnt.preventDefault()
936
+ const offsetWidth = boxElem.offsetWidth
937
+ const offsetHeight = boxElem.offsetHeight
938
+ const minX = marginSize
939
+ const maxX = visibleWidth - offsetWidth - marginSize - 1
940
+ const minY = marginSize
941
+ const maxY = visibleHeight - offsetHeight - marginSize - 1
942
+ let left = evnt.clientX - disX
943
+ let top = evnt.clientY - disY
944
+ if (left > maxX) {
945
+ left = maxX
946
+ }
947
+ if (left < minX) {
948
+ left = minX
949
+ }
950
+ if (top > maxY) {
951
+ top = maxY
952
+ }
953
+ if (top < minY) {
954
+ top = minY
955
+ }
956
+ boxElem.style.left = `${left}px`
957
+ boxElem.style.top = `${top}px`
958
+ boxElem.className = boxElem.className.replace(/\s?is--drag/, '') + ' is--drag'
959
+ dispatchEvent('move', { type: 'move' }, evnt)
960
+ reactData.resizeFlag++
961
+ }
962
+ document.onmouseup = () => {
963
+ document.onmousemove = null
964
+ document.onmouseup = null
965
+ if (storage) {
966
+ nextTick(() => {
967
+ savePosStorage()
968
+ })
969
+ }
970
+ reactData.resizeFlag++
971
+ setTimeout(() => {
972
+ boxElem.className = boxElem.className.replace(/\s?is--drag/, '')
973
+ }, 50)
974
+ }
975
+ }
976
+ }
977
+
978
+ const dragEvent = (evnt: MouseEvent) => {
979
+ evnt.preventDefault()
980
+ const { storage } = props
981
+ const { visibleHeight, visibleWidth } = getDomNode()
982
+ const marginSize = XEUtils.toNumber(props.marginSize)
983
+ const targetElem = evnt.target as HTMLSpanElement
984
+ const type = targetElem.getAttribute('type')
985
+ const minWidth = XEUtils.toNumber(props.minWidth)
986
+ const minHeight = XEUtils.toNumber(props.minHeight)
987
+ const maxWidth = visibleWidth
988
+ const maxHeight = visibleHeight
989
+ const boxElem = getBox()
990
+ const clientWidth = boxElem.clientWidth
991
+ const clientHeight = boxElem.clientHeight
992
+ const disX = evnt.clientX
993
+ const disY = evnt.clientY
994
+ const offsetTop = boxElem.offsetTop
995
+ const offsetLeft = boxElem.offsetLeft
996
+ const params = { type: 'resize' }
997
+ document.onmousemove = evnt => {
998
+ evnt.preventDefault()
999
+ let dragLeft
1000
+ let dragTop
1001
+ let width
1002
+ let height
1003
+ switch (type) {
1004
+ case 'wl':
1005
+ dragLeft = disX - evnt.clientX
1006
+ width = dragLeft + clientWidth
1007
+ if (offsetLeft - dragLeft > marginSize) {
1008
+ if (width > minWidth) {
1009
+ boxElem.style.width = `${width < maxWidth ? width : maxWidth}px`
1010
+ boxElem.style.left = `${offsetLeft - dragLeft}px`
1011
+ }
1012
+ }
1013
+ break
1014
+ case 'swst':
1015
+ dragLeft = disX - evnt.clientX
1016
+ dragTop = disY - evnt.clientY
1017
+ width = dragLeft + clientWidth
1018
+ height = dragTop + clientHeight
1019
+ if (offsetLeft - dragLeft > marginSize) {
1020
+ if (width > minWidth) {
1021
+ boxElem.style.width = `${width < maxWidth ? width : maxWidth}px`
1022
+ boxElem.style.left = `${offsetLeft - dragLeft}px`
1023
+ }
1024
+ }
1025
+ if (offsetTop - dragTop > marginSize) {
1026
+ if (height > minHeight) {
1027
+ boxElem.style.height = `${height < maxHeight ? height : maxHeight}px`
1028
+ boxElem.style.top = `${offsetTop - dragTop}px`
1029
+ }
1030
+ }
1031
+ break
1032
+ case 'swlb':
1033
+ dragLeft = disX - evnt.clientX
1034
+ dragTop = evnt.clientY - disY
1035
+ width = dragLeft + clientWidth
1036
+ height = dragTop + clientHeight
1037
+ if (offsetLeft - dragLeft > marginSize) {
1038
+ if (width > minWidth) {
1039
+ boxElem.style.width = `${width < maxWidth ? width : maxWidth}px`
1040
+ boxElem.style.left = `${offsetLeft - dragLeft}px`
1041
+ }
1042
+ }
1043
+ if (offsetTop + height + marginSize < visibleHeight) {
1044
+ if (height > minHeight) {
1045
+ boxElem.style.height = `${height < maxHeight ? height : maxHeight}px`
1046
+ }
1047
+ }
1048
+ break
1049
+ case 'st':
1050
+ dragTop = disY - evnt.clientY
1051
+ height = clientHeight + dragTop
1052
+ if (offsetTop - dragTop > marginSize) {
1053
+ if (height > minHeight) {
1054
+ boxElem.style.height = `${height < maxHeight ? height : maxHeight}px`
1055
+ boxElem.style.top = `${offsetTop - dragTop}px`
1056
+ }
1057
+ }
1058
+ break
1059
+ case 'wr':
1060
+ dragLeft = evnt.clientX - disX
1061
+ width = dragLeft + clientWidth
1062
+ if (offsetLeft + width + marginSize < visibleWidth) {
1063
+ if (width > minWidth) {
1064
+ boxElem.style.width = `${width < maxWidth ? width : maxWidth}px`
1065
+ }
1066
+ }
1067
+ break
1068
+ case 'sest':
1069
+ dragLeft = evnt.clientX - disX
1070
+ dragTop = disY - evnt.clientY
1071
+ width = dragLeft + clientWidth
1072
+ height = dragTop + clientHeight
1073
+ if (offsetLeft + width + marginSize < visibleWidth) {
1074
+ if (width > minWidth) {
1075
+ boxElem.style.width = `${width < maxWidth ? width : maxWidth}px`
1076
+ }
1077
+ }
1078
+ if (offsetTop - dragTop > marginSize) {
1079
+ if (height > minHeight) {
1080
+ boxElem.style.height = `${height < maxHeight ? height : maxHeight}px`
1081
+ boxElem.style.top = `${offsetTop - dragTop}px`
1082
+ }
1083
+ }
1084
+ break
1085
+ case 'selb':
1086
+ dragLeft = evnt.clientX - disX
1087
+ dragTop = evnt.clientY - disY
1088
+ width = dragLeft + clientWidth
1089
+ height = dragTop + clientHeight
1090
+ if (offsetLeft + width + marginSize < visibleWidth) {
1091
+ if (width > minWidth) {
1092
+ boxElem.style.width = `${width < maxWidth ? width : maxWidth}px`
1093
+ }
1094
+ }
1095
+ if (offsetTop + height + marginSize < visibleHeight) {
1096
+ if (height > minHeight) {
1097
+ boxElem.style.height = `${height < maxHeight ? height : maxHeight}px`
1098
+ }
1099
+ }
1100
+ break
1101
+ case 'sb':
1102
+ dragTop = evnt.clientY - disY
1103
+ height = dragTop + clientHeight
1104
+ if (offsetTop + height + marginSize < visibleHeight) {
1105
+ if (height > minHeight) {
1106
+ boxElem.style.height = `${height < maxHeight ? height : maxHeight}px`
1107
+ }
1108
+ }
1109
+ break
1110
+ }
1111
+ boxElem.className = boxElem.className.replace(/\s?is--drag/, '') + ' is--drag'
1112
+ if (storage) {
1113
+ savePosStorage()
1114
+ }
1115
+ dispatchEvent('resize', params, evnt)
1116
+ }
1117
+ document.onmouseup = () => {
1118
+ reactData.revertLocat = null
1119
+ document.onmousemove = null
1120
+ document.onmouseup = null
1121
+ setTimeout(() => {
1122
+ boxElem.className = boxElem.className.replace(/\s?is--drag/, '')
1123
+ }, 50)
1124
+ }
1125
+ }
1126
+
1127
+ const dispatchEvent = (type: ValueOf<VxeModalEmits>, params: Record<string, any>, evnt: Event | null) => {
1128
+ emit(type, createEvent(evnt, { $modal: $xeModal }, params))
1129
+ }
1130
+
1131
+ const emitModel = (value: any) => {
1132
+ emit('update:modelValue', value)
1133
+ }
1134
+
1135
+ modalMethods = {
1136
+ dispatchEvent,
1137
+ open: openModal,
1138
+ close () {
1139
+ return closeModal('close')
1140
+ },
1141
+ getBox,
1142
+ getPosition,
1143
+ setPosition,
1144
+ isMinimized,
1145
+ isMaximized,
1146
+ zoom () {
1147
+ return handleZoom()
1148
+ },
1149
+ minimize () {
1150
+ if (!reactData.visible) {
1151
+ return Promise.resolve({
1152
+ status: false
1153
+ })
1154
+ }
1155
+ return handleMinimize()
1156
+ },
1157
+ maximize () {
1158
+ if (!reactData.visible) {
1159
+ return Promise.resolve({
1160
+ status: false
1161
+ })
1162
+ }
1163
+ return handleMaximize()
1164
+ },
1165
+ revert () {
1166
+ if (!reactData.visible) {
1167
+ return Promise.resolve({
1168
+ status: false
1169
+ })
1170
+ }
1171
+ return handleRevert()
1172
+ }
1173
+ }
1174
+
1175
+ Object.assign($xeModal, modalMethods)
1176
+
1177
+ const renderTitles = () => {
1178
+ const { slots: propSlots = {}, showClose, showZoom, showMaximize, showMinimize, title } = props
1179
+ const { zoomStatus } = reactData
1180
+ const titleSlot = slots.title || propSlots.title
1181
+ const cornerSlot = slots.corner || propSlots.corner
1182
+ const isMinimizeStatus = computeIsMinimizeStatus.value
1183
+ const isMaximizeStatus = computeIsMaximizeStatus.value
1184
+ return [
1185
+ h('div', {
1186
+ class: 'vxe-modal--header-title'
1187
+ }, titleSlot
1188
+ ? getSlotVNs(titleSlot({
1189
+ $modal: $xeModal,
1190
+ minimized: isMinimizeStatus,
1191
+ maximized: isMaximizeStatus
1192
+ }))
1193
+ : (title ? getFuncText(title) : getI18n('vxe.alert.title'))),
1194
+ h('div', {
1195
+ class: 'vxe-modal--header-right'
1196
+ }, [
1197
+ cornerSlot && !isMinimizeStatus
1198
+ ? h('div', {
1199
+ class: 'vxe-modal--corner-wrapper'
1200
+ }, getSlotVNs(cornerSlot({ $modal: $xeModal })))
1201
+ : renderEmptyElement($xeModal),
1202
+ (XEUtils.isBoolean(showMinimize) ? showMinimize : showZoom)
1203
+ ? h('div', {
1204
+ class: ['vxe-modal--zoom-btn', 'trigger--btn'],
1205
+ title: getI18n(`vxe.modal.zoom${zoomStatus === 'minimize' ? 'Out' : 'Min'}`),
1206
+ onClick: toggleZoomMinEvent
1207
+ }, [
1208
+ h('i', {
1209
+ class: zoomStatus === 'minimize' ? getIcon().MODAL_ZOOM_REVERT : getIcon().MODAL_ZOOM_MIN
1210
+ })
1211
+ ])
1212
+ : renderEmptyElement($xeModal),
1213
+ (XEUtils.isBoolean(showMaximize) ? showMaximize : showZoom) && zoomStatus !== 'minimize'
1214
+ ? h('div', {
1215
+ class: ['vxe-modal--zoom-btn', 'trigger--btn'],
1216
+ title: getI18n(`vxe.modal.zoom${zoomStatus === 'maximize' ? 'Out' : 'In'}`),
1217
+ onClick: toggleZoomMaxEvent
1218
+ }, [
1219
+ h('i', {
1220
+ class: zoomStatus === 'maximize' ? getIcon().MODAL_ZOOM_OUT : getIcon().MODAL_ZOOM_IN
1221
+ })
1222
+ ])
1223
+ : renderEmptyElement($xeModal),
1224
+ showClose
1225
+ ? h('div', {
1226
+ class: ['vxe-modal--close-btn', 'trigger--btn'],
1227
+ title: getI18n('vxe.modal.close'),
1228
+ onClick: closeEvent
1229
+ }, [
1230
+ h('i', {
1231
+ class: getIcon().MODAL_CLOSE
1232
+ })
1233
+ ])
1234
+ : renderEmptyElement($xeModal)
1235
+ ])
1236
+ ]
1237
+ }
1238
+
1239
+ const renderHeader = () => {
1240
+ const { slots: propSlots = {}, showZoom, showMaximize, draggable } = props
1241
+ const headerSlot = slots.header || propSlots.header
1242
+ if (props.showHeader) {
1243
+ const headerOns: Record<string, any> = {}
1244
+ if (draggable) {
1245
+ headerOns.onMousedown = mousedownEvent
1246
+ }
1247
+ if ((XEUtils.isBoolean(showMaximize) ? showMaximize : showZoom) && props.dblclickZoom && props.type === 'modal') {
1248
+ headerOns.onDblclick = toggleZoomMaxEvent
1249
+ }
1250
+ return h('div', {
1251
+ ref: refHeaderElem,
1252
+ class: ['vxe-modal--header', {
1253
+ 'is--ellipsis': props.showTitleOverflow
1254
+ }],
1255
+ ...headerOns
1256
+ }, headerSlot ? getSlotVNs(headerSlot({ $modal: $xeModal })) : renderTitles())
1257
+ }
1258
+ return renderEmptyElement($xeModal)
1259
+ }
1260
+
1261
+ const renderBody = () => {
1262
+ const { slots: propSlots = {}, status, message, iconStatus } = props
1263
+ const content = props.content || message
1264
+ const isMsg = computeIsMsg.value
1265
+ const defaultSlot = slots.default || propSlots.default
1266
+ const leftSlot = slots.left || propSlots.left
1267
+ const rightSlot = slots.right || propSlots.right
1268
+ const contVNs: VNode[] = []
1269
+ if (!isMsg && (status || iconStatus)) {
1270
+ contVNs.push(
1271
+ h('div', {
1272
+ class: 'vxe-modal--status-wrapper'
1273
+ }, [
1274
+ h('i', {
1275
+ class: ['vxe-modal--status-icon', iconStatus || getIcon()[`MODAL_${status}`.toLocaleUpperCase() as 'MODAL_SUCCESS' | 'MODAL_ERROR']]
1276
+ })
1277
+ ])
1278
+ )
1279
+ }
1280
+ contVNs.push(
1281
+ h('div', {
1282
+ class: 'vxe-modal--content'
1283
+ }, defaultSlot ? getSlotVNs(defaultSlot({ $modal: $xeModal })) : getFuncText(content))
1284
+ )
1285
+ return h('div', {
1286
+ class: 'vxe-modal--body'
1287
+ }, [
1288
+ leftSlot
1289
+ ? h('div', {
1290
+ class: 'vxe-modal--body-left'
1291
+ }, getSlotVNs(leftSlot({ $modal: $xeModal })))
1292
+ : renderEmptyElement($xeModal),
1293
+ h('div', {
1294
+ class: 'vxe-modal--body-default'
1295
+ }, contVNs),
1296
+ rightSlot
1297
+ ? h('div', {
1298
+ class: 'vxe-modal--body-right'
1299
+ }, getSlotVNs(rightSlot({ $modal: $xeModal })))
1300
+ : renderEmptyElement($xeModal),
1301
+ isMsg
1302
+ ? renderEmptyElement($xeModal)
1303
+ : h(VxeLoadingComponent, {
1304
+ class: 'vxe-modal--loading',
1305
+ modelValue: props.loading
1306
+ })
1307
+ ])
1308
+ }
1309
+
1310
+ const renderDefaultFooter = () => {
1311
+ const { slots: propSlots = {}, showCancelButton, showConfirmButton, type, loading } = props
1312
+ const lfSlot = slots.leftfoot || propSlots.leftfoot
1313
+ const rfSlot = slots.rightfoot || propSlots.rightfoot
1314
+ const btnVNs = []
1315
+ if (XEUtils.isBoolean(showCancelButton) ? showCancelButton : type === 'confirm') {
1316
+ btnVNs.push(
1317
+ h(VxeButtonComponent, {
1318
+ key: 1,
1319
+ ref: refCancelBtn,
1320
+ content: props.cancelButtonText || getI18n('vxe.button.cancel'),
1321
+ onClick: cancelEvent
1322
+ })
1323
+ )
1324
+ }
1325
+ if (XEUtils.isBoolean(showConfirmButton) ? showConfirmButton : (type === 'confirm' || type === 'alert')) {
1326
+ btnVNs.push(
1327
+ h(VxeButtonComponent, {
1328
+ key: 2,
1329
+ ref: refConfirmBtn,
1330
+ loading: loading,
1331
+ status: 'primary',
1332
+ content: props.confirmButtonText || getI18n('vxe.button.confirm'),
1333
+ onClick: confirmEvent
1334
+ })
1335
+ )
1336
+ }
1337
+ return h('div', {
1338
+ class: 'vxe-modal--footer-wrapper'
1339
+ }, [
1340
+ h('div', {
1341
+ class: 'vxe-modal--footer-left'
1342
+ }, lfSlot ? getSlotVNs(lfSlot({ $modal: $xeModal })) : []),
1343
+ h('div', {
1344
+ class: 'vxe-modal--footer-right'
1345
+ }, rfSlot ? getSlotVNs(rfSlot({ $modal: $xeModal })) : btnVNs)
1346
+ ])
1347
+ }
1348
+
1349
+ const renderFooter = () => {
1350
+ const { slots: propSlots = {} } = props
1351
+ const footerSlot = slots.footer || propSlots.footer
1352
+ if (props.showFooter) {
1353
+ return h('div', {
1354
+ class: 'vxe-modal--footer'
1355
+ }, footerSlot ? getSlotVNs(footerSlot({ $modal: $xeModal })) : [renderDefaultFooter()])
1356
+ }
1357
+ return renderEmptyElement($xeModal)
1358
+ }
1359
+
1360
+ const renderVN = () => {
1361
+ const { slots: propSlots = {}, className, type, animat, draggable, iconStatus, position, loading, destroyOnClose, status, lockScroll, padding, lockView, mask, resize } = props
1362
+ const { initialized, modalTop, contentVisible, visible, zoomStatus } = reactData
1363
+ const asideSlot = slots.aside || propSlots.aside
1364
+ const vSize = computeSize.value
1365
+ const isMsg = computeIsMsg.value
1366
+ const isMinimizeStatus = computeIsMinimizeStatus.value
1367
+ const btnTransfer = computeBtnTransfer.value
1368
+ const ons: Record<string, any> = {}
1369
+ if (isMsg) {
1370
+ ons.onMouseover = selfMouseoverEvent
1371
+ ons.onMouseout = selfMouseoutEvent
1372
+ }
1373
+ return h(Teleport, {
1374
+ to: 'body',
1375
+ disabled: btnTransfer ? !initialized : true
1376
+ }, [
1377
+ h('div', {
1378
+ ref: refElem,
1379
+ class: ['vxe-modal--wrapper', `type--${type}`, `zoom--${zoomStatus || 'revert'}`, className || '', position ? `pos--${position}` : '', {
1380
+ [`size--${vSize}`]: vSize,
1381
+ [`status--${status}`]: status,
1382
+ 'is--padding': padding,
1383
+ 'is--animat': animat,
1384
+ 'lock--scroll': lockScroll,
1385
+ 'lock--view': lockView,
1386
+ 'is--draggable': draggable,
1387
+ 'is--resize': resize,
1388
+ 'is--mask': mask,
1389
+ 'is--visible': contentVisible,
1390
+ 'is--active': visible,
1391
+ 'is--loading': loading
1392
+ }],
1393
+ style: {
1394
+ zIndex: reactData.modalZindex,
1395
+ top: modalTop ? `${modalTop}px` : null
1396
+ },
1397
+ onClick: selfClickEvent,
1398
+ ...ons
1399
+ }, [
1400
+ h('div', {
1401
+ ref: refModalBox,
1402
+ class: 'vxe-modal--box',
1403
+ onMousedown: boxMousedownEvent
1404
+ }, [
1405
+ (isMsg || asideSlot) && !isMinimizeStatus
1406
+ ? h('div', {
1407
+ class: 'vxe-modal--aside'
1408
+ },
1409
+ asideSlot
1410
+ ? getSlotVNs(asideSlot({ $modal: $xeModal }))
1411
+ : [
1412
+ status || iconStatus
1413
+ ? h('div', {
1414
+ class: 'vxe-modal--status-wrapper'
1415
+ }, [
1416
+ h('i', {
1417
+ class: ['vxe-modal--status-icon', iconStatus || getIcon()[`MODAL_${status}`.toLocaleUpperCase() as 'MODAL_SUCCESS' | 'MODAL_ERROR']]
1418
+ })
1419
+ ])
1420
+ : renderEmptyElement($xeModal)
1421
+ ]
1422
+ )
1423
+ : renderEmptyElement($xeModal),
1424
+ h('div', {
1425
+ class: 'vxe-modal--container'
1426
+ }, !reactData.initialized || (destroyOnClose && !reactData.visible)
1427
+ ? []
1428
+ : [
1429
+ renderHeader(),
1430
+ renderBody(),
1431
+ renderFooter(),
1432
+ !isMsg && resize
1433
+ ? h('span', {
1434
+ class: 'vxe-modal--resize'
1435
+ }, ['wl', 'wr', 'swst', 'sest', 'st', 'swlb', 'selb', 'sb'].map(type => {
1436
+ return h('span', {
1437
+ class: `${type}-resize`,
1438
+ type: type,
1439
+ onMousedown: dragEvent
1440
+ })
1441
+ }))
1442
+ : renderEmptyElement($xeModal)
1443
+ ])
1444
+ ])
1445
+ ])
1446
+ ])
1447
+ }
1448
+
1449
+ $xeModal.renderVN = renderVN
1450
+
1451
+ watch(() => props.width, recalculate)
1452
+ watch(() => props.height, recalculate)
1453
+
1454
+ watch(() => props.modelValue, (value) => {
1455
+ if (value) {
1456
+ openModal()
1457
+ } else {
1458
+ closeModal('model')
1459
+ }
1460
+ })
1461
+
1462
+ onMounted(() => {
1463
+ if (props.type === 'modal' && props.showFooter && !(props.showConfirmButton || props.showCancelButton || slots.footer)) {
1464
+ warnLog('vxe.modal.footPropErr')
1465
+ }
1466
+ nextTick(() => {
1467
+ if (props.storage && !props.id) {
1468
+ errLog('vxe.error.reqProp', ['[modal] id'])
1469
+ }
1470
+ if (props.modelValue) {
1471
+ openModal()
1472
+ }
1473
+ recalculate()
1474
+ })
1475
+ if (props.escClosable) {
1476
+ globalEvents.on($xeModal, 'keydown', handleGlobalKeydownEvent)
1477
+ }
1478
+ })
1479
+
1480
+ onUnmounted(() => {
1481
+ globalEvents.off($xeModal, 'keydown')
1482
+ removeMsgQueue()
1483
+ removeActiveQueue()
1484
+ removeBodyLockScroll()
1485
+ })
1486
+
1487
+ provide('$xeModal', $xeModal)
1488
+
1489
+ return $xeModal
1490
+ },
1491
+ render () {
1492
+ return this.renderVN()
1493
+ }
1494
+ })