vxe-pc-ui 4.20.25 → 4.20.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (626) hide show
  1. package/dist/all.esm.js +15059 -10308
  2. package/dist/style.css +1 -1
  3. package/dist/style.mini.css +1 -1
  4. package/es/alert/src/alert.js +61 -36
  5. package/es/anchor/src/anchor-link.js +39 -20
  6. package/es/anchor/src/anchor.js +74 -45
  7. package/es/avatar/src/avatar.js +47 -27
  8. package/es/backtop/src/backtop.js +65 -40
  9. package/es/badge/src/badge.js +32 -16
  10. package/es/breadcrumb/src/breadcrumb-item.js +52 -27
  11. package/es/breadcrumb/src/breadcrumb.js +11 -8
  12. package/es/button/src/button-group.js +24 -18
  13. package/es/button/src/button.js +284 -185
  14. package/es/calendar/src/calendar.js +571 -358
  15. package/es/card/src/card.js +123 -68
  16. package/es/carousel/src/carousel-item.js +14 -7
  17. package/es/carousel/src/carousel.js +174 -112
  18. package/es/cascader/src/cascader.js +526 -380
  19. package/es/checkbox/src/button.js +90 -55
  20. package/es/checkbox/src/checkbox.js +60 -40
  21. package/es/checkbox/src/group.js +34 -26
  22. package/es/collapse/src/collapse-pane.js +33 -16
  23. package/es/collapse/src/collapse.js +133 -79
  24. package/es/color-picker/src/color-picker.js +489 -350
  25. package/es/components.d.ts +3 -1
  26. package/es/components.js +3 -2
  27. package/es/context-menu/src/context-menu.js +190 -110
  28. package/es/countdown/src/countdown.js +91 -59
  29. package/es/date-panel/src/date-panel.js +760 -450
  30. package/es/date-picker/src/date-picker.js +331 -228
  31. package/es/date-range-picker/src/date-range-picker.js +366 -265
  32. package/es/divider/src/divider.js +26 -12
  33. package/es/drawer/src/drawer.js +254 -154
  34. package/es/dynamics/index.js +38 -25
  35. package/es/empty/src/empty.js +53 -29
  36. package/es/form/render/index.js +66 -41
  37. package/es/form/src/form-config-item.js +22 -16
  38. package/es/form/src/form-group.js +23 -14
  39. package/es/form/src/form-item.js +23 -17
  40. package/es/form/src/form.js +139 -95
  41. package/es/form/src/itemInfo.js +2 -1
  42. package/es/form/src/render.js +207 -127
  43. package/es/form/src/util.js +8 -4
  44. package/es/icon/src/icon.js +14 -10
  45. package/es/icon/style.css +1 -1
  46. package/es/icon/style.mini.css +1 -1
  47. package/es/icon-picker/src/icon-picker.js +250 -157
  48. package/es/image/src/group.js +26 -20
  49. package/es/image/src/image.js +33 -32
  50. package/es/image/src/preview.js +182 -122
  51. package/es/image/src/util.js +6 -3
  52. package/es/index.esm.js +9 -8
  53. package/es/index.js +9 -8
  54. package/es/input/src/input.js +820 -507
  55. package/es/layout-aside/src/layout-aside.js +54 -38
  56. package/es/layout-body/src/layout-body.js +39 -27
  57. package/es/layout-container/src/layout-container.js +16 -9
  58. package/es/layout-footer/src/layout-footer.js +16 -7
  59. package/es/layout-header/src/layout-header.js +15 -7
  60. package/es/link/src/link.js +65 -44
  61. package/es/list/src/list.js +453 -333
  62. package/es/loading/index.js +8 -5
  63. package/es/loading/src/loading.js +60 -33
  64. package/es/mention/src/mention.js +2 -1
  65. package/es/menu/src/menu.js +341 -210
  66. package/es/modal/index.js +60 -37
  67. package/es/modal/src/modal.js +303 -205
  68. package/es/notice-bar/src/notice-bar.js +64 -37
  69. package/es/number-input/src/number-input.js +249 -172
  70. package/es/pager/src/pager.js +346 -202
  71. package/es/password-input/src/password-input.js +145 -105
  72. package/es/print/src/page-break.js +2 -1
  73. package/es/print/src/print.js +184 -99
  74. package/es/pulldown/src/pulldown.js +113 -71
  75. package/es/radio/src/button.js +92 -57
  76. package/es/radio/src/group.js +33 -25
  77. package/es/radio/src/radio.js +61 -41
  78. package/es/rate/src/rate.js +48 -36
  79. package/es/result/src/result.js +67 -35
  80. package/es/row/src/col.js +30 -16
  81. package/es/row/src/row.js +21 -14
  82. package/es/scrollbar/src/scrollbar.js +177 -145
  83. package/es/segmented/src/segmented.js +93 -60
  84. package/es/select/src/optgroup.js +7 -3
  85. package/es/select/src/select.js +483 -340
  86. package/es/select/src/util.js +6 -3
  87. package/es/slider/src/slider.js +108 -80
  88. package/es/space/src/space.js +40 -23
  89. package/es/splitter/src/splitter-panel.js +50 -25
  90. package/es/splitter/src/splitter.js +219 -144
  91. package/es/steps/src/steps.js +10 -5
  92. package/es/style.css +1 -1
  93. package/es/style.mini.css +1 -1
  94. package/es/switch/src/switch.js +85 -57
  95. package/es/table-select/src/table-select.js +232 -153
  96. package/es/table-transfer/src/table-transfer.js +10 -5
  97. package/es/tabs/src/tab-pane.js +33 -16
  98. package/es/tabs/src/tabs.js +363 -230
  99. package/es/tag/src/tag.js +61 -43
  100. package/es/text/src/text.js +89 -65
  101. package/es/text-ellipsis/src/text-ellipsis.js +82 -51
  102. package/es/textarea/src/textarea.js +116 -86
  103. package/es/timeline/src/timeline-item.js +2 -1
  104. package/es/timeline/src/timeline.js +2 -1
  105. package/es/tip/src/tip.js +53 -29
  106. package/es/tooltip/src/tooltip.js +114 -74
  107. package/es/tour/src/tour.js +2 -1
  108. package/es/transfer/src/transfer.js +42 -25
  109. package/es/tree/src/tree.js +709 -492
  110. package/es/tree-select/src/tree-select.js +320 -225
  111. package/es/ui/index.d.ts +0 -1
  112. package/es/ui/index.js +46 -3
  113. package/es/ui/src/dom.js +9 -6
  114. package/es/ui/src/log.js +1 -1
  115. package/es/ui/src/utils.d.ts +1 -1
  116. package/es/upload/src/upload.js +614 -398
  117. package/es/vxe-icon/style.css +1 -1
  118. package/es/vxe-icon/style.mini.css +1 -1
  119. package/es/watermark/src/util.js +15 -12
  120. package/es/watermark/src/watermark.js +55 -25
  121. package/lib/alert/src/alert.js +62 -37
  122. package/lib/anchor/src/anchor-link.js +39 -20
  123. package/lib/anchor/src/anchor.js +75 -46
  124. package/lib/avatar/src/avatar.js +52 -32
  125. package/lib/backtop/src/backtop.js +81 -56
  126. package/lib/badge/src/badge.js +35 -19
  127. package/lib/breadcrumb/src/breadcrumb-item.js +52 -27
  128. package/lib/breadcrumb/src/breadcrumb.js +13 -10
  129. package/lib/button/src/button-group.js +27 -21
  130. package/lib/button/src/button.js +306 -207
  131. package/lib/calendar/src/calendar.js +575 -362
  132. package/lib/card/src/card.js +133 -78
  133. package/lib/carousel/src/carousel-item.js +15 -8
  134. package/lib/carousel/src/carousel.js +182 -120
  135. package/lib/cascader/src/cascader.js +555 -409
  136. package/lib/checkbox/src/button.js +93 -58
  137. package/lib/checkbox/src/checkbox.js +63 -43
  138. package/lib/checkbox/src/group.js +37 -29
  139. package/lib/collapse/src/collapse-pane.js +34 -17
  140. package/lib/collapse/src/collapse.js +139 -85
  141. package/lib/color-picker/src/color-picker.js +516 -377
  142. package/lib/components.js +3 -2
  143. package/lib/context-menu/src/context-menu.js +212 -132
  144. package/lib/countdown/src/countdown.js +95 -63
  145. package/lib/date-panel/src/date-panel.js +776 -466
  146. package/lib/date-picker/src/date-picker.js +377 -274
  147. package/lib/date-range-picker/src/date-range-picker.js +401 -300
  148. package/lib/divider/src/divider.js +31 -17
  149. package/lib/drawer/src/drawer.js +255 -155
  150. package/lib/dynamics/index.js +38 -25
  151. package/lib/empty/src/empty.js +55 -31
  152. package/lib/form/render/index.js +68 -43
  153. package/lib/form/src/form-config-item.js +24 -18
  154. package/lib/form/src/form-group.js +25 -16
  155. package/lib/form/src/form-item.js +25 -19
  156. package/lib/form/src/form.js +140 -96
  157. package/lib/form/src/itemInfo.js +4 -3
  158. package/lib/form/src/render.js +214 -134
  159. package/lib/form/src/util.js +9 -5
  160. package/lib/icon/src/icon.js +17 -13
  161. package/lib/icon/style/style.css +1 -1
  162. package/lib/icon/style/style.mini.css +1 -1
  163. package/lib/icon-picker/src/icon-picker.js +251 -158
  164. package/lib/image/src/group.js +26 -20
  165. package/lib/image/src/image.js +41 -40
  166. package/lib/image/src/preview.js +206 -146
  167. package/lib/image/src/util.js +6 -3
  168. package/lib/index.common.js +9 -8
  169. package/lib/index.js +9 -8
  170. package/lib/index.umd.js +15131 -10364
  171. package/lib/index.umd.min.js +3 -3
  172. package/lib/input/src/input.js +878 -565
  173. package/lib/layout-aside/src/layout-aside.js +61 -45
  174. package/lib/layout-body/src/layout-body.js +47 -35
  175. package/lib/layout-container/src/layout-container.js +18 -11
  176. package/lib/layout-footer/src/layout-footer.js +17 -8
  177. package/lib/layout-header/src/layout-header.js +16 -8
  178. package/lib/link/src/link.js +69 -48
  179. package/lib/list/src/list.js +456 -336
  180. package/lib/loading/index.js +8 -5
  181. package/lib/loading/src/loading.js +69 -42
  182. package/lib/mention/src/mention.js +4 -3
  183. package/lib/menu/src/menu.js +351 -220
  184. package/lib/modal/index.js +60 -37
  185. package/lib/modal/src/modal.js +306 -208
  186. package/lib/notice-bar/src/notice-bar.js +70 -43
  187. package/lib/number-input/src/number-input.js +290 -213
  188. package/lib/pager/src/pager.js +347 -203
  189. package/lib/password-input/src/password-input.js +155 -115
  190. package/lib/print/src/page-break.js +3 -2
  191. package/lib/print/src/print.js +193 -108
  192. package/lib/pulldown/src/pulldown.js +128 -86
  193. package/lib/radio/src/button.js +96 -61
  194. package/lib/radio/src/group.js +37 -29
  195. package/lib/radio/src/radio.js +65 -45
  196. package/lib/rate/src/rate.js +50 -38
  197. package/lib/result/src/result.js +68 -36
  198. package/lib/row/src/col.js +32 -18
  199. package/lib/row/src/row.js +25 -18
  200. package/lib/scrollbar/src/scrollbar.js +178 -146
  201. package/lib/segmented/src/segmented.js +97 -64
  202. package/lib/select/src/optgroup.js +7 -3
  203. package/lib/select/src/select.js +486 -343
  204. package/lib/select/src/util.js +6 -3
  205. package/lib/slider/src/slider.js +122 -94
  206. package/lib/space/src/space.js +54 -37
  207. package/lib/splitter/src/splitter-panel.js +51 -26
  208. package/lib/splitter/src/splitter.js +233 -158
  209. package/lib/steps/src/steps.js +11 -6
  210. package/lib/style.css +1 -1
  211. package/lib/style.mini.css +1 -1
  212. package/lib/switch/src/switch.js +87 -59
  213. package/lib/table-select/src/table-select.js +234 -155
  214. package/lib/table-transfer/src/table-transfer.js +12 -7
  215. package/lib/tabs/src/tab-pane.js +34 -17
  216. package/lib/tabs/src/tabs.js +365 -232
  217. package/lib/tag/src/tag.js +67 -49
  218. package/lib/text/src/text.js +100 -76
  219. package/lib/text-ellipsis/src/text-ellipsis.js +86 -55
  220. package/lib/textarea/src/textarea.js +127 -97
  221. package/lib/timeline/src/timeline-item.js +3 -2
  222. package/lib/timeline/src/timeline.js +4 -3
  223. package/lib/tip/src/tip.js +58 -34
  224. package/lib/tooltip/src/tooltip.js +116 -76
  225. package/lib/tour/src/tour.js +4 -3
  226. package/lib/transfer/src/transfer.js +44 -27
  227. package/lib/tree/src/tree.js +717 -500
  228. package/lib/tree-select/src/tree-select.js +351 -256
  229. package/lib/ui/index.js +46 -4
  230. package/lib/ui/src/dom.js +9 -6
  231. package/lib/ui/src/log.js +1 -1
  232. package/lib/upload/src/upload.js +708 -492
  233. package/lib/vxe-icon/style/style.css +1 -1
  234. package/lib/vxe-icon/style/style.mini.css +1 -1
  235. package/lib/watermark/src/util.js +15 -12
  236. package/lib/watermark/src/watermark.js +60 -30
  237. package/package.json +10 -4
  238. package/packages/alert/index.ts +16 -16
  239. package/packages/alert/src/alert.ts +148 -126
  240. package/packages/anchor/index.ts +16 -16
  241. package/packages/anchor/src/anchor-link.ts +139 -121
  242. package/packages/anchor/src/anchor.ts +266 -237
  243. package/packages/anchor/src/util.ts +23 -23
  244. package/packages/anchor-link/index.ts +16 -16
  245. package/packages/avatar/index.ts +16 -16
  246. package/packages/avatar/src/avatar.ts +166 -149
  247. package/packages/backtop/index.ts +16 -16
  248. package/packages/backtop/src/backtop.ts +337 -313
  249. package/packages/badge/index.ts +16 -16
  250. package/packages/badge/src/badge.ts +131 -118
  251. package/packages/breadcrumb/index.ts +16 -16
  252. package/packages/breadcrumb/src/breadcrumb-item.ts +129 -106
  253. package/packages/breadcrumb/src/breadcrumb.ts +94 -92
  254. package/packages/breadcrumb-item/index.ts +16 -16
  255. package/packages/button/index.ts +16 -16
  256. package/packages/button/src/button-group.ts +116 -110
  257. package/packages/button/src/button.ts +975 -855
  258. package/packages/button-group/index.ts +16 -16
  259. package/packages/calendar/index.ts +16 -16
  260. package/packages/calendar/src/calendar.ts +1566 -1352
  261. package/packages/card/index.ts +16 -16
  262. package/packages/card/src/card.ts +285 -236
  263. package/packages/carousel/index.ts +16 -16
  264. package/packages/carousel/src/carousel-item.ts +120 -102
  265. package/packages/carousel/src/carousel.ts +475 -414
  266. package/packages/carousel/src/util.ts +21 -21
  267. package/packages/carousel-item/index.ts +16 -16
  268. package/packages/cascader/index.ts +16 -16
  269. package/packages/cascader/src/cascader.ts +2074 -1896
  270. package/packages/cascader/src/util.ts +9 -9
  271. package/packages/checkbox/index.ts +16 -16
  272. package/packages/checkbox/src/button.ts +267 -221
  273. package/packages/checkbox/src/checkbox.ts +219 -199
  274. package/packages/checkbox/src/group.ts +292 -269
  275. package/packages/checkbox-button/index.ts +16 -16
  276. package/packages/checkbox-group/index.ts +16 -16
  277. package/packages/col/index.ts +16 -16
  278. package/packages/collapse/index.ts +16 -16
  279. package/packages/collapse/src/collapse-pane.ts +142 -114
  280. package/packages/collapse/src/collapse.ts +453 -384
  281. package/packages/collapse/src/util.ts +21 -21
  282. package/packages/collapse-pane/index.ts +16 -16
  283. package/packages/color-picker/index.ts +31 -31
  284. package/packages/color-picker/src/color-picker.ts +1310 -1147
  285. package/packages/color-picker/src/util.ts +436 -423
  286. package/packages/components.ts +350 -349
  287. package/packages/context-menu/index.ts +54 -54
  288. package/packages/context-menu/src/context-menu.ts +773 -681
  289. package/packages/countdown/index.ts +16 -16
  290. package/packages/countdown/src/countdown.ts +295 -262
  291. package/packages/date-panel/index.ts +16 -16
  292. package/packages/date-panel/src/date-panel.ts +2214 -1900
  293. package/packages/date-panel/src/util.ts +354 -326
  294. package/packages/date-picker/index.ts +16 -16
  295. package/packages/date-picker/src/date-picker.ts +1884 -1752
  296. package/packages/date-range-picker/index.ts +16 -16
  297. package/packages/date-range-picker/src/date-range-picker.ts +1728 -1604
  298. package/packages/divider/index.ts +16 -16
  299. package/packages/divider/src/divider.ts +105 -93
  300. package/packages/drawer/index.ts +78 -78
  301. package/packages/drawer/src/drawer.ts +920 -802
  302. package/packages/drawer/src/store.ts +3 -3
  303. package/packages/dynamics/index.ts +124 -117
  304. package/packages/empty/index.ts +16 -16
  305. package/packages/empty/src/empty.ts +124 -103
  306. package/packages/form/index.ts +16 -16
  307. package/packages/form/render/index.ts +646 -614
  308. package/packages/form/src/form-config-item.ts +85 -80
  309. package/packages/form/src/form-group.ts +96 -86
  310. package/packages/form/src/form-item.ts +181 -174
  311. package/packages/form/src/form.ts +1122 -1069
  312. package/packages/form/src/itemInfo.ts +84 -82
  313. package/packages/form/src/render.ts +470 -387
  314. package/packages/form/src/util.ts +98 -93
  315. package/packages/form-gather/index.ts +26 -26
  316. package/packages/form-group/index.ts +16 -16
  317. package/packages/form-item/index.ts +16 -16
  318. package/packages/icon/index.ts +16 -16
  319. package/packages/icon/src/icon.ts +78 -75
  320. package/packages/icon-picker/index.ts +16 -16
  321. package/packages/icon-picker/src/icon-picker.ts +922 -809
  322. package/packages/image/index.ts +16 -16
  323. package/packages/image/src/group.ts +159 -153
  324. package/packages/image/src/image.ts +298 -298
  325. package/packages/image/src/preview.ts +749 -672
  326. package/packages/image/src/util.ts +62 -59
  327. package/packages/image-group/index.ts +16 -16
  328. package/packages/image-preview/index.ts +19 -19
  329. package/packages/index.ts +20 -21
  330. package/packages/input/index.ts +16 -16
  331. package/packages/input/src/input.ts +3201 -2863
  332. package/packages/language/fr-FR.ts +15 -15
  333. package/packages/language/it-IT.ts +4 -4
  334. package/packages/language/uk-UA.ts +1 -1
  335. package/packages/language/uz-UZ.ts +13 -13
  336. package/packages/language/zh-CN.ts +907 -907
  337. package/packages/layout-aside/index.ts +16 -16
  338. package/packages/layout-aside/src/layout-aside.ts +172 -156
  339. package/packages/layout-body/index.ts +16 -16
  340. package/packages/layout-body/src/layout-body.ts +191 -181
  341. package/packages/layout-container/index.ts +16 -16
  342. package/packages/layout-container/src/layout-container.ts +108 -92
  343. package/packages/layout-footer/index.ts +16 -16
  344. package/packages/layout-footer/src/layout-footer.ts +81 -74
  345. package/packages/layout-header/index.ts +16 -16
  346. package/packages/layout-header/src/layout-header.ts +79 -73
  347. package/packages/link/index.ts +16 -16
  348. package/packages/link/src/link.ts +180 -161
  349. package/packages/list/index.ts +16 -16
  350. package/packages/list/src/list.ts +2690 -2564
  351. package/packages/list/src/store.ts +10 -10
  352. package/packages/list/src/util.ts +10 -11
  353. package/packages/loading/index.ts +39 -36
  354. package/packages/loading/src/loading.ts +179 -152
  355. package/packages/mention/index.ts +16 -16
  356. package/packages/mention/src/mention.ts +69 -71
  357. package/packages/menu/index.ts +16 -16
  358. package/packages/menu/src/menu.ts +1000 -857
  359. package/packages/modal/index.ts +164 -141
  360. package/packages/modal/src/modal.ts +1803 -1681
  361. package/packages/modal/src/store.ts +3 -3
  362. package/packages/notice-bar/index.ts +16 -16
  363. package/packages/notice-bar/src/notice-bar.ts +207 -181
  364. package/packages/number-input/index.ts +16 -16
  365. package/packages/number-input/src/number-input.ts +1322 -1242
  366. package/packages/number-input/src/util.ts +25 -25
  367. package/packages/optgroup/index.ts +16 -16
  368. package/packages/option/index.ts +16 -16
  369. package/packages/pager/index.ts +16 -16
  370. package/packages/pager/src/pager.ts +919 -775
  371. package/packages/password-input/index.ts +16 -16
  372. package/packages/password-input/src/password-input.ts +523 -482
  373. package/packages/print/index.ts +18 -18
  374. package/packages/print/src/page-break.ts +104 -92
  375. package/packages/print/src/print.ts +366 -281
  376. package/packages/print/src/util.ts +299 -304
  377. package/packages/print-page-break/index.ts +16 -16
  378. package/packages/pulldown/index.ts +16 -16
  379. package/packages/pulldown/src/pulldown.ts +505 -445
  380. package/packages/radio/index.ts +16 -16
  381. package/packages/radio/src/button.ts +290 -243
  382. package/packages/radio/src/group.ts +275 -252
  383. package/packages/radio/src/radio.ts +237 -218
  384. package/packages/radio-button/index.ts +16 -16
  385. package/packages/radio-group/index.ts +16 -16
  386. package/packages/rate/index.ts +16 -16
  387. package/packages/rate/src/rate.ts +203 -192
  388. package/packages/result/index.ts +16 -16
  389. package/packages/result/src/result.ts +141 -112
  390. package/packages/row/index.ts +16 -16
  391. package/packages/row/src/col.ts +171 -159
  392. package/packages/row/src/row.ts +143 -138
  393. package/packages/scrollbar/index.ts +16 -16
  394. package/packages/scrollbar/src/scrollbar.ts +626 -595
  395. package/packages/segmented/index.ts +16 -16
  396. package/packages/segmented/src/segmented.ts +297 -264
  397. package/packages/select/index.ts +16 -16
  398. package/packages/select/src/optgroup.ts +53 -49
  399. package/packages/select/src/option-info.ts +20 -20
  400. package/packages/select/src/option.ts +47 -47
  401. package/packages/select/src/select.ts +2390 -2214
  402. package/packages/select/src/util.ts +50 -47
  403. package/packages/slider/index.ts +16 -16
  404. package/packages/slider/src/slider.ts +547 -506
  405. package/packages/space/index.ts +16 -16
  406. package/packages/space/src/space.ts +225 -209
  407. package/packages/split/index.ts +16 -16
  408. package/packages/split-pane/index.ts +17 -17
  409. package/packages/splitter/index.ts +16 -16
  410. package/packages/splitter/src/splitter-panel.ts +199 -163
  411. package/packages/splitter/src/splitter.ts +1110 -1020
  412. package/packages/splitter/src/util.ts +21 -21
  413. package/packages/splitter-panel/index.ts +16 -16
  414. package/packages/steps/index.ts +16 -16
  415. package/packages/steps/src/steps.ts +69 -68
  416. package/packages/switch/index.ts +16 -16
  417. package/packages/switch/src/switch.ts +300 -271
  418. package/packages/tab-pane/index.ts +16 -16
  419. package/packages/table-select/index.ts +16 -16
  420. package/packages/table-select/src/table-select.ts +1103 -999
  421. package/packages/table-transfer/index.ts +16 -16
  422. package/packages/table-transfer/src/table-transfer.ts +104 -91
  423. package/packages/tabs/index.ts +16 -16
  424. package/packages/tabs/src/tab-pane.ts +132 -117
  425. package/packages/tabs/src/tabs.ts +1137 -997
  426. package/packages/tabs/src/util.ts +21 -21
  427. package/packages/tag/index.ts +16 -16
  428. package/packages/tag/src/tag.ts +204 -187
  429. package/packages/text/index.ts +16 -16
  430. package/packages/text/src/text.ts +282 -260
  431. package/packages/text-ellipsis/index.ts +16 -16
  432. package/packages/text-ellipsis/src/text-ellipsis.ts +312 -282
  433. package/packages/textarea/index.ts +16 -16
  434. package/packages/textarea/src/textarea.ts +526 -495
  435. package/packages/timeline/index.ts +16 -16
  436. package/packages/timeline/src/timeline-item.ts +65 -67
  437. package/packages/timeline/src/timeline.ts +70 -71
  438. package/packages/timeline-item/index.ts +16 -16
  439. package/packages/tip/index.ts +19 -19
  440. package/packages/tip/src/tip.ts +150 -129
  441. package/packages/tooltip/index.ts +72 -72
  442. package/packages/tooltip/src/tooltip.ts +669 -627
  443. package/packages/tour/index.ts +16 -16
  444. package/packages/tour/src/tour.ts +70 -71
  445. package/packages/transfer/index.ts +16 -16
  446. package/packages/transfer/src/transfer.ts +130 -117
  447. package/packages/tree/index.ts +16 -16
  448. package/packages/tree/src/store.ts +10 -10
  449. package/packages/tree/src/tree.ts +4077 -3852
  450. package/packages/tree/src/util.ts +51 -51
  451. package/packages/tree-select/index.ts +16 -16
  452. package/packages/tree-select/src/tree-select.ts +1217 -1094
  453. package/packages/ui/index.ts +836 -793
  454. package/packages/ui/src/anime.ts +51 -52
  455. package/packages/ui/src/comp.ts +3 -3
  456. package/packages/ui/src/dom.ts +357 -354
  457. package/packages/ui/src/log.ts +19 -19
  458. package/packages/ui/src/utils.ts +79 -79
  459. package/packages/ui/src/vn.ts +39 -39
  460. package/packages/upload/index.ts +20 -20
  461. package/packages/upload/src/upload.ts +2271 -2021
  462. package/packages/upload/src/util.ts +109 -109
  463. package/packages/watermark/index.ts +33 -33
  464. package/packages/watermark/src/util.ts +186 -180
  465. package/packages/watermark/src/watermark.ts +196 -168
  466. package/types/all.d.ts +552 -552
  467. package/types/components/alert.d.ts +83 -87
  468. package/types/components/anchor-link.d.ts +88 -91
  469. package/types/components/anchor.d.ts +97 -104
  470. package/types/components/avatar.d.ts +85 -88
  471. package/types/components/backtop.d.ts +119 -122
  472. package/types/components/badge.d.ts +77 -80
  473. package/types/components/breadcrumb-item.d.ts +77 -80
  474. package/types/components/breadcrumb.d.ts +83 -87
  475. package/types/components/button-group.d.ts +118 -120
  476. package/types/components/button.d.ts +331 -339
  477. package/types/components/calendar.d.ts +247 -264
  478. package/types/components/card.d.ts +111 -113
  479. package/types/components/carousel-item.d.ts +73 -75
  480. package/types/components/carousel.d.ts +130 -134
  481. package/types/components/cascader.d.ts +336 -386
  482. package/types/components/checkbox-button.d.ts +109 -114
  483. package/types/components/checkbox-group.d.ts +152 -154
  484. package/types/components/checkbox.d.ts +123 -128
  485. package/types/components/col.d.ts +77 -80
  486. package/types/components/colgroup.d.ts +64 -69
  487. package/types/components/collapse-pane.d.ts +86 -89
  488. package/types/components/collapse.d.ts +123 -133
  489. package/types/components/color-picker.d.ts +275 -280
  490. package/types/components/column.d.ts +834 -851
  491. package/types/components/context-menu.d.ts +282 -289
  492. package/types/components/countdown.d.ts +108 -112
  493. package/types/components/date-panel.d.ts +319 -331
  494. package/types/components/date-picker.d.ts +361 -384
  495. package/types/components/date-range-picker.d.ts +351 -371
  496. package/types/components/divider.d.ts +72 -75
  497. package/types/components/drawer.d.ts +333 -344
  498. package/types/components/empty.d.ts +75 -78
  499. package/types/components/flow-design.d.ts +73 -85
  500. package/types/components/flow-view.d.ts +73 -85
  501. package/types/components/form-design.d.ts +370 -376
  502. package/types/components/form-gather.d.ts +120 -124
  503. package/types/components/form-group.d.ts +73 -77
  504. package/types/components/form-item.d.ts +395 -413
  505. package/types/components/form-view.d.ts +179 -183
  506. package/types/components/form.d.ts +499 -495
  507. package/types/components/gantt-module/gantt-view.d.ts +195 -200
  508. package/types/components/gantt-module/index.d.ts +1 -1
  509. package/types/components/gantt-plugins/extend-gantt-chart.d.ts +137 -131
  510. package/types/components/gantt-plugins/index.d.ts +1 -1
  511. package/types/components/gantt.d.ts +1248 -1399
  512. package/types/components/grid.d.ts +1289 -1317
  513. package/types/components/icon-picker.d.ts +242 -253
  514. package/types/components/icon.d.ts +332 -87
  515. package/types/components/image-group.d.ts +124 -127
  516. package/types/components/image-preview.d.ts +167 -167
  517. package/types/components/image.d.ts +166 -173
  518. package/types/components/input.d.ts +429 -453
  519. package/types/components/layout-aside.d.ts +123 -123
  520. package/types/components/layout-body.d.ts +110 -113
  521. package/types/components/layout-container.d.ts +73 -75
  522. package/types/components/layout-footer.d.ts +71 -73
  523. package/types/components/layout-header.d.ts +67 -69
  524. package/types/components/link.d.ts +107 -111
  525. package/types/components/list-design.d.ts +189 -190
  526. package/types/components/list-view.d.ts +193 -199
  527. package/types/components/list.d.ts +678 -715
  528. package/types/components/loading.d.ts +98 -103
  529. package/types/components/mention.d.ts +70 -77
  530. package/types/components/menu.d.ts +284 -295
  531. package/types/components/modal.d.ts +567 -584
  532. package/types/components/notice-bar.d.ts +102 -106
  533. package/types/components/number-input.d.ts +359 -365
  534. package/types/components/optgroup.d.ts +85 -88
  535. package/types/components/option.d.ts +94 -103
  536. package/types/components/pager.d.ts +330 -335
  537. package/types/components/password-input.d.ts +143 -156
  538. package/types/components/print-page-break.d.ts +65 -69
  539. package/types/components/print.d.ts +243 -245
  540. package/types/components/pulldown.d.ts +231 -239
  541. package/types/components/radio-button.d.ts +113 -118
  542. package/types/components/radio-group.d.ts +151 -153
  543. package/types/components/radio.d.ts +129 -134
  544. package/types/components/rate.d.ts +83 -88
  545. package/types/components/result.d.ts +81 -84
  546. package/types/components/row.d.ts +77 -81
  547. package/types/components/scrollbar.d.ts +299 -305
  548. package/types/components/segmented.d.ts +119 -123
  549. package/types/components/select.d.ts +598 -616
  550. package/types/components/slider.d.ts +137 -151
  551. package/types/components/space.d.ts +120 -127
  552. package/types/components/split-pane.d.ts +126 -133
  553. package/types/components/split.d.ts +301 -312
  554. package/types/components/splitter-panel.d.ts +123 -130
  555. package/types/components/splitter.d.ts +290 -301
  556. package/types/components/steps.d.ts +63 -68
  557. package/types/components/switch.d.ts +127 -133
  558. package/types/components/tab-pane.d.ts +111 -114
  559. package/types/components/table-module/custom.d.ts +123 -123
  560. package/types/components/table-module/edit.d.ts +297 -276
  561. package/types/components/table-module/export.d.ts +88 -96
  562. package/types/components/table-module/filter.d.ts +144 -144
  563. package/types/components/table-module/index.d.ts +7 -7
  564. package/types/components/table-module/keyboard.d.ts +26 -26
  565. package/types/components/table-module/menu.d.ts +46 -46
  566. package/types/components/table-module/validator.d.ts +53 -53
  567. package/types/components/table-plugins/extend-cell-area.d.ts +781 -781
  568. package/types/components/table-plugins/extend-pivot-table.d.ts +59 -58
  569. package/types/components/table-plugins/filters-combination.d.ts +15 -15
  570. package/types/components/table-plugins/filters-complex-input.d.ts +9 -9
  571. package/types/components/table-plugins/index.d.ts +4 -4
  572. package/types/components/table-select.d.ts +268 -276
  573. package/types/components/table-transfer.d.ts +80 -84
  574. package/types/components/table.d.ts +7530 -8000
  575. package/types/components/tabs.d.ts +314 -352
  576. package/types/components/tag.d.ts +108 -114
  577. package/types/components/text-ellipsis.d.ts +107 -112
  578. package/types/components/text.d.ts +112 -122
  579. package/types/components/textarea.d.ts +261 -275
  580. package/types/components/timeline-item.d.ts +66 -75
  581. package/types/components/timeline.d.ts +70 -77
  582. package/types/components/tip.d.ts +81 -83
  583. package/types/components/toolbar.d.ts +327 -336
  584. package/types/components/tooltip.d.ts +250 -255
  585. package/types/components/tour.d.ts +70 -77
  586. package/types/components/transfer.d.ts +80 -84
  587. package/types/components/tree-select.d.ts +361 -376
  588. package/types/components/tree.d.ts +994 -1036
  589. package/types/components/upload.d.ts +477 -518
  590. package/types/components/watermark.d.ts +116 -120
  591. package/types/handles/form-design.d.ts +50 -50
  592. package/types/handles/index.d.ts +3 -3
  593. package/types/handles/list-design.d.ts +1 -2
  594. package/types/handles/table.d.ts +15 -15
  595. package/types/index.d.ts +8 -8
  596. package/types/ui/commands.d.ts +57 -57
  597. package/types/ui/formats.d.ts +62 -62
  598. package/types/ui/global-config.d.ts +269 -269
  599. package/types/ui/global-icon.d.ts +315 -315
  600. package/types/ui/hooks.d.ts +13 -13
  601. package/types/ui/index.d.ts +100 -100
  602. package/types/ui/interceptor.d.ts +52 -52
  603. package/types/ui/menus.d.ts +89 -89
  604. package/types/ui/renderer.d.ts +1033 -1047
  605. package/types/ui/validators.d.ts +37 -38
  606. /package/dist/{iconfont.1792992046297.ttf → iconfont.1793007755017.ttf} +0 -0
  607. /package/dist/{iconfont.1792992046297.woff → iconfont.1793007755017.woff} +0 -0
  608. /package/dist/{iconfont.1792992046297.woff2 → iconfont.1793007755017.woff2} +0 -0
  609. /package/es/icon/{iconfont.1792992046297.ttf → iconfont.1793007755017.ttf} +0 -0
  610. /package/es/icon/{iconfont.1792992046297.woff → iconfont.1793007755017.woff} +0 -0
  611. /package/es/icon/{iconfont.1792992046297.woff2 → iconfont.1793007755017.woff2} +0 -0
  612. /package/es/{iconfont.1792992046297.ttf → iconfont.1793007755017.ttf} +0 -0
  613. /package/es/{iconfont.1792992046297.woff → iconfont.1793007755017.woff} +0 -0
  614. /package/es/{iconfont.1792992046297.woff2 → iconfont.1793007755017.woff2} +0 -0
  615. /package/es/vxe-icon/{iconfont.1792992046297.ttf → iconfont.1793007755017.ttf} +0 -0
  616. /package/es/vxe-icon/{iconfont.1792992046297.woff → iconfont.1793007755017.woff} +0 -0
  617. /package/es/vxe-icon/{iconfont.1792992046297.woff2 → iconfont.1793007755017.woff2} +0 -0
  618. /package/lib/icon/style/{iconfont.1792992046297.ttf → iconfont.1793007755017.ttf} +0 -0
  619. /package/lib/icon/style/{iconfont.1792992046297.woff → iconfont.1793007755017.woff} +0 -0
  620. /package/lib/icon/style/{iconfont.1792992046297.woff2 → iconfont.1793007755017.woff2} +0 -0
  621. /package/lib/{iconfont.1792992046297.ttf → iconfont.1793007755017.ttf} +0 -0
  622. /package/lib/{iconfont.1792992046297.woff → iconfont.1793007755017.woff} +0 -0
  623. /package/lib/{iconfont.1792992046297.woff2 → iconfont.1793007755017.woff2} +0 -0
  624. /package/lib/vxe-icon/style/{iconfont.1792992046297.ttf → iconfont.1793007755017.ttf} +0 -0
  625. /package/lib/vxe-icon/style/{iconfont.1792992046297.woff → iconfont.1793007755017.woff} +0 -0
  626. /package/lib/vxe-icon/style/{iconfont.1792992046297.woff2 → iconfont.1793007755017.woff2} +0 -0
@@ -1,1604 +1,1728 @@
1
- import { h, Teleport, ref, Ref, computed, provide, reactive, inject, nextTick, watch, PropType, onDeactivated, onUnmounted, onBeforeUnmount } from 'vue'
2
- import { defineVxeComponent } from '../../ui/src/comp'
3
- import XEUtils from 'xe-utils'
4
- import { getConfig, getIcon, getI18n, commands, globalEvents, createEvent, GLOBAL_EVENT_KEYS, useSize, renderEmptyElement } from '../../ui'
5
- import { getFuncText, getLastZIndex, nextZIndex, isEnableConf } from '../../ui/src/utils'
6
- import { updatePanelPlacement, getEventTargetNode, getPopupContainer, toCssUnit } from '../../ui/src/dom'
7
- import { parseDateString, parseDateObj, getRangeDateByCode, handleValueFormat, hasTimestampValueType, hasDateValueType, parseDateValue, getNextMonth, getPrevMonth, getNextYear, getPrevYear } from '../../date-panel/src/util'
8
- import { getSlotVNs } from '../../ui/src/vn'
9
- import { createComponentLog } from '../../ui/src/log'
10
- import VxeDatePanelComponent from '../../date-panel'
11
- import VxeButtonComponent from '../../button'
12
- import VxeButtonGroupComponent from '../../button-group'
13
-
14
- import type { VxeDateRangePickerConstructor, VxeDateRangePickerEmits, DateRangePickerInternalData, DateRangePickerReactData, DateRangePickerMethods, VxeDateRangePickerPropTypes, DateRangePickerPrivateRef, VxeFormConstructor, VxeFormPrivateMethods, VxeFormDefines, ValueOf, VxeModalConstructor, VxeDatePanelPropTypes, VxeDrawerConstructor, VxeModalMethods, VxeDrawerMethods, VxeDatePanelEvents, VxeDateRangePickerDefines, VxeButtonGroupEvents, VxeDatePanelConstructor, VxeCardConstructor, VxeCardPrivateMethods, VxeComponentStyleType } from '../../../types'
15
- import type { VxeTableConstructor, VxeTablePrivateMethods } from '../../../types/components/table'
16
-
17
- const { errLog } = createComponentLog('date-range-picker')
18
-
19
- function createReactData (): DateRangePickerReactData {
20
- return {
21
- initialized: false,
22
- panelIndex: 0,
23
- visiblePanel: false,
24
- isAniVisible: false,
25
- panelStyle: {},
26
- panelPlacement: '',
27
- isActivated: false,
28
- selectStValue: '',
29
- selectEdValue: '',
30
- paneStartVal: [],
31
- paneEndVal: []
32
- }
33
- }
34
-
35
- function createInternalData (): DateRangePickerInternalData {
36
- return {
37
- // selectStatus: false
38
- // hpTimeout: undefined
39
- }
40
- }
41
-
42
- export default defineVxeComponent({
43
- name: 'VxeDateRangePicker',
44
- props: {
45
- modelValue: [String, Number, Date, Array] as PropType<VxeDateRangePickerPropTypes.ModelValue>,
46
- startValue: [String, Number, Date] as PropType<VxeDateRangePickerPropTypes.StartValue>,
47
- endValue: [String, Number, Date] as PropType<VxeDateRangePickerPropTypes.EndValue>,
48
- immediate: {
49
- type: Boolean as PropType<VxeDateRangePickerPropTypes.Immediate>,
50
- default: true
51
- },
52
- width: [Number, String] as PropType<VxeDateRangePickerPropTypes.Width>,
53
- name: String as PropType<VxeDateRangePickerPropTypes.Name>,
54
- type: {
55
- type: String as PropType<VxeDateRangePickerPropTypes.Type>,
56
- default: 'date'
57
- },
58
- clearable: {
59
- type: Boolean as PropType<VxeDateRangePickerPropTypes.Clearable>,
60
- default: () => getConfig().dateRangePicker.clearable
61
- },
62
- linkedPanels: {
63
- type: Boolean as PropType<VxeDateRangePickerPropTypes.LinkedPanels>,
64
- default: () => getConfig().dateRangePicker.linkedPanels
65
- },
66
- readonly: {
67
- type: Boolean as PropType<VxeDateRangePickerPropTypes.Readonly>,
68
- default: null
69
- },
70
- disabled: {
71
- type: Boolean as PropType<VxeDateRangePickerPropTypes.Disabled>,
72
- default: null
73
- },
74
- placeholder: String as PropType<VxeDateRangePickerPropTypes.Placeholder>,
75
- autoComplete: {
76
- type: String as PropType<VxeDateRangePickerPropTypes.AutoComplete>,
77
- default: 'off'
78
- },
79
- form: String as PropType<VxeDateRangePickerPropTypes.Form>,
80
- className: String as PropType<VxeDateRangePickerPropTypes.ClassName>,
81
- inputClassName: {
82
- type: String as PropType<VxeDateRangePickerPropTypes.InputClassName>,
83
- default: () => getConfig().dateRangePicker.inputClassName
84
- },
85
- zIndex: Number as PropType<VxeDateRangePickerPropTypes.ZIndex>,
86
- size: {
87
- type: String as PropType<VxeDateRangePickerPropTypes.Size>,
88
- default: () => getConfig().dateRangePicker.size || getConfig().size
89
- },
90
-
91
- // startDate: {
92
- // type: [String, Number, Date] as PropType<VxeDateRangePickerPropTypes.StartDate>,
93
- // default: () => getConfig().dateRangePicker.startDate
94
- // },
95
- // endDate: {
96
- // type: [String, Number, Date] as PropType<VxeDateRangePickerPropTypes.EndDate>,
97
- // default: () => getConfig().dateRangePicker.endDate
98
- // },
99
- minDate: [String, Number, Date] as PropType<VxeDateRangePickerPropTypes.MinDate>,
100
- maxDate: [String, Number, Date] as PropType<VxeDateRangePickerPropTypes.MaxDate>,
101
- defaultDate: [String, Number, Date, Array] as PropType<VxeDateRangePickerPropTypes.DefaultDate>,
102
- defaultTime: [String, Number, Date, Array] as PropType<VxeDateRangePickerPropTypes.DefaultTime>,
103
- startDay: {
104
- type: [String, Number] as PropType<VxeDateRangePickerPropTypes.StartDay>,
105
- default: () => getConfig().dateRangePicker.startDay
106
- },
107
- labelFormat: String as PropType<VxeDateRangePickerPropTypes.LabelFormat>,
108
- valueFormat: String as PropType<VxeDateRangePickerPropTypes.ValueFormat>,
109
- timeFormat: String as PropType<VxeDateRangePickerPropTypes.TimeFormat>,
110
- valueType: String as PropType<VxeDateRangePickerPropTypes.ValueType>,
111
- editable: {
112
- type: Boolean as PropType<VxeDateRangePickerPropTypes.Editable>,
113
- default: true
114
- },
115
- festivalMethod: Function as PropType<VxeDateRangePickerPropTypes.FestivalMethod>,
116
- disabledMethod: Function as PropType<VxeDateRangePickerPropTypes.DisabledMethod>,
117
- separator: {
118
- type: [String, Number] as PropType<VxeDateRangePickerPropTypes.Separator>,
119
- default: () => getConfig().dateRangePicker.separator
120
- },
121
-
122
- // week
123
- selectDay: {
124
- type: [String, Number] as PropType<VxeDateRangePickerPropTypes.SelectDay>,
125
- default: () => getConfig().dateRangePicker.selectDay
126
- },
127
- showClearButton: {
128
- type: Boolean as PropType<VxeDateRangePickerPropTypes.ShowClearButton>,
129
- default: () => getConfig().dateRangePicker.showClearButton
130
- },
131
- showConfirmButton: {
132
- type: Boolean as PropType<VxeDateRangePickerPropTypes.ShowConfirmButton>,
133
- default: () => getConfig().dateRangePicker.showConfirmButton
134
- },
135
- autoClose: {
136
- type: Boolean as PropType<VxeDateRangePickerPropTypes.AutoClose>,
137
- default: () => getConfig().dateRangePicker.autoClose
138
- },
139
-
140
- prefixIcon: String as PropType<VxeDateRangePickerPropTypes.PrefixIcon>,
141
- suffixIcon: String as PropType<VxeDateRangePickerPropTypes.SuffixIcon>,
142
- /**
143
- * 已废弃,请使用 popupConfig.placement
144
- * @deprecated
145
- */
146
- placement: String as PropType<VxeDateRangePickerPropTypes.Placement>,
147
- /**
148
- * 已废弃,请使用 popupConfig.transfer
149
- * @deprecated
150
- */
151
- transfer: {
152
- type: Boolean as PropType<VxeDateRangePickerPropTypes.Transfer>,
153
- default: null
154
- },
155
-
156
- timeConfig: Object as PropType<VxeDateRangePickerPropTypes.TimeConfig>,
157
- popupConfig: Object as PropType<VxeDateRangePickerPropTypes.PopupConfig>,
158
- shortcutConfig: Object as PropType<VxeDateRangePickerPropTypes.ShortcutConfig>
159
- },
160
- emits: [
161
- 'update:modelValue',
162
- 'update:startValue',
163
- 'update:endValue',
164
- 'input',
165
- 'change',
166
- 'keydown',
167
- 'keyup',
168
- 'click',
169
- 'focus',
170
- 'blur',
171
- 'clear',
172
- 'confirm',
173
- 'prefix-click',
174
- 'suffix-click',
175
- 'date-prev',
176
- 'date-today',
177
- 'date-next',
178
- 'shortcut-click'
179
- ] as VxeDateRangePickerEmits,
180
- setup (props, context) {
181
- const { slots, emit } = context
182
-
183
- const $xeModal = inject<(VxeModalConstructor & VxeModalMethods) | null>('$xeModal', null)
184
- const $xeDrawer = inject<(VxeDrawerConstructor & VxeDrawerMethods) | null>('$xeDrawer', null)
185
- const $xeTable = inject<(VxeTableConstructor & VxeTablePrivateMethods) | null>('$xeTable', null)
186
- const $xeCard = inject<(VxeCardConstructor & VxeCardPrivateMethods) | null>('$xeCard', null)
187
- const $xeForm = inject<(VxeFormConstructor & VxeFormPrivateMethods) | null>('$xeForm', null)
188
- const formItemInfo = inject<VxeFormDefines.ProvideItemInfo | null>('xeFormItemInfo', null)
189
-
190
- const xID = XEUtils.uniqueId()
191
-
192
- const { computeSize } = useSize(props)
193
-
194
- const reactData = reactive(createReactData())
195
- const internalData = createInternalData()
196
-
197
- const defaultFuncProps = {
198
- festivalMethod: getConfig().dateRangePicker.festivalMethod,
199
- disabledMethod: getConfig().dateRangePicker.disabledMethod
200
- }
201
-
202
- const refElem = ref() as Ref<HTMLDivElement>
203
- const refInputTarget = ref() as Ref<HTMLInputElement>
204
- const refInputPanel = ref<HTMLDivElement>()
205
- const refPanelWrapper = ref<HTMLDivElement>()
206
-
207
- const refStartDatePanel = ref<VxeDatePanelConstructor>()
208
- const refEndDatePanel = ref<VxeDatePanelConstructor>()
209
-
210
- const refMaps: DateRangePickerPrivateRef = {
211
- refElem,
212
- refInput: refInputTarget
213
- }
214
-
215
- const $xeDateRangePicker = {
216
- xID,
217
- props,
218
- context,
219
- reactData,
220
- internalData,
221
- getRefMaps: () => refMaps
222
- } as unknown as VxeDateRangePickerConstructor
223
-
224
- let dateRangePickerMethods = {} as DateRangePickerMethods
225
-
226
- const computeBtnTransfer = computed(() => {
227
- const { transfer } = props
228
- const popupOpts = computePopupOpts.value
229
- if (XEUtils.isBoolean(popupOpts.transfer)) {
230
- return popupOpts.transfer
231
- }
232
- if (transfer === null) {
233
- const globalTransfer = getConfig().dateRangePicker.transfer
234
- if (XEUtils.isBoolean(globalTransfer)) {
235
- return globalTransfer
236
- }
237
- if ($xeTable || $xeModal || $xeDrawer || $xeCard || $xeForm) {
238
- return true
239
- }
240
- }
241
- return transfer
242
- })
243
-
244
- const computeFormReadonly = computed(() => {
245
- const { readonly } = props
246
- if (readonly === null) {
247
- if ($xeForm) {
248
- return $xeForm.props.readonly
249
- }
250
- return false
251
- }
252
- return readonly
253
- })
254
-
255
- const computeIsDisabled = computed(() => {
256
- const { disabled } = props
257
- if (disabled === null) {
258
- if ($xeForm) {
259
- return $xeForm.props.disabled
260
- }
261
- return false
262
- }
263
- return disabled
264
- })
265
-
266
- const computeDefaultDates = computed(() => {
267
- const { defaultDate } = props
268
- if (defaultDate) {
269
- if (XEUtils.isArray(defaultDate)) {
270
- return defaultDate
271
- }
272
- if (`${defaultDate}`.indexOf(',') > -1) {
273
- return `${defaultDate}`.split(',')
274
- }
275
- return [defaultDate, defaultDate]
276
- }
277
- return []
278
- })
279
-
280
- const computeDefaultTimes = computed(() => {
281
- const { defaultTime } = props
282
- if (defaultTime) {
283
- if (XEUtils.isArray(defaultTime)) {
284
- return defaultTime
285
- }
286
- if (`${defaultTime}`.indexOf(',') > -1) {
287
- return `${defaultTime}`.split(',')
288
- }
289
- return [defaultTime, defaultTime]
290
- }
291
- return []
292
- })
293
-
294
- const computeCurrStyle = computed(() => {
295
- const { width } = props
296
- const stys: VxeComponentStyleType = {}
297
- if (width) {
298
- stys.width = toCssUnit(width)
299
- }
300
- return stys
301
- })
302
-
303
- const computeMVal = computed(() => {
304
- const { startValue, endValue } = props
305
- return `${startValue || ''}${endValue || ''}`
306
- })
307
-
308
- const computeIsTimeType = computed(() => {
309
- const { type } = props
310
- return type === 'time'
311
- })
312
-
313
- const computeIsTimeOrDateTimeType = computed(() => {
314
- const { type } = props
315
- const isTimeType = computeIsTimeType.value
316
- return isTimeType || type === 'datetime'
317
- })
318
-
319
- const computeIsDatePickerType = computed(() => {
320
- return ['date', 'week', 'month', 'quarter', 'year'].indexOf(props.type) > -1
321
- })
322
-
323
- const computeIsClearable = computed(() => {
324
- return props.clearable
325
- })
326
-
327
- const computeInpPlaceholder = computed(() => {
328
- const { placeholder } = props
329
- if (placeholder) {
330
- return getFuncText(placeholder)
331
- }
332
- const globalPlaceholder = getConfig().dateRangePicker.placeholder
333
- if (globalPlaceholder) {
334
- return getFuncText(globalPlaceholder)
335
- }
336
- return getI18n('vxe.dateRangePicker.pleaseRange')
337
- })
338
-
339
- const computeInpImmediate = computed(() => {
340
- const { immediate } = props
341
- return immediate
342
- })
343
-
344
- const computeTimeOpts = computed(() => {
345
- return Object.assign({}, getConfig().dateRangePicker.timeConfig, props.timeConfig)
346
- })
347
-
348
- const computePopupOpts = computed(() => {
349
- return Object.assign({}, getConfig().dateRangePicker.popupConfig, props.popupConfig)
350
- })
351
-
352
- const computeShortcutOpts = computed(() => {
353
- return Object.assign({}, getConfig().dateRangePicker.shortcutConfig, props.shortcutConfig)
354
- })
355
-
356
- const computeShortcutList = computed(() => {
357
- const shortcutOpts = computeShortcutOpts.value
358
- const { options } = shortcutOpts
359
- if (options) {
360
- return options.map((option, index) => {
361
- return Object.assign({
362
- name: `${option.name || option.code || index}`
363
- }, option)
364
- })
365
- }
366
- return []
367
- })
368
-
369
- const computeDateLabelFormat = computed(() => {
370
- const { labelFormat } = props
371
- return labelFormat || getI18n(`vxe.input.date.labelFormat.${props.type}`)
372
- })
373
-
374
- const computeDateValueFormat = computed(() => {
375
- const { type, valueFormat } = props
376
- return handleValueFormat(type, valueFormat)
377
- })
378
-
379
- const computeFirstDayOfWeek = computed(() => {
380
- const { startDay } = props
381
- return XEUtils.toNumber(startDay) as VxeDateRangePickerPropTypes.StartDay
382
- })
383
-
384
- const computePanelLabelObj = computed(() => {
385
- const { selectStValue, selectEdValue } = reactData
386
- const vals: string[] = selectStValue || selectEdValue ? [selectStValue || '', selectEdValue || ''] : []
387
- return formatRangeLabel(vals)
388
- })
389
-
390
- const computeInputLabel = computed(() => {
391
- const panelLabelObj = computePanelLabelObj.value
392
- return panelLabelObj.label
393
- })
394
-
395
- const formatRangeLabel = (vals: string[]) => {
396
- const { type, separator } = props
397
- const dateLabelFormat = computeDateLabelFormat.value
398
- const dateValueFormat = computeDateValueFormat.value
399
- const firstDayOfWeek = computeFirstDayOfWeek.value
400
- const startRest = vals[0]
401
- ? parseDateObj(vals[0], type, {
402
- valueFormat: dateValueFormat,
403
- labelFormat: dateLabelFormat,
404
- firstDay: firstDayOfWeek
405
- })
406
- : null
407
- const endRest = vals[1]
408
- ? parseDateObj(vals[1], type, {
409
- valueFormat: dateValueFormat,
410
- labelFormat: dateLabelFormat,
411
- firstDay: firstDayOfWeek
412
- })
413
- : null
414
- const startLabel = startRest ? startRest.label : ''
415
- const endLabel = endRest ? endRest.label : ''
416
- return {
417
- label: (startLabel || endLabel ? [startLabel, endLabel] : []).join(`${separator || ' ~ '}`),
418
- startLabel,
419
- endLabel
420
- }
421
- }
422
-
423
- const getRangeValue = (sValue: string | number | Date | null, eValue: string | number | Date | null) => {
424
- const { modelValue, valueType, valueFormat } = props
425
- let isArr = valueFormat === 'date' || XEUtils.isArray(modelValue)
426
- if (valueType) {
427
- switch (valueType) {
428
- case 'array':
429
- isArr = true
430
- break
431
- case 'string':
432
- isArr = false
433
- break
434
- }
435
- }
436
- if (sValue || eValue) {
437
- const rest = [sValue || null, eValue || null]
438
- if (isArr) {
439
- return rest
440
- }
441
- return rest.join(',')
442
- }
443
- return isArr ? [] : ''
444
- }
445
-
446
- const paraeUpdateModel = () => {
447
- const { type, modelValue } = props
448
- const dateValueFormat = computeDateValueFormat.value
449
- let sValue: string | Date | null = ''
450
- let eValue: string | Date | null = ''
451
- if (XEUtils.isArray(modelValue)) {
452
- const date1 = parseDateString(modelValue[0], type, { valueFormat: dateValueFormat })
453
- const date2 = parseDateString(modelValue[1], type, { valueFormat: dateValueFormat })
454
- if (date1 || date2) {
455
- sValue = date1 || ''
456
- eValue = date2 || ''
457
- }
458
- } else if (XEUtils.isString(modelValue)) {
459
- const strArr = modelValue.split(',')
460
- if (strArr[0] || strArr[1]) {
461
- sValue = strArr[0] || ''
462
- eValue = strArr[1] || ''
463
- }
464
- }
465
- return {
466
- sValue,
467
- eValue
468
- }
469
- }
470
-
471
- const parseUpdateData = () => {
472
- const { type, startValue, endValue } = props
473
- const dateValueFormat = computeDateValueFormat.value
474
- let sValue: string | Date | null = ''
475
- let eValue: string | Date | null = ''
476
- sValue = parseDateString(startValue, type, { valueFormat: dateValueFormat })
477
- eValue = parseDateString(endValue, type, { valueFormat: dateValueFormat })
478
- return {
479
- sValue,
480
- eValue
481
- }
482
- }
483
-
484
- const updateModelValue = (isModel: boolean) => {
485
- const { modelValue, startValue, endValue, valueFormat } = props
486
- let restObj: {
487
- sValue: string | Date | null
488
- eValue: string | Date | null
489
- } = {
490
- sValue: '',
491
- eValue: ''
492
- }
493
- if (isModel) {
494
- if (modelValue) {
495
- restObj = paraeUpdateModel()
496
- } else {
497
- restObj = parseUpdateData()
498
- }
499
- } else {
500
- if (startValue || endValue) {
501
- restObj = parseUpdateData()
502
- } else {
503
- restObj = paraeUpdateModel()
504
- }
505
- }
506
- let startRest: string | number | Date | null = restObj.sValue
507
- let endRest: string | number | Date | null = restObj.eValue
508
- if (valueFormat === 'timestamp') {
509
- if (XEUtils.isString(startRest) && /^\d+$/.test(startRest)) {
510
- startRest = Number(startRest)
511
- }
512
- if (XEUtils.isString(endRest) && /^\d+$/.test(endRest)) {
513
- endRest = Number(endRest)
514
- }
515
- }
516
- reactData.selectStValue = startRest
517
- reactData.selectEdValue = endRest
518
- reactData.paneEndVal = [startRest, endRest]
519
- reactData.paneStartVal = [startRest, endRest]
520
- }
521
-
522
- const triggerEvent = (evnt: Event & { type: 'input' | 'change' | 'keydown' | 'keyup' | 'click' | 'focus' | 'blur' }) => {
523
- const { selectStValue, selectEdValue } = reactData
524
- const value = getRangeValue(selectStValue, selectEdValue)
525
- dispatchEvent(evnt.type, { value, startValue: selectStValue, endValue: selectEdValue }, evnt)
526
- }
527
-
528
- const handleChange = (sValue: string, eValue: string, evnt: Event | { type: string }) => {
529
- const { type, modelValue, valueFormat } = props
530
- const dateValueFormat = computeDateValueFormat.value
531
- let startRest: string | number | Date | null = sValue
532
- let endRest: string | number | Date | null = eValue
533
- if (hasTimestampValueType(valueFormat)) {
534
- if (startRest) {
535
- const dateVal = parseDateValue(startRest, type, { valueFormat: dateValueFormat })
536
- startRest = dateVal ? dateVal.getTime() : null
537
- }
538
- if (endRest) {
539
- const dateVal = parseDateValue(endRest, type, { valueFormat: dateValueFormat })
540
- endRest = dateVal ? dateVal.getTime() : null
541
- }
542
- } else if (hasDateValueType(valueFormat)) {
543
- if (startRest) {
544
- startRest = parseDateValue(startRest, type, { valueFormat: dateValueFormat })
545
- }
546
- if (endRest) {
547
- endRest = parseDateValue(endRest, type, { valueFormat: dateValueFormat })
548
- }
549
- }
550
- reactData.selectStValue = startRest
551
- reactData.selectEdValue = endRest
552
- const value = getRangeValue(startRest, endRest)
553
- const isFinish = (startRest && endRest) || (!startRest && !endRest)
554
- emitModel(value)
555
- emit('update:startValue', startRest || '')
556
- emit('update:endValue', endRest || '')
557
- if (XEUtils.toValueString(modelValue) !== value) {
558
- dispatchEvent('change', { value, startValue: startRest, endValue: endRest, isFinish }, evnt as any)
559
- // 自动更新校验状态
560
- if ($xeForm && formItemInfo) {
561
- $xeForm.triggerItemEvent(evnt, formItemInfo.itemConfig.field, value)
562
- }
563
- }
564
- }
565
-
566
- const changeEvent = (evnt: Event & { type: 'change' }) => {
567
- const inpImmediate = computeInpImmediate.value
568
- if (!inpImmediate) {
569
- triggerEvent(evnt)
570
- }
571
- }
572
-
573
- const focusEvent = (evnt: Event & { type: 'focus' }) => {
574
- const popupOpts = computePopupOpts.value
575
- const { trigger } = popupOpts
576
- reactData.isActivated = true
577
- if (!trigger || trigger === 'default') {
578
- dateRangePickerOpenEvent(evnt)
579
- } else if (trigger === 'icon') {
580
- hidePanel()
581
- }
582
- triggerEvent(evnt)
583
- }
584
-
585
- const clickPrefixEvent = (evnt: Event) => {
586
- const isDisabled = computeIsDisabled.value
587
- if (!isDisabled) {
588
- const { selectStValue, selectEdValue } = reactData
589
- const value = getRangeValue(selectStValue, selectEdValue)
590
- dispatchEvent('prefix-click', { value, startValue: selectStValue, endValue: selectEdValue }, evnt)
591
- }
592
- }
593
-
594
- const hidePanel = () => {
595
- return new Promise<void>(resolve => {
596
- reactData.visiblePanel = false
597
- internalData.hpTimeout = setTimeout(() => {
598
- reactData.isAniVisible = false
599
- resolve()
600
- }, 350)
601
- })
602
- }
603
-
604
- const clearValueEvent = (evnt: Event, value: VxeDateRangePickerPropTypes.ModelValue) => {
605
- const isDatePickerType = computeIsDatePickerType.value
606
- if (isDatePickerType) {
607
- hidePanel()
608
- }
609
- const startValue = ''
610
- const endValue = ''
611
- handleChange(startValue, endValue, evnt)
612
- dispatchEvent('clear', { value, startValue, endValue }, evnt)
613
- }
614
-
615
- const checkValue = () => {
616
- const $startDatePanel = refStartDatePanel.value
617
- const $endDatePanel = refEndDatePanel.value
618
- if ($startDatePanel && $endDatePanel) {
619
- const startValue = $startDatePanel.getModelValue()
620
- const endValue = $endDatePanel.getModelValue()
621
- if (!startValue || !endValue) {
622
- handleChange('', '', { type: 'check' })
623
- }
624
- }
625
- }
626
-
627
- const panelCellClassName: VxeDatePanelPropTypes.CellClassName = ({ date }) => {
628
- const startValue = reactData.selectStValue
629
- const endValue = reactData.selectEdValue
630
- if (startValue && endValue) {
631
- const currTime = date.getTime()
632
- const startTime = XEUtils.toStringDate(startValue).getTime()
633
- const endTime = XEUtils.toStringDate(endValue).getTime()
634
- if (currTime >= startTime && currTime <= endTime) {
635
- return 'is--range-selected'
636
- }
637
- }
638
- return ''
639
- }
640
-
641
- const handleSelectClose = () => {
642
- const { autoClose } = props
643
- const { selectStValue, selectEdValue } = reactData
644
- const { selectStatus } = internalData
645
- const isDatePickerType = computeIsDatePickerType.value
646
- if (autoClose) {
647
- if (selectStatus && isDatePickerType) {
648
- if (selectStValue && selectEdValue) {
649
- hidePanel()
650
- }
651
- }
652
- } else {
653
- if (selectStValue && selectEdValue) {
654
- internalData.selectStatus = false
655
- }
656
- }
657
- }
658
-
659
- const clickSuffixEvent = (evnt: Event) => {
660
- const isDisabled = computeIsDisabled.value
661
- if (!isDisabled) {
662
- const { selectStValue, selectEdValue } = reactData
663
- const value = getRangeValue(selectStValue, selectEdValue)
664
- dispatchEvent('suffix-click', { value, startValue: selectStValue, endValue: selectEdValue }, evnt)
665
- }
666
- }
667
-
668
- const blurEvent = (evnt: Event & { type: 'blur' }) => {
669
- const { selectStValue, selectEdValue } = reactData
670
- const inpImmediate = computeInpImmediate.value
671
- const value = ''
672
- if (!inpImmediate) {
673
- handleChange(selectStValue, selectEdValue, evnt)
674
- }
675
- if (!reactData.visiblePanel) {
676
- reactData.isActivated = false
677
- checkValue()
678
- }
679
- dispatchEvent('blur', { value, startValue: selectStValue, endValue: selectEdValue }, evnt)
680
- // 自动更新校验状态
681
- if ($xeForm && formItemInfo) {
682
- $xeForm.triggerItemEvent(evnt, formItemInfo.itemConfig.field, value)
683
- }
684
- }
685
-
686
- const keydownEvent = (evnt: KeyboardEvent & { type: 'keydown' }) => {
687
- triggerEvent(evnt)
688
- }
689
-
690
- const keyupEvent = (evnt: KeyboardEvent & { type: 'keyup' }) => {
691
- triggerEvent(evnt)
692
- }
693
-
694
- const confirmEvent = (evnt: MouseEvent) => {
695
- const isTimeType = computeIsTimeType.value
696
- const $startDatePanel = refStartDatePanel.value
697
- const $endDatePanel = refEndDatePanel.value
698
- if ($startDatePanel && $endDatePanel) {
699
- const startValue = $startDatePanel.getModelValue()
700
- const endValue = $endDatePanel.getModelValue()
701
- if (isTimeType) {
702
- $startDatePanel.confirmByEvent(evnt)
703
- $endDatePanel.confirmByEvent(evnt)
704
- } else if ((startValue && !endValue) || (!startValue && endValue)) {
705
- handleChange('', '', evnt)
706
- } else {
707
- $startDatePanel.confirmByEvent(evnt)
708
- $endDatePanel.confirmByEvent(evnt)
709
- }
710
- const value = getRangeValue(startValue, endValue)
711
- dispatchEvent('confirm', { value, startValue, endValue }, evnt)
712
- }
713
- hidePanel()
714
- }
715
-
716
- const startPanelChangeEvent = (params: any) => {
717
- const { paneStartVal } = reactData
718
- const { selectStatus } = internalData
719
- const { value, currValue, $event } = params
720
- const paneVals = value ? (XEUtils.isString(value) ? value.split(',') : [value]) : []
721
- let startValue = ''
722
- let endValue = ''
723
- if (selectStatus) {
724
- // 如果选择同一天
725
- if (!value && currValue === paneStartVal[0]) {
726
- startValue = currValue
727
- endValue = currValue
728
- } else {
729
- startValue = paneVals[0]
730
- if (paneVals[1]) {
731
- endValue = paneVals[1]
732
- } else {
733
- endValue = reactData.selectEdValue
734
- }
735
- }
736
- } else {
737
- startValue = currValue || XEUtils.last(paneVals)
738
- }
739
- reactData.paneEndVal = [startValue, endValue]
740
- reactData.paneStartVal = [startValue, endValue]
741
- handleChange(startValue, endValue, $event)
742
- handleSelectClose()
743
- if (selectStatus) {
744
- if (startValue && endValue) {
745
- internalData.selectStatus = false
746
- }
747
- } else {
748
- internalData.selectStatus = true
749
- }
750
- nextTick(() => {
751
- handleUpdateStartPanelDate()
752
- })
753
- }
754
-
755
- const endPanelChangeEvent = (params: any) => {
756
- const { paneEndVal } = reactData
757
- const { selectStatus } = internalData
758
- const { value, currValue, $event } = params
759
- const paneVals = value ? (XEUtils.isString(value) ? value.split(',') : [value]) : []
760
- let startValue = ''
761
- let endValue = ''
762
- if (selectStatus) {
763
- // 如果选择同一天
764
- if (!value && currValue === paneEndVal[1]) {
765
- startValue = currValue
766
- endValue = currValue
767
- } else {
768
- endValue = paneVals[0]
769
- if (paneVals[1]) {
770
- startValue = paneVals[0]
771
- endValue = paneVals[1]
772
- } else {
773
- startValue = reactData.selectStValue
774
- }
775
- }
776
- } else {
777
- endValue = currValue || XEUtils.last(paneVals)
778
- }
779
- reactData.paneEndVal = [startValue, endValue]
780
- reactData.paneStartVal = [startValue, endValue]
781
- handleChange(startValue, endValue, $event)
782
- handleSelectClose()
783
- if (selectStatus) {
784
- if (startValue && endValue) {
785
- internalData.selectStatus = false
786
- }
787
- } else {
788
- internalData.selectStatus = true
789
- }
790
- nextTick(() => {
791
- handleUpdateEndPanelDate()
792
- })
793
- }
794
-
795
- const handleUpdateStartPanelDate = () => {
796
- const $startDatePanel = refStartDatePanel.value
797
- const $endDatePanel = refEndDatePanel.value
798
- if (!$startDatePanel || !$endDatePanel) {
799
- return
800
- }
801
- const startPanelDate = $startDatePanel.getPanelDate()
802
- const endPanelDate = $endDatePanel.getPanelDate()
803
- if (!startPanelDate || !endPanelDate) {
804
- return
805
- }
806
- const viewType = $startDatePanel.getViewType()
807
- const startYear = startPanelDate.getFullYear()
808
- const startMonth = startPanelDate.getMonth()
809
- const endYear = endPanelDate.getFullYear()
810
- const endMonth = endPanelDate.getMonth()
811
- switch (viewType) {
812
- case 'day':
813
- case 'date':
814
- case 'week': {
815
- if (endYear <= startYear && endMonth <= startMonth) {
816
- $endDatePanel.setPanelDate(getNextMonth(startPanelDate))
817
- }
818
- break
819
- }
820
- case 'month':
821
- case 'quarter': {
822
- if (endYear <= startYear) {
823
- $endDatePanel.setPanelDate(getNextYear(startPanelDate))
824
- }
825
- break
826
- }
827
- case 'year': {
828
- const { computeYearList } = $startDatePanel.getComputeMaps()
829
- const yearList = computeYearList.value
830
- if (yearList.some((item) => XEUtils.isDateSame(item.date, endPanelDate, 'yyyy'))) {
831
- $endDatePanel.setPanelDate(getNextYear(startPanelDate, yearList.length))
832
- }
833
- break
834
- }
835
- }
836
- }
837
-
838
- const startPanelDateBtnChangeEvent: VxeDatePanelEvents.DateToday = () => {
839
- const { linkedPanels } = props
840
- const $startDatePanel = refStartDatePanel.value
841
- const $endDatePanel = refEndDatePanel.value
842
- if (!$startDatePanel || !$endDatePanel) {
843
- return
844
- }
845
- const startPanelDate = $startDatePanel.getPanelDate()
846
- const endPanelDate = $endDatePanel.getPanelDate()
847
- if (!startPanelDate || !endPanelDate) {
848
- return
849
- }
850
- const viewType = $startDatePanel.getViewType()
851
- if (linkedPanels) {
852
- switch (viewType) {
853
- case 'day':
854
- case 'date':
855
- case 'week': {
856
- $endDatePanel.setPanelDate(getNextMonth(startPanelDate))
857
- break
858
- }
859
- case 'month':
860
- case 'quarter': {
861
- $endDatePanel.setPanelDate(getNextYear(startPanelDate))
862
- break
863
- }
864
- case 'year': {
865
- const { computeYearList } = $startDatePanel.getComputeMaps()
866
- const yearList = computeYearList.value
867
- $endDatePanel.setPanelDate(getNextYear(startPanelDate, yearList.length))
868
- break
869
- }
870
- }
871
- } else {
872
- handleUpdateStartPanelDate()
873
- }
874
- }
875
-
876
- const handleUpdateEndPanelDate = () => {
877
- const $startDatePanel = refStartDatePanel.value
878
- const $endDatePanel = refEndDatePanel.value
879
- if (!$startDatePanel || !$endDatePanel) {
880
- return
881
- }
882
- const startPanelDate = $startDatePanel.getPanelDate()
883
- const endPanelDate = $endDatePanel.getPanelDate()
884
- if (!startPanelDate || !endPanelDate) {
885
- return
886
- }
887
- const viewType = $endDatePanel.getViewType()
888
- const startYear = startPanelDate.getFullYear()
889
- const startMonth = startPanelDate.getMonth()
890
- const endYear = endPanelDate.getFullYear()
891
- const endMonth = endPanelDate.getMonth()
892
- switch (viewType) {
893
- case 'day':
894
- case 'date':
895
- case 'week': {
896
- if (startYear >= endYear && startMonth >= endMonth) {
897
- $startDatePanel.setPanelDate(getPrevMonth(endPanelDate))
898
- }
899
- break
900
- }
901
- case 'month':
902
- case 'quarter': {
903
- if (startYear >= endYear) {
904
- $startDatePanel.setPanelDate(getPrevYear(endPanelDate))
905
- }
906
- break
907
- }
908
- case 'year': {
909
- const { computeYearList } = $endDatePanel.getComputeMaps()
910
- const yearList = computeYearList.value
911
- if (yearList.some((item) => XEUtils.isDateSame(item.date, startPanelDate, 'yyyy'))) {
912
- $startDatePanel.setPanelDate(getPrevYear(endPanelDate, yearList.length))
913
- }
914
- break
915
- }
916
- }
917
- }
918
-
919
- const endPanelDateBtnChangeEvent: VxeDatePanelEvents.DateToday = () => {
920
- const { linkedPanels } = props
921
- const $startDatePanel = refStartDatePanel.value
922
- const $endDatePanel = refEndDatePanel.value
923
- if (!$startDatePanel || !$endDatePanel) {
924
- return
925
- }
926
- const startPanelDate = $startDatePanel.getPanelDate()
927
- const endPanelDate = $endDatePanel.getPanelDate()
928
- if (!startPanelDate || !endPanelDate) {
929
- return
930
- }
931
- const viewType = $endDatePanel.getViewType()
932
- if (linkedPanels) {
933
- switch (viewType) {
934
- case 'day':
935
- case 'date':
936
- case 'week': {
937
- $startDatePanel.setPanelDate(getPrevMonth(endPanelDate))
938
- break
939
- }
940
- case 'month':
941
- case 'quarter': {
942
- $startDatePanel.setPanelDate(getPrevYear(endPanelDate))
943
- break
944
- }
945
- case 'year': {
946
- const { computeYearList } = $endDatePanel.getComputeMaps()
947
- const yearList = computeYearList.value
948
- $startDatePanel.setPanelDate(getPrevYear(endPanelDate, yearList.length))
949
- break
950
- }
951
- }
952
- } else {
953
- handleUpdateEndPanelDate()
954
- }
955
- }
956
-
957
- // 全局事件
958
- const handleGlobalMousedownEvent = (evnt: Event) => {
959
- const { visiblePanel, isActivated } = reactData
960
- const el = refElem.value
961
- const panelWrapperElem = refPanelWrapper.value
962
- const isDisabled = computeIsDisabled.value
963
- if (!isDisabled && isActivated) {
964
- reactData.isActivated = getEventTargetNode(evnt, el).flag || getEventTargetNode(evnt, panelWrapperElem).flag
965
- if (!reactData.isActivated) {
966
- if (visiblePanel) {
967
- checkValue()
968
- hidePanel()
969
- }
970
- }
971
- }
972
- }
973
-
974
- const handleGlobalKeydownEvent = (evnt: KeyboardEvent) => {
975
- const { visiblePanel } = reactData
976
- const isDisabled = computeIsDisabled.value
977
- if (!isDisabled) {
978
- const isTab = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.TAB)
979
- const isEsc = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ESCAPE)
980
- if (isTab) {
981
- reactData.isActivated = false
982
- }
983
- if (visiblePanel) {
984
- if (isEsc || isTab) {
985
- checkValue()
986
- hidePanel()
987
- }
988
- }
989
- }
990
- }
991
-
992
- const handleGlobalBlurEvent = () => {
993
- const { visiblePanel, isActivated } = reactData
994
- if (visiblePanel) {
995
- checkValue()
996
- hidePanel()
997
- }
998
- if (isActivated) {
999
- reactData.isActivated = false
1000
- }
1001
- if (visiblePanel || isActivated) {
1002
- const targetElem = refInputTarget.value
1003
- if (targetElem) {
1004
- targetElem.blur()
1005
- }
1006
- }
1007
- }
1008
-
1009
- const handleGlobalResizeEvent = () => {
1010
- const { visiblePanel } = reactData
1011
- if (visiblePanel) {
1012
- updatePlacement()
1013
- }
1014
- }
1015
-
1016
- const handleGlobalScrollEvent = () => {
1017
- const { visiblePanel } = reactData
1018
- if (visiblePanel) {
1019
- updatePlacement()
1020
- }
1021
- }
1022
-
1023
- // 弹出面板
1024
- const updateZindex = () => {
1025
- const popupOpts = computePopupOpts.value
1026
- const customZIndex = popupOpts.zIndex || props.zIndex
1027
- if (customZIndex) {
1028
- reactData.panelIndex = XEUtils.toNumber(customZIndex)
1029
- } else if (reactData.panelIndex < getLastZIndex()) {
1030
- reactData.panelIndex = nextZIndex()
1031
- }
1032
- }
1033
-
1034
- const updatePlacement = () => {
1035
- const { placement } = props
1036
- const { panelIndex } = reactData
1037
- const targetElem = refInputTarget.value
1038
- const panelElem = refInputPanel.value
1039
- if (!panelElem) {
1040
- return nextTick()
1041
- }
1042
- const btnTransfer = computeBtnTransfer.value
1043
- const popupOpts = computePopupOpts.value
1044
- const handleStyle = () => {
1045
- const ppObj = updatePanelPlacement(targetElem, panelElem, {
1046
- placement: popupOpts.placement || placement,
1047
- defaultPlacement: popupOpts.defaultPlacement,
1048
- appendTo: popupOpts.appendTo,
1049
- teleportTo: btnTransfer
1050
- })
1051
- const panelStyle: { [key: string]: string | number } = Object.assign(ppObj.style, {
1052
- zIndex: panelIndex
1053
- })
1054
- reactData.panelStyle = panelStyle
1055
- reactData.panelPlacement = ppObj.placement
1056
- }
1057
- handleStyle()
1058
- return nextTick().then(handleStyle)
1059
- }
1060
-
1061
- const showPanel = () => {
1062
- const { visiblePanel } = reactData
1063
- const isDisabled = computeIsDisabled.value
1064
- if (!isDisabled && !visiblePanel) {
1065
- if (!reactData.initialized) {
1066
- reactData.initialized = true
1067
- }
1068
- if (internalData.hpTimeout) {
1069
- clearTimeout(internalData.hpTimeout)
1070
- internalData.hpTimeout = undefined
1071
- }
1072
- internalData.selectStatus = false
1073
- reactData.isActivated = true
1074
- reactData.isAniVisible = true
1075
- setTimeout(() => {
1076
- reactData.visiblePanel = true
1077
- handleUpdateStartPanelDate()
1078
- updatePlacement()
1079
- }, 10)
1080
- updateZindex()
1081
- return updatePlacement()
1082
- }
1083
- return nextTick()
1084
- }
1085
-
1086
- const dateRangePickerOpenEvent = (evnt: Event) => {
1087
- const formReadonly = computeFormReadonly.value
1088
- if (!formReadonly) {
1089
- evnt.preventDefault()
1090
- showPanel()
1091
- }
1092
- }
1093
-
1094
- const clickIconEvent = (evnt: MouseEvent) => {
1095
- const { visiblePanel } = reactData
1096
- const popupOpts = computePopupOpts.value
1097
- const { trigger } = popupOpts
1098
- if (!trigger || trigger === 'default' || trigger === 'icon') {
1099
- if (visiblePanel) {
1100
- hidePanel()
1101
- } else {
1102
- dateRangePickerOpenEvent(evnt)
1103
- }
1104
- }
1105
- }
1106
-
1107
- const clickEvent = (evnt: Event & { type: 'click' }) => {
1108
- triggerEvent(evnt)
1109
- }
1110
-
1111
- const handleShortcutEvent: VxeButtonGroupEvents.Click = ({ option, $event }) => {
1112
- const { type } = props
1113
- const shortcutOpts = computeShortcutOpts.value
1114
- const { autoClose } = shortcutOpts
1115
- const { code, clickMethod } = option as VxeDateRangePickerDefines.ShortcutOption
1116
- let startValue = reactData.selectStValue
1117
- let endValue = reactData.selectEdValue
1118
- let value = getRangeValue(startValue, endValue)
1119
- const shortcutParams = {
1120
- $dateRangePicker: $xeDateRangePicker,
1121
- option: option,
1122
- value,
1123
- startValue,
1124
- endValue,
1125
- code
1126
- }
1127
- if (!clickMethod && code) {
1128
- const gCommandOpts = commands.get(code)
1129
- const drpCommandMethod = gCommandOpts ? gCommandOpts.dateRangePickerCommandMethod : null
1130
- if (drpCommandMethod) {
1131
- drpCommandMethod(shortcutParams)
1132
- } else {
1133
- const dateValueFormat = computeDateValueFormat.value
1134
- const firstDayOfWeek = computeFirstDayOfWeek.value
1135
- switch (code) {
1136
- case 'last1':
1137
- case 'last3':
1138
- case 'last7':
1139
- case 'last30':
1140
- case 'last60':
1141
- case 'last90':
1142
- case 'last180': {
1143
- const restObj = getRangeDateByCode(code, value, type, {
1144
- valueFormat: dateValueFormat,
1145
- firstDay: firstDayOfWeek
1146
- })
1147
- startValue = restObj.startValue
1148
- endValue = restObj.endValue
1149
- value = getRangeValue(startValue, endValue)
1150
- shortcutParams.value = value
1151
- shortcutParams.startValue = startValue
1152
- shortcutParams.endValue = endValue
1153
- handleChange(startValue, endValue, $event)
1154
- break
1155
- }
1156
- default:
1157
- errLog('vxe.error.notCommands', [code])
1158
- break
1159
- }
1160
- }
1161
- } else {
1162
- const optClickMethod = clickMethod || shortcutOpts.clickMethod
1163
- if (optClickMethod) {
1164
- optClickMethod(shortcutParams)
1165
- }
1166
- }
1167
- if (autoClose) {
1168
- hidePanel()
1169
- }
1170
- dispatchEvent('shortcut-click', shortcutParams, $event)
1171
- }
1172
-
1173
- const dispatchEvent = (type: ValueOf<VxeDateRangePickerEmits>, params: Record<string, any>, evnt: Event | null) => {
1174
- emit(type, createEvent(evnt, { $dateRangePicker: $xeDateRangePicker }, params))
1175
- }
1176
-
1177
- const emitModel = (value: any) => {
1178
- emit('update:modelValue', value)
1179
- }
1180
-
1181
- dateRangePickerMethods = {
1182
- dispatchEvent,
1183
-
1184
- setModelValue (startValue, endValue) {
1185
- reactData.selectStValue = startValue || ''
1186
- reactData.selectEdValue = endValue || ''
1187
- const value = getRangeValue(startValue, endValue)
1188
- emitModel(value)
1189
- },
1190
- setModelValueByEvent (evnt, startValue, endValue) {
1191
- handleChange(startValue || '', endValue || '', evnt)
1192
- },
1193
- focus () {
1194
- const inputElem = refInputTarget.value
1195
- reactData.isActivated = true
1196
- inputElem.focus()
1197
- return nextTick()
1198
- },
1199
- blur () {
1200
- const inputElem = refInputTarget.value
1201
- inputElem.blur()
1202
- reactData.isActivated = false
1203
- return nextTick()
1204
- },
1205
- select () {
1206
- const inputElem = refInputTarget.value
1207
- inputElem.select()
1208
- reactData.isActivated = false
1209
- return nextTick()
1210
- },
1211
- showPanel,
1212
- hidePanel,
1213
- updatePlacement
1214
- }
1215
-
1216
- Object.assign($xeDateRangePicker, dateRangePickerMethods)
1217
-
1218
- const renderShortcutBtn = (pos: 'top' | 'bottom' | 'left' | 'right' | 'header' | 'footer', isVertical?: boolean) => {
1219
- const shortcutOpts = computeShortcutOpts.value
1220
- const { position, align, mode } = shortcutOpts
1221
- const shortcutList = computeShortcutList.value
1222
- if (isEnableConf(shortcutOpts) && shortcutList.length && (position || 'left') === pos) {
1223
- return h('div', {
1224
- class: `vxe-date-range-picker--layout-${pos}-wrapper`
1225
- }, [
1226
- h(VxeButtonGroupComponent, {
1227
- options: shortcutList,
1228
- mode,
1229
- align,
1230
- vertical: isVertical,
1231
- onClick: handleShortcutEvent
1232
- })
1233
- ])
1234
- }
1235
- return renderEmptyElement($xeDateRangePicker)
1236
- }
1237
-
1238
- const renderPanel = () => {
1239
- const popupOpts = computePopupOpts.value
1240
- if (popupOpts.enabled === false) {
1241
- return renderEmptyElement($xeDateRangePicker)
1242
- }
1243
- const { type, separator, autoClose, valueFormat, showConfirmButton, showClearButton } = props
1244
- const { initialized, isAniVisible, visiblePanel, panelPlacement, panelStyle, selectStValue, selectEdValue, paneStartVal, paneEndVal } = reactData
1245
- const vSize = computeSize.value
1246
- const btnTransfer = computeBtnTransfer.value
1247
- const shortcutOpts = computeShortcutOpts.value
1248
- const isClearable = computeIsClearable.value
1249
- const panelLabelObj = computePanelLabelObj.value
1250
- const shortcutList = computeShortcutList.value
1251
- const isTimeType = computeIsTimeType.value
1252
- const isTimeOrDateTimeType = computeIsTimeOrDateTimeType.value
1253
- const defaultDates = computeDefaultDates.value
1254
- const defaultTimes = computeDefaultTimes.value
1255
- const timeOpts = computeTimeOpts.value
1256
- const { appendTo } = popupOpts
1257
- const { startLabel, endLabel } = panelLabelObj
1258
- const { position } = shortcutOpts
1259
- const headerSlot = slots.header
1260
- const footerSlot = slots.footer
1261
- const topSlot = slots.top
1262
- const bottomSlot = slots.bottom
1263
- const leftSlot = slots.left
1264
- const rightSlot = slots.right
1265
- const ppClassName = popupOpts.className
1266
- const [sdDate, edDate] = defaultDates
1267
- const [sdTime, edTime] = defaultTimes
1268
- const hasShortcutBtn = shortcutList.length > 0
1269
- const showConfirmBtn = (showConfirmButton === null ? (isTimeOrDateTimeType || !autoClose) : showConfirmButton)
1270
- const showClearBtn = (showClearButton === null ? isClearable : showClearButton)
1271
- return h(Teleport, {
1272
- to: getPopupContainer(appendTo),
1273
- disabled: btnTransfer ? !initialized : true
1274
- }, [
1275
- h('div', {
1276
- ref: refInputPanel,
1277
- class: ['vxe-table--ignore-clear vxe-date-range-picker--panel', `type--${type}`, ppClassName ? (XEUtils.isFunction(ppClassName) ? ppClassName({ $dateRangePicker: $xeDateRangePicker }) : ppClassName) : '', {
1278
- [`size--${vSize}`]: vSize,
1279
- 'is--transfer': btnTransfer,
1280
- 'ani--leave': isAniVisible,
1281
- 'ani--enter': visiblePanel,
1282
- 'show--top': !!(topSlot || headerSlot || (hasShortcutBtn && (position === 'top' || position === 'header'))),
1283
- 'show--bottom': !!(bottomSlot || footerSlot || (hasShortcutBtn && (position === 'bottom' || position === 'footer'))),
1284
- 'show--left': !!(leftSlot || (hasShortcutBtn && position === 'left')),
1285
- 'show--right': !!(rightSlot || (hasShortcutBtn && position === 'right'))
1286
- }],
1287
- placement: panelPlacement,
1288
- style: panelStyle
1289
- }, initialized && (visiblePanel || isAniVisible)
1290
- ? [
1291
- h('div', {
1292
- ref: refPanelWrapper,
1293
- class: ['vxe-date-range-picker--layout-all-wrapper', `type--${type}`, {
1294
- [`size--${vSize}`]: vSize
1295
- }]
1296
- }, [
1297
- topSlot
1298
- ? h('div', {
1299
- class: 'vxe-date-range-picker--layout-top-wrapper'
1300
- }, topSlot({}))
1301
- : renderShortcutBtn('top'),
1302
- h('div', {
1303
- class: 'vxe-date-range-picker--layout-body-layout-wrapper'
1304
- }, [
1305
- leftSlot
1306
- ? h('div', {
1307
- class: 'vxe-date-range-picker--layout-left-wrapper'
1308
- }, leftSlot({}))
1309
- : renderShortcutBtn('left', true),
1310
- h('div', {
1311
- class: 'vxe-date-range-picker--layout-body-content-wrapper'
1312
- }, [
1313
- headerSlot
1314
- ? h('div', {
1315
- class: 'vxe-date-range-picker--layout-header-wrapper'
1316
- }, headerSlot({}))
1317
- : renderShortcutBtn('header'),
1318
- h('div', {
1319
- class: 'vxe-date-range-picker--layout-body-wrapper'
1320
- }, [
1321
- h(VxeDatePanelComponent, {
1322
- ref: refStartDatePanel,
1323
- modelValue: paneStartVal,
1324
- multiple: !isTimeType,
1325
- valueSort: true,
1326
- limitCount: 3,
1327
- defaultMode: 'first',
1328
- type: props.type,
1329
- className: props.className,
1330
- minDate: props.minDate,
1331
- maxDate: props.maxDate,
1332
- startDay: props.startDay,
1333
- labelFormat: props.labelFormat,
1334
- valueFormat: valueFormat === 'date' || valueFormat === 'timestamp' ? '' : valueFormat,
1335
- timeFormat: props.timeFormat,
1336
- defaultDate: sdDate,
1337
- defaultTime: sdTime,
1338
- timeConfig: timeOpts,
1339
- festivalMethod: props.festivalMethod || defaultFuncProps.festivalMethod,
1340
- disabledMethod: props.disabledMethod || defaultFuncProps.disabledMethod,
1341
- selectDay: props.selectDay,
1342
- cellClassName: panelCellClassName,
1343
- onChange: startPanelChangeEvent,
1344
- onDatePrev: startPanelDateBtnChangeEvent,
1345
- onDateToday: startPanelDateBtnChangeEvent,
1346
- onDateNext: startPanelDateBtnChangeEvent
1347
- }),
1348
- h(VxeDatePanelComponent, {
1349
- ref: refEndDatePanel,
1350
- modelValue: paneEndVal,
1351
- multiple: !isTimeType,
1352
- valueSort: true,
1353
- limitCount: 3,
1354
- defaultMode: 'last',
1355
- type: props.type,
1356
- className: props.className,
1357
- minDate: props.minDate,
1358
- maxDate: props.maxDate,
1359
- startDay: props.startDay,
1360
- labelFormat: props.labelFormat,
1361
- valueFormat: valueFormat === 'date' || valueFormat === 'timestamp' ? '' : valueFormat,
1362
- timeFormat: props.timeFormat,
1363
- defaultDate: edDate,
1364
- defaultTime: edTime,
1365
- timeConfig: timeOpts,
1366
- festivalMethod: props.festivalMethod || defaultFuncProps.festivalMethod,
1367
- disabledMethod: props.disabledMethod || defaultFuncProps.disabledMethod,
1368
- selectDay: props.selectDay,
1369
- cellClassName: panelCellClassName,
1370
- onChange: endPanelChangeEvent,
1371
- onDatePrev: endPanelDateBtnChangeEvent,
1372
- onDateToday: endPanelDateBtnChangeEvent,
1373
- onDateNext: endPanelDateBtnChangeEvent
1374
- })
1375
- ]),
1376
- h('div', {
1377
- class: 'vxe-date-range-picker--layout-footer-wrapper'
1378
- }, [
1379
- h('div', {
1380
- class: 'vxe-date-range-picker--layout-footer-label'
1381
- }, startLabel || endLabel
1382
- ? [
1383
- h('span', startLabel),
1384
- h('span', `${separator || ''}`),
1385
- h('span', endLabel)
1386
- ]
1387
- : `${separator || ''}`),
1388
- h('div', {
1389
- class: 'vxe-date-range-picker--layout-footer-custom'
1390
- }, footerSlot ? footerSlot({}) : [renderShortcutBtn('footer')]),
1391
- h('div', {
1392
- class: 'vxe-date-range-picker--layout-footer-btns'
1393
- }, [
1394
- showClearBtn
1395
- ? h(VxeButtonComponent, {
1396
- size: 'mini',
1397
- disabled: !(selectStValue || selectEdValue),
1398
- content: getI18n('vxe.button.clear'),
1399
- onClick: clearValueEvent
1400
- })
1401
- : renderEmptyElement($xeDateRangePicker),
1402
- showConfirmBtn
1403
- ? h(VxeButtonComponent, {
1404
- size: 'mini',
1405
- status: 'primary',
1406
- content: getI18n('vxe.button.confirm'),
1407
- onClick: confirmEvent
1408
- })
1409
- : renderEmptyElement($xeDateRangePicker)
1410
- ])
1411
- ])
1412
- ]),
1413
- rightSlot
1414
- ? h('div', {
1415
- class: 'vxe-date-range-picker--layout-right-wrapper'
1416
- }, rightSlot({}))
1417
- : renderShortcutBtn('right', true)
1418
- ]),
1419
- bottomSlot
1420
- ? h('div', {
1421
- class: 'vxe-date-range-picker--layout-bottom-wrapper'
1422
- }, bottomSlot({}))
1423
- : renderShortcutBtn('bottom')
1424
- ])
1425
- ]
1426
- : [])
1427
- ])
1428
- }
1429
-
1430
- const renderPrefixIcon = () => {
1431
- const { prefixIcon } = props
1432
- const prefixSlot = slots.prefix
1433
- return prefixSlot || prefixIcon
1434
- ? h('div', {
1435
- class: 'vxe-date-range-picker--prefix',
1436
- onClick: clickPrefixEvent
1437
- }, [
1438
- h('div', {
1439
- class: 'vxe-date-range-picker--prefix-icon'
1440
- }, prefixSlot
1441
- ? getSlotVNs(prefixSlot({}))
1442
- : [
1443
- h('i', {
1444
- class: prefixIcon
1445
- })
1446
- ])
1447
- ])
1448
- : null
1449
- }
1450
-
1451
- const renderSuffixIcon = () => {
1452
- const { suffixIcon } = props
1453
- const { selectStValue, selectEdValue } = reactData
1454
- const suffixSlot = slots.suffix
1455
- const isDisabled = computeIsDisabled.value
1456
- const isClearable = computeIsClearable.value
1457
- return h('div', {
1458
- class: ['vxe-date-range-picker--suffix', {
1459
- 'is--clear': isClearable && !isDisabled && (selectStValue || selectEdValue)
1460
- }]
1461
- }, [
1462
- isClearable
1463
- ? h('div', {
1464
- class: 'vxe-date-range-picker--clear-icon',
1465
- onClick: clearValueEvent
1466
- }, [
1467
- h('i', {
1468
- class: getIcon().INPUT_CLEAR
1469
- })
1470
- ])
1471
- : renderEmptyElement($xeDateRangePicker),
1472
- renderExtraSuffixIcon(),
1473
- suffixSlot || suffixIcon
1474
- ? h('div', {
1475
- class: 'vxe-date-range-picker--suffix-icon',
1476
- onClick: clickSuffixEvent
1477
- }, suffixSlot
1478
- ? getSlotVNs(suffixSlot({}))
1479
- : [
1480
- h('i', {
1481
- class: suffixIcon
1482
- })
1483
- ])
1484
- : renderEmptyElement($xeDateRangePicker)
1485
- ])
1486
- }
1487
-
1488
- const renderExtraSuffixIcon = () => {
1489
- return h('div', {
1490
- class: 'vxe-date-range-picker--control-icon',
1491
- onClick: clickIconEvent
1492
- }, [
1493
- h('i', {
1494
- class: ['vxe-date-range-picker--date-picker-icon', getIcon().DATE_PICKER_DATE]
1495
- })
1496
- ])
1497
- }
1498
-
1499
- const renderVN = () => {
1500
- const { className, inputClassName, type, name, autoComplete } = props
1501
- const { selectStValue, selectEdValue, visiblePanel, isActivated } = reactData
1502
- const vSize = computeSize.value
1503
- const isDisabled = computeIsDisabled.value
1504
- const formReadonly = computeFormReadonly.value
1505
- const inputLabel = computeInputLabel.value
1506
- if (formReadonly) {
1507
- return h('div', {
1508
- ref: refElem,
1509
- class: ['vxe-date-range-picker--readonly', `type--${type}`, className]
1510
- }, inputLabel)
1511
- }
1512
- const currStyle = computeCurrStyle.value
1513
- const inpPlaceholder = computeInpPlaceholder.value
1514
- const isClearable = computeIsClearable.value
1515
- const prefix = renderPrefixIcon()
1516
- const suffix = renderSuffixIcon()
1517
- return h('div', {
1518
- ref: refElem,
1519
- class: ['vxe-date-range-picker', `type--${type}`, className, {
1520
- [`size--${vSize}`]: vSize,
1521
- 'is--prefix': !!prefix,
1522
- 'is--suffix': !!suffix,
1523
- 'is--visible': visiblePanel,
1524
- 'is--disabled': isDisabled,
1525
- 'is--active': isActivated,
1526
- 'show--clear': isClearable && !isDisabled && (selectStValue || selectEdValue)
1527
- }],
1528
- style: currStyle,
1529
- spellcheck: false
1530
- }, [
1531
- prefix || renderEmptyElement($xeDateRangePicker),
1532
- h('div', {
1533
- class: 'vxe-date-range-picker--wrapper'
1534
- }, [
1535
- h('input', {
1536
- ref: refInputTarget,
1537
- class: 'vxe-date-range-picker--inner' + (inputClassName ? (' ' + inputClassName) : ''),
1538
- value: inputLabel,
1539
- name,
1540
- type: 'text',
1541
- placeholder: inpPlaceholder,
1542
- editable: false,
1543
- disabled: isDisabled,
1544
- autocomplete: autoComplete,
1545
- onKeydown: keydownEvent,
1546
- onKeyup: keyupEvent,
1547
- onClick: clickEvent,
1548
- onChange: changeEvent,
1549
- onFocus: focusEvent,
1550
- onBlur: blurEvent
1551
- })
1552
- ]),
1553
- suffix || renderEmptyElement($xeDateRangePicker),
1554
- // 下拉面板
1555
- renderPanel()
1556
- ])
1557
- }
1558
-
1559
- watch(() => props.modelValue, () => {
1560
- updateModelValue(true)
1561
- })
1562
-
1563
- watch(computeMVal, () => {
1564
- updateModelValue(false)
1565
- })
1566
-
1567
- updateModelValue(true)
1568
-
1569
- nextTick(() => {
1570
- globalEvents.on($xeDateRangePicker, 'mousedown', handleGlobalMousedownEvent)
1571
- globalEvents.on($xeDateRangePicker, 'keydown', handleGlobalKeydownEvent)
1572
- globalEvents.on($xeDateRangePicker, 'blur', handleGlobalBlurEvent)
1573
- globalEvents.on($xeDateRangePicker, 'resize', handleGlobalResizeEvent)
1574
- globalEvents.on($xeDateRangePicker, 'scroll', handleGlobalScrollEvent)
1575
- })
1576
-
1577
- onDeactivated(() => {
1578
- checkValue()
1579
- })
1580
-
1581
- onBeforeUnmount(() => {
1582
- checkValue()
1583
- })
1584
-
1585
- onUnmounted(() => {
1586
- globalEvents.off($xeDateRangePicker, 'mousedown')
1587
- globalEvents.off($xeDateRangePicker, 'keydown')
1588
- globalEvents.off($xeDateRangePicker, 'blur')
1589
- globalEvents.off($xeDateRangePicker, 'resize')
1590
- globalEvents.off($xeDateRangePicker, 'scroll')
1591
- XEUtils.assign(reactData, createReactData())
1592
- XEUtils.assign(internalData, createInternalData())
1593
- })
1594
-
1595
- provide('$xeDateRangePicker', $xeDateRangePicker)
1596
-
1597
- $xeDateRangePicker.renderVN = renderVN
1598
-
1599
- return $xeDateRangePicker
1600
- },
1601
- render () {
1602
- return this.renderVN()
1603
- }
1604
- })
1
+ import { h, Teleport, ref, Ref, computed, provide, reactive, inject, nextTick, watch, PropType, onDeactivated, onUnmounted, onBeforeUnmount } from 'vue'
2
+ import { defineVxeComponent } from '../../ui/src/comp'
3
+ import XEUtils from 'xe-utils'
4
+ import { VxeUI } from '@vxe-ui/core'
5
+ import { getFuncText, getLastZIndex, nextZIndex, isEnableConf } from '../../ui/src/utils'
6
+ import { updatePanelPlacement, getEventTargetNode, getPopupContainer, toCssUnit } from '../../ui/src/dom'
7
+ import { parseDateString, parseDateObj, getRangeDateByCode, handleValueFormat, hasTimestampValueType, hasDateValueType, parseDateValue, getNextMonth, getPrevMonth, getNextYear, getPrevYear } from '../../date-panel/src/util'
8
+ import { getSlotVNs } from '../../ui/src/vn'
9
+ import { createComponentLog } from '../../ui/src/log'
10
+ import VxeDatePanelComponent from '../../date-panel'
11
+ import VxeButtonComponent from '../../button'
12
+ import VxeButtonGroupComponent from '../../button-group'
13
+
14
+ import type {
15
+ VxeDateRangePickerConstructor,
16
+ VxeDateRangePickerEmits,
17
+ DateRangePickerInternalData,
18
+ DateRangePickerReactData,
19
+ DateRangePickerMethods,
20
+ VxeDateRangePickerPropTypes,
21
+ DateRangePickerPrivateRef,
22
+ VxeFormConstructor,
23
+ VxeFormPrivateMethods,
24
+ VxeFormDefines,
25
+ ValueOf,
26
+ VxeModalConstructor,
27
+ VxeDatePanelPropTypes,
28
+ VxeDrawerConstructor,
29
+ VxeModalMethods,
30
+ VxeDrawerMethods,
31
+ VxeDatePanelEvents,
32
+ VxeDateRangePickerDefines,
33
+ VxeButtonGroupEvents,
34
+ VxeDatePanelConstructor,
35
+ VxeCardConstructor,
36
+ VxeCardPrivateMethods,
37
+ VxeComponentStyleType
38
+ } from '../../../types'
39
+ import type { VxeTableConstructor, VxeTablePrivateMethods } from '../../../types/components/table'
40
+
41
+ const { getConfig, getIcon, getI18n, commands, globalEvents, createEvent, GLOBAL_EVENT_KEYS, useFns, renderEmptyElement } = VxeUI
42
+
43
+ const { errLog } = createComponentLog('date-range-picker')
44
+
45
+ function createReactData(): DateRangePickerReactData {
46
+ return {
47
+ initialized: false,
48
+ panelIndex: 0,
49
+ visiblePanel: false,
50
+ isAniVisible: false,
51
+ panelStyle: {},
52
+ panelPlacement: '',
53
+ isActivated: false,
54
+ selectStValue: '',
55
+ selectEdValue: '',
56
+ paneStartVal: [],
57
+ paneEndVal: []
58
+ }
59
+ }
60
+
61
+ function createInternalData(): DateRangePickerInternalData {
62
+ return {
63
+ // selectStatus: false
64
+ // hpTimeout: undefined
65
+ }
66
+ }
67
+
68
+ export default defineVxeComponent({
69
+ name: 'VxeDateRangePicker',
70
+ props: {
71
+ modelValue: [String, Number, Date, Array] as PropType<VxeDateRangePickerPropTypes.ModelValue>,
72
+ startValue: [String, Number, Date] as PropType<VxeDateRangePickerPropTypes.StartValue>,
73
+ endValue: [String, Number, Date] as PropType<VxeDateRangePickerPropTypes.EndValue>,
74
+ immediate: {
75
+ type: Boolean as PropType<VxeDateRangePickerPropTypes.Immediate>,
76
+ default: true
77
+ },
78
+ width: [Number, String] as PropType<VxeDateRangePickerPropTypes.Width>,
79
+ name: String as PropType<VxeDateRangePickerPropTypes.Name>,
80
+ type: {
81
+ type: String as PropType<VxeDateRangePickerPropTypes.Type>,
82
+ default: 'date'
83
+ },
84
+ clearable: {
85
+ type: Boolean as PropType<VxeDateRangePickerPropTypes.Clearable>,
86
+ default: () => getConfig().dateRangePicker.clearable
87
+ },
88
+ linkedPanels: {
89
+ type: Boolean as PropType<VxeDateRangePickerPropTypes.LinkedPanels>,
90
+ default: () => getConfig().dateRangePicker.linkedPanels
91
+ },
92
+ readonly: {
93
+ type: Boolean as PropType<VxeDateRangePickerPropTypes.Readonly>,
94
+ default: null
95
+ },
96
+ disabled: {
97
+ type: Boolean as PropType<VxeDateRangePickerPropTypes.Disabled>,
98
+ default: null
99
+ },
100
+ placeholder: String as PropType<VxeDateRangePickerPropTypes.Placeholder>,
101
+ autoComplete: {
102
+ type: String as PropType<VxeDateRangePickerPropTypes.AutoComplete>,
103
+ default: 'off'
104
+ },
105
+ form: String as PropType<VxeDateRangePickerPropTypes.Form>,
106
+ className: String as PropType<VxeDateRangePickerPropTypes.ClassName>,
107
+ inputClassName: {
108
+ type: String as PropType<VxeDateRangePickerPropTypes.InputClassName>,
109
+ default: () => getConfig().dateRangePicker.inputClassName
110
+ },
111
+ zIndex: Number as PropType<VxeDateRangePickerPropTypes.ZIndex>,
112
+ size: {
113
+ type: String as PropType<VxeDateRangePickerPropTypes.Size>,
114
+ default: () => getConfig().dateRangePicker.size || getConfig().size
115
+ },
116
+
117
+ // startDate: {
118
+ // type: [String, Number, Date] as PropType<VxeDateRangePickerPropTypes.StartDate>,
119
+ // default: () => getConfig().dateRangePicker.startDate
120
+ // },
121
+ // endDate: {
122
+ // type: [String, Number, Date] as PropType<VxeDateRangePickerPropTypes.EndDate>,
123
+ // default: () => getConfig().dateRangePicker.endDate
124
+ // },
125
+ minDate: [String, Number, Date] as PropType<VxeDateRangePickerPropTypes.MinDate>,
126
+ maxDate: [String, Number, Date] as PropType<VxeDateRangePickerPropTypes.MaxDate>,
127
+ defaultDate: [String, Number, Date, Array] as PropType<VxeDateRangePickerPropTypes.DefaultDate>,
128
+ defaultTime: [String, Number, Date, Array] as PropType<VxeDateRangePickerPropTypes.DefaultTime>,
129
+ startDay: {
130
+ type: [String, Number] as PropType<VxeDateRangePickerPropTypes.StartDay>,
131
+ default: () => getConfig().dateRangePicker.startDay
132
+ },
133
+ labelFormat: String as PropType<VxeDateRangePickerPropTypes.LabelFormat>,
134
+ valueFormat: String as PropType<VxeDateRangePickerPropTypes.ValueFormat>,
135
+ timeFormat: String as PropType<VxeDateRangePickerPropTypes.TimeFormat>,
136
+ valueType: String as PropType<VxeDateRangePickerPropTypes.ValueType>,
137
+ editable: {
138
+ type: Boolean as PropType<VxeDateRangePickerPropTypes.Editable>,
139
+ default: true
140
+ },
141
+ festivalMethod: Function as PropType<VxeDateRangePickerPropTypes.FestivalMethod>,
142
+ disabledMethod: Function as PropType<VxeDateRangePickerPropTypes.DisabledMethod>,
143
+ separator: {
144
+ type: [String, Number] as PropType<VxeDateRangePickerPropTypes.Separator>,
145
+ default: () => getConfig().dateRangePicker.separator
146
+ },
147
+
148
+ // week
149
+ selectDay: {
150
+ type: [String, Number] as PropType<VxeDateRangePickerPropTypes.SelectDay>,
151
+ default: () => getConfig().dateRangePicker.selectDay
152
+ },
153
+ showClearButton: {
154
+ type: Boolean as PropType<VxeDateRangePickerPropTypes.ShowClearButton>,
155
+ default: () => getConfig().dateRangePicker.showClearButton
156
+ },
157
+ showConfirmButton: {
158
+ type: Boolean as PropType<VxeDateRangePickerPropTypes.ShowConfirmButton>,
159
+ default: () => getConfig().dateRangePicker.showConfirmButton
160
+ },
161
+ autoClose: {
162
+ type: Boolean as PropType<VxeDateRangePickerPropTypes.AutoClose>,
163
+ default: () => getConfig().dateRangePicker.autoClose
164
+ },
165
+
166
+ prefixIcon: String as PropType<VxeDateRangePickerPropTypes.PrefixIcon>,
167
+ suffixIcon: String as PropType<VxeDateRangePickerPropTypes.SuffixIcon>,
168
+ /**
169
+ * 已废弃,请使用 popupConfig.placement
170
+ * @deprecated
171
+ */
172
+ placement: String as PropType<VxeDateRangePickerPropTypes.Placement>,
173
+ /**
174
+ * 已废弃,请使用 popupConfig.transfer
175
+ * @deprecated
176
+ */
177
+ transfer: {
178
+ type: Boolean as PropType<VxeDateRangePickerPropTypes.Transfer>,
179
+ default: null
180
+ },
181
+
182
+ timeConfig: Object as PropType<VxeDateRangePickerPropTypes.TimeConfig>,
183
+ popupConfig: Object as PropType<VxeDateRangePickerPropTypes.PopupConfig>,
184
+ shortcutConfig: Object as PropType<VxeDateRangePickerPropTypes.ShortcutConfig>
185
+ },
186
+ emits: ['update:modelValue', 'update:startValue', 'update:endValue', 'input', 'change', 'keydown', 'keyup', 'click', 'focus', 'blur', 'clear', 'confirm', 'prefix-click', 'suffix-click', 'date-prev', 'date-today', 'date-next', 'shortcut-click'] as VxeDateRangePickerEmits,
187
+ setup(props, context) {
188
+ const { slots, emit } = context
189
+
190
+ const $xeModal = inject<(VxeModalConstructor & VxeModalMethods) | null>('$xeModal', null)
191
+ const $xeDrawer = inject<(VxeDrawerConstructor & VxeDrawerMethods) | null>('$xeDrawer', null)
192
+ const $xeTable = inject<(VxeTableConstructor & VxeTablePrivateMethods) | null>('$xeTable', null)
193
+ const $xeCard = inject<(VxeCardConstructor & VxeCardPrivateMethods) | null>('$xeCard', null)
194
+ const $xeForm = inject<(VxeFormConstructor & VxeFormPrivateMethods) | null>('$xeForm', null)
195
+ const formItemInfo = inject<VxeFormDefines.ProvideItemInfo | null>('xeFormItemInfo', null)
196
+
197
+ const xID = XEUtils.uniqueId()
198
+
199
+ const { computeSize } = useFns.useSize(props)
200
+
201
+ const reactData = reactive(createReactData())
202
+ const internalData = createInternalData()
203
+
204
+ const defaultFuncProps = {
205
+ festivalMethod: getConfig().dateRangePicker.festivalMethod,
206
+ disabledMethod: getConfig().dateRangePicker.disabledMethod
207
+ }
208
+
209
+ const refElem = ref() as Ref<HTMLDivElement>
210
+ const refInputTarget = ref() as Ref<HTMLInputElement>
211
+ const refInputPanel = ref<HTMLDivElement>()
212
+ const refPanelWrapper = ref<HTMLDivElement>()
213
+
214
+ const refStartDatePanel = ref<VxeDatePanelConstructor>()
215
+ const refEndDatePanel = ref<VxeDatePanelConstructor>()
216
+
217
+ const refMaps: DateRangePickerPrivateRef = {
218
+ refElem,
219
+ refInput: refInputTarget
220
+ }
221
+
222
+ const $xeDateRangePicker = {
223
+ xID,
224
+ props,
225
+ context,
226
+ reactData,
227
+ internalData,
228
+ getRefMaps: () => refMaps
229
+ } as unknown as VxeDateRangePickerConstructor
230
+
231
+ let dateRangePickerMethods = {} as DateRangePickerMethods
232
+
233
+ const computeBtnTransfer = computed(() => {
234
+ const { transfer } = props
235
+ const popupOpts = computePopupOpts.value
236
+ if (XEUtils.isBoolean(popupOpts.transfer)) {
237
+ return popupOpts.transfer
238
+ }
239
+ if (transfer === null) {
240
+ const globalTransfer = getConfig().dateRangePicker.transfer
241
+ if (XEUtils.isBoolean(globalTransfer)) {
242
+ return globalTransfer
243
+ }
244
+ if ($xeTable || $xeModal || $xeDrawer || $xeCard || $xeForm) {
245
+ return true
246
+ }
247
+ }
248
+ return transfer
249
+ })
250
+
251
+ const computeFormReadonly = computed(() => {
252
+ const { readonly } = props
253
+ if (readonly === null) {
254
+ if ($xeForm) {
255
+ return $xeForm.props.readonly
256
+ }
257
+ return false
258
+ }
259
+ return readonly
260
+ })
261
+
262
+ const computeIsDisabled = computed(() => {
263
+ const { disabled } = props
264
+ if (disabled === null) {
265
+ if ($xeForm) {
266
+ return $xeForm.props.disabled
267
+ }
268
+ return false
269
+ }
270
+ return disabled
271
+ })
272
+
273
+ const computeDefaultDates = computed(() => {
274
+ const { defaultDate } = props
275
+ if (defaultDate) {
276
+ if (XEUtils.isArray(defaultDate)) {
277
+ return defaultDate
278
+ }
279
+ if (`${defaultDate}`.indexOf(',') > -1) {
280
+ return `${defaultDate}`.split(',')
281
+ }
282
+ return [defaultDate, defaultDate]
283
+ }
284
+ return []
285
+ })
286
+
287
+ const computeDefaultTimes = computed(() => {
288
+ const { defaultTime } = props
289
+ if (defaultTime) {
290
+ if (XEUtils.isArray(defaultTime)) {
291
+ return defaultTime
292
+ }
293
+ if (`${defaultTime}`.indexOf(',') > -1) {
294
+ return `${defaultTime}`.split(',')
295
+ }
296
+ return [defaultTime, defaultTime]
297
+ }
298
+ return []
299
+ })
300
+
301
+ const computeCurrStyle = computed(() => {
302
+ const { width } = props
303
+ const stys: VxeComponentStyleType = {}
304
+ if (width) {
305
+ stys.width = toCssUnit(width)
306
+ }
307
+ return stys
308
+ })
309
+
310
+ const computeMVal = computed(() => {
311
+ const { startValue, endValue } = props
312
+ return `${startValue || ''}${endValue || ''}`
313
+ })
314
+
315
+ const computeIsTimeType = computed(() => {
316
+ const { type } = props
317
+ return type === 'time'
318
+ })
319
+
320
+ const computeIsTimeOrDateTimeType = computed(() => {
321
+ const { type } = props
322
+ const isTimeType = computeIsTimeType.value
323
+ return isTimeType || type === 'datetime'
324
+ })
325
+
326
+ const computeIsDatePickerType = computed(() => {
327
+ return ['date', 'week', 'month', 'quarter', 'year'].indexOf(props.type) > -1
328
+ })
329
+
330
+ const computeIsClearable = computed(() => {
331
+ return props.clearable
332
+ })
333
+
334
+ const computeInpPlaceholder = computed(() => {
335
+ const { placeholder } = props
336
+ if (placeholder) {
337
+ return getFuncText(placeholder)
338
+ }
339
+ const globalPlaceholder = getConfig().dateRangePicker.placeholder
340
+ if (globalPlaceholder) {
341
+ return getFuncText(globalPlaceholder)
342
+ }
343
+ return getI18n('vxe.dateRangePicker.pleaseRange')
344
+ })
345
+
346
+ const computeInpImmediate = computed(() => {
347
+ const { immediate } = props
348
+ return immediate
349
+ })
350
+
351
+ const computeTimeOpts = computed(() => {
352
+ return Object.assign({}, getConfig().dateRangePicker.timeConfig, props.timeConfig)
353
+ })
354
+
355
+ const computePopupOpts = computed(() => {
356
+ return Object.assign({}, getConfig().dateRangePicker.popupConfig, props.popupConfig)
357
+ })
358
+
359
+ const computeShortcutOpts = computed(() => {
360
+ return Object.assign({}, getConfig().dateRangePicker.shortcutConfig, props.shortcutConfig)
361
+ })
362
+
363
+ const computeShortcutList = computed(() => {
364
+ const shortcutOpts = computeShortcutOpts.value
365
+ const { options } = shortcutOpts
366
+ if (options) {
367
+ return options.map((option, index) => {
368
+ return Object.assign(
369
+ {
370
+ name: `${option.name || option.code || index}`
371
+ },
372
+ option
373
+ )
374
+ })
375
+ }
376
+ return []
377
+ })
378
+
379
+ const computeDateLabelFormat = computed(() => {
380
+ const { labelFormat } = props
381
+ return labelFormat || getI18n(`vxe.input.date.labelFormat.${props.type}`)
382
+ })
383
+
384
+ const computeDateValueFormat = computed(() => {
385
+ const { type, valueFormat } = props
386
+ return handleValueFormat(type, valueFormat)
387
+ })
388
+
389
+ const computeFirstDayOfWeek = computed(() => {
390
+ const { startDay } = props
391
+ return XEUtils.toNumber(startDay) as VxeDateRangePickerPropTypes.StartDay
392
+ })
393
+
394
+ const computePanelLabelObj = computed(() => {
395
+ const { selectStValue, selectEdValue } = reactData
396
+ const vals: string[] = selectStValue || selectEdValue ? [selectStValue || '', selectEdValue || ''] : []
397
+ return formatRangeLabel(vals)
398
+ })
399
+
400
+ const computeInputLabel = computed(() => {
401
+ const panelLabelObj = computePanelLabelObj.value
402
+ return panelLabelObj.label
403
+ })
404
+
405
+ const formatRangeLabel = (vals: string[]) => {
406
+ const { type, separator } = props
407
+ const dateLabelFormat = computeDateLabelFormat.value
408
+ const dateValueFormat = computeDateValueFormat.value
409
+ const firstDayOfWeek = computeFirstDayOfWeek.value
410
+ const startRest = vals[0]
411
+ ? parseDateObj(vals[0], type, {
412
+ valueFormat: dateValueFormat,
413
+ labelFormat: dateLabelFormat,
414
+ firstDay: firstDayOfWeek
415
+ })
416
+ : null
417
+ const endRest = vals[1]
418
+ ? parseDateObj(vals[1], type, {
419
+ valueFormat: dateValueFormat,
420
+ labelFormat: dateLabelFormat,
421
+ firstDay: firstDayOfWeek
422
+ })
423
+ : null
424
+ const startLabel = startRest ? startRest.label : ''
425
+ const endLabel = endRest ? endRest.label : ''
426
+ return {
427
+ label: (startLabel || endLabel ? [startLabel, endLabel] : []).join(`${separator || ' ~ '}`),
428
+ startLabel,
429
+ endLabel
430
+ }
431
+ }
432
+
433
+ const getRangeValue = (sValue: string | number | Date | null, eValue: string | number | Date | null) => {
434
+ const { modelValue, valueType, valueFormat } = props
435
+ let isArr = valueFormat === 'date' || XEUtils.isArray(modelValue)
436
+ if (valueType) {
437
+ switch (valueType) {
438
+ case 'array':
439
+ isArr = true
440
+ break
441
+ case 'string':
442
+ isArr = false
443
+ break
444
+ }
445
+ }
446
+ if (sValue || eValue) {
447
+ const rest = [sValue || null, eValue || null]
448
+ if (isArr) {
449
+ return rest
450
+ }
451
+ return rest.join(',')
452
+ }
453
+ return isArr ? [] : ''
454
+ }
455
+
456
+ const paraeUpdateModel = () => {
457
+ const { type, modelValue } = props
458
+ const dateValueFormat = computeDateValueFormat.value
459
+ let sValue: string | Date | null = ''
460
+ let eValue: string | Date | null = ''
461
+ if (XEUtils.isArray(modelValue)) {
462
+ const date1 = parseDateString(modelValue[0], type, { valueFormat: dateValueFormat })
463
+ const date2 = parseDateString(modelValue[1], type, { valueFormat: dateValueFormat })
464
+ if (date1 || date2) {
465
+ sValue = date1 || ''
466
+ eValue = date2 || ''
467
+ }
468
+ } else if (XEUtils.isString(modelValue)) {
469
+ const strArr = modelValue.split(',')
470
+ if (strArr[0] || strArr[1]) {
471
+ sValue = strArr[0] || ''
472
+ eValue = strArr[1] || ''
473
+ }
474
+ }
475
+ return {
476
+ sValue,
477
+ eValue
478
+ }
479
+ }
480
+
481
+ const parseUpdateData = () => {
482
+ const { type, startValue, endValue } = props
483
+ const dateValueFormat = computeDateValueFormat.value
484
+ let sValue: string | Date | null = ''
485
+ let eValue: string | Date | null = ''
486
+ sValue = parseDateString(startValue, type, { valueFormat: dateValueFormat })
487
+ eValue = parseDateString(endValue, type, { valueFormat: dateValueFormat })
488
+ return {
489
+ sValue,
490
+ eValue
491
+ }
492
+ }
493
+
494
+ const updateModelValue = (isModel: boolean) => {
495
+ const { modelValue, startValue, endValue, valueFormat } = props
496
+ let restObj: {
497
+ sValue: string | Date | null
498
+ eValue: string | Date | null
499
+ } = {
500
+ sValue: '',
501
+ eValue: ''
502
+ }
503
+ if (isModel) {
504
+ if (modelValue) {
505
+ restObj = paraeUpdateModel()
506
+ } else {
507
+ restObj = parseUpdateData()
508
+ }
509
+ } else {
510
+ if (startValue || endValue) {
511
+ restObj = parseUpdateData()
512
+ } else {
513
+ restObj = paraeUpdateModel()
514
+ }
515
+ }
516
+ let startRest: string | number | Date | null = restObj.sValue
517
+ let endRest: string | number | Date | null = restObj.eValue
518
+ if (valueFormat === 'timestamp') {
519
+ if (XEUtils.isString(startRest) && /^\d+$/.test(startRest)) {
520
+ startRest = Number(startRest)
521
+ }
522
+ if (XEUtils.isString(endRest) && /^\d+$/.test(endRest)) {
523
+ endRest = Number(endRest)
524
+ }
525
+ }
526
+ reactData.selectStValue = startRest
527
+ reactData.selectEdValue = endRest
528
+ reactData.paneEndVal = [startRest, endRest]
529
+ reactData.paneStartVal = [startRest, endRest]
530
+ }
531
+
532
+ const triggerEvent = (evnt: Event & { type: 'input' | 'change' | 'keydown' | 'keyup' | 'click' | 'focus' | 'blur' }) => {
533
+ const { selectStValue, selectEdValue } = reactData
534
+ const value = getRangeValue(selectStValue, selectEdValue)
535
+ dispatchEvent(evnt.type, { value, startValue: selectStValue, endValue: selectEdValue }, evnt)
536
+ }
537
+
538
+ const handleChange = (sValue: string, eValue: string, evnt: Event | { type: string }) => {
539
+ const { type, modelValue, valueFormat } = props
540
+ const dateValueFormat = computeDateValueFormat.value
541
+ let startRest: string | number | Date | null = sValue
542
+ let endRest: string | number | Date | null = eValue
543
+ if (hasTimestampValueType(valueFormat)) {
544
+ if (startRest) {
545
+ const dateVal = parseDateValue(startRest, type, { valueFormat: dateValueFormat })
546
+ startRest = dateVal ? dateVal.getTime() : null
547
+ }
548
+ if (endRest) {
549
+ const dateVal = parseDateValue(endRest, type, { valueFormat: dateValueFormat })
550
+ endRest = dateVal ? dateVal.getTime() : null
551
+ }
552
+ } else if (hasDateValueType(valueFormat)) {
553
+ if (startRest) {
554
+ startRest = parseDateValue(startRest, type, { valueFormat: dateValueFormat })
555
+ }
556
+ if (endRest) {
557
+ endRest = parseDateValue(endRest, type, { valueFormat: dateValueFormat })
558
+ }
559
+ }
560
+ reactData.selectStValue = startRest
561
+ reactData.selectEdValue = endRest
562
+ const value = getRangeValue(startRest, endRest)
563
+ const isFinish = (startRest && endRest) || (!startRest && !endRest)
564
+ emitModel(value)
565
+ emit('update:startValue', startRest || '')
566
+ emit('update:endValue', endRest || '')
567
+ if (XEUtils.toValueString(modelValue) !== value) {
568
+ dispatchEvent('change', { value, startValue: startRest, endValue: endRest, isFinish }, evnt as any)
569
+ // 自动更新校验状态
570
+ if ($xeForm && formItemInfo) {
571
+ $xeForm.triggerItemEvent(evnt, formItemInfo.itemConfig.field, value)
572
+ }
573
+ }
574
+ }
575
+
576
+ const changeEvent = (evnt: Event & { type: 'change' }) => {
577
+ const inpImmediate = computeInpImmediate.value
578
+ if (!inpImmediate) {
579
+ triggerEvent(evnt)
580
+ }
581
+ }
582
+
583
+ const focusEvent = (evnt: Event & { type: 'focus' }) => {
584
+ const popupOpts = computePopupOpts.value
585
+ const { trigger } = popupOpts
586
+ reactData.isActivated = true
587
+ if (!trigger || trigger === 'default') {
588
+ dateRangePickerOpenEvent(evnt)
589
+ } else if (trigger === 'icon') {
590
+ hidePanel()
591
+ }
592
+ triggerEvent(evnt)
593
+ }
594
+
595
+ const clickPrefixEvent = (evnt: Event) => {
596
+ const isDisabled = computeIsDisabled.value
597
+ if (!isDisabled) {
598
+ const { selectStValue, selectEdValue } = reactData
599
+ const value = getRangeValue(selectStValue, selectEdValue)
600
+ dispatchEvent('prefix-click', { value, startValue: selectStValue, endValue: selectEdValue }, evnt)
601
+ }
602
+ }
603
+
604
+ const hidePanel = () => {
605
+ return new Promise<void>((resolve) => {
606
+ reactData.visiblePanel = false
607
+ internalData.hpTimeout = setTimeout(() => {
608
+ reactData.isAniVisible = false
609
+ resolve()
610
+ }, 350)
611
+ })
612
+ }
613
+
614
+ const clearValueEvent = (evnt: Event, value: VxeDateRangePickerPropTypes.ModelValue) => {
615
+ const isDatePickerType = computeIsDatePickerType.value
616
+ if (isDatePickerType) {
617
+ hidePanel()
618
+ }
619
+ const startValue = ''
620
+ const endValue = ''
621
+ handleChange(startValue, endValue, evnt)
622
+ dispatchEvent('clear', { value, startValue, endValue }, evnt)
623
+ }
624
+
625
+ const checkValue = () => {
626
+ const $startDatePanel = refStartDatePanel.value
627
+ const $endDatePanel = refEndDatePanel.value
628
+ if ($startDatePanel && $endDatePanel) {
629
+ const startValue = $startDatePanel.getModelValue()
630
+ const endValue = $endDatePanel.getModelValue()
631
+ if (!startValue || !endValue) {
632
+ handleChange('', '', { type: 'check' })
633
+ }
634
+ }
635
+ }
636
+
637
+ const panelCellClassName: VxeDatePanelPropTypes.CellClassName = ({ date }) => {
638
+ const startValue = reactData.selectStValue
639
+ const endValue = reactData.selectEdValue
640
+ if (startValue && endValue) {
641
+ const currTime = date.getTime()
642
+ const startTime = XEUtils.toStringDate(startValue).getTime()
643
+ const endTime = XEUtils.toStringDate(endValue).getTime()
644
+ if (currTime >= startTime && currTime <= endTime) {
645
+ return 'is--range-selected'
646
+ }
647
+ }
648
+ return ''
649
+ }
650
+
651
+ const handleSelectClose = () => {
652
+ const { autoClose } = props
653
+ const { selectStValue, selectEdValue } = reactData
654
+ const { selectStatus } = internalData
655
+ const isDatePickerType = computeIsDatePickerType.value
656
+ if (autoClose) {
657
+ if (selectStatus && isDatePickerType) {
658
+ if (selectStValue && selectEdValue) {
659
+ hidePanel()
660
+ }
661
+ }
662
+ } else {
663
+ if (selectStValue && selectEdValue) {
664
+ internalData.selectStatus = false
665
+ }
666
+ }
667
+ }
668
+
669
+ const clickSuffixEvent = (evnt: Event) => {
670
+ const isDisabled = computeIsDisabled.value
671
+ if (!isDisabled) {
672
+ const { selectStValue, selectEdValue } = reactData
673
+ const value = getRangeValue(selectStValue, selectEdValue)
674
+ dispatchEvent('suffix-click', { value, startValue: selectStValue, endValue: selectEdValue }, evnt)
675
+ }
676
+ }
677
+
678
+ const blurEvent = (evnt: Event & { type: 'blur' }) => {
679
+ const { selectStValue, selectEdValue } = reactData
680
+ const inpImmediate = computeInpImmediate.value
681
+ const value = ''
682
+ if (!inpImmediate) {
683
+ handleChange(selectStValue, selectEdValue, evnt)
684
+ }
685
+ if (!reactData.visiblePanel) {
686
+ reactData.isActivated = false
687
+ checkValue()
688
+ }
689
+ dispatchEvent('blur', { value, startValue: selectStValue, endValue: selectEdValue }, evnt)
690
+ // 自动更新校验状态
691
+ if ($xeForm && formItemInfo) {
692
+ $xeForm.triggerItemEvent(evnt, formItemInfo.itemConfig.field, value)
693
+ }
694
+ }
695
+
696
+ const keydownEvent = (evnt: KeyboardEvent & { type: 'keydown' }) => {
697
+ triggerEvent(evnt)
698
+ }
699
+
700
+ const keyupEvent = (evnt: KeyboardEvent & { type: 'keyup' }) => {
701
+ triggerEvent(evnt)
702
+ }
703
+
704
+ const confirmEvent = (evnt: MouseEvent) => {
705
+ const isTimeType = computeIsTimeType.value
706
+ const $startDatePanel = refStartDatePanel.value
707
+ const $endDatePanel = refEndDatePanel.value
708
+ if ($startDatePanel && $endDatePanel) {
709
+ const startValue = $startDatePanel.getModelValue()
710
+ const endValue = $endDatePanel.getModelValue()
711
+ if (isTimeType) {
712
+ $startDatePanel.confirmByEvent(evnt)
713
+ $endDatePanel.confirmByEvent(evnt)
714
+ } else if ((startValue && !endValue) || (!startValue && endValue)) {
715
+ handleChange('', '', evnt)
716
+ } else {
717
+ $startDatePanel.confirmByEvent(evnt)
718
+ $endDatePanel.confirmByEvent(evnt)
719
+ }
720
+ const value = getRangeValue(startValue, endValue)
721
+ dispatchEvent('confirm', { value, startValue, endValue }, evnt)
722
+ }
723
+ hidePanel()
724
+ }
725
+
726
+ const startPanelChangeEvent = (params: any) => {
727
+ const { paneStartVal } = reactData
728
+ const { selectStatus } = internalData
729
+ const { value, currValue, $event } = params
730
+ const paneVals = value ? (XEUtils.isString(value) ? value.split(',') : [value]) : []
731
+ let startValue = ''
732
+ let endValue = ''
733
+ if (selectStatus) {
734
+ // 如果选择同一天
735
+ if (!value && currValue === paneStartVal[0]) {
736
+ startValue = currValue
737
+ endValue = currValue
738
+ } else {
739
+ startValue = paneVals[0]
740
+ if (paneVals[1]) {
741
+ endValue = paneVals[1]
742
+ } else {
743
+ endValue = reactData.selectEdValue
744
+ }
745
+ }
746
+ } else {
747
+ startValue = currValue || XEUtils.last(paneVals)
748
+ }
749
+ reactData.paneEndVal = [startValue, endValue]
750
+ reactData.paneStartVal = [startValue, endValue]
751
+ handleChange(startValue, endValue, $event)
752
+ handleSelectClose()
753
+ if (selectStatus) {
754
+ if (startValue && endValue) {
755
+ internalData.selectStatus = false
756
+ }
757
+ } else {
758
+ internalData.selectStatus = true
759
+ }
760
+ nextTick(() => {
761
+ handleUpdateStartPanelDate()
762
+ })
763
+ }
764
+
765
+ const endPanelChangeEvent = (params: any) => {
766
+ const { paneEndVal } = reactData
767
+ const { selectStatus } = internalData
768
+ const { value, currValue, $event } = params
769
+ const paneVals = value ? (XEUtils.isString(value) ? value.split(',') : [value]) : []
770
+ let startValue = ''
771
+ let endValue = ''
772
+ if (selectStatus) {
773
+ // 如果选择同一天
774
+ if (!value && currValue === paneEndVal[1]) {
775
+ startValue = currValue
776
+ endValue = currValue
777
+ } else {
778
+ endValue = paneVals[0]
779
+ if (paneVals[1]) {
780
+ startValue = paneVals[0]
781
+ endValue = paneVals[1]
782
+ } else {
783
+ startValue = reactData.selectStValue
784
+ }
785
+ }
786
+ } else {
787
+ endValue = currValue || XEUtils.last(paneVals)
788
+ }
789
+ reactData.paneEndVal = [startValue, endValue]
790
+ reactData.paneStartVal = [startValue, endValue]
791
+ handleChange(startValue, endValue, $event)
792
+ handleSelectClose()
793
+ if (selectStatus) {
794
+ if (startValue && endValue) {
795
+ internalData.selectStatus = false
796
+ }
797
+ } else {
798
+ internalData.selectStatus = true
799
+ }
800
+ nextTick(() => {
801
+ handleUpdateEndPanelDate()
802
+ })
803
+ }
804
+
805
+ const handleUpdateStartPanelDate = () => {
806
+ const $startDatePanel = refStartDatePanel.value
807
+ const $endDatePanel = refEndDatePanel.value
808
+ if (!$startDatePanel || !$endDatePanel) {
809
+ return
810
+ }
811
+ const startPanelDate = $startDatePanel.getPanelDate()
812
+ const endPanelDate = $endDatePanel.getPanelDate()
813
+ if (!startPanelDate || !endPanelDate) {
814
+ return
815
+ }
816
+ const viewType = $startDatePanel.getViewType()
817
+ const startYear = startPanelDate.getFullYear()
818
+ const startMonth = startPanelDate.getMonth()
819
+ const endYear = endPanelDate.getFullYear()
820
+ const endMonth = endPanelDate.getMonth()
821
+ switch (viewType) {
822
+ case 'day':
823
+ case 'date':
824
+ case 'week': {
825
+ if (endYear <= startYear && endMonth <= startMonth) {
826
+ $endDatePanel.setPanelDate(getNextMonth(startPanelDate))
827
+ }
828
+ break
829
+ }
830
+ case 'month':
831
+ case 'quarter': {
832
+ if (endYear <= startYear) {
833
+ $endDatePanel.setPanelDate(getNextYear(startPanelDate))
834
+ }
835
+ break
836
+ }
837
+ case 'year': {
838
+ const { computeYearList } = $startDatePanel.getComputeMaps()
839
+ const yearList = computeYearList.value
840
+ if (yearList.some((item) => XEUtils.isDateSame(item.date, endPanelDate, 'yyyy'))) {
841
+ $endDatePanel.setPanelDate(getNextYear(startPanelDate, yearList.length))
842
+ }
843
+ break
844
+ }
845
+ }
846
+ }
847
+
848
+ const startPanelDateBtnChangeEvent: VxeDatePanelEvents.DateToday = () => {
849
+ const { linkedPanels } = props
850
+ const $startDatePanel = refStartDatePanel.value
851
+ const $endDatePanel = refEndDatePanel.value
852
+ if (!$startDatePanel || !$endDatePanel) {
853
+ return
854
+ }
855
+ const startPanelDate = $startDatePanel.getPanelDate()
856
+ const endPanelDate = $endDatePanel.getPanelDate()
857
+ if (!startPanelDate || !endPanelDate) {
858
+ return
859
+ }
860
+ const viewType = $startDatePanel.getViewType()
861
+ if (linkedPanels) {
862
+ switch (viewType) {
863
+ case 'day':
864
+ case 'date':
865
+ case 'week': {
866
+ $endDatePanel.setPanelDate(getNextMonth(startPanelDate))
867
+ break
868
+ }
869
+ case 'month':
870
+ case 'quarter': {
871
+ $endDatePanel.setPanelDate(getNextYear(startPanelDate))
872
+ break
873
+ }
874
+ case 'year': {
875
+ const { computeYearList } = $startDatePanel.getComputeMaps()
876
+ const yearList = computeYearList.value
877
+ $endDatePanel.setPanelDate(getNextYear(startPanelDate, yearList.length))
878
+ break
879
+ }
880
+ }
881
+ } else {
882
+ handleUpdateStartPanelDate()
883
+ }
884
+ }
885
+
886
+ const handleUpdateEndPanelDate = () => {
887
+ const $startDatePanel = refStartDatePanel.value
888
+ const $endDatePanel = refEndDatePanel.value
889
+ if (!$startDatePanel || !$endDatePanel) {
890
+ return
891
+ }
892
+ const startPanelDate = $startDatePanel.getPanelDate()
893
+ const endPanelDate = $endDatePanel.getPanelDate()
894
+ if (!startPanelDate || !endPanelDate) {
895
+ return
896
+ }
897
+ const viewType = $endDatePanel.getViewType()
898
+ const startYear = startPanelDate.getFullYear()
899
+ const startMonth = startPanelDate.getMonth()
900
+ const endYear = endPanelDate.getFullYear()
901
+ const endMonth = endPanelDate.getMonth()
902
+ switch (viewType) {
903
+ case 'day':
904
+ case 'date':
905
+ case 'week': {
906
+ if (startYear >= endYear && startMonth >= endMonth) {
907
+ $startDatePanel.setPanelDate(getPrevMonth(endPanelDate))
908
+ }
909
+ break
910
+ }
911
+ case 'month':
912
+ case 'quarter': {
913
+ if (startYear >= endYear) {
914
+ $startDatePanel.setPanelDate(getPrevYear(endPanelDate))
915
+ }
916
+ break
917
+ }
918
+ case 'year': {
919
+ const { computeYearList } = $endDatePanel.getComputeMaps()
920
+ const yearList = computeYearList.value
921
+ if (yearList.some((item) => XEUtils.isDateSame(item.date, startPanelDate, 'yyyy'))) {
922
+ $startDatePanel.setPanelDate(getPrevYear(endPanelDate, yearList.length))
923
+ }
924
+ break
925
+ }
926
+ }
927
+ }
928
+
929
+ const endPanelDateBtnChangeEvent: VxeDatePanelEvents.DateToday = () => {
930
+ const { linkedPanels } = props
931
+ const $startDatePanel = refStartDatePanel.value
932
+ const $endDatePanel = refEndDatePanel.value
933
+ if (!$startDatePanel || !$endDatePanel) {
934
+ return
935
+ }
936
+ const startPanelDate = $startDatePanel.getPanelDate()
937
+ const endPanelDate = $endDatePanel.getPanelDate()
938
+ if (!startPanelDate || !endPanelDate) {
939
+ return
940
+ }
941
+ const viewType = $endDatePanel.getViewType()
942
+ if (linkedPanels) {
943
+ switch (viewType) {
944
+ case 'day':
945
+ case 'date':
946
+ case 'week': {
947
+ $startDatePanel.setPanelDate(getPrevMonth(endPanelDate))
948
+ break
949
+ }
950
+ case 'month':
951
+ case 'quarter': {
952
+ $startDatePanel.setPanelDate(getPrevYear(endPanelDate))
953
+ break
954
+ }
955
+ case 'year': {
956
+ const { computeYearList } = $endDatePanel.getComputeMaps()
957
+ const yearList = computeYearList.value
958
+ $startDatePanel.setPanelDate(getPrevYear(endPanelDate, yearList.length))
959
+ break
960
+ }
961
+ }
962
+ } else {
963
+ handleUpdateEndPanelDate()
964
+ }
965
+ }
966
+
967
+ // 全局事件
968
+ const handleGlobalMousedownEvent = (evnt: Event) => {
969
+ const { visiblePanel, isActivated } = reactData
970
+ const el = refElem.value
971
+ const panelWrapperElem = refPanelWrapper.value
972
+ const isDisabled = computeIsDisabled.value
973
+ if (!isDisabled && isActivated) {
974
+ reactData.isActivated = getEventTargetNode(evnt, el).flag || getEventTargetNode(evnt, panelWrapperElem).flag
975
+ if (!reactData.isActivated) {
976
+ if (visiblePanel) {
977
+ checkValue()
978
+ hidePanel()
979
+ }
980
+ }
981
+ }
982
+ }
983
+
984
+ const handleGlobalKeydownEvent = (evnt: KeyboardEvent) => {
985
+ const { visiblePanel } = reactData
986
+ const isDisabled = computeIsDisabled.value
987
+ if (!isDisabled) {
988
+ const isTab = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.TAB)
989
+ const isEsc = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ESCAPE)
990
+ if (isTab) {
991
+ reactData.isActivated = false
992
+ }
993
+ if (visiblePanel) {
994
+ if (isEsc || isTab) {
995
+ checkValue()
996
+ hidePanel()
997
+ }
998
+ }
999
+ }
1000
+ }
1001
+
1002
+ const handleGlobalBlurEvent = () => {
1003
+ const { visiblePanel, isActivated } = reactData
1004
+ if (visiblePanel) {
1005
+ checkValue()
1006
+ hidePanel()
1007
+ }
1008
+ if (isActivated) {
1009
+ reactData.isActivated = false
1010
+ }
1011
+ if (visiblePanel || isActivated) {
1012
+ const targetElem = refInputTarget.value
1013
+ if (targetElem) {
1014
+ targetElem.blur()
1015
+ }
1016
+ }
1017
+ }
1018
+
1019
+ const handleGlobalResizeEvent = () => {
1020
+ const { visiblePanel } = reactData
1021
+ if (visiblePanel) {
1022
+ updatePlacement()
1023
+ }
1024
+ }
1025
+
1026
+ const handleGlobalScrollEvent = () => {
1027
+ const { visiblePanel } = reactData
1028
+ if (visiblePanel) {
1029
+ updatePlacement()
1030
+ }
1031
+ }
1032
+
1033
+ // 弹出面板
1034
+ const updateZindex = () => {
1035
+ const popupOpts = computePopupOpts.value
1036
+ const customZIndex = popupOpts.zIndex || props.zIndex
1037
+ if (customZIndex) {
1038
+ reactData.panelIndex = XEUtils.toNumber(customZIndex)
1039
+ } else if (reactData.panelIndex < getLastZIndex()) {
1040
+ reactData.panelIndex = nextZIndex()
1041
+ }
1042
+ }
1043
+
1044
+ const updatePlacement = () => {
1045
+ const { placement } = props
1046
+ const { panelIndex } = reactData
1047
+ const targetElem = refInputTarget.value
1048
+ const panelElem = refInputPanel.value
1049
+ if (!panelElem) {
1050
+ return nextTick()
1051
+ }
1052
+ const btnTransfer = computeBtnTransfer.value
1053
+ const popupOpts = computePopupOpts.value
1054
+ const handleStyle = () => {
1055
+ const ppObj = updatePanelPlacement(targetElem, panelElem, {
1056
+ placement: popupOpts.placement || placement,
1057
+ defaultPlacement: popupOpts.defaultPlacement,
1058
+ appendTo: popupOpts.appendTo,
1059
+ teleportTo: btnTransfer
1060
+ })
1061
+ const panelStyle: { [key: string]: string | number } = Object.assign(ppObj.style, {
1062
+ zIndex: panelIndex
1063
+ })
1064
+ reactData.panelStyle = panelStyle
1065
+ reactData.panelPlacement = ppObj.placement
1066
+ }
1067
+ handleStyle()
1068
+ return nextTick().then(handleStyle)
1069
+ }
1070
+
1071
+ const showPanel = () => {
1072
+ const { visiblePanel } = reactData
1073
+ const isDisabled = computeIsDisabled.value
1074
+ if (!isDisabled && !visiblePanel) {
1075
+ if (!reactData.initialized) {
1076
+ reactData.initialized = true
1077
+ }
1078
+ if (internalData.hpTimeout) {
1079
+ clearTimeout(internalData.hpTimeout)
1080
+ internalData.hpTimeout = undefined
1081
+ }
1082
+ internalData.selectStatus = false
1083
+ reactData.isActivated = true
1084
+ reactData.isAniVisible = true
1085
+ setTimeout(() => {
1086
+ reactData.visiblePanel = true
1087
+ handleUpdateStartPanelDate()
1088
+ updatePlacement()
1089
+ }, 10)
1090
+ updateZindex()
1091
+ return updatePlacement()
1092
+ }
1093
+ return nextTick()
1094
+ }
1095
+
1096
+ const dateRangePickerOpenEvent = (evnt: Event) => {
1097
+ const formReadonly = computeFormReadonly.value
1098
+ if (!formReadonly) {
1099
+ evnt.preventDefault()
1100
+ showPanel()
1101
+ }
1102
+ }
1103
+
1104
+ const clickIconEvent = (evnt: MouseEvent) => {
1105
+ const { visiblePanel } = reactData
1106
+ const popupOpts = computePopupOpts.value
1107
+ const { trigger } = popupOpts
1108
+ if (!trigger || trigger === 'default' || trigger === 'icon') {
1109
+ if (visiblePanel) {
1110
+ hidePanel()
1111
+ } else {
1112
+ dateRangePickerOpenEvent(evnt)
1113
+ }
1114
+ }
1115
+ }
1116
+
1117
+ const clickEvent = (evnt: Event & { type: 'click' }) => {
1118
+ triggerEvent(evnt)
1119
+ }
1120
+
1121
+ const handleShortcutEvent: VxeButtonGroupEvents.Click = ({ option, $event }) => {
1122
+ const { type } = props
1123
+ const shortcutOpts = computeShortcutOpts.value
1124
+ const { autoClose } = shortcutOpts
1125
+ const { code, clickMethod } = option as VxeDateRangePickerDefines.ShortcutOption
1126
+ let startValue = reactData.selectStValue
1127
+ let endValue = reactData.selectEdValue
1128
+ let value = getRangeValue(startValue, endValue)
1129
+ const shortcutParams = {
1130
+ $dateRangePicker: $xeDateRangePicker,
1131
+ option: option,
1132
+ value,
1133
+ startValue,
1134
+ endValue,
1135
+ code
1136
+ }
1137
+ if (!clickMethod && code) {
1138
+ const gCommandOpts = commands.get(code)
1139
+ const drpCommandMethod = gCommandOpts ? gCommandOpts.dateRangePickerCommandMethod : null
1140
+ if (drpCommandMethod) {
1141
+ drpCommandMethod(shortcutParams)
1142
+ } else {
1143
+ const dateValueFormat = computeDateValueFormat.value
1144
+ const firstDayOfWeek = computeFirstDayOfWeek.value
1145
+ switch (code) {
1146
+ case 'last1':
1147
+ case 'last3':
1148
+ case 'last7':
1149
+ case 'last30':
1150
+ case 'last60':
1151
+ case 'last90':
1152
+ case 'last180': {
1153
+ const restObj = getRangeDateByCode(code, value, type, {
1154
+ valueFormat: dateValueFormat,
1155
+ firstDay: firstDayOfWeek
1156
+ })
1157
+ startValue = restObj.startValue
1158
+ endValue = restObj.endValue
1159
+ value = getRangeValue(startValue, endValue)
1160
+ shortcutParams.value = value
1161
+ shortcutParams.startValue = startValue
1162
+ shortcutParams.endValue = endValue
1163
+ handleChange(startValue, endValue, $event)
1164
+ break
1165
+ }
1166
+ default:
1167
+ errLog('vxe.error.notCommands', [code])
1168
+ break
1169
+ }
1170
+ }
1171
+ } else {
1172
+ const optClickMethod = clickMethod || shortcutOpts.clickMethod
1173
+ if (optClickMethod) {
1174
+ optClickMethod(shortcutParams)
1175
+ }
1176
+ }
1177
+ if (autoClose) {
1178
+ hidePanel()
1179
+ }
1180
+ dispatchEvent('shortcut-click', shortcutParams, $event)
1181
+ }
1182
+
1183
+ const dispatchEvent = (type: ValueOf<VxeDateRangePickerEmits>, params: Record<string, any>, evnt: Event | null) => {
1184
+ emit(type, createEvent(evnt, { $dateRangePicker: $xeDateRangePicker }, params))
1185
+ }
1186
+
1187
+ const emitModel = (value: any) => {
1188
+ emit('update:modelValue', value)
1189
+ }
1190
+
1191
+ dateRangePickerMethods = {
1192
+ dispatchEvent,
1193
+
1194
+ setModelValue(startValue, endValue) {
1195
+ reactData.selectStValue = startValue || ''
1196
+ reactData.selectEdValue = endValue || ''
1197
+ const value = getRangeValue(startValue, endValue)
1198
+ emitModel(value)
1199
+ },
1200
+ setModelValueByEvent(evnt, startValue, endValue) {
1201
+ handleChange(startValue || '', endValue || '', evnt)
1202
+ },
1203
+ focus() {
1204
+ const inputElem = refInputTarget.value
1205
+ reactData.isActivated = true
1206
+ inputElem.focus()
1207
+ return nextTick()
1208
+ },
1209
+ blur() {
1210
+ const inputElem = refInputTarget.value
1211
+ inputElem.blur()
1212
+ reactData.isActivated = false
1213
+ return nextTick()
1214
+ },
1215
+ select() {
1216
+ const inputElem = refInputTarget.value
1217
+ inputElem.select()
1218
+ reactData.isActivated = false
1219
+ return nextTick()
1220
+ },
1221
+ showPanel,
1222
+ hidePanel,
1223
+ updatePlacement
1224
+ }
1225
+
1226
+ Object.assign($xeDateRangePicker, dateRangePickerMethods)
1227
+
1228
+ const renderShortcutBtn = (pos: 'top' | 'bottom' | 'left' | 'right' | 'header' | 'footer', isVertical?: boolean) => {
1229
+ const shortcutOpts = computeShortcutOpts.value
1230
+ const { position, align, mode } = shortcutOpts
1231
+ const shortcutList = computeShortcutList.value
1232
+ if (isEnableConf(shortcutOpts) && shortcutList.length && (position || 'left') === pos) {
1233
+ return h(
1234
+ 'div',
1235
+ {
1236
+ class: `vxe-date-range-picker--layout-${pos}-wrapper`
1237
+ },
1238
+ [
1239
+ h(VxeButtonGroupComponent, {
1240
+ options: shortcutList,
1241
+ mode,
1242
+ align,
1243
+ vertical: isVertical,
1244
+ onClick: handleShortcutEvent
1245
+ })
1246
+ ]
1247
+ )
1248
+ }
1249
+ return renderEmptyElement($xeDateRangePicker)
1250
+ }
1251
+
1252
+ const renderPanel = () => {
1253
+ const popupOpts = computePopupOpts.value
1254
+ if (popupOpts.enabled === false) {
1255
+ return renderEmptyElement($xeDateRangePicker)
1256
+ }
1257
+ const { type, separator, autoClose, valueFormat, showConfirmButton, showClearButton } = props
1258
+ const { initialized, isAniVisible, visiblePanel, panelPlacement, panelStyle, selectStValue, selectEdValue, paneStartVal, paneEndVal } = reactData
1259
+ const vSize = computeSize.value
1260
+ const btnTransfer = computeBtnTransfer.value
1261
+ const shortcutOpts = computeShortcutOpts.value
1262
+ const isClearable = computeIsClearable.value
1263
+ const panelLabelObj = computePanelLabelObj.value
1264
+ const shortcutList = computeShortcutList.value
1265
+ const isTimeType = computeIsTimeType.value
1266
+ const isTimeOrDateTimeType = computeIsTimeOrDateTimeType.value
1267
+ const defaultDates = computeDefaultDates.value
1268
+ const defaultTimes = computeDefaultTimes.value
1269
+ const timeOpts = computeTimeOpts.value
1270
+ const { appendTo } = popupOpts
1271
+ const { startLabel, endLabel } = panelLabelObj
1272
+ const { position } = shortcutOpts
1273
+ const headerSlot = slots.header
1274
+ const footerSlot = slots.footer
1275
+ const topSlot = slots.top
1276
+ const bottomSlot = slots.bottom
1277
+ const leftSlot = slots.left
1278
+ const rightSlot = slots.right
1279
+ const ppClassName = popupOpts.className
1280
+ const [sdDate, edDate] = defaultDates
1281
+ const [sdTime, edTime] = defaultTimes
1282
+ const hasShortcutBtn = shortcutList.length > 0
1283
+ const showConfirmBtn = showConfirmButton === null ? isTimeOrDateTimeType || !autoClose : showConfirmButton
1284
+ const showClearBtn = showClearButton === null ? isClearable : showClearButton
1285
+ return h(
1286
+ Teleport,
1287
+ {
1288
+ to: getPopupContainer(appendTo),
1289
+ disabled: btnTransfer ? !initialized : true
1290
+ },
1291
+ [
1292
+ h(
1293
+ 'div',
1294
+ {
1295
+ ref: refInputPanel,
1296
+ class: [
1297
+ 'vxe-table--ignore-clear vxe-date-range-picker--panel',
1298
+ `type--${type}`,
1299
+ ppClassName ? (XEUtils.isFunction(ppClassName) ? ppClassName({ $dateRangePicker: $xeDateRangePicker }) : ppClassName) : '',
1300
+ {
1301
+ [`size--${vSize}`]: vSize,
1302
+ 'is--transfer': btnTransfer,
1303
+ 'ani--leave': isAniVisible,
1304
+ 'ani--enter': visiblePanel,
1305
+ 'show--top': !!(topSlot || headerSlot || (hasShortcutBtn && (position === 'top' || position === 'header'))),
1306
+ 'show--bottom': !!(bottomSlot || footerSlot || (hasShortcutBtn && (position === 'bottom' || position === 'footer'))),
1307
+ 'show--left': !!(leftSlot || (hasShortcutBtn && position === 'left')),
1308
+ 'show--right': !!(rightSlot || (hasShortcutBtn && position === 'right'))
1309
+ }
1310
+ ],
1311
+ placement: panelPlacement,
1312
+ style: panelStyle
1313
+ },
1314
+ initialized && (visiblePanel || isAniVisible)
1315
+ ? [
1316
+ h(
1317
+ 'div',
1318
+ {
1319
+ ref: refPanelWrapper,
1320
+ class: [
1321
+ 'vxe-date-range-picker--layout-all-wrapper',
1322
+ `type--${type}`,
1323
+ {
1324
+ [`size--${vSize}`]: vSize
1325
+ }
1326
+ ]
1327
+ },
1328
+ [
1329
+ topSlot
1330
+ ? h(
1331
+ 'div',
1332
+ {
1333
+ class: 'vxe-date-range-picker--layout-top-wrapper'
1334
+ },
1335
+ topSlot({})
1336
+ )
1337
+ : renderShortcutBtn('top'),
1338
+ h(
1339
+ 'div',
1340
+ {
1341
+ class: 'vxe-date-range-picker--layout-body-layout-wrapper'
1342
+ },
1343
+ [
1344
+ leftSlot
1345
+ ? h(
1346
+ 'div',
1347
+ {
1348
+ class: 'vxe-date-range-picker--layout-left-wrapper'
1349
+ },
1350
+ leftSlot({})
1351
+ )
1352
+ : renderShortcutBtn('left', true),
1353
+ h(
1354
+ 'div',
1355
+ {
1356
+ class: 'vxe-date-range-picker--layout-body-content-wrapper'
1357
+ },
1358
+ [
1359
+ headerSlot
1360
+ ? h(
1361
+ 'div',
1362
+ {
1363
+ class: 'vxe-date-range-picker--layout-header-wrapper'
1364
+ },
1365
+ headerSlot({})
1366
+ )
1367
+ : renderShortcutBtn('header'),
1368
+ h(
1369
+ 'div',
1370
+ {
1371
+ class: 'vxe-date-range-picker--layout-body-wrapper'
1372
+ },
1373
+ [
1374
+ h(VxeDatePanelComponent, {
1375
+ ref: refStartDatePanel,
1376
+ modelValue: paneStartVal,
1377
+ multiple: !isTimeType,
1378
+ valueSort: true,
1379
+ limitCount: 3,
1380
+ defaultMode: 'first',
1381
+ type: props.type,
1382
+ className: props.className,
1383
+ minDate: props.minDate,
1384
+ maxDate: props.maxDate,
1385
+ startDay: props.startDay,
1386
+ labelFormat: props.labelFormat,
1387
+ valueFormat: valueFormat === 'date' || valueFormat === 'timestamp' ? '' : valueFormat,
1388
+ timeFormat: props.timeFormat,
1389
+ defaultDate: sdDate,
1390
+ defaultTime: sdTime,
1391
+ timeConfig: timeOpts,
1392
+ festivalMethod: props.festivalMethod || defaultFuncProps.festivalMethod,
1393
+ disabledMethod: props.disabledMethod || defaultFuncProps.disabledMethod,
1394
+ selectDay: props.selectDay,
1395
+ cellClassName: panelCellClassName,
1396
+ onChange: startPanelChangeEvent,
1397
+ onDatePrev: startPanelDateBtnChangeEvent,
1398
+ onDateToday: startPanelDateBtnChangeEvent,
1399
+ onDateNext: startPanelDateBtnChangeEvent
1400
+ }),
1401
+ h(VxeDatePanelComponent, {
1402
+ ref: refEndDatePanel,
1403
+ modelValue: paneEndVal,
1404
+ multiple: !isTimeType,
1405
+ valueSort: true,
1406
+ limitCount: 3,
1407
+ defaultMode: 'last',
1408
+ type: props.type,
1409
+ className: props.className,
1410
+ minDate: props.minDate,
1411
+ maxDate: props.maxDate,
1412
+ startDay: props.startDay,
1413
+ labelFormat: props.labelFormat,
1414
+ valueFormat: valueFormat === 'date' || valueFormat === 'timestamp' ? '' : valueFormat,
1415
+ timeFormat: props.timeFormat,
1416
+ defaultDate: edDate,
1417
+ defaultTime: edTime,
1418
+ timeConfig: timeOpts,
1419
+ festivalMethod: props.festivalMethod || defaultFuncProps.festivalMethod,
1420
+ disabledMethod: props.disabledMethod || defaultFuncProps.disabledMethod,
1421
+ selectDay: props.selectDay,
1422
+ cellClassName: panelCellClassName,
1423
+ onChange: endPanelChangeEvent,
1424
+ onDatePrev: endPanelDateBtnChangeEvent,
1425
+ onDateToday: endPanelDateBtnChangeEvent,
1426
+ onDateNext: endPanelDateBtnChangeEvent
1427
+ })
1428
+ ]
1429
+ ),
1430
+ h(
1431
+ 'div',
1432
+ {
1433
+ class: 'vxe-date-range-picker--layout-footer-wrapper'
1434
+ },
1435
+ [
1436
+ h(
1437
+ 'div',
1438
+ {
1439
+ class: 'vxe-date-range-picker--layout-footer-label'
1440
+ },
1441
+ startLabel || endLabel ? [h('span', startLabel), h('span', `${separator || ''}`), h('span', endLabel)] : `${separator || ''}`
1442
+ ),
1443
+ h(
1444
+ 'div',
1445
+ {
1446
+ class: 'vxe-date-range-picker--layout-footer-custom'
1447
+ },
1448
+ footerSlot ? footerSlot({}) : [renderShortcutBtn('footer')]
1449
+ ),
1450
+ h(
1451
+ 'div',
1452
+ {
1453
+ class: 'vxe-date-range-picker--layout-footer-btns'
1454
+ },
1455
+ [
1456
+ showClearBtn
1457
+ ? h(VxeButtonComponent, {
1458
+ size: 'mini',
1459
+ disabled: !(selectStValue || selectEdValue),
1460
+ content: getI18n('vxe.button.clear'),
1461
+ onClick: clearValueEvent
1462
+ })
1463
+ : renderEmptyElement($xeDateRangePicker),
1464
+ showConfirmBtn
1465
+ ? h(VxeButtonComponent, {
1466
+ size: 'mini',
1467
+ status: 'primary',
1468
+ content: getI18n('vxe.button.confirm'),
1469
+ onClick: confirmEvent
1470
+ })
1471
+ : renderEmptyElement($xeDateRangePicker)
1472
+ ]
1473
+ )
1474
+ ]
1475
+ )
1476
+ ]
1477
+ ),
1478
+ rightSlot
1479
+ ? h(
1480
+ 'div',
1481
+ {
1482
+ class: 'vxe-date-range-picker--layout-right-wrapper'
1483
+ },
1484
+ rightSlot({})
1485
+ )
1486
+ : renderShortcutBtn('right', true)
1487
+ ]
1488
+ ),
1489
+ bottomSlot
1490
+ ? h(
1491
+ 'div',
1492
+ {
1493
+ class: 'vxe-date-range-picker--layout-bottom-wrapper'
1494
+ },
1495
+ bottomSlot({})
1496
+ )
1497
+ : renderShortcutBtn('bottom')
1498
+ ]
1499
+ )
1500
+ ]
1501
+ : []
1502
+ )
1503
+ ]
1504
+ )
1505
+ }
1506
+
1507
+ const renderPrefixIcon = () => {
1508
+ const { prefixIcon } = props
1509
+ const prefixSlot = slots.prefix
1510
+ return prefixSlot || prefixIcon
1511
+ ? h(
1512
+ 'div',
1513
+ {
1514
+ class: 'vxe-date-range-picker--prefix',
1515
+ onClick: clickPrefixEvent
1516
+ },
1517
+ [
1518
+ h(
1519
+ 'div',
1520
+ {
1521
+ class: 'vxe-date-range-picker--prefix-icon'
1522
+ },
1523
+ prefixSlot
1524
+ ? getSlotVNs(prefixSlot({}))
1525
+ : [
1526
+ h('i', {
1527
+ class: prefixIcon
1528
+ })
1529
+ ]
1530
+ )
1531
+ ]
1532
+ )
1533
+ : null
1534
+ }
1535
+
1536
+ const renderSuffixIcon = () => {
1537
+ const { suffixIcon } = props
1538
+ const { selectStValue, selectEdValue } = reactData
1539
+ const suffixSlot = slots.suffix
1540
+ const isDisabled = computeIsDisabled.value
1541
+ const isClearable = computeIsClearable.value
1542
+ return h(
1543
+ 'div',
1544
+ {
1545
+ class: [
1546
+ 'vxe-date-range-picker--suffix',
1547
+ {
1548
+ 'is--clear': isClearable && !isDisabled && (selectStValue || selectEdValue)
1549
+ }
1550
+ ]
1551
+ },
1552
+ [
1553
+ isClearable
1554
+ ? h(
1555
+ 'div',
1556
+ {
1557
+ class: 'vxe-date-range-picker--clear-icon',
1558
+ onClick: clearValueEvent
1559
+ },
1560
+ [
1561
+ h('i', {
1562
+ class: getIcon().INPUT_CLEAR
1563
+ })
1564
+ ]
1565
+ )
1566
+ : renderEmptyElement($xeDateRangePicker),
1567
+ renderExtraSuffixIcon(),
1568
+ suffixSlot || suffixIcon
1569
+ ? h(
1570
+ 'div',
1571
+ {
1572
+ class: 'vxe-date-range-picker--suffix-icon',
1573
+ onClick: clickSuffixEvent
1574
+ },
1575
+ suffixSlot
1576
+ ? getSlotVNs(suffixSlot({}))
1577
+ : [
1578
+ h('i', {
1579
+ class: suffixIcon
1580
+ })
1581
+ ]
1582
+ )
1583
+ : renderEmptyElement($xeDateRangePicker)
1584
+ ]
1585
+ )
1586
+ }
1587
+
1588
+ const renderExtraSuffixIcon = () => {
1589
+ return h(
1590
+ 'div',
1591
+ {
1592
+ class: 'vxe-date-range-picker--control-icon',
1593
+ onClick: clickIconEvent
1594
+ },
1595
+ [
1596
+ h('i', {
1597
+ class: ['vxe-date-range-picker--date-picker-icon', getIcon().DATE_PICKER_DATE]
1598
+ })
1599
+ ]
1600
+ )
1601
+ }
1602
+
1603
+ const renderVN = () => {
1604
+ const { className, inputClassName, type, name, autoComplete } = props
1605
+ const { selectStValue, selectEdValue, visiblePanel, isActivated } = reactData
1606
+ const vSize = computeSize.value
1607
+ const isDisabled = computeIsDisabled.value
1608
+ const formReadonly = computeFormReadonly.value
1609
+ const inputLabel = computeInputLabel.value
1610
+ if (formReadonly) {
1611
+ return h(
1612
+ 'div',
1613
+ {
1614
+ ref: refElem,
1615
+ class: ['vxe-date-range-picker--readonly', `type--${type}`, className]
1616
+ },
1617
+ inputLabel
1618
+ )
1619
+ }
1620
+ const currStyle = computeCurrStyle.value
1621
+ const inpPlaceholder = computeInpPlaceholder.value
1622
+ const isClearable = computeIsClearable.value
1623
+ const prefix = renderPrefixIcon()
1624
+ const suffix = renderSuffixIcon()
1625
+ return h(
1626
+ 'div',
1627
+ {
1628
+ ref: refElem,
1629
+ class: [
1630
+ 'vxe-date-range-picker',
1631
+ `type--${type}`,
1632
+ className,
1633
+ {
1634
+ [`size--${vSize}`]: vSize,
1635
+ 'is--prefix': !!prefix,
1636
+ 'is--suffix': !!suffix,
1637
+ 'is--visible': visiblePanel,
1638
+ 'is--disabled': isDisabled,
1639
+ 'is--active': isActivated,
1640
+ 'show--clear': isClearable && !isDisabled && (selectStValue || selectEdValue)
1641
+ }
1642
+ ],
1643
+ style: currStyle,
1644
+ spellcheck: false
1645
+ },
1646
+ [
1647
+ prefix || renderEmptyElement($xeDateRangePicker),
1648
+ h(
1649
+ 'div',
1650
+ {
1651
+ class: 'vxe-date-range-picker--wrapper'
1652
+ },
1653
+ [
1654
+ h('input', {
1655
+ ref: refInputTarget,
1656
+ class: 'vxe-date-range-picker--inner' + (inputClassName ? ' ' + inputClassName : ''),
1657
+ value: inputLabel,
1658
+ name,
1659
+ type: 'text',
1660
+ placeholder: inpPlaceholder,
1661
+ editable: false,
1662
+ disabled: isDisabled,
1663
+ autocomplete: autoComplete,
1664
+ onKeydown: keydownEvent,
1665
+ onKeyup: keyupEvent,
1666
+ onClick: clickEvent,
1667
+ onChange: changeEvent,
1668
+ onFocus: focusEvent,
1669
+ onBlur: blurEvent
1670
+ })
1671
+ ]
1672
+ ),
1673
+ suffix || renderEmptyElement($xeDateRangePicker),
1674
+ // 下拉面板
1675
+ renderPanel()
1676
+ ]
1677
+ )
1678
+ }
1679
+
1680
+ watch(
1681
+ () => props.modelValue,
1682
+ () => {
1683
+ updateModelValue(true)
1684
+ }
1685
+ )
1686
+
1687
+ watch(computeMVal, () => {
1688
+ updateModelValue(false)
1689
+ })
1690
+
1691
+ updateModelValue(true)
1692
+
1693
+ nextTick(() => {
1694
+ globalEvents.on($xeDateRangePicker, 'mousedown', handleGlobalMousedownEvent)
1695
+ globalEvents.on($xeDateRangePicker, 'keydown', handleGlobalKeydownEvent)
1696
+ globalEvents.on($xeDateRangePicker, 'blur', handleGlobalBlurEvent)
1697
+ globalEvents.on($xeDateRangePicker, 'resize', handleGlobalResizeEvent)
1698
+ globalEvents.on($xeDateRangePicker, 'scroll', handleGlobalScrollEvent)
1699
+ })
1700
+
1701
+ onDeactivated(() => {
1702
+ checkValue()
1703
+ })
1704
+
1705
+ onBeforeUnmount(() => {
1706
+ checkValue()
1707
+ })
1708
+
1709
+ onUnmounted(() => {
1710
+ globalEvents.off($xeDateRangePicker, 'mousedown')
1711
+ globalEvents.off($xeDateRangePicker, 'keydown')
1712
+ globalEvents.off($xeDateRangePicker, 'blur')
1713
+ globalEvents.off($xeDateRangePicker, 'resize')
1714
+ globalEvents.off($xeDateRangePicker, 'scroll')
1715
+ XEUtils.assign(reactData, createReactData())
1716
+ XEUtils.assign(internalData, createInternalData())
1717
+ })
1718
+
1719
+ provide('$xeDateRangePicker', $xeDateRangePicker)
1720
+
1721
+ $xeDateRangePicker.renderVN = renderVN
1722
+
1723
+ return $xeDateRangePicker
1724
+ },
1725
+ render() {
1726
+ return this.renderVN()
1727
+ }
1728
+ })