vxe-pc-ui 4.14.4 → 4.14.6

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 (480) hide show
  1. package/LICENSE +21 -21
  2. package/README.en.md +72 -72
  3. package/README.ja-JP.md +72 -72
  4. package/README.md +364 -364
  5. package/README.zh-TW.md +73 -73
  6. package/es/tree/src/tree.js +31 -2
  7. package/es/tree-select/src/tree-select.js +2 -0
  8. package/es/ui/index.js +1 -1
  9. package/es/ui/src/log.js +1 -1
  10. package/lib/index.umd.js +2359 -2257
  11. package/lib/index.umd.min.js +1 -1
  12. package/lib/tree/src/tree.js +27 -2
  13. package/lib/tree/src/tree.min.js +1 -1
  14. package/lib/tree-select/src/tree-select.js +2 -0
  15. package/lib/tree-select/src/tree-select.min.js +1 -1
  16. package/lib/ui/index.js +1 -1
  17. package/lib/ui/index.min.js +1 -1
  18. package/lib/ui/src/log.js +1 -1
  19. package/lib/ui/src/log.min.js +1 -1
  20. package/package.json +88 -88
  21. package/packages/alert/index.ts +16 -16
  22. package/packages/alert/src/alert.ts +124 -124
  23. package/packages/anchor/index.ts +16 -16
  24. package/packages/anchor/src/anchor-link.ts +121 -121
  25. package/packages/anchor/src/anchor.ts +237 -237
  26. package/packages/anchor/src/util.ts +23 -23
  27. package/packages/anchor-link/index.ts +16 -16
  28. package/packages/avatar/index.ts +16 -16
  29. package/packages/avatar/src/avatar.ts +149 -149
  30. package/packages/backtop/index.ts +16 -16
  31. package/packages/backtop/src/backtop.ts +314 -314
  32. package/packages/badge/index.ts +16 -16
  33. package/packages/badge/src/badge.ts +100 -100
  34. package/packages/breadcrumb/index.ts +16 -16
  35. package/packages/breadcrumb/src/breadcrumb-item.ts +106 -106
  36. package/packages/breadcrumb/src/breadcrumb.ts +92 -92
  37. package/packages/breadcrumb-item/index.ts +16 -16
  38. package/packages/button/index.ts +16 -16
  39. package/packages/button/src/button-group.ts +110 -110
  40. package/packages/button/src/button.ts +841 -841
  41. package/packages/button-group/index.ts +16 -16
  42. package/packages/calendar/index.ts +16 -16
  43. package/packages/calendar/src/calendar.ts +1351 -1351
  44. package/packages/card/index.ts +16 -16
  45. package/packages/card/src/card.ts +175 -175
  46. package/packages/carousel/index.ts +16 -16
  47. package/packages/carousel/src/carousel-item.ts +102 -102
  48. package/packages/carousel/src/carousel.ts +414 -414
  49. package/packages/carousel/src/util.ts +21 -21
  50. package/packages/carousel-item/index.ts +16 -16
  51. package/packages/cascader/index.ts +16 -16
  52. package/packages/cascader/src/cascader.ts +741 -741
  53. package/packages/checkbox/index.ts +16 -16
  54. package/packages/checkbox/src/button.ts +144 -144
  55. package/packages/checkbox/src/checkbox.ts +154 -154
  56. package/packages/checkbox/src/group.ts +222 -222
  57. package/packages/checkbox-button/index.ts +16 -16
  58. package/packages/checkbox-group/index.ts +16 -16
  59. package/packages/col/index.ts +16 -16
  60. package/packages/collapse/index.ts +16 -16
  61. package/packages/collapse/src/collapse-pane.ts +114 -114
  62. package/packages/collapse/src/collapse.ts +284 -284
  63. package/packages/collapse/src/util.ts +21 -21
  64. package/packages/collapse-pane/index.ts +16 -16
  65. package/packages/color-picker/index.ts +16 -16
  66. package/packages/color-picker/src/color-picker.ts +1109 -1109
  67. package/packages/color-picker/src/util.ts +198 -198
  68. package/packages/components.ts +307 -307
  69. package/packages/context-menu/index.ts +54 -54
  70. package/packages/context-menu/src/context-menu.ts +681 -681
  71. package/packages/countdown/index.ts +16 -16
  72. package/packages/countdown/src/countdown.ts +262 -262
  73. package/packages/date-panel/index.ts +16 -16
  74. package/packages/date-panel/src/date-panel.ts +1809 -1809
  75. package/packages/date-panel/src/util.ts +244 -244
  76. package/packages/date-picker/index.ts +16 -16
  77. package/packages/date-picker/src/date-picker.ts +1071 -1071
  78. package/packages/date-range-picker/index.ts +16 -16
  79. package/packages/date-range-picker/src/date-range-picker.ts +1280 -1280
  80. package/packages/drawer/index.ts +77 -77
  81. package/packages/drawer/src/drawer.ts +657 -657
  82. package/packages/dynamics/index.ts +89 -89
  83. package/packages/empty/index.ts +16 -16
  84. package/packages/empty/src/empty.ts +100 -100
  85. package/packages/form/index.ts +16 -16
  86. package/packages/form/render/index.ts +598 -598
  87. package/packages/form/src/form-config-item.ts +72 -72
  88. package/packages/form/src/form-group.ts +86 -86
  89. package/packages/form/src/form-item.ts +174 -174
  90. package/packages/form/src/form.ts +987 -987
  91. package/packages/form/src/itemInfo.ts +80 -80
  92. package/packages/form/src/render.ts +387 -387
  93. package/packages/form/src/util.ts +93 -93
  94. package/packages/form-gather/index.ts +26 -26
  95. package/packages/form-group/index.ts +16 -16
  96. package/packages/form-item/index.ts +16 -16
  97. package/packages/icon/index.ts +16 -16
  98. package/packages/icon/src/icon.ts +75 -75
  99. package/packages/icon-picker/index.ts +16 -16
  100. package/packages/icon-picker/src/icon-picker.ts +626 -626
  101. package/packages/image/index.ts +16 -16
  102. package/packages/image/src/group.ts +153 -153
  103. package/packages/image/src/image.ts +298 -298
  104. package/packages/image/src/preview.ts +672 -672
  105. package/packages/image/src/util.ts +59 -59
  106. package/packages/image-group/index.ts +16 -16
  107. package/packages/image-preview/index.ts +19 -19
  108. package/packages/index.ts +4 -4
  109. package/packages/input/index.ts +16 -16
  110. package/packages/input/src/input.ts +2788 -2788
  111. package/packages/language/ar-EG.ts +840 -840
  112. package/packages/language/de-DE.ts +840 -840
  113. package/packages/language/en-US.ts +840 -840
  114. package/packages/language/es-ES.ts +840 -840
  115. package/packages/language/fr-FR.ts +840 -840
  116. package/packages/language/hu-HU.ts +840 -840
  117. package/packages/language/hy-AM.ts +840 -840
  118. package/packages/language/id-ID.ts +840 -840
  119. package/packages/language/it-IT.ts +840 -840
  120. package/packages/language/ja-JP.ts +840 -840
  121. package/packages/language/ko-KR.ts +840 -840
  122. package/packages/language/ms-MY.ts +840 -840
  123. package/packages/language/nb-NO.ts +840 -840
  124. package/packages/language/pt-BR.ts +840 -840
  125. package/packages/language/ru-RU.ts +840 -840
  126. package/packages/language/th-TH.ts +840 -840
  127. package/packages/language/ug-CN.ts +840 -840
  128. package/packages/language/uk-UA.ts +840 -840
  129. package/packages/language/uz-UZ.ts +840 -840
  130. package/packages/language/vi-VN.ts +840 -840
  131. package/packages/language/zh-CHT.ts +840 -840
  132. package/packages/language/zh-CN.ts +840 -840
  133. package/packages/language/zh-HK.ts +3 -3
  134. package/packages/language/zh-MO.ts +3 -3
  135. package/packages/language/zh-TC.ts +3 -3
  136. package/packages/language/zh-TW.ts +3 -3
  137. package/packages/layout-aside/index.ts +16 -16
  138. package/packages/layout-aside/src/layout-aside.ts +123 -123
  139. package/packages/layout-body/index.ts +16 -16
  140. package/packages/layout-body/src/layout-body.ts +142 -142
  141. package/packages/layout-container/index.ts +16 -16
  142. package/packages/layout-container/src/layout-container.ts +82 -82
  143. package/packages/layout-footer/index.ts +16 -16
  144. package/packages/layout-footer/src/layout-footer.ts +74 -74
  145. package/packages/layout-header/index.ts +16 -16
  146. package/packages/layout-header/src/layout-header.ts +73 -73
  147. package/packages/link/index.ts +16 -16
  148. package/packages/link/src/link.ts +161 -161
  149. package/packages/list/index.ts +16 -16
  150. package/packages/list/src/list.ts +442 -442
  151. package/packages/loading/index.ts +34 -34
  152. package/packages/loading/src/loading.ts +152 -152
  153. package/packages/mention/index.ts +16 -16
  154. package/packages/mention/src/mention.ts +71 -71
  155. package/packages/menu/index.ts +16 -16
  156. package/packages/menu/src/menu.ts +581 -581
  157. package/packages/modal/index.ts +136 -136
  158. package/packages/modal/src/modal.ts +1494 -1494
  159. package/packages/notice-bar/index.ts +16 -16
  160. package/packages/notice-bar/src/notice-bar.ts +181 -181
  161. package/packages/number-input/index.ts +16 -16
  162. package/packages/number-input/src/number-input.ts +1096 -1096
  163. package/packages/number-input/src/util.ts +12 -12
  164. package/packages/optgroup/index.ts +16 -16
  165. package/packages/option/index.ts +16 -16
  166. package/packages/pager/index.ts +16 -16
  167. package/packages/pager/src/pager.ts +769 -769
  168. package/packages/password-input/index.ts +16 -16
  169. package/packages/password-input/src/password-input.ts +378 -378
  170. package/packages/print/index.ts +18 -18
  171. package/packages/print/src/page-break.ts +92 -92
  172. package/packages/print/src/print.ts +272 -272
  173. package/packages/print/src/util.ts +284 -284
  174. package/packages/print-page-break/index.ts +16 -16
  175. package/packages/pulldown/index.ts +16 -16
  176. package/packages/pulldown/src/pulldown.ts +457 -457
  177. package/packages/radio/index.ts +16 -16
  178. package/packages/radio/src/button.ts +173 -173
  179. package/packages/radio/src/group.ts +213 -213
  180. package/packages/radio/src/radio.ts +180 -180
  181. package/packages/radio-button/index.ts +16 -16
  182. package/packages/radio-group/index.ts +16 -16
  183. package/packages/rate/index.ts +16 -16
  184. package/packages/rate/src/rate.ts +192 -192
  185. package/packages/result/index.ts +16 -16
  186. package/packages/result/src/result.ts +112 -112
  187. package/packages/row/index.ts +16 -16
  188. package/packages/row/src/col.ts +136 -136
  189. package/packages/row/src/row.ts +119 -119
  190. package/packages/segmented/index.ts +16 -16
  191. package/packages/segmented/src/segmented.ts +264 -264
  192. package/packages/select/index.ts +16 -16
  193. package/packages/select/src/optgroup.ts +49 -49
  194. package/packages/select/src/option-info.ts +20 -20
  195. package/packages/select/src/option.ts +47 -47
  196. package/packages/select/src/select.ts +1699 -1699
  197. package/packages/select/src/util.ts +47 -47
  198. package/packages/slider/index.ts +16 -16
  199. package/packages/slider/src/slider.ts +304 -304
  200. package/packages/split/index.ts +16 -16
  201. package/packages/split-pane/index.ts +17 -17
  202. package/packages/splitter/index.ts +16 -16
  203. package/packages/splitter/src/splitter-panel.ts +145 -145
  204. package/packages/splitter/src/splitter.ts +1009 -1009
  205. package/packages/splitter/src/util.ts +21 -21
  206. package/packages/splitter-panel/index.ts +16 -16
  207. package/packages/steps/index.ts +16 -16
  208. package/packages/steps/src/steps.ts +68 -68
  209. package/packages/switch/index.ts +16 -16
  210. package/packages/switch/src/switch.ts +237 -237
  211. package/packages/tab-pane/index.ts +16 -16
  212. package/packages/table-select/index.ts +16 -16
  213. package/packages/table-select/src/table-select.ts +800 -800
  214. package/packages/tabs/index.ts +16 -16
  215. package/packages/tabs/src/tab-pane.ts +117 -117
  216. package/packages/tabs/src/tabs.ts +940 -940
  217. package/packages/tabs/src/util.ts +21 -21
  218. package/packages/tag/index.ts +16 -16
  219. package/packages/tag/src/tag.ts +187 -187
  220. package/packages/text/index.ts +16 -16
  221. package/packages/text/src/text.ts +260 -260
  222. package/packages/text-ellipsis/index.ts +16 -16
  223. package/packages/text-ellipsis/src/text-ellipsis.ts +282 -282
  224. package/packages/textarea/index.ts +16 -16
  225. package/packages/textarea/src/textarea.ts +373 -373
  226. package/packages/timeline/index.ts +16 -16
  227. package/packages/timeline/src/timeline-item.ts +67 -67
  228. package/packages/timeline/src/timeline.ts +71 -71
  229. package/packages/timeline-item/index.ts +16 -16
  230. package/packages/tip/index.ts +19 -19
  231. package/packages/tip/src/tip.ts +129 -129
  232. package/packages/tooltip/index.ts +16 -16
  233. package/packages/tooltip/src/tooltip.ts +589 -589
  234. package/packages/tour/index.ts +16 -16
  235. package/packages/tour/src/tour.ts +71 -71
  236. package/packages/tree/index.ts +16 -16
  237. package/packages/tree/src/store.ts +14 -14
  238. package/packages/tree/src/tree.ts +2825 -2795
  239. package/packages/tree/src/util.ts +45 -45
  240. package/packages/tree-select/index.ts +16 -16
  241. package/packages/tree-select/src/tree-select.ts +979 -977
  242. package/packages/ui/index.ts +697 -697
  243. package/packages/ui/src/anime.ts +52 -52
  244. package/packages/ui/src/comp.ts +3 -3
  245. package/packages/ui/src/dom.ts +279 -279
  246. package/packages/ui/src/log.ts +6 -6
  247. package/packages/ui/src/utils.ts +49 -49
  248. package/packages/ui/src/vn.ts +39 -39
  249. package/packages/upload/index.ts +20 -20
  250. package/packages/upload/src/upload.ts +1919 -1919
  251. package/packages/upload/src/util.ts +109 -109
  252. package/packages/watermark/index.ts +31 -31
  253. package/packages/watermark/src/util.ts +176 -176
  254. package/packages/watermark/src/watermark.ts +168 -168
  255. package/styles/all.scss +90 -90
  256. package/styles/base.scss +16 -16
  257. package/styles/components/alert.scss +101 -101
  258. package/styles/components/anchor.scss +44 -44
  259. package/styles/components/avatar.scss +115 -115
  260. package/styles/components/backtop.scss +82 -82
  261. package/styles/components/badge.scss +45 -45
  262. package/styles/components/breadcrumb.scss +29 -29
  263. package/styles/components/button-group.scss +30 -30
  264. package/styles/components/button.scss +415 -415
  265. package/styles/components/calendar.scss +471 -471
  266. package/styles/components/card.scss +121 -121
  267. package/styles/components/carousel.scss +184 -184
  268. package/styles/components/cascader.scss +140 -140
  269. package/styles/components/checkbox-button.scss +57 -57
  270. package/styles/components/checkbox.scss +81 -81
  271. package/styles/components/collapse.scss +56 -56
  272. package/styles/components/color-picker.scss +409 -409
  273. package/styles/components/context-menu.scss +102 -102
  274. package/styles/components/countdown.scss +35 -35
  275. package/styles/components/date-panel.scss +505 -505
  276. package/styles/components/date-picker.scss +247 -247
  277. package/styles/components/date-range-picker.scss +252 -252
  278. package/styles/components/drawer.scss +298 -298
  279. package/styles/components/empty.scss +79 -79
  280. package/styles/components/form.scss +668 -668
  281. package/styles/components/icon-picker.scss +211 -211
  282. package/styles/components/icon.scss +1048 -1048
  283. package/styles/components/image-group.scss +2 -2
  284. package/styles/components/image-preview.scss +215 -215
  285. package/styles/components/image.scss +16 -16
  286. package/styles/components/input.scss +846 -846
  287. package/styles/components/layout-aside.scss +22 -22
  288. package/styles/components/layout-body.scss +14 -14
  289. package/styles/components/layout-container.scss +13 -13
  290. package/styles/components/layout-footer.scss +14 -14
  291. package/styles/components/layout-header.scss +11 -11
  292. package/styles/components/link.scss +115 -115
  293. package/styles/components/list.scss +40 -40
  294. package/styles/components/loading.scss +137 -137
  295. package/styles/components/menu.scss +150 -150
  296. package/styles/components/modal.scss +480 -480
  297. package/styles/components/notice-bar.scss +91 -91
  298. package/styles/components/number-input.scss +283 -283
  299. package/styles/components/old-icon.scss +4 -4
  300. package/styles/components/pager.scss +282 -282
  301. package/styles/components/password-input.scss +374 -374
  302. package/styles/components/print.scss +3 -3
  303. package/styles/components/pulldown.scss +75 -75
  304. package/styles/components/radio-button.scss +57 -57
  305. package/styles/components/radio.scss +79 -79
  306. package/styles/components/rate.scss +76 -76
  307. package/styles/components/result.scss +91 -91
  308. package/styles/components/row.scss +69 -69
  309. package/styles/components/segmented.scss +215 -215
  310. package/styles/components/select.scss +244 -244
  311. package/styles/components/slider.scss +139 -139
  312. package/styles/components/split.scss +1 -1
  313. package/styles/components/splitter.scss +318 -318
  314. package/styles/components/switch.scss +128 -128
  315. package/styles/components/table-select.scss +105 -105
  316. package/styles/components/tabs.scss +745 -745
  317. package/styles/components/tag.scss +184 -184
  318. package/styles/components/text-ellipsis.scss +130 -130
  319. package/styles/components/text.scss +123 -123
  320. package/styles/components/textarea.scss +106 -106
  321. package/styles/components/tip.scss +97 -97
  322. package/styles/components/tooltip.scss +141 -141
  323. package/styles/components/tree-select.scss +166 -166
  324. package/styles/components/tree.scss +294 -294
  325. package/styles/components/upload.scss +497 -497
  326. package/styles/components/watermark.scss +26 -26
  327. package/styles/helpers/baseMixin.scss +95 -95
  328. package/styles/helpers/baseVar.scss +3 -3
  329. package/styles/helpers/placement.scss +38 -38
  330. package/styles/theme/base.scss +214 -214
  331. package/styles/theme/dark.scss +119 -119
  332. package/styles/theme/light.scss +118 -118
  333. package/styles/variable.scss +111 -111
  334. package/types/all.d.ts +327 -327
  335. package/types/components/alert.d.ts +87 -87
  336. package/types/components/anchor-link.d.ts +91 -91
  337. package/types/components/anchor.d.ts +104 -104
  338. package/types/components/avatar.d.ts +88 -88
  339. package/types/components/backtop.d.ts +122 -122
  340. package/types/components/badge.d.ts +76 -76
  341. package/types/components/breadcrumb-item.d.ts +80 -80
  342. package/types/components/breadcrumb.d.ts +87 -87
  343. package/types/components/button-group.d.ts +120 -120
  344. package/types/components/button.d.ts +323 -323
  345. package/types/components/calendar.d.ts +264 -264
  346. package/types/components/card.d.ts +93 -93
  347. package/types/components/carousel-item.d.ts +75 -75
  348. package/types/components/carousel.d.ts +134 -134
  349. package/types/components/cascader.d.ts +263 -263
  350. package/types/components/checkbox-button.d.ts +103 -103
  351. package/types/components/checkbox-group.d.ts +143 -143
  352. package/types/components/checkbox.d.ts +123 -123
  353. package/types/components/col.d.ts +80 -80
  354. package/types/components/colgroup.d.ts +137 -137
  355. package/types/components/collapse-pane.d.ts +89 -89
  356. package/types/components/collapse.d.ts +121 -121
  357. package/types/components/color-picker.d.ts +176 -176
  358. package/types/components/column.d.ts +841 -841
  359. package/types/components/context-menu.d.ts +289 -289
  360. package/types/components/countdown.d.ts +112 -112
  361. package/types/components/date-panel.d.ts +280 -280
  362. package/types/components/date-picker.d.ts +332 -332
  363. package/types/components/date-range-picker.d.ts +352 -352
  364. package/types/components/drawer.d.ts +299 -299
  365. package/types/components/empty.d.ts +78 -78
  366. package/types/components/flow-design.d.ts +85 -85
  367. package/types/components/flow-view.d.ts +85 -85
  368. package/types/components/form-design.d.ts +376 -376
  369. package/types/components/form-gather.d.ts +124 -124
  370. package/types/components/form-group.d.ts +77 -77
  371. package/types/components/form-item.d.ts +411 -411
  372. package/types/components/form-view.d.ts +183 -183
  373. package/types/components/form.d.ts +468 -468
  374. package/types/components/gantt-module/gantt-view.d.ts +177 -177
  375. package/types/components/gantt-module/index.d.ts +1 -1
  376. package/types/components/gantt-plugins/extend-gantt-chart.d.ts +131 -131
  377. package/types/components/gantt-plugins/index.d.ts +1 -1
  378. package/types/components/gantt.d.ts +1194 -1185
  379. package/types/components/grid.d.ts +1040 -1040
  380. package/types/components/icon-picker.d.ts +196 -196
  381. package/types/components/icon.d.ts +87 -87
  382. package/types/components/image-group.d.ts +127 -127
  383. package/types/components/image-preview.d.ts +167 -167
  384. package/types/components/image.d.ts +173 -173
  385. package/types/components/input.d.ts +435 -435
  386. package/types/components/layout-aside.d.ts +80 -80
  387. package/types/components/layout-body.d.ts +91 -91
  388. package/types/components/layout-container.d.ts +73 -73
  389. package/types/components/layout-footer.d.ts +73 -73
  390. package/types/components/layout-header.d.ts +69 -69
  391. package/types/components/link.d.ts +111 -111
  392. package/types/components/list-design.d.ts +190 -190
  393. package/types/components/list-view.d.ts +199 -199
  394. package/types/components/list.d.ts +204 -204
  395. package/types/components/loading.d.ts +103 -103
  396. package/types/components/mention.d.ts +77 -77
  397. package/types/components/menu.d.ts +211 -211
  398. package/types/components/modal.d.ts +542 -542
  399. package/types/components/notice-bar.d.ts +102 -102
  400. package/types/components/number-input.d.ts +309 -309
  401. package/types/components/optgroup.d.ts +88 -88
  402. package/types/components/option.d.ts +103 -103
  403. package/types/components/pager.d.ts +335 -335
  404. package/types/components/password-input.d.ts +142 -142
  405. package/types/components/print-page-break.d.ts +69 -69
  406. package/types/components/print.d.ts +206 -206
  407. package/types/components/pulldown.d.ts +231 -231
  408. package/types/components/radio-button.d.ts +114 -114
  409. package/types/components/radio-group.d.ts +144 -144
  410. package/types/components/radio.d.ts +129 -129
  411. package/types/components/rate.d.ts +88 -88
  412. package/types/components/result.d.ts +84 -84
  413. package/types/components/row.d.ts +79 -79
  414. package/types/components/segmented.d.ts +123 -123
  415. package/types/components/select.d.ts +527 -527
  416. package/types/components/slider.d.ts +126 -126
  417. package/types/components/split-pane.d.ts +133 -133
  418. package/types/components/split.d.ts +312 -312
  419. package/types/components/splitter-panel.d.ts +105 -105
  420. package/types/components/splitter.d.ts +288 -288
  421. package/types/components/steps.d.ts +68 -68
  422. package/types/components/switch.d.ts +133 -133
  423. package/types/components/tab-pane.d.ts +114 -114
  424. package/types/components/table-module/custom.d.ts +123 -123
  425. package/types/components/table-module/edit.d.ts +243 -243
  426. package/types/components/table-module/export.d.ts +96 -96
  427. package/types/components/table-module/filter.d.ts +140 -140
  428. package/types/components/table-module/index.d.ts +7 -7
  429. package/types/components/table-module/keyboard.d.ts +26 -26
  430. package/types/components/table-module/menu.d.ts +28 -28
  431. package/types/components/table-module/validator.d.ts +53 -53
  432. package/types/components/table-plugins/extend-cell-area.d.ts +770 -770
  433. package/types/components/table-plugins/extend-pivot-table.d.ts +58 -58
  434. package/types/components/table-plugins/filters-combination.d.ts +15 -15
  435. package/types/components/table-plugins/filters-complex-input.d.ts +9 -9
  436. package/types/components/table-plugins/index.d.ts +4 -4
  437. package/types/components/table-select.d.ts +219 -219
  438. package/types/components/table.d.ts +7465 -7465
  439. package/types/components/tabs.d.ts +332 -332
  440. package/types/components/tag.d.ts +114 -114
  441. package/types/components/text-ellipsis.d.ts +112 -112
  442. package/types/components/text.d.ts +122 -122
  443. package/types/components/textarea.d.ts +247 -247
  444. package/types/components/timeline-item.d.ts +75 -75
  445. package/types/components/timeline.d.ts +77 -77
  446. package/types/components/tip.d.ts +83 -83
  447. package/types/components/toolbar.d.ts +336 -336
  448. package/types/components/tooltip.d.ts +180 -180
  449. package/types/components/tour.d.ts +77 -77
  450. package/types/components/tree-select.d.ts +310 -310
  451. package/types/components/tree.d.ts +843 -833
  452. package/types/components/upload.d.ts +437 -437
  453. package/types/components/watermark.d.ts +120 -120
  454. package/types/handles/form-design.d.ts +50 -50
  455. package/types/handles/index.d.ts +3 -3
  456. package/types/handles/list-design.d.ts +2 -2
  457. package/types/handles/table.d.ts +15 -15
  458. package/types/index.d.ts +8 -8
  459. package/types/ui/commands.d.ts +57 -57
  460. package/types/ui/formats.d.ts +62 -62
  461. package/types/ui/global-config.d.ts +254 -254
  462. package/types/ui/global-icon.d.ts +292 -292
  463. package/types/ui/hooks.d.ts +13 -13
  464. package/types/ui/index.d.ts +96 -96
  465. package/types/ui/interceptor.d.ts +52 -52
  466. package/types/ui/menus.d.ts +77 -77
  467. package/types/ui/renderer.d.ts +1041 -1041
  468. package/types/ui/validators.d.ts +38 -38
  469. /package/es/icon/{iconfont.1778169084473.ttf → iconfont.1778317220469.ttf} +0 -0
  470. /package/es/icon/{iconfont.1778169084473.woff → iconfont.1778317220469.woff} +0 -0
  471. /package/es/icon/{iconfont.1778169084473.woff2 → iconfont.1778317220469.woff2} +0 -0
  472. /package/es/{iconfont.1778169084473.ttf → iconfont.1778317220469.ttf} +0 -0
  473. /package/es/{iconfont.1778169084473.woff → iconfont.1778317220469.woff} +0 -0
  474. /package/es/{iconfont.1778169084473.woff2 → iconfont.1778317220469.woff2} +0 -0
  475. /package/lib/icon/style/{iconfont.1778169084473.ttf → iconfont.1778317220469.ttf} +0 -0
  476. /package/lib/icon/style/{iconfont.1778169084473.woff → iconfont.1778317220469.woff} +0 -0
  477. /package/lib/icon/style/{iconfont.1778169084473.woff2 → iconfont.1778317220469.woff2} +0 -0
  478. /package/lib/{iconfont.1778169084473.ttf → iconfont.1778317220469.ttf} +0 -0
  479. /package/lib/{iconfont.1778169084473.woff → iconfont.1778317220469.woff} +0 -0
  480. /package/lib/{iconfont.1778169084473.woff2 → iconfont.1778317220469.woff2} +0 -0
@@ -1,1280 +1,1280 @@
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 } from '../../ui/src/dom'
7
- import { parseDateString, parseDateObj, getRangeDateByCode, handleValueFormat } from '../../date-panel/src/util'
8
- import { getSlotVNs } from '../../ui/src/vn'
9
- import { errLog } from '../../ui/src/log'
10
- import VxeDatePanelComponent from '../../date-panel/src/date-panel'
11
- import VxeButtonComponent from '../../button/src/button'
12
- import VxeButtonGroupComponent from '../../button/src/button-group'
13
-
14
- import type { VxeDateRangePickerConstructor, VxeDateRangePickerEmits, DateRangePickerInternalData, DateRangePickerReactData, DateRangePickerMethods, VxeDateRangePickerPropTypes, DateRangePickerPrivateRef, VxeFormConstructor, VxeFormPrivateMethods, VxeFormDefines, ValueOf, VxeModalConstructor, VxeDrawerConstructor, VxeModalMethods, VxeDrawerMethods, VxeDateRangePickerDefines, VxeButtonGroupEvents, VxeDatePanelConstructor } from '../../../types'
15
- import type { VxeTableConstructor, VxeTablePrivateMethods } from '../../../types/components/table'
16
-
17
- export default defineVxeComponent({
18
- name: 'VxeDateRangePicker',
19
- props: {
20
- modelValue: [String, Number, Date, Array] as PropType<VxeDateRangePickerPropTypes.ModelValue>,
21
- startValue: [String, Number, Date] as PropType<VxeDateRangePickerPropTypes.StartValue>,
22
- endValue: [String, Number, Date] as PropType<VxeDateRangePickerPropTypes.EndValue>,
23
- immediate: {
24
- type: Boolean as PropType<VxeDateRangePickerPropTypes.Immediate>,
25
- default: true
26
- },
27
- name: String as PropType<VxeDateRangePickerPropTypes.Name>,
28
- type: {
29
- type: String as PropType<VxeDateRangePickerPropTypes.Type>,
30
- default: 'date'
31
- },
32
- clearable: {
33
- type: Boolean as PropType<VxeDateRangePickerPropTypes.Clearable>,
34
- default: () => getConfig().dateRangePicker.clearable
35
- },
36
- readonly: {
37
- type: Boolean as PropType<VxeDateRangePickerPropTypes.Readonly>,
38
- default: null
39
- },
40
- disabled: {
41
- type: Boolean as PropType<VxeDateRangePickerPropTypes.Disabled>,
42
- default: null
43
- },
44
- placeholder: String as PropType<VxeDateRangePickerPropTypes.Placeholder>,
45
- autoComplete: {
46
- type: String as PropType<VxeDateRangePickerPropTypes.AutoComplete>,
47
- default: 'off'
48
- },
49
- form: String as PropType<VxeDateRangePickerPropTypes.Form>,
50
- className: String as PropType<VxeDateRangePickerPropTypes.ClassName>,
51
- zIndex: Number as PropType<VxeDateRangePickerPropTypes.ZIndex>,
52
- size: {
53
- type: String as PropType<VxeDateRangePickerPropTypes.Size>,
54
- default: () => getConfig().dateRangePicker.size || getConfig().size
55
- },
56
-
57
- // startDate: {
58
- // type: [String, Number, Date] as PropType<VxeDateRangePickerPropTypes.StartDate>,
59
- // default: () => getConfig().dateRangePicker.startDate
60
- // },
61
- // endDate: {
62
- // type: [String, Number, Date] as PropType<VxeDateRangePickerPropTypes.EndDate>,
63
- // default: () => getConfig().dateRangePicker.endDate
64
- // },
65
- minDate: [String, Number, Date] as PropType<VxeDateRangePickerPropTypes.MinDate>,
66
- maxDate: [String, Number, Date] as PropType<VxeDateRangePickerPropTypes.MaxDate>,
67
- defaultDate: [String, Number, Date, Array] as PropType<VxeDateRangePickerPropTypes.DefaultDate>,
68
- defaultTime: [String, Number, Date, Array] as PropType<VxeDateRangePickerPropTypes.DefaultTime>,
69
- startDay: {
70
- type: [String, Number] as PropType<VxeDateRangePickerPropTypes.StartDay>,
71
- default: () => getConfig().dateRangePicker.startDay
72
- },
73
- labelFormat: String as PropType<VxeDateRangePickerPropTypes.LabelFormat>,
74
- valueFormat: String as PropType<VxeDateRangePickerPropTypes.ValueFormat>,
75
- timeFormat: String as PropType<VxeDateRangePickerPropTypes.TimeFormat>,
76
- valueType: String as PropType<VxeDateRangePickerPropTypes.ValueType>,
77
- editable: {
78
- type: Boolean as PropType<VxeDateRangePickerPropTypes.Editable>,
79
- default: true
80
- },
81
- festivalMethod: {
82
- type: Function as PropType<VxeDateRangePickerPropTypes.FestivalMethod>,
83
- default: () => getConfig().dateRangePicker.festivalMethod
84
- },
85
- disabledMethod: {
86
- type: Function as PropType<VxeDateRangePickerPropTypes.DisabledMethod>,
87
- default: () => getConfig().dateRangePicker.disabledMethod
88
- },
89
- separator: {
90
- type: [String, Number] as PropType<VxeDateRangePickerPropTypes.Separator>,
91
- default: () => getConfig().dateRangePicker.separator
92
- },
93
-
94
- // week
95
- selectDay: {
96
- type: [String, Number] as PropType<VxeDateRangePickerPropTypes.SelectDay>,
97
- default: () => getConfig().dateRangePicker.selectDay
98
- },
99
- showClearButton: {
100
- type: Boolean as PropType<VxeDateRangePickerPropTypes.ShowClearButton>,
101
- default: () => getConfig().dateRangePicker.showClearButton
102
- },
103
- showConfirmButton: {
104
- type: Boolean as PropType<VxeDateRangePickerPropTypes.ShowConfirmButton>,
105
- default: () => getConfig().dateRangePicker.showConfirmButton
106
- },
107
- autoClose: {
108
- type: Boolean as PropType<VxeDateRangePickerPropTypes.AutoClose>,
109
- default: () => getConfig().dateRangePicker.autoClose
110
- },
111
-
112
- prefixIcon: String as PropType<VxeDateRangePickerPropTypes.PrefixIcon>,
113
- suffixIcon: String as PropType<VxeDateRangePickerPropTypes.SuffixIcon>,
114
- placement: String as PropType<VxeDateRangePickerPropTypes.Placement>,
115
- transfer: {
116
- type: Boolean as PropType<VxeDateRangePickerPropTypes.Transfer>,
117
- default: null
118
- },
119
-
120
- timeConfig: Object as PropType<VxeDateRangePickerPropTypes.TimeConfig>,
121
- popupConfig: Object as PropType<VxeDateRangePickerPropTypes.PopupConfig>,
122
- shortcutConfig: Object as PropType<VxeDateRangePickerPropTypes.ShortcutConfig>
123
- },
124
- emits: [
125
- 'update:modelValue',
126
- 'update:startValue',
127
- 'update:endValue',
128
- 'input',
129
- 'change',
130
- 'keydown',
131
- 'keyup',
132
- 'click',
133
- 'focus',
134
- 'blur',
135
- 'clear',
136
- 'confirm',
137
- 'prefix-click',
138
- 'suffix-click',
139
- 'date-prev',
140
- 'date-today',
141
- 'date-next',
142
- 'shortcut-click'
143
- ] as VxeDateRangePickerEmits,
144
- setup (props, context) {
145
- const { slots, emit } = context
146
-
147
- const $xeModal = inject<(VxeModalConstructor & VxeModalMethods) | null>('$xeModal', null)
148
- const $xeDrawer = inject<(VxeDrawerConstructor & VxeDrawerMethods) | null>('$xeDrawer', null)
149
- const $xeTable = inject<(VxeTableConstructor & VxeTablePrivateMethods) | null>('$xeTable', null)
150
- const $xeForm = inject<(VxeFormConstructor & VxeFormPrivateMethods) | null>('$xeForm', null)
151
- const formItemInfo = inject<VxeFormDefines.ProvideItemInfo | null>('xeFormItemInfo', null)
152
-
153
- const xID = XEUtils.uniqueId()
154
-
155
- const { computeSize } = useSize(props)
156
-
157
- const reactData = reactive<DateRangePickerReactData>({
158
- initialized: false,
159
- panelIndex: 0,
160
- visiblePanel: false,
161
- isAniVisible: false,
162
- panelStyle: {},
163
- panelPlacement: '',
164
- isActivated: false,
165
- startValue: '',
166
- endValue: ''
167
- })
168
-
169
- const internalData: DateRangePickerInternalData = {
170
- // selectStatus: false
171
- // hpTimeout: undefined
172
- }
173
-
174
- const refElem = ref() as Ref<HTMLDivElement>
175
- const refInputTarget = ref() as Ref<HTMLInputElement>
176
- const refInputPanel = ref<HTMLDivElement>()
177
- const refPanelWrapper = ref<HTMLDivElement>()
178
-
179
- const refStartDatePanel = ref<VxeDatePanelConstructor>()
180
- const refEndDatePanel = ref<VxeDatePanelConstructor>()
181
-
182
- const refMaps: DateRangePickerPrivateRef = {
183
- refElem,
184
- refInput: refInputTarget
185
- }
186
-
187
- const $xeDateRangePicker = {
188
- xID,
189
- props,
190
- context,
191
- reactData,
192
- internalData,
193
- getRefMaps: () => refMaps
194
- } as unknown as VxeDateRangePickerConstructor
195
-
196
- let dateRangePickerMethods = {} as DateRangePickerMethods
197
-
198
- const computeBtnTransfer = computed(() => {
199
- const { transfer } = props
200
- const popupOpts = computePopupOpts.value
201
- if (XEUtils.isBoolean(popupOpts.transfer)) {
202
- return popupOpts.transfer
203
- }
204
- if (transfer === null) {
205
- const globalTransfer = getConfig().dateRangePicker.transfer
206
- if (XEUtils.isBoolean(globalTransfer)) {
207
- return globalTransfer
208
- }
209
- if ($xeTable || $xeModal || $xeDrawer || $xeForm) {
210
- return true
211
- }
212
- }
213
- return transfer
214
- })
215
-
216
- const computeFormReadonly = computed(() => {
217
- const { readonly } = props
218
- if (readonly === null) {
219
- if ($xeForm) {
220
- return $xeForm.props.readonly
221
- }
222
- return false
223
- }
224
- return readonly
225
- })
226
-
227
- const computeIsDisabled = computed(() => {
228
- const { disabled } = props
229
- if (disabled === null) {
230
- if ($xeForm) {
231
- return $xeForm.props.disabled
232
- }
233
- return false
234
- }
235
- return disabled
236
- })
237
-
238
- const computeDefaultDates = computed(() => {
239
- const { defaultDate } = props
240
- if (defaultDate) {
241
- if (XEUtils.isArray(defaultDate)) {
242
- return defaultDate
243
- }
244
- if (`${defaultDate}`.indexOf(',') > -1) {
245
- return `${defaultDate}`.split(',')
246
- }
247
- return [defaultDate, defaultDate]
248
- }
249
- return []
250
- })
251
-
252
- const computeDefaultTimes = computed(() => {
253
- const { defaultTime } = props
254
- if (defaultTime) {
255
- if (XEUtils.isArray(defaultTime)) {
256
- return defaultTime
257
- }
258
- if (`${defaultTime}`.indexOf(',') > -1) {
259
- return `${defaultTime}`.split(',')
260
- }
261
- return [defaultTime, defaultTime]
262
- }
263
- return []
264
- })
265
-
266
- const computeMVal = computed(() => {
267
- const { startValue, endValue } = props
268
- return `${startValue || ''}${endValue || ''}`
269
- })
270
-
271
- const computeIsDateTimeType = computed(() => {
272
- const { type } = props
273
- return type === 'time' || type === 'datetime'
274
- })
275
-
276
- const computeIsDatePickerType = computed(() => {
277
- return ['date', 'week', 'month', 'quarter', 'year'].indexOf(props.type) > -1
278
- })
279
-
280
- const computeIsClearable = computed(() => {
281
- return props.clearable
282
- })
283
-
284
- const computeInpPlaceholder = computed(() => {
285
- const { placeholder } = props
286
- if (placeholder) {
287
- return getFuncText(placeholder)
288
- }
289
- const globalPlaceholder = getConfig().dateRangePicker.placeholder
290
- if (globalPlaceholder) {
291
- return getFuncText(globalPlaceholder)
292
- }
293
- return getI18n('vxe.dateRangePicker.pleaseRange')
294
- })
295
-
296
- const computeInpImmediate = computed(() => {
297
- const { immediate } = props
298
- return immediate
299
- })
300
-
301
- const computeTimeOpts = computed(() => {
302
- return Object.assign({}, getConfig().dateRangePicker.timeConfig, props.timeConfig)
303
- })
304
-
305
- const computePopupOpts = computed(() => {
306
- return Object.assign({}, getConfig().dateRangePicker.popupConfig, props.popupConfig)
307
- })
308
-
309
- const computeShortcutOpts = computed(() => {
310
- return Object.assign({}, getConfig().dateRangePicker.shortcutConfig, props.shortcutConfig)
311
- })
312
-
313
- const computeShortcutList = computed(() => {
314
- const shortcutOpts = computeShortcutOpts.value
315
- const { options } = shortcutOpts
316
- if (options) {
317
- return options.map((option, index) => {
318
- return Object.assign({
319
- name: `${option.name || option.code || index}`
320
- }, option)
321
- })
322
- }
323
- return []
324
- })
325
-
326
- const computeDateLabelFormat = computed(() => {
327
- const { labelFormat } = props
328
- return labelFormat || getI18n(`vxe.input.date.labelFormat.${props.type}`)
329
- })
330
-
331
- const computeDateValueFormat = computed(() => {
332
- const { type, valueFormat } = props
333
- return handleValueFormat(type, valueFormat)
334
- })
335
-
336
- const computeFirstDayOfWeek = computed(() => {
337
- const { startDay } = props
338
- return XEUtils.toNumber(startDay) as VxeDateRangePickerPropTypes.StartDay
339
- })
340
-
341
- const computePanelLabelObj = computed(() => {
342
- const { startValue, endValue } = reactData
343
- const vals: string[] = startValue || endValue ? [startValue || '', endValue || ''] : []
344
- return formatRangeLabel(vals)
345
- })
346
-
347
- const computeInputLabel = computed(() => {
348
- const panelLabelObj = computePanelLabelObj.value
349
- return panelLabelObj.label
350
- })
351
-
352
- const formatRangeLabel = (vals: string[]) => {
353
- const { type, separator } = props
354
- const dateLabelFormat = computeDateLabelFormat.value
355
- const dateValueFormat = computeDateValueFormat.value
356
- const firstDayOfWeek = computeFirstDayOfWeek.value
357
- const startRest = vals[0]
358
- ? parseDateObj(vals[0], type, {
359
- valueFormat: dateValueFormat,
360
- labelFormat: dateLabelFormat,
361
- firstDay: firstDayOfWeek
362
- })
363
- : null
364
- const endRest = vals[1]
365
- ? parseDateObj(vals[1], type, {
366
- valueFormat: dateValueFormat,
367
- labelFormat: dateLabelFormat,
368
- firstDay: firstDayOfWeek
369
- })
370
- : null
371
- const startLabel = startRest ? startRest.label : ''
372
- const endLabel = endRest ? endRest.label : ''
373
- return {
374
- label: (startLabel || endLabel ? [startLabel, endLabel] : []).join(`${separator || ' ~ '}`),
375
- startLabel,
376
- endLabel
377
- }
378
- }
379
-
380
- const getRangeValue = (sValue: string, eValue: string) => {
381
- const { modelValue, valueType } = props
382
- let isArr = XEUtils.isArray(modelValue)
383
- if (valueType) {
384
- switch (valueType) {
385
- case 'array':
386
- isArr = true
387
- break
388
- case 'string':
389
- isArr = false
390
- break
391
- }
392
- }
393
- if (sValue || eValue) {
394
- const rest = [sValue || '', eValue || '']
395
- if (isArr) {
396
- return rest
397
- }
398
- return rest.join(',')
399
- }
400
- return isArr ? [] : ''
401
- }
402
-
403
- const paraeUpdateModel = () => {
404
- const { type, modelValue } = props
405
- const dateValueFormat = computeDateValueFormat.value
406
- let sValue: string | Date | null = ''
407
- let eValue: string | Date | null = ''
408
- if (XEUtils.isArray(modelValue)) {
409
- const date1 = parseDateString(modelValue[0], type, { valueFormat: dateValueFormat })
410
- const date2 = parseDateString(modelValue[1], type, { valueFormat: dateValueFormat })
411
- if (date1 || date2) {
412
- sValue = date1 || ''
413
- eValue = date2 || ''
414
- }
415
- } else if (XEUtils.isString(modelValue)) {
416
- const strArr = modelValue.split(',')
417
- if (strArr[0] || strArr[1]) {
418
- sValue = strArr[0] || ''
419
- eValue = strArr[1] || ''
420
- }
421
- }
422
- return {
423
- sValue,
424
- eValue
425
- }
426
- }
427
-
428
- const parseUpdateData = () => {
429
- const { type, startValue, endValue } = props
430
- const dateValueFormat = computeDateValueFormat.value
431
- let sValue: string | Date | null = ''
432
- let eValue: string | Date | null = ''
433
- sValue = parseDateString(startValue, type, { valueFormat: dateValueFormat })
434
- eValue = parseDateString(endValue, type, { valueFormat: dateValueFormat })
435
- return {
436
- sValue,
437
- eValue
438
- }
439
- }
440
-
441
- const updateModelValue = (isModel: boolean) => {
442
- const { modelValue, startValue, endValue } = props
443
- let restObj: {
444
- sValue: string | Date | null
445
- eValue: string | Date | null
446
- } = {
447
- sValue: '',
448
- eValue: ''
449
- }
450
- if (isModel) {
451
- if (modelValue) {
452
- restObj = paraeUpdateModel()
453
- } else {
454
- restObj = parseUpdateData()
455
- }
456
- } else {
457
- if (startValue || endValue) {
458
- restObj = parseUpdateData()
459
- } else {
460
- restObj = paraeUpdateModel()
461
- }
462
- }
463
- reactData.startValue = restObj.sValue
464
- reactData.endValue = restObj.eValue
465
- }
466
-
467
- const triggerEvent = (evnt: Event & { type: 'input' | 'change' | 'keydown' | 'keyup' | 'click' | 'focus' | 'blur' }) => {
468
- const { startValue, endValue } = reactData
469
- const value = getRangeValue(startValue, endValue)
470
- dispatchEvent(evnt.type, { value, startValue, endValue }, evnt)
471
- }
472
-
473
- const handleChange = (sValue: string, eValue: string, evnt: Event | { type: string }) => {
474
- const { modelValue } = props
475
- reactData.startValue = sValue
476
- reactData.endValue = eValue
477
- const value = getRangeValue(sValue, eValue)
478
- const isFinish = (sValue && eValue) || (!sValue && !eValue)
479
- emit('update:modelValue', value)
480
- emit('update:startValue', sValue || '')
481
- emit('update:endValue', eValue || '')
482
- if (XEUtils.toValueString(modelValue) !== value) {
483
- dispatchEvent('change', { value, startValue: sValue, endValue: eValue, isFinish }, evnt as any)
484
- // 自动更新校验状态
485
- if ($xeForm && formItemInfo) {
486
- $xeForm.triggerItemEvent(evnt, formItemInfo.itemConfig.field, value)
487
- }
488
- }
489
- }
490
-
491
- const changeEvent = (evnt: Event & { type: 'change' }) => {
492
- const inpImmediate = computeInpImmediate.value
493
- if (!inpImmediate) {
494
- triggerEvent(evnt)
495
- }
496
- }
497
-
498
- const focusEvent = (evnt: Event & { type: 'focus' }) => {
499
- const popupOpts = computePopupOpts.value
500
- const { trigger } = popupOpts
501
- reactData.isActivated = true
502
- if (!trigger || trigger === 'default') {
503
- dateRangePickerOpenEvent(evnt)
504
- }
505
- triggerEvent(evnt)
506
- }
507
-
508
- const clickPrefixEvent = (evnt: Event) => {
509
- const isDisabled = computeIsDisabled.value
510
- if (!isDisabled) {
511
- const { startValue, endValue } = reactData
512
- const value = getRangeValue(startValue, endValue)
513
- dispatchEvent('prefix-click', { value, startValue, endValue }, evnt)
514
- }
515
- }
516
-
517
- const hidePanel = () => {
518
- return new Promise<void>(resolve => {
519
- reactData.visiblePanel = false
520
- internalData.hpTimeout = setTimeout(() => {
521
- reactData.isAniVisible = false
522
- resolve()
523
- }, 350)
524
- })
525
- }
526
-
527
- const clearValueEvent = (evnt: Event, value: VxeDateRangePickerPropTypes.ModelValue) => {
528
- const isDatePickerType = computeIsDatePickerType.value
529
- if (isDatePickerType) {
530
- hidePanel()
531
- }
532
- const startValue = ''
533
- const endValue = ''
534
- handleChange(startValue, endValue, evnt)
535
- dispatchEvent('clear', { value, startValue, endValue }, evnt)
536
- }
537
-
538
- const checkValue = () => {
539
- const $startDatePanel = refStartDatePanel.value
540
- const $endDatePanel = refEndDatePanel.value
541
- if ($startDatePanel && $endDatePanel) {
542
- const startValue = $startDatePanel.getModelValue()
543
- const endValue = $endDatePanel.getModelValue()
544
- if (!startValue || !endValue) {
545
- handleChange('', '', { type: 'check' })
546
- }
547
- }
548
- }
549
-
550
- const handleSelectClose = () => {
551
- const { autoClose } = props
552
- const { startValue, endValue } = reactData
553
- const { selectStatus } = internalData
554
- const isDatePickerType = computeIsDatePickerType.value
555
- if (autoClose) {
556
- if (selectStatus && isDatePickerType) {
557
- if (startValue && endValue) {
558
- hidePanel()
559
- }
560
- }
561
- } else {
562
- if (startValue && endValue) {
563
- internalData.selectStatus = false
564
- }
565
- }
566
- }
567
-
568
- const clickSuffixEvent = (evnt: Event) => {
569
- const isDisabled = computeIsDisabled.value
570
- if (!isDisabled) {
571
- const { startValue, endValue } = reactData
572
- const value = getRangeValue(startValue, endValue)
573
- dispatchEvent('suffix-click', { value, startValue, endValue }, evnt)
574
- }
575
- }
576
-
577
- const blurEvent = (evnt: Event & { type: 'blur' }) => {
578
- const { startValue, endValue } = reactData
579
- const inpImmediate = computeInpImmediate.value
580
- const value = ''
581
- if (!inpImmediate) {
582
- handleChange(startValue, endValue, evnt)
583
- }
584
- if (!reactData.visiblePanel) {
585
- reactData.isActivated = false
586
- }
587
- dispatchEvent('blur', { value, startValue, endValue }, evnt)
588
- // 自动更新校验状态
589
- if ($xeForm && formItemInfo) {
590
- $xeForm.triggerItemEvent(evnt, formItemInfo.itemConfig.field, value)
591
- }
592
- }
593
-
594
- const keydownEvent = (evnt: KeyboardEvent & { type: 'keydown' }) => {
595
- triggerEvent(evnt)
596
- }
597
-
598
- const keyupEvent = (evnt: KeyboardEvent & { type: 'keyup' }) => {
599
- triggerEvent(evnt)
600
- }
601
-
602
- const confirmEvent = (evnt: MouseEvent) => {
603
- const $startDatePanel = refStartDatePanel.value
604
- const $endDatePanel = refEndDatePanel.value
605
- if ($startDatePanel && $endDatePanel) {
606
- const startValue = $startDatePanel.getModelValue()
607
- const endValue = $endDatePanel.getModelValue()
608
- if ((startValue && !endValue) || (!startValue && endValue)) {
609
- handleChange('', '', evnt)
610
- } else {
611
- $startDatePanel.confirmByEvent(evnt)
612
- $endDatePanel.confirmByEvent(evnt)
613
- }
614
- const value = getRangeValue(startValue, endValue)
615
- dispatchEvent('confirm', { value, startValue, endValue }, evnt)
616
- }
617
- hidePanel()
618
- }
619
-
620
- const startPanelChangeEvent = (params: any) => {
621
- const { selectStatus } = internalData
622
- const { value, $event } = params
623
- const endValue = selectStatus ? reactData.endValue : ''
624
- handleChange(value, endValue, $event)
625
- handleSelectClose()
626
- if (!selectStatus) {
627
- internalData.selectStatus = true
628
- }
629
- nextTick(() => {
630
- const $startDatePanel = refStartDatePanel.value
631
- const $endDatePanel = refEndDatePanel.value
632
- if ($startDatePanel && $endDatePanel) {
633
- const startValue = $startDatePanel.getModelValue()
634
- if (!endValue && startValue) {
635
- $endDatePanel.setPanelDate(XEUtils.toStringDate(startValue))
636
- }
637
- }
638
- })
639
- }
640
-
641
- const endPanelChangeEvent = (params: any) => {
642
- const { selectStatus } = internalData
643
- const { value, $event } = params
644
- const startValue = selectStatus ? reactData.startValue : ''
645
- handleChange(startValue, value, $event)
646
- handleSelectClose()
647
- if (!selectStatus) {
648
- internalData.selectStatus = true
649
- }
650
- nextTick(() => {
651
- const $startDatePanel = refStartDatePanel.value
652
- const $endDatePanel = refEndDatePanel.value
653
- if ($startDatePanel && $endDatePanel) {
654
- const endValue = $endDatePanel.getModelValue()
655
- if (!startValue && endValue) {
656
- $startDatePanel.setPanelDate(XEUtils.toStringDate(endValue))
657
- }
658
- }
659
- })
660
- }
661
-
662
- // 全局事件
663
- const handleGlobalMousedownEvent = (evnt: Event) => {
664
- const { visiblePanel, isActivated } = reactData
665
- const el = refElem.value
666
- const panelWrapperElem = refPanelWrapper.value
667
- const isDisabled = computeIsDisabled.value
668
- if (!isDisabled && isActivated) {
669
- reactData.isActivated = getEventTargetNode(evnt, el).flag || getEventTargetNode(evnt, panelWrapperElem).flag
670
- if (!reactData.isActivated) {
671
- if (visiblePanel) {
672
- checkValue()
673
- hidePanel()
674
- }
675
- }
676
- }
677
- }
678
-
679
- const handleGlobalKeydownEvent = (evnt: KeyboardEvent) => {
680
- const { visiblePanel } = reactData
681
- const isDisabled = computeIsDisabled.value
682
- if (!isDisabled) {
683
- const isTab = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.TAB)
684
- const isEsc = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ESCAPE)
685
- if (isTab) {
686
- reactData.isActivated = false
687
- }
688
- if (visiblePanel) {
689
- if (isEsc || isTab) {
690
- checkValue()
691
- hidePanel()
692
- }
693
- }
694
- }
695
- }
696
-
697
- const handleGlobalMousewheelEvent = (evnt: Event) => {
698
- const { visiblePanel } = reactData
699
- const isDisabled = computeIsDisabled.value
700
- if (!isDisabled) {
701
- if (visiblePanel) {
702
- const panelWrapperElem = refPanelWrapper.value
703
- if (getEventTargetNode(evnt, panelWrapperElem).flag) {
704
- updatePlacement()
705
- } else {
706
- checkValue()
707
- hidePanel()
708
- }
709
- }
710
- }
711
- }
712
-
713
- const handleGlobalBlurEvent = () => {
714
- const { visiblePanel, isActivated } = reactData
715
- if (visiblePanel) {
716
- checkValue()
717
- hidePanel()
718
- }
719
- if (isActivated) {
720
- reactData.isActivated = false
721
- }
722
- if (visiblePanel || isActivated) {
723
- const targetElem = refInputTarget.value
724
- if (targetElem) {
725
- targetElem.blur()
726
- }
727
- }
728
- }
729
-
730
- const handleGlobalResizeEvent = () => {
731
- const { visiblePanel } = reactData
732
- if (visiblePanel) {
733
- updatePlacement()
734
- }
735
- }
736
-
737
- // 弹出面板
738
- const updateZindex = () => {
739
- const popupOpts = computePopupOpts.value
740
- const customZIndex = popupOpts.zIndex || props.zIndex
741
- if (customZIndex) {
742
- reactData.panelIndex = XEUtils.toNumber(customZIndex)
743
- } else if (reactData.panelIndex < getLastZIndex()) {
744
- reactData.panelIndex = nextZIndex()
745
- }
746
- }
747
-
748
- const updatePlacement = () => {
749
- const { placement } = props
750
- const { panelIndex } = reactData
751
- const targetElem = refInputTarget.value
752
- const panelElem = refInputPanel.value
753
- const btnTransfer = computeBtnTransfer.value
754
- const popupOpts = computePopupOpts.value
755
- const handleStyle = () => {
756
- const ppObj = updatePanelPlacement(targetElem, panelElem, {
757
- placement: popupOpts.placement || placement,
758
- defaultPlacement: popupOpts.defaultPlacement,
759
- teleportTo: btnTransfer
760
- })
761
- const panelStyle: { [key: string]: string | number } = Object.assign(ppObj.style, {
762
- zIndex: panelIndex
763
- })
764
- reactData.panelStyle = panelStyle
765
- reactData.panelPlacement = ppObj.placement
766
- }
767
- handleStyle()
768
- return nextTick().then(handleStyle)
769
- }
770
-
771
- const showPanel = () => {
772
- const { visiblePanel } = reactData
773
- const isDisabled = computeIsDisabled.value
774
- if (!isDisabled && !visiblePanel) {
775
- if (!reactData.initialized) {
776
- reactData.initialized = true
777
- }
778
- if (internalData.hpTimeout) {
779
- clearTimeout(internalData.hpTimeout)
780
- internalData.hpTimeout = undefined
781
- }
782
- internalData.selectStatus = false
783
- reactData.isActivated = true
784
- reactData.isAniVisible = true
785
- setTimeout(() => {
786
- reactData.visiblePanel = true
787
- updatePlacement()
788
- }, 10)
789
- updateZindex()
790
- return updatePlacement()
791
- }
792
- return nextTick()
793
- }
794
-
795
- const dateRangePickerOpenEvent = (evnt: Event) => {
796
- const formReadonly = computeFormReadonly.value
797
- if (!formReadonly) {
798
- evnt.preventDefault()
799
- showPanel()
800
- }
801
- }
802
-
803
- const clickIconEvent = (evnt: MouseEvent) => {
804
- const popupOpts = computePopupOpts.value
805
- const { trigger } = popupOpts
806
- if (!trigger || trigger === 'default' || trigger === 'icon') {
807
- dateRangePickerOpenEvent(evnt)
808
- }
809
- }
810
-
811
- const clickEvent = (evnt: Event & { type: 'click' }) => {
812
- triggerEvent(evnt)
813
- }
814
-
815
- const handleShortcutEvent: VxeButtonGroupEvents.Click = ({ option, $event }) => {
816
- const { type } = props
817
- const shortcutOpts = computeShortcutOpts.value
818
- const { autoClose } = shortcutOpts
819
- const { code, clickMethod } = option as VxeDateRangePickerDefines.ShortcutOption
820
- let startValue = reactData.startValue
821
- let endValue = reactData.endValue
822
- let value = getRangeValue(startValue, endValue)
823
- const shortcutParams = {
824
- $dateRangePicker: $xeDateRangePicker,
825
- option: option,
826
- value,
827
- startValue,
828
- endValue,
829
- code
830
- }
831
- if (!clickMethod && code) {
832
- const gCommandOpts = commands.get(code)
833
- const drpCommandMethod = gCommandOpts ? gCommandOpts.dateRangePickerCommandMethod : null
834
- if (drpCommandMethod) {
835
- drpCommandMethod(shortcutParams)
836
- } else {
837
- const dateValueFormat = computeDateValueFormat.value
838
- const firstDayOfWeek = computeFirstDayOfWeek.value
839
- switch (code) {
840
- case 'last1':
841
- case 'last3':
842
- case 'last7':
843
- case 'last30':
844
- case 'last60':
845
- case 'last90':
846
- case 'last180': {
847
- const restObj = getRangeDateByCode(code, value, type, {
848
- valueFormat: dateValueFormat,
849
- firstDay: firstDayOfWeek
850
- })
851
- startValue = restObj.startValue
852
- endValue = restObj.endValue
853
- value = getRangeValue(startValue, endValue)
854
- shortcutParams.value = value
855
- shortcutParams.startValue = startValue
856
- shortcutParams.endValue = endValue
857
- handleChange(startValue, endValue, $event)
858
- break
859
- }
860
- default:
861
- errLog('vxe.error.notCommands', [`[date-range-picker] ${code}`])
862
- break
863
- }
864
- }
865
- } else {
866
- const optClickMethod = clickMethod || shortcutOpts.clickMethod
867
- if (optClickMethod) {
868
- optClickMethod(shortcutParams)
869
- }
870
- }
871
- if (autoClose) {
872
- hidePanel()
873
- }
874
- dispatchEvent('shortcut-click', shortcutParams, $event)
875
- }
876
-
877
- const dispatchEvent = (type: ValueOf<VxeDateRangePickerEmits>, params: Record<string, any>, evnt: Event | null) => {
878
- emit(type, createEvent(evnt, { $dateRangePicker: $xeDateRangePicker }, params))
879
- }
880
-
881
- dateRangePickerMethods = {
882
- dispatchEvent,
883
-
884
- setModelValue (startValue, endValue) {
885
- reactData.startValue = startValue || ''
886
- reactData.endValue = endValue || ''
887
- const value = getRangeValue(startValue, endValue)
888
- emit('update:modelValue', value)
889
- },
890
- setModelValueByEvent (evnt, startValue, endValue) {
891
- handleChange(startValue || '', endValue || '', evnt)
892
- },
893
- focus () {
894
- const inputElem = refInputTarget.value
895
- reactData.isActivated = true
896
- inputElem.focus()
897
- return nextTick()
898
- },
899
- blur () {
900
- const inputElem = refInputTarget.value
901
- inputElem.blur()
902
- reactData.isActivated = false
903
- return nextTick()
904
- },
905
- select () {
906
- const inputElem = refInputTarget.value
907
- inputElem.select()
908
- reactData.isActivated = false
909
- return nextTick()
910
- },
911
- showPanel,
912
- hidePanel,
913
- updatePlacement
914
- }
915
-
916
- Object.assign($xeDateRangePicker, dateRangePickerMethods)
917
-
918
- const renderShortcutBtn = (pos: 'top' | 'bottom' | 'left' | 'right' | 'header' | 'footer', isVertical?: boolean) => {
919
- const shortcutOpts = computeShortcutOpts.value
920
- const { position, align, mode } = shortcutOpts
921
- const shortcutList = computeShortcutList.value
922
- if (isEnableConf(shortcutOpts) && shortcutList.length && (position || 'left') === pos) {
923
- return h('div', {
924
- class: `vxe-date-range-picker--layout-${pos}-wrapper`
925
- }, [
926
- h(VxeButtonGroupComponent, {
927
- options: shortcutList,
928
- mode,
929
- align,
930
- vertical: isVertical,
931
- onClick: handleShortcutEvent
932
- })
933
- ])
934
- }
935
- return renderEmptyElement($xeDateRangePicker)
936
- }
937
-
938
- const renderPanel = () => {
939
- const { type, separator, autoClose, showConfirmButton, showClearButton } = props
940
- const { initialized, isAniVisible, visiblePanel, panelPlacement, panelStyle, startValue, endValue } = reactData
941
- const vSize = computeSize.value
942
- const btnTransfer = computeBtnTransfer.value
943
- const shortcutOpts = computeShortcutOpts.value
944
- const isClearable = computeIsClearable.value
945
- const panelLabelObj = computePanelLabelObj.value
946
- const shortcutList = computeShortcutList.value
947
- const isDateTimeType = computeIsDateTimeType.value
948
- const defaultDates = computeDefaultDates.value
949
- const defaultTimes = computeDefaultTimes.value
950
- const timeOpts = computeTimeOpts.value
951
- const popupOpts = computePopupOpts.value
952
- const { startLabel, endLabel } = panelLabelObj
953
- const { position } = shortcutOpts
954
- const headerSlot = slots.header
955
- const footerSlot = slots.footer
956
- const topSlot = slots.top
957
- const bottomSlot = slots.bottom
958
- const leftSlot = slots.left
959
- const rightSlot = slots.right
960
- const ppClassName = popupOpts.className
961
- const [sdDate, edDate] = defaultDates
962
- const [sdTime, edTime] = defaultTimes
963
- const hasShortcutBtn = shortcutList.length > 0
964
- const showConfirmBtn = (showConfirmButton === null ? (isDateTimeType || !autoClose) : showConfirmButton)
965
- const showClearBtn = (showClearButton === null ? isClearable : showClearButton)
966
- return h(Teleport, {
967
- to: 'body',
968
- disabled: btnTransfer ? !initialized : true
969
- }, [
970
- h('div', {
971
- ref: refInputPanel,
972
- class: ['vxe-table--ignore-clear vxe-date-range-picker--panel', `type--${type}`, ppClassName ? (XEUtils.isFunction(ppClassName) ? ppClassName({ $dateRangePicker: $xeDateRangePicker }) : ppClassName) : '', {
973
- [`size--${vSize}`]: vSize,
974
- 'is--transfer': btnTransfer,
975
- 'ani--leave': isAniVisible,
976
- 'ani--enter': visiblePanel,
977
- 'show--top': !!(topSlot || headerSlot || (hasShortcutBtn && (position === 'top' || position === 'header'))),
978
- 'show--bottom': !!(bottomSlot || footerSlot || (hasShortcutBtn && (position === 'bottom' || position === 'footer'))),
979
- 'show--left': !!(leftSlot || (hasShortcutBtn && position === 'left')),
980
- 'show--right': !!(rightSlot || (hasShortcutBtn && position === 'right'))
981
- }],
982
- placement: panelPlacement,
983
- style: panelStyle
984
- }, initialized && (visiblePanel || isAniVisible)
985
- ? [
986
- h('div', {
987
- ref: refPanelWrapper,
988
- class: ['vxe-date-range-picker--layout-all-wrapper', `type--${type}`, {
989
- [`size--${vSize}`]: vSize
990
- }]
991
- }, [
992
- topSlot
993
- ? h('div', {
994
- class: 'vxe-date-range-picker--layout-top-wrapper'
995
- }, topSlot({}))
996
- : renderShortcutBtn('top'),
997
- h('div', {
998
- class: 'vxe-date-range-picker--layout-body-layout-wrapper'
999
- }, [
1000
- leftSlot
1001
- ? h('div', {
1002
- class: 'vxe-date-range-picker--layout-left-wrapper'
1003
- }, leftSlot({}))
1004
- : renderShortcutBtn('left', true),
1005
- h('div', {
1006
- class: 'vxe-date-range-picker--layout-body-content-wrapper'
1007
- }, [
1008
- headerSlot
1009
- ? h('div', {
1010
- class: 'vxe-date-range-picker--layout-header-wrapper'
1011
- }, headerSlot({}))
1012
- : renderShortcutBtn('header'),
1013
- h('div', {
1014
- class: 'vxe-date-range-picker--layout-body-wrapper'
1015
- }, [
1016
- h(VxeDatePanelComponent, {
1017
- ref: refStartDatePanel,
1018
- modelValue: startValue,
1019
- type: props.type,
1020
- className: props.className,
1021
- minDate: props.minDate,
1022
- maxDate: props.maxDate,
1023
- endDate: endValue,
1024
- startDay: props.startDay,
1025
- labelFormat: props.labelFormat,
1026
- valueFormat: props.valueFormat,
1027
- timeFormat: props.timeFormat,
1028
- defaultDate: sdDate,
1029
- defaultTime: sdTime,
1030
- timeConfig: timeOpts,
1031
- festivalMethod: props.festivalMethod,
1032
- disabledMethod: props.disabledMethod,
1033
- selectDay: props.selectDay,
1034
- onChange: startPanelChangeEvent
1035
- }),
1036
- h(VxeDatePanelComponent, {
1037
- ref: refEndDatePanel,
1038
- modelValue: endValue,
1039
- type: props.type,
1040
- className: props.className,
1041
- minDate: props.minDate,
1042
- maxDate: props.maxDate,
1043
- startDate: startValue,
1044
- startDay: props.startDay,
1045
- labelFormat: props.labelFormat,
1046
- valueFormat: props.valueFormat,
1047
- timeFormat: props.timeFormat,
1048
- defaultDate: edDate,
1049
- defaultTime: edTime,
1050
- timeConfig: timeOpts,
1051
- festivalMethod: props.festivalMethod,
1052
- disabledMethod: props.disabledMethod,
1053
- selectDay: props.selectDay,
1054
- onChange: endPanelChangeEvent
1055
- })
1056
- ]),
1057
- h('div', {
1058
- class: 'vxe-date-range-picker--layout-footer-wrapper'
1059
- }, [
1060
- h('div', {
1061
- class: 'vxe-date-range-picker--layout-footer-label'
1062
- }, startLabel || endLabel
1063
- ? [
1064
- h('span', startLabel),
1065
- h('span', `${separator || ''}`),
1066
- h('span', endLabel)
1067
- ]
1068
- : `${separator || ''}`),
1069
- h('div', {
1070
- class: 'vxe-date-range-picker--layout-footer-custom'
1071
- }, footerSlot ? footerSlot({}) : [renderShortcutBtn('footer')]),
1072
- h('div', {
1073
- class: 'vxe-date-range-picker--layout-footer-btns'
1074
- }, [
1075
- showClearBtn
1076
- ? h(VxeButtonComponent, {
1077
- size: 'mini',
1078
- disabled: !(startValue || endValue),
1079
- content: getI18n('vxe.button.clear'),
1080
- onClick: clearValueEvent
1081
- })
1082
- : renderEmptyElement($xeDateRangePicker),
1083
- showConfirmBtn
1084
- ? h(VxeButtonComponent, {
1085
- size: 'mini',
1086
- status: 'primary',
1087
- content: getI18n('vxe.button.confirm'),
1088
- onClick: confirmEvent
1089
- })
1090
- : renderEmptyElement($xeDateRangePicker)
1091
- ])
1092
- ])
1093
- ]),
1094
- rightSlot
1095
- ? h('div', {
1096
- class: 'vxe-date-range-picker--layout-right-wrapper'
1097
- }, rightSlot({}))
1098
- : renderShortcutBtn('right', true)
1099
- ]),
1100
- bottomSlot
1101
- ? h('div', {
1102
- class: 'vxe-date-range-picker--layout-bottom-wrapper'
1103
- }, bottomSlot({}))
1104
- : renderShortcutBtn('bottom')
1105
- ])
1106
- ]
1107
- : [])
1108
- ])
1109
- }
1110
-
1111
- const renderPrefixIcon = () => {
1112
- const { prefixIcon } = props
1113
- const prefixSlot = slots.prefix
1114
- return prefixSlot || prefixIcon
1115
- ? h('div', {
1116
- class: 'vxe-date-range-picker--prefix',
1117
- onClick: clickPrefixEvent
1118
- }, [
1119
- h('div', {
1120
- class: 'vxe-date-range-picker--prefix-icon'
1121
- }, prefixSlot
1122
- ? getSlotVNs(prefixSlot({}))
1123
- : [
1124
- h('i', {
1125
- class: prefixIcon
1126
- })
1127
- ])
1128
- ])
1129
- : null
1130
- }
1131
-
1132
- const renderSuffixIcon = () => {
1133
- const { suffixIcon } = props
1134
- const { startValue, endValue } = reactData
1135
- const suffixSlot = slots.suffix
1136
- const isDisabled = computeIsDisabled.value
1137
- const isClearable = computeIsClearable.value
1138
- return h('div', {
1139
- class: ['vxe-date-range-picker--suffix', {
1140
- 'is--clear': isClearable && !isDisabled && (startValue || endValue)
1141
- }]
1142
- }, [
1143
- isClearable
1144
- ? h('div', {
1145
- class: 'vxe-date-range-picker--clear-icon',
1146
- onClick: clearValueEvent
1147
- }, [
1148
- h('i', {
1149
- class: getIcon().INPUT_CLEAR
1150
- })
1151
- ])
1152
- : renderEmptyElement($xeDateRangePicker),
1153
- renderExtraSuffixIcon(),
1154
- suffixSlot || suffixIcon
1155
- ? h('div', {
1156
- class: 'vxe-date-range-picker--suffix-icon',
1157
- onClick: clickSuffixEvent
1158
- }, suffixSlot
1159
- ? getSlotVNs(suffixSlot({}))
1160
- : [
1161
- h('i', {
1162
- class: suffixIcon
1163
- })
1164
- ])
1165
- : renderEmptyElement($xeDateRangePicker)
1166
- ])
1167
- }
1168
-
1169
- const renderExtraSuffixIcon = () => {
1170
- return h('div', {
1171
- class: 'vxe-date-range-picker--control-icon',
1172
- onClick: clickIconEvent
1173
- }, [
1174
- h('i', {
1175
- class: ['vxe-date-range-picker--date-picker-icon', getIcon().DATE_PICKER_DATE]
1176
- })
1177
- ])
1178
- }
1179
-
1180
- const renderVN = () => {
1181
- const { className, type, name, autoComplete } = props
1182
- const { startValue, endValue, visiblePanel, isActivated } = reactData
1183
- const vSize = computeSize.value
1184
- const isDisabled = computeIsDisabled.value
1185
- const formReadonly = computeFormReadonly.value
1186
- const inputLabel = computeInputLabel.value
1187
- if (formReadonly) {
1188
- return h('div', {
1189
- ref: refElem,
1190
- class: ['vxe-date-range-picker--readonly', `type--${type}`, className]
1191
- }, inputLabel)
1192
- }
1193
- const inpPlaceholder = computeInpPlaceholder.value
1194
- const isClearable = computeIsClearable.value
1195
- const prefix = renderPrefixIcon()
1196
- const suffix = renderSuffixIcon()
1197
- return h('div', {
1198
- ref: refElem,
1199
- class: ['vxe-date-range-picker', `type--${type}`, className, {
1200
- [`size--${vSize}`]: vSize,
1201
- 'is--prefix': !!prefix,
1202
- 'is--suffix': !!suffix,
1203
- 'is--visible': visiblePanel,
1204
- 'is--disabled': isDisabled,
1205
- 'is--active': isActivated,
1206
- 'show--clear': isClearable && !isDisabled && (startValue || endValue)
1207
- }],
1208
- spellcheck: false
1209
- }, [
1210
- prefix || renderEmptyElement($xeDateRangePicker),
1211
- h('div', {
1212
- class: 'vxe-date-range-picker--wrapper'
1213
- }, [
1214
- h('input', {
1215
- ref: refInputTarget,
1216
- class: 'vxe-date-range-picker--inner',
1217
- value: inputLabel,
1218
- name,
1219
- type: 'text',
1220
- placeholder: inpPlaceholder,
1221
- editable: false,
1222
- disabled: isDisabled,
1223
- autocomplete: autoComplete,
1224
- onKeydown: keydownEvent,
1225
- onKeyup: keyupEvent,
1226
- onClick: clickEvent,
1227
- onChange: changeEvent,
1228
- onFocus: focusEvent,
1229
- onBlur: blurEvent
1230
- })
1231
- ]),
1232
- suffix || renderEmptyElement($xeDateRangePicker),
1233
- // 下拉面板
1234
- renderPanel()
1235
- ])
1236
- }
1237
-
1238
- watch(() => props.modelValue, () => {
1239
- updateModelValue(true)
1240
- })
1241
-
1242
- watch(computeMVal, () => {
1243
- updateModelValue(false)
1244
- })
1245
-
1246
- updateModelValue(true)
1247
-
1248
- nextTick(() => {
1249
- globalEvents.on($xeDateRangePicker, 'mousewheel', handleGlobalMousewheelEvent)
1250
- globalEvents.on($xeDateRangePicker, 'mousedown', handleGlobalMousedownEvent)
1251
- globalEvents.on($xeDateRangePicker, 'keydown', handleGlobalKeydownEvent)
1252
- globalEvents.on($xeDateRangePicker, 'blur', handleGlobalBlurEvent)
1253
- globalEvents.on($xeDateRangePicker, 'resize', handleGlobalResizeEvent)
1254
- })
1255
-
1256
- onDeactivated(() => {
1257
- checkValue()
1258
- })
1259
-
1260
- onUnmounted(() => {
1261
- globalEvents.off($xeDateRangePicker, 'mousewheel')
1262
- globalEvents.off($xeDateRangePicker, 'mousedown')
1263
- globalEvents.off($xeDateRangePicker, 'blur')
1264
- globalEvents.off($xeDateRangePicker, 'resize')
1265
- })
1266
-
1267
- onBeforeUnmount(() => {
1268
- checkValue()
1269
- })
1270
-
1271
- provide('$xeDateRangePicker', $xeDateRangePicker)
1272
-
1273
- $xeDateRangePicker.renderVN = renderVN
1274
-
1275
- return $xeDateRangePicker
1276
- },
1277
- render () {
1278
- return this.renderVN()
1279
- }
1280
- })
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 } from '../../ui/src/dom'
7
+ import { parseDateString, parseDateObj, getRangeDateByCode, handleValueFormat } from '../../date-panel/src/util'
8
+ import { getSlotVNs } from '../../ui/src/vn'
9
+ import { errLog } from '../../ui/src/log'
10
+ import VxeDatePanelComponent from '../../date-panel/src/date-panel'
11
+ import VxeButtonComponent from '../../button/src/button'
12
+ import VxeButtonGroupComponent from '../../button/src/button-group'
13
+
14
+ import type { VxeDateRangePickerConstructor, VxeDateRangePickerEmits, DateRangePickerInternalData, DateRangePickerReactData, DateRangePickerMethods, VxeDateRangePickerPropTypes, DateRangePickerPrivateRef, VxeFormConstructor, VxeFormPrivateMethods, VxeFormDefines, ValueOf, VxeModalConstructor, VxeDrawerConstructor, VxeModalMethods, VxeDrawerMethods, VxeDateRangePickerDefines, VxeButtonGroupEvents, VxeDatePanelConstructor } from '../../../types'
15
+ import type { VxeTableConstructor, VxeTablePrivateMethods } from '../../../types/components/table'
16
+
17
+ export default defineVxeComponent({
18
+ name: 'VxeDateRangePicker',
19
+ props: {
20
+ modelValue: [String, Number, Date, Array] as PropType<VxeDateRangePickerPropTypes.ModelValue>,
21
+ startValue: [String, Number, Date] as PropType<VxeDateRangePickerPropTypes.StartValue>,
22
+ endValue: [String, Number, Date] as PropType<VxeDateRangePickerPropTypes.EndValue>,
23
+ immediate: {
24
+ type: Boolean as PropType<VxeDateRangePickerPropTypes.Immediate>,
25
+ default: true
26
+ },
27
+ name: String as PropType<VxeDateRangePickerPropTypes.Name>,
28
+ type: {
29
+ type: String as PropType<VxeDateRangePickerPropTypes.Type>,
30
+ default: 'date'
31
+ },
32
+ clearable: {
33
+ type: Boolean as PropType<VxeDateRangePickerPropTypes.Clearable>,
34
+ default: () => getConfig().dateRangePicker.clearable
35
+ },
36
+ readonly: {
37
+ type: Boolean as PropType<VxeDateRangePickerPropTypes.Readonly>,
38
+ default: null
39
+ },
40
+ disabled: {
41
+ type: Boolean as PropType<VxeDateRangePickerPropTypes.Disabled>,
42
+ default: null
43
+ },
44
+ placeholder: String as PropType<VxeDateRangePickerPropTypes.Placeholder>,
45
+ autoComplete: {
46
+ type: String as PropType<VxeDateRangePickerPropTypes.AutoComplete>,
47
+ default: 'off'
48
+ },
49
+ form: String as PropType<VxeDateRangePickerPropTypes.Form>,
50
+ className: String as PropType<VxeDateRangePickerPropTypes.ClassName>,
51
+ zIndex: Number as PropType<VxeDateRangePickerPropTypes.ZIndex>,
52
+ size: {
53
+ type: String as PropType<VxeDateRangePickerPropTypes.Size>,
54
+ default: () => getConfig().dateRangePicker.size || getConfig().size
55
+ },
56
+
57
+ // startDate: {
58
+ // type: [String, Number, Date] as PropType<VxeDateRangePickerPropTypes.StartDate>,
59
+ // default: () => getConfig().dateRangePicker.startDate
60
+ // },
61
+ // endDate: {
62
+ // type: [String, Number, Date] as PropType<VxeDateRangePickerPropTypes.EndDate>,
63
+ // default: () => getConfig().dateRangePicker.endDate
64
+ // },
65
+ minDate: [String, Number, Date] as PropType<VxeDateRangePickerPropTypes.MinDate>,
66
+ maxDate: [String, Number, Date] as PropType<VxeDateRangePickerPropTypes.MaxDate>,
67
+ defaultDate: [String, Number, Date, Array] as PropType<VxeDateRangePickerPropTypes.DefaultDate>,
68
+ defaultTime: [String, Number, Date, Array] as PropType<VxeDateRangePickerPropTypes.DefaultTime>,
69
+ startDay: {
70
+ type: [String, Number] as PropType<VxeDateRangePickerPropTypes.StartDay>,
71
+ default: () => getConfig().dateRangePicker.startDay
72
+ },
73
+ labelFormat: String as PropType<VxeDateRangePickerPropTypes.LabelFormat>,
74
+ valueFormat: String as PropType<VxeDateRangePickerPropTypes.ValueFormat>,
75
+ timeFormat: String as PropType<VxeDateRangePickerPropTypes.TimeFormat>,
76
+ valueType: String as PropType<VxeDateRangePickerPropTypes.ValueType>,
77
+ editable: {
78
+ type: Boolean as PropType<VxeDateRangePickerPropTypes.Editable>,
79
+ default: true
80
+ },
81
+ festivalMethod: {
82
+ type: Function as PropType<VxeDateRangePickerPropTypes.FestivalMethod>,
83
+ default: () => getConfig().dateRangePicker.festivalMethod
84
+ },
85
+ disabledMethod: {
86
+ type: Function as PropType<VxeDateRangePickerPropTypes.DisabledMethod>,
87
+ default: () => getConfig().dateRangePicker.disabledMethod
88
+ },
89
+ separator: {
90
+ type: [String, Number] as PropType<VxeDateRangePickerPropTypes.Separator>,
91
+ default: () => getConfig().dateRangePicker.separator
92
+ },
93
+
94
+ // week
95
+ selectDay: {
96
+ type: [String, Number] as PropType<VxeDateRangePickerPropTypes.SelectDay>,
97
+ default: () => getConfig().dateRangePicker.selectDay
98
+ },
99
+ showClearButton: {
100
+ type: Boolean as PropType<VxeDateRangePickerPropTypes.ShowClearButton>,
101
+ default: () => getConfig().dateRangePicker.showClearButton
102
+ },
103
+ showConfirmButton: {
104
+ type: Boolean as PropType<VxeDateRangePickerPropTypes.ShowConfirmButton>,
105
+ default: () => getConfig().dateRangePicker.showConfirmButton
106
+ },
107
+ autoClose: {
108
+ type: Boolean as PropType<VxeDateRangePickerPropTypes.AutoClose>,
109
+ default: () => getConfig().dateRangePicker.autoClose
110
+ },
111
+
112
+ prefixIcon: String as PropType<VxeDateRangePickerPropTypes.PrefixIcon>,
113
+ suffixIcon: String as PropType<VxeDateRangePickerPropTypes.SuffixIcon>,
114
+ placement: String as PropType<VxeDateRangePickerPropTypes.Placement>,
115
+ transfer: {
116
+ type: Boolean as PropType<VxeDateRangePickerPropTypes.Transfer>,
117
+ default: null
118
+ },
119
+
120
+ timeConfig: Object as PropType<VxeDateRangePickerPropTypes.TimeConfig>,
121
+ popupConfig: Object as PropType<VxeDateRangePickerPropTypes.PopupConfig>,
122
+ shortcutConfig: Object as PropType<VxeDateRangePickerPropTypes.ShortcutConfig>
123
+ },
124
+ emits: [
125
+ 'update:modelValue',
126
+ 'update:startValue',
127
+ 'update:endValue',
128
+ 'input',
129
+ 'change',
130
+ 'keydown',
131
+ 'keyup',
132
+ 'click',
133
+ 'focus',
134
+ 'blur',
135
+ 'clear',
136
+ 'confirm',
137
+ 'prefix-click',
138
+ 'suffix-click',
139
+ 'date-prev',
140
+ 'date-today',
141
+ 'date-next',
142
+ 'shortcut-click'
143
+ ] as VxeDateRangePickerEmits,
144
+ setup (props, context) {
145
+ const { slots, emit } = context
146
+
147
+ const $xeModal = inject<(VxeModalConstructor & VxeModalMethods) | null>('$xeModal', null)
148
+ const $xeDrawer = inject<(VxeDrawerConstructor & VxeDrawerMethods) | null>('$xeDrawer', null)
149
+ const $xeTable = inject<(VxeTableConstructor & VxeTablePrivateMethods) | null>('$xeTable', null)
150
+ const $xeForm = inject<(VxeFormConstructor & VxeFormPrivateMethods) | null>('$xeForm', null)
151
+ const formItemInfo = inject<VxeFormDefines.ProvideItemInfo | null>('xeFormItemInfo', null)
152
+
153
+ const xID = XEUtils.uniqueId()
154
+
155
+ const { computeSize } = useSize(props)
156
+
157
+ const reactData = reactive<DateRangePickerReactData>({
158
+ initialized: false,
159
+ panelIndex: 0,
160
+ visiblePanel: false,
161
+ isAniVisible: false,
162
+ panelStyle: {},
163
+ panelPlacement: '',
164
+ isActivated: false,
165
+ startValue: '',
166
+ endValue: ''
167
+ })
168
+
169
+ const internalData: DateRangePickerInternalData = {
170
+ // selectStatus: false
171
+ // hpTimeout: undefined
172
+ }
173
+
174
+ const refElem = ref() as Ref<HTMLDivElement>
175
+ const refInputTarget = ref() as Ref<HTMLInputElement>
176
+ const refInputPanel = ref<HTMLDivElement>()
177
+ const refPanelWrapper = ref<HTMLDivElement>()
178
+
179
+ const refStartDatePanel = ref<VxeDatePanelConstructor>()
180
+ const refEndDatePanel = ref<VxeDatePanelConstructor>()
181
+
182
+ const refMaps: DateRangePickerPrivateRef = {
183
+ refElem,
184
+ refInput: refInputTarget
185
+ }
186
+
187
+ const $xeDateRangePicker = {
188
+ xID,
189
+ props,
190
+ context,
191
+ reactData,
192
+ internalData,
193
+ getRefMaps: () => refMaps
194
+ } as unknown as VxeDateRangePickerConstructor
195
+
196
+ let dateRangePickerMethods = {} as DateRangePickerMethods
197
+
198
+ const computeBtnTransfer = computed(() => {
199
+ const { transfer } = props
200
+ const popupOpts = computePopupOpts.value
201
+ if (XEUtils.isBoolean(popupOpts.transfer)) {
202
+ return popupOpts.transfer
203
+ }
204
+ if (transfer === null) {
205
+ const globalTransfer = getConfig().dateRangePicker.transfer
206
+ if (XEUtils.isBoolean(globalTransfer)) {
207
+ return globalTransfer
208
+ }
209
+ if ($xeTable || $xeModal || $xeDrawer || $xeForm) {
210
+ return true
211
+ }
212
+ }
213
+ return transfer
214
+ })
215
+
216
+ const computeFormReadonly = computed(() => {
217
+ const { readonly } = props
218
+ if (readonly === null) {
219
+ if ($xeForm) {
220
+ return $xeForm.props.readonly
221
+ }
222
+ return false
223
+ }
224
+ return readonly
225
+ })
226
+
227
+ const computeIsDisabled = computed(() => {
228
+ const { disabled } = props
229
+ if (disabled === null) {
230
+ if ($xeForm) {
231
+ return $xeForm.props.disabled
232
+ }
233
+ return false
234
+ }
235
+ return disabled
236
+ })
237
+
238
+ const computeDefaultDates = computed(() => {
239
+ const { defaultDate } = props
240
+ if (defaultDate) {
241
+ if (XEUtils.isArray(defaultDate)) {
242
+ return defaultDate
243
+ }
244
+ if (`${defaultDate}`.indexOf(',') > -1) {
245
+ return `${defaultDate}`.split(',')
246
+ }
247
+ return [defaultDate, defaultDate]
248
+ }
249
+ return []
250
+ })
251
+
252
+ const computeDefaultTimes = computed(() => {
253
+ const { defaultTime } = props
254
+ if (defaultTime) {
255
+ if (XEUtils.isArray(defaultTime)) {
256
+ return defaultTime
257
+ }
258
+ if (`${defaultTime}`.indexOf(',') > -1) {
259
+ return `${defaultTime}`.split(',')
260
+ }
261
+ return [defaultTime, defaultTime]
262
+ }
263
+ return []
264
+ })
265
+
266
+ const computeMVal = computed(() => {
267
+ const { startValue, endValue } = props
268
+ return `${startValue || ''}${endValue || ''}`
269
+ })
270
+
271
+ const computeIsDateTimeType = computed(() => {
272
+ const { type } = props
273
+ return type === 'time' || type === 'datetime'
274
+ })
275
+
276
+ const computeIsDatePickerType = computed(() => {
277
+ return ['date', 'week', 'month', 'quarter', 'year'].indexOf(props.type) > -1
278
+ })
279
+
280
+ const computeIsClearable = computed(() => {
281
+ return props.clearable
282
+ })
283
+
284
+ const computeInpPlaceholder = computed(() => {
285
+ const { placeholder } = props
286
+ if (placeholder) {
287
+ return getFuncText(placeholder)
288
+ }
289
+ const globalPlaceholder = getConfig().dateRangePicker.placeholder
290
+ if (globalPlaceholder) {
291
+ return getFuncText(globalPlaceholder)
292
+ }
293
+ return getI18n('vxe.dateRangePicker.pleaseRange')
294
+ })
295
+
296
+ const computeInpImmediate = computed(() => {
297
+ const { immediate } = props
298
+ return immediate
299
+ })
300
+
301
+ const computeTimeOpts = computed(() => {
302
+ return Object.assign({}, getConfig().dateRangePicker.timeConfig, props.timeConfig)
303
+ })
304
+
305
+ const computePopupOpts = computed(() => {
306
+ return Object.assign({}, getConfig().dateRangePicker.popupConfig, props.popupConfig)
307
+ })
308
+
309
+ const computeShortcutOpts = computed(() => {
310
+ return Object.assign({}, getConfig().dateRangePicker.shortcutConfig, props.shortcutConfig)
311
+ })
312
+
313
+ const computeShortcutList = computed(() => {
314
+ const shortcutOpts = computeShortcutOpts.value
315
+ const { options } = shortcutOpts
316
+ if (options) {
317
+ return options.map((option, index) => {
318
+ return Object.assign({
319
+ name: `${option.name || option.code || index}`
320
+ }, option)
321
+ })
322
+ }
323
+ return []
324
+ })
325
+
326
+ const computeDateLabelFormat = computed(() => {
327
+ const { labelFormat } = props
328
+ return labelFormat || getI18n(`vxe.input.date.labelFormat.${props.type}`)
329
+ })
330
+
331
+ const computeDateValueFormat = computed(() => {
332
+ const { type, valueFormat } = props
333
+ return handleValueFormat(type, valueFormat)
334
+ })
335
+
336
+ const computeFirstDayOfWeek = computed(() => {
337
+ const { startDay } = props
338
+ return XEUtils.toNumber(startDay) as VxeDateRangePickerPropTypes.StartDay
339
+ })
340
+
341
+ const computePanelLabelObj = computed(() => {
342
+ const { startValue, endValue } = reactData
343
+ const vals: string[] = startValue || endValue ? [startValue || '', endValue || ''] : []
344
+ return formatRangeLabel(vals)
345
+ })
346
+
347
+ const computeInputLabel = computed(() => {
348
+ const panelLabelObj = computePanelLabelObj.value
349
+ return panelLabelObj.label
350
+ })
351
+
352
+ const formatRangeLabel = (vals: string[]) => {
353
+ const { type, separator } = props
354
+ const dateLabelFormat = computeDateLabelFormat.value
355
+ const dateValueFormat = computeDateValueFormat.value
356
+ const firstDayOfWeek = computeFirstDayOfWeek.value
357
+ const startRest = vals[0]
358
+ ? parseDateObj(vals[0], type, {
359
+ valueFormat: dateValueFormat,
360
+ labelFormat: dateLabelFormat,
361
+ firstDay: firstDayOfWeek
362
+ })
363
+ : null
364
+ const endRest = vals[1]
365
+ ? parseDateObj(vals[1], type, {
366
+ valueFormat: dateValueFormat,
367
+ labelFormat: dateLabelFormat,
368
+ firstDay: firstDayOfWeek
369
+ })
370
+ : null
371
+ const startLabel = startRest ? startRest.label : ''
372
+ const endLabel = endRest ? endRest.label : ''
373
+ return {
374
+ label: (startLabel || endLabel ? [startLabel, endLabel] : []).join(`${separator || ' ~ '}`),
375
+ startLabel,
376
+ endLabel
377
+ }
378
+ }
379
+
380
+ const getRangeValue = (sValue: string, eValue: string) => {
381
+ const { modelValue, valueType } = props
382
+ let isArr = XEUtils.isArray(modelValue)
383
+ if (valueType) {
384
+ switch (valueType) {
385
+ case 'array':
386
+ isArr = true
387
+ break
388
+ case 'string':
389
+ isArr = false
390
+ break
391
+ }
392
+ }
393
+ if (sValue || eValue) {
394
+ const rest = [sValue || '', eValue || '']
395
+ if (isArr) {
396
+ return rest
397
+ }
398
+ return rest.join(',')
399
+ }
400
+ return isArr ? [] : ''
401
+ }
402
+
403
+ const paraeUpdateModel = () => {
404
+ const { type, modelValue } = props
405
+ const dateValueFormat = computeDateValueFormat.value
406
+ let sValue: string | Date | null = ''
407
+ let eValue: string | Date | null = ''
408
+ if (XEUtils.isArray(modelValue)) {
409
+ const date1 = parseDateString(modelValue[0], type, { valueFormat: dateValueFormat })
410
+ const date2 = parseDateString(modelValue[1], type, { valueFormat: dateValueFormat })
411
+ if (date1 || date2) {
412
+ sValue = date1 || ''
413
+ eValue = date2 || ''
414
+ }
415
+ } else if (XEUtils.isString(modelValue)) {
416
+ const strArr = modelValue.split(',')
417
+ if (strArr[0] || strArr[1]) {
418
+ sValue = strArr[0] || ''
419
+ eValue = strArr[1] || ''
420
+ }
421
+ }
422
+ return {
423
+ sValue,
424
+ eValue
425
+ }
426
+ }
427
+
428
+ const parseUpdateData = () => {
429
+ const { type, startValue, endValue } = props
430
+ const dateValueFormat = computeDateValueFormat.value
431
+ let sValue: string | Date | null = ''
432
+ let eValue: string | Date | null = ''
433
+ sValue = parseDateString(startValue, type, { valueFormat: dateValueFormat })
434
+ eValue = parseDateString(endValue, type, { valueFormat: dateValueFormat })
435
+ return {
436
+ sValue,
437
+ eValue
438
+ }
439
+ }
440
+
441
+ const updateModelValue = (isModel: boolean) => {
442
+ const { modelValue, startValue, endValue } = props
443
+ let restObj: {
444
+ sValue: string | Date | null
445
+ eValue: string | Date | null
446
+ } = {
447
+ sValue: '',
448
+ eValue: ''
449
+ }
450
+ if (isModel) {
451
+ if (modelValue) {
452
+ restObj = paraeUpdateModel()
453
+ } else {
454
+ restObj = parseUpdateData()
455
+ }
456
+ } else {
457
+ if (startValue || endValue) {
458
+ restObj = parseUpdateData()
459
+ } else {
460
+ restObj = paraeUpdateModel()
461
+ }
462
+ }
463
+ reactData.startValue = restObj.sValue
464
+ reactData.endValue = restObj.eValue
465
+ }
466
+
467
+ const triggerEvent = (evnt: Event & { type: 'input' | 'change' | 'keydown' | 'keyup' | 'click' | 'focus' | 'blur' }) => {
468
+ const { startValue, endValue } = reactData
469
+ const value = getRangeValue(startValue, endValue)
470
+ dispatchEvent(evnt.type, { value, startValue, endValue }, evnt)
471
+ }
472
+
473
+ const handleChange = (sValue: string, eValue: string, evnt: Event | { type: string }) => {
474
+ const { modelValue } = props
475
+ reactData.startValue = sValue
476
+ reactData.endValue = eValue
477
+ const value = getRangeValue(sValue, eValue)
478
+ const isFinish = (sValue && eValue) || (!sValue && !eValue)
479
+ emit('update:modelValue', value)
480
+ emit('update:startValue', sValue || '')
481
+ emit('update:endValue', eValue || '')
482
+ if (XEUtils.toValueString(modelValue) !== value) {
483
+ dispatchEvent('change', { value, startValue: sValue, endValue: eValue, isFinish }, evnt as any)
484
+ // 自动更新校验状态
485
+ if ($xeForm && formItemInfo) {
486
+ $xeForm.triggerItemEvent(evnt, formItemInfo.itemConfig.field, value)
487
+ }
488
+ }
489
+ }
490
+
491
+ const changeEvent = (evnt: Event & { type: 'change' }) => {
492
+ const inpImmediate = computeInpImmediate.value
493
+ if (!inpImmediate) {
494
+ triggerEvent(evnt)
495
+ }
496
+ }
497
+
498
+ const focusEvent = (evnt: Event & { type: 'focus' }) => {
499
+ const popupOpts = computePopupOpts.value
500
+ const { trigger } = popupOpts
501
+ reactData.isActivated = true
502
+ if (!trigger || trigger === 'default') {
503
+ dateRangePickerOpenEvent(evnt)
504
+ }
505
+ triggerEvent(evnt)
506
+ }
507
+
508
+ const clickPrefixEvent = (evnt: Event) => {
509
+ const isDisabled = computeIsDisabled.value
510
+ if (!isDisabled) {
511
+ const { startValue, endValue } = reactData
512
+ const value = getRangeValue(startValue, endValue)
513
+ dispatchEvent('prefix-click', { value, startValue, endValue }, evnt)
514
+ }
515
+ }
516
+
517
+ const hidePanel = () => {
518
+ return new Promise<void>(resolve => {
519
+ reactData.visiblePanel = false
520
+ internalData.hpTimeout = setTimeout(() => {
521
+ reactData.isAniVisible = false
522
+ resolve()
523
+ }, 350)
524
+ })
525
+ }
526
+
527
+ const clearValueEvent = (evnt: Event, value: VxeDateRangePickerPropTypes.ModelValue) => {
528
+ const isDatePickerType = computeIsDatePickerType.value
529
+ if (isDatePickerType) {
530
+ hidePanel()
531
+ }
532
+ const startValue = ''
533
+ const endValue = ''
534
+ handleChange(startValue, endValue, evnt)
535
+ dispatchEvent('clear', { value, startValue, endValue }, evnt)
536
+ }
537
+
538
+ const checkValue = () => {
539
+ const $startDatePanel = refStartDatePanel.value
540
+ const $endDatePanel = refEndDatePanel.value
541
+ if ($startDatePanel && $endDatePanel) {
542
+ const startValue = $startDatePanel.getModelValue()
543
+ const endValue = $endDatePanel.getModelValue()
544
+ if (!startValue || !endValue) {
545
+ handleChange('', '', { type: 'check' })
546
+ }
547
+ }
548
+ }
549
+
550
+ const handleSelectClose = () => {
551
+ const { autoClose } = props
552
+ const { startValue, endValue } = reactData
553
+ const { selectStatus } = internalData
554
+ const isDatePickerType = computeIsDatePickerType.value
555
+ if (autoClose) {
556
+ if (selectStatus && isDatePickerType) {
557
+ if (startValue && endValue) {
558
+ hidePanel()
559
+ }
560
+ }
561
+ } else {
562
+ if (startValue && endValue) {
563
+ internalData.selectStatus = false
564
+ }
565
+ }
566
+ }
567
+
568
+ const clickSuffixEvent = (evnt: Event) => {
569
+ const isDisabled = computeIsDisabled.value
570
+ if (!isDisabled) {
571
+ const { startValue, endValue } = reactData
572
+ const value = getRangeValue(startValue, endValue)
573
+ dispatchEvent('suffix-click', { value, startValue, endValue }, evnt)
574
+ }
575
+ }
576
+
577
+ const blurEvent = (evnt: Event & { type: 'blur' }) => {
578
+ const { startValue, endValue } = reactData
579
+ const inpImmediate = computeInpImmediate.value
580
+ const value = ''
581
+ if (!inpImmediate) {
582
+ handleChange(startValue, endValue, evnt)
583
+ }
584
+ if (!reactData.visiblePanel) {
585
+ reactData.isActivated = false
586
+ }
587
+ dispatchEvent('blur', { value, startValue, endValue }, evnt)
588
+ // 自动更新校验状态
589
+ if ($xeForm && formItemInfo) {
590
+ $xeForm.triggerItemEvent(evnt, formItemInfo.itemConfig.field, value)
591
+ }
592
+ }
593
+
594
+ const keydownEvent = (evnt: KeyboardEvent & { type: 'keydown' }) => {
595
+ triggerEvent(evnt)
596
+ }
597
+
598
+ const keyupEvent = (evnt: KeyboardEvent & { type: 'keyup' }) => {
599
+ triggerEvent(evnt)
600
+ }
601
+
602
+ const confirmEvent = (evnt: MouseEvent) => {
603
+ const $startDatePanel = refStartDatePanel.value
604
+ const $endDatePanel = refEndDatePanel.value
605
+ if ($startDatePanel && $endDatePanel) {
606
+ const startValue = $startDatePanel.getModelValue()
607
+ const endValue = $endDatePanel.getModelValue()
608
+ if ((startValue && !endValue) || (!startValue && endValue)) {
609
+ handleChange('', '', evnt)
610
+ } else {
611
+ $startDatePanel.confirmByEvent(evnt)
612
+ $endDatePanel.confirmByEvent(evnt)
613
+ }
614
+ const value = getRangeValue(startValue, endValue)
615
+ dispatchEvent('confirm', { value, startValue, endValue }, evnt)
616
+ }
617
+ hidePanel()
618
+ }
619
+
620
+ const startPanelChangeEvent = (params: any) => {
621
+ const { selectStatus } = internalData
622
+ const { value, $event } = params
623
+ const endValue = selectStatus ? reactData.endValue : ''
624
+ handleChange(value, endValue, $event)
625
+ handleSelectClose()
626
+ if (!selectStatus) {
627
+ internalData.selectStatus = true
628
+ }
629
+ nextTick(() => {
630
+ const $startDatePanel = refStartDatePanel.value
631
+ const $endDatePanel = refEndDatePanel.value
632
+ if ($startDatePanel && $endDatePanel) {
633
+ const startValue = $startDatePanel.getModelValue()
634
+ if (!endValue && startValue) {
635
+ $endDatePanel.setPanelDate(XEUtils.toStringDate(startValue))
636
+ }
637
+ }
638
+ })
639
+ }
640
+
641
+ const endPanelChangeEvent = (params: any) => {
642
+ const { selectStatus } = internalData
643
+ const { value, $event } = params
644
+ const startValue = selectStatus ? reactData.startValue : ''
645
+ handleChange(startValue, value, $event)
646
+ handleSelectClose()
647
+ if (!selectStatus) {
648
+ internalData.selectStatus = true
649
+ }
650
+ nextTick(() => {
651
+ const $startDatePanel = refStartDatePanel.value
652
+ const $endDatePanel = refEndDatePanel.value
653
+ if ($startDatePanel && $endDatePanel) {
654
+ const endValue = $endDatePanel.getModelValue()
655
+ if (!startValue && endValue) {
656
+ $startDatePanel.setPanelDate(XEUtils.toStringDate(endValue))
657
+ }
658
+ }
659
+ })
660
+ }
661
+
662
+ // 全局事件
663
+ const handleGlobalMousedownEvent = (evnt: Event) => {
664
+ const { visiblePanel, isActivated } = reactData
665
+ const el = refElem.value
666
+ const panelWrapperElem = refPanelWrapper.value
667
+ const isDisabled = computeIsDisabled.value
668
+ if (!isDisabled && isActivated) {
669
+ reactData.isActivated = getEventTargetNode(evnt, el).flag || getEventTargetNode(evnt, panelWrapperElem).flag
670
+ if (!reactData.isActivated) {
671
+ if (visiblePanel) {
672
+ checkValue()
673
+ hidePanel()
674
+ }
675
+ }
676
+ }
677
+ }
678
+
679
+ const handleGlobalKeydownEvent = (evnt: KeyboardEvent) => {
680
+ const { visiblePanel } = reactData
681
+ const isDisabled = computeIsDisabled.value
682
+ if (!isDisabled) {
683
+ const isTab = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.TAB)
684
+ const isEsc = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ESCAPE)
685
+ if (isTab) {
686
+ reactData.isActivated = false
687
+ }
688
+ if (visiblePanel) {
689
+ if (isEsc || isTab) {
690
+ checkValue()
691
+ hidePanel()
692
+ }
693
+ }
694
+ }
695
+ }
696
+
697
+ const handleGlobalMousewheelEvent = (evnt: Event) => {
698
+ const { visiblePanel } = reactData
699
+ const isDisabled = computeIsDisabled.value
700
+ if (!isDisabled) {
701
+ if (visiblePanel) {
702
+ const panelWrapperElem = refPanelWrapper.value
703
+ if (getEventTargetNode(evnt, panelWrapperElem).flag) {
704
+ updatePlacement()
705
+ } else {
706
+ checkValue()
707
+ hidePanel()
708
+ }
709
+ }
710
+ }
711
+ }
712
+
713
+ const handleGlobalBlurEvent = () => {
714
+ const { visiblePanel, isActivated } = reactData
715
+ if (visiblePanel) {
716
+ checkValue()
717
+ hidePanel()
718
+ }
719
+ if (isActivated) {
720
+ reactData.isActivated = false
721
+ }
722
+ if (visiblePanel || isActivated) {
723
+ const targetElem = refInputTarget.value
724
+ if (targetElem) {
725
+ targetElem.blur()
726
+ }
727
+ }
728
+ }
729
+
730
+ const handleGlobalResizeEvent = () => {
731
+ const { visiblePanel } = reactData
732
+ if (visiblePanel) {
733
+ updatePlacement()
734
+ }
735
+ }
736
+
737
+ // 弹出面板
738
+ const updateZindex = () => {
739
+ const popupOpts = computePopupOpts.value
740
+ const customZIndex = popupOpts.zIndex || props.zIndex
741
+ if (customZIndex) {
742
+ reactData.panelIndex = XEUtils.toNumber(customZIndex)
743
+ } else if (reactData.panelIndex < getLastZIndex()) {
744
+ reactData.panelIndex = nextZIndex()
745
+ }
746
+ }
747
+
748
+ const updatePlacement = () => {
749
+ const { placement } = props
750
+ const { panelIndex } = reactData
751
+ const targetElem = refInputTarget.value
752
+ const panelElem = refInputPanel.value
753
+ const btnTransfer = computeBtnTransfer.value
754
+ const popupOpts = computePopupOpts.value
755
+ const handleStyle = () => {
756
+ const ppObj = updatePanelPlacement(targetElem, panelElem, {
757
+ placement: popupOpts.placement || placement,
758
+ defaultPlacement: popupOpts.defaultPlacement,
759
+ teleportTo: btnTransfer
760
+ })
761
+ const panelStyle: { [key: string]: string | number } = Object.assign(ppObj.style, {
762
+ zIndex: panelIndex
763
+ })
764
+ reactData.panelStyle = panelStyle
765
+ reactData.panelPlacement = ppObj.placement
766
+ }
767
+ handleStyle()
768
+ return nextTick().then(handleStyle)
769
+ }
770
+
771
+ const showPanel = () => {
772
+ const { visiblePanel } = reactData
773
+ const isDisabled = computeIsDisabled.value
774
+ if (!isDisabled && !visiblePanel) {
775
+ if (!reactData.initialized) {
776
+ reactData.initialized = true
777
+ }
778
+ if (internalData.hpTimeout) {
779
+ clearTimeout(internalData.hpTimeout)
780
+ internalData.hpTimeout = undefined
781
+ }
782
+ internalData.selectStatus = false
783
+ reactData.isActivated = true
784
+ reactData.isAniVisible = true
785
+ setTimeout(() => {
786
+ reactData.visiblePanel = true
787
+ updatePlacement()
788
+ }, 10)
789
+ updateZindex()
790
+ return updatePlacement()
791
+ }
792
+ return nextTick()
793
+ }
794
+
795
+ const dateRangePickerOpenEvent = (evnt: Event) => {
796
+ const formReadonly = computeFormReadonly.value
797
+ if (!formReadonly) {
798
+ evnt.preventDefault()
799
+ showPanel()
800
+ }
801
+ }
802
+
803
+ const clickIconEvent = (evnt: MouseEvent) => {
804
+ const popupOpts = computePopupOpts.value
805
+ const { trigger } = popupOpts
806
+ if (!trigger || trigger === 'default' || trigger === 'icon') {
807
+ dateRangePickerOpenEvent(evnt)
808
+ }
809
+ }
810
+
811
+ const clickEvent = (evnt: Event & { type: 'click' }) => {
812
+ triggerEvent(evnt)
813
+ }
814
+
815
+ const handleShortcutEvent: VxeButtonGroupEvents.Click = ({ option, $event }) => {
816
+ const { type } = props
817
+ const shortcutOpts = computeShortcutOpts.value
818
+ const { autoClose } = shortcutOpts
819
+ const { code, clickMethod } = option as VxeDateRangePickerDefines.ShortcutOption
820
+ let startValue = reactData.startValue
821
+ let endValue = reactData.endValue
822
+ let value = getRangeValue(startValue, endValue)
823
+ const shortcutParams = {
824
+ $dateRangePicker: $xeDateRangePicker,
825
+ option: option,
826
+ value,
827
+ startValue,
828
+ endValue,
829
+ code
830
+ }
831
+ if (!clickMethod && code) {
832
+ const gCommandOpts = commands.get(code)
833
+ const drpCommandMethod = gCommandOpts ? gCommandOpts.dateRangePickerCommandMethod : null
834
+ if (drpCommandMethod) {
835
+ drpCommandMethod(shortcutParams)
836
+ } else {
837
+ const dateValueFormat = computeDateValueFormat.value
838
+ const firstDayOfWeek = computeFirstDayOfWeek.value
839
+ switch (code) {
840
+ case 'last1':
841
+ case 'last3':
842
+ case 'last7':
843
+ case 'last30':
844
+ case 'last60':
845
+ case 'last90':
846
+ case 'last180': {
847
+ const restObj = getRangeDateByCode(code, value, type, {
848
+ valueFormat: dateValueFormat,
849
+ firstDay: firstDayOfWeek
850
+ })
851
+ startValue = restObj.startValue
852
+ endValue = restObj.endValue
853
+ value = getRangeValue(startValue, endValue)
854
+ shortcutParams.value = value
855
+ shortcutParams.startValue = startValue
856
+ shortcutParams.endValue = endValue
857
+ handleChange(startValue, endValue, $event)
858
+ break
859
+ }
860
+ default:
861
+ errLog('vxe.error.notCommands', [`[date-range-picker] ${code}`])
862
+ break
863
+ }
864
+ }
865
+ } else {
866
+ const optClickMethod = clickMethod || shortcutOpts.clickMethod
867
+ if (optClickMethod) {
868
+ optClickMethod(shortcutParams)
869
+ }
870
+ }
871
+ if (autoClose) {
872
+ hidePanel()
873
+ }
874
+ dispatchEvent('shortcut-click', shortcutParams, $event)
875
+ }
876
+
877
+ const dispatchEvent = (type: ValueOf<VxeDateRangePickerEmits>, params: Record<string, any>, evnt: Event | null) => {
878
+ emit(type, createEvent(evnt, { $dateRangePicker: $xeDateRangePicker }, params))
879
+ }
880
+
881
+ dateRangePickerMethods = {
882
+ dispatchEvent,
883
+
884
+ setModelValue (startValue, endValue) {
885
+ reactData.startValue = startValue || ''
886
+ reactData.endValue = endValue || ''
887
+ const value = getRangeValue(startValue, endValue)
888
+ emit('update:modelValue', value)
889
+ },
890
+ setModelValueByEvent (evnt, startValue, endValue) {
891
+ handleChange(startValue || '', endValue || '', evnt)
892
+ },
893
+ focus () {
894
+ const inputElem = refInputTarget.value
895
+ reactData.isActivated = true
896
+ inputElem.focus()
897
+ return nextTick()
898
+ },
899
+ blur () {
900
+ const inputElem = refInputTarget.value
901
+ inputElem.blur()
902
+ reactData.isActivated = false
903
+ return nextTick()
904
+ },
905
+ select () {
906
+ const inputElem = refInputTarget.value
907
+ inputElem.select()
908
+ reactData.isActivated = false
909
+ return nextTick()
910
+ },
911
+ showPanel,
912
+ hidePanel,
913
+ updatePlacement
914
+ }
915
+
916
+ Object.assign($xeDateRangePicker, dateRangePickerMethods)
917
+
918
+ const renderShortcutBtn = (pos: 'top' | 'bottom' | 'left' | 'right' | 'header' | 'footer', isVertical?: boolean) => {
919
+ const shortcutOpts = computeShortcutOpts.value
920
+ const { position, align, mode } = shortcutOpts
921
+ const shortcutList = computeShortcutList.value
922
+ if (isEnableConf(shortcutOpts) && shortcutList.length && (position || 'left') === pos) {
923
+ return h('div', {
924
+ class: `vxe-date-range-picker--layout-${pos}-wrapper`
925
+ }, [
926
+ h(VxeButtonGroupComponent, {
927
+ options: shortcutList,
928
+ mode,
929
+ align,
930
+ vertical: isVertical,
931
+ onClick: handleShortcutEvent
932
+ })
933
+ ])
934
+ }
935
+ return renderEmptyElement($xeDateRangePicker)
936
+ }
937
+
938
+ const renderPanel = () => {
939
+ const { type, separator, autoClose, showConfirmButton, showClearButton } = props
940
+ const { initialized, isAniVisible, visiblePanel, panelPlacement, panelStyle, startValue, endValue } = reactData
941
+ const vSize = computeSize.value
942
+ const btnTransfer = computeBtnTransfer.value
943
+ const shortcutOpts = computeShortcutOpts.value
944
+ const isClearable = computeIsClearable.value
945
+ const panelLabelObj = computePanelLabelObj.value
946
+ const shortcutList = computeShortcutList.value
947
+ const isDateTimeType = computeIsDateTimeType.value
948
+ const defaultDates = computeDefaultDates.value
949
+ const defaultTimes = computeDefaultTimes.value
950
+ const timeOpts = computeTimeOpts.value
951
+ const popupOpts = computePopupOpts.value
952
+ const { startLabel, endLabel } = panelLabelObj
953
+ const { position } = shortcutOpts
954
+ const headerSlot = slots.header
955
+ const footerSlot = slots.footer
956
+ const topSlot = slots.top
957
+ const bottomSlot = slots.bottom
958
+ const leftSlot = slots.left
959
+ const rightSlot = slots.right
960
+ const ppClassName = popupOpts.className
961
+ const [sdDate, edDate] = defaultDates
962
+ const [sdTime, edTime] = defaultTimes
963
+ const hasShortcutBtn = shortcutList.length > 0
964
+ const showConfirmBtn = (showConfirmButton === null ? (isDateTimeType || !autoClose) : showConfirmButton)
965
+ const showClearBtn = (showClearButton === null ? isClearable : showClearButton)
966
+ return h(Teleport, {
967
+ to: 'body',
968
+ disabled: btnTransfer ? !initialized : true
969
+ }, [
970
+ h('div', {
971
+ ref: refInputPanel,
972
+ class: ['vxe-table--ignore-clear vxe-date-range-picker--panel', `type--${type}`, ppClassName ? (XEUtils.isFunction(ppClassName) ? ppClassName({ $dateRangePicker: $xeDateRangePicker }) : ppClassName) : '', {
973
+ [`size--${vSize}`]: vSize,
974
+ 'is--transfer': btnTransfer,
975
+ 'ani--leave': isAniVisible,
976
+ 'ani--enter': visiblePanel,
977
+ 'show--top': !!(topSlot || headerSlot || (hasShortcutBtn && (position === 'top' || position === 'header'))),
978
+ 'show--bottom': !!(bottomSlot || footerSlot || (hasShortcutBtn && (position === 'bottom' || position === 'footer'))),
979
+ 'show--left': !!(leftSlot || (hasShortcutBtn && position === 'left')),
980
+ 'show--right': !!(rightSlot || (hasShortcutBtn && position === 'right'))
981
+ }],
982
+ placement: panelPlacement,
983
+ style: panelStyle
984
+ }, initialized && (visiblePanel || isAniVisible)
985
+ ? [
986
+ h('div', {
987
+ ref: refPanelWrapper,
988
+ class: ['vxe-date-range-picker--layout-all-wrapper', `type--${type}`, {
989
+ [`size--${vSize}`]: vSize
990
+ }]
991
+ }, [
992
+ topSlot
993
+ ? h('div', {
994
+ class: 'vxe-date-range-picker--layout-top-wrapper'
995
+ }, topSlot({}))
996
+ : renderShortcutBtn('top'),
997
+ h('div', {
998
+ class: 'vxe-date-range-picker--layout-body-layout-wrapper'
999
+ }, [
1000
+ leftSlot
1001
+ ? h('div', {
1002
+ class: 'vxe-date-range-picker--layout-left-wrapper'
1003
+ }, leftSlot({}))
1004
+ : renderShortcutBtn('left', true),
1005
+ h('div', {
1006
+ class: 'vxe-date-range-picker--layout-body-content-wrapper'
1007
+ }, [
1008
+ headerSlot
1009
+ ? h('div', {
1010
+ class: 'vxe-date-range-picker--layout-header-wrapper'
1011
+ }, headerSlot({}))
1012
+ : renderShortcutBtn('header'),
1013
+ h('div', {
1014
+ class: 'vxe-date-range-picker--layout-body-wrapper'
1015
+ }, [
1016
+ h(VxeDatePanelComponent, {
1017
+ ref: refStartDatePanel,
1018
+ modelValue: startValue,
1019
+ type: props.type,
1020
+ className: props.className,
1021
+ minDate: props.minDate,
1022
+ maxDate: props.maxDate,
1023
+ endDate: endValue,
1024
+ startDay: props.startDay,
1025
+ labelFormat: props.labelFormat,
1026
+ valueFormat: props.valueFormat,
1027
+ timeFormat: props.timeFormat,
1028
+ defaultDate: sdDate,
1029
+ defaultTime: sdTime,
1030
+ timeConfig: timeOpts,
1031
+ festivalMethod: props.festivalMethod,
1032
+ disabledMethod: props.disabledMethod,
1033
+ selectDay: props.selectDay,
1034
+ onChange: startPanelChangeEvent
1035
+ }),
1036
+ h(VxeDatePanelComponent, {
1037
+ ref: refEndDatePanel,
1038
+ modelValue: endValue,
1039
+ type: props.type,
1040
+ className: props.className,
1041
+ minDate: props.minDate,
1042
+ maxDate: props.maxDate,
1043
+ startDate: startValue,
1044
+ startDay: props.startDay,
1045
+ labelFormat: props.labelFormat,
1046
+ valueFormat: props.valueFormat,
1047
+ timeFormat: props.timeFormat,
1048
+ defaultDate: edDate,
1049
+ defaultTime: edTime,
1050
+ timeConfig: timeOpts,
1051
+ festivalMethod: props.festivalMethod,
1052
+ disabledMethod: props.disabledMethod,
1053
+ selectDay: props.selectDay,
1054
+ onChange: endPanelChangeEvent
1055
+ })
1056
+ ]),
1057
+ h('div', {
1058
+ class: 'vxe-date-range-picker--layout-footer-wrapper'
1059
+ }, [
1060
+ h('div', {
1061
+ class: 'vxe-date-range-picker--layout-footer-label'
1062
+ }, startLabel || endLabel
1063
+ ? [
1064
+ h('span', startLabel),
1065
+ h('span', `${separator || ''}`),
1066
+ h('span', endLabel)
1067
+ ]
1068
+ : `${separator || ''}`),
1069
+ h('div', {
1070
+ class: 'vxe-date-range-picker--layout-footer-custom'
1071
+ }, footerSlot ? footerSlot({}) : [renderShortcutBtn('footer')]),
1072
+ h('div', {
1073
+ class: 'vxe-date-range-picker--layout-footer-btns'
1074
+ }, [
1075
+ showClearBtn
1076
+ ? h(VxeButtonComponent, {
1077
+ size: 'mini',
1078
+ disabled: !(startValue || endValue),
1079
+ content: getI18n('vxe.button.clear'),
1080
+ onClick: clearValueEvent
1081
+ })
1082
+ : renderEmptyElement($xeDateRangePicker),
1083
+ showConfirmBtn
1084
+ ? h(VxeButtonComponent, {
1085
+ size: 'mini',
1086
+ status: 'primary',
1087
+ content: getI18n('vxe.button.confirm'),
1088
+ onClick: confirmEvent
1089
+ })
1090
+ : renderEmptyElement($xeDateRangePicker)
1091
+ ])
1092
+ ])
1093
+ ]),
1094
+ rightSlot
1095
+ ? h('div', {
1096
+ class: 'vxe-date-range-picker--layout-right-wrapper'
1097
+ }, rightSlot({}))
1098
+ : renderShortcutBtn('right', true)
1099
+ ]),
1100
+ bottomSlot
1101
+ ? h('div', {
1102
+ class: 'vxe-date-range-picker--layout-bottom-wrapper'
1103
+ }, bottomSlot({}))
1104
+ : renderShortcutBtn('bottom')
1105
+ ])
1106
+ ]
1107
+ : [])
1108
+ ])
1109
+ }
1110
+
1111
+ const renderPrefixIcon = () => {
1112
+ const { prefixIcon } = props
1113
+ const prefixSlot = slots.prefix
1114
+ return prefixSlot || prefixIcon
1115
+ ? h('div', {
1116
+ class: 'vxe-date-range-picker--prefix',
1117
+ onClick: clickPrefixEvent
1118
+ }, [
1119
+ h('div', {
1120
+ class: 'vxe-date-range-picker--prefix-icon'
1121
+ }, prefixSlot
1122
+ ? getSlotVNs(prefixSlot({}))
1123
+ : [
1124
+ h('i', {
1125
+ class: prefixIcon
1126
+ })
1127
+ ])
1128
+ ])
1129
+ : null
1130
+ }
1131
+
1132
+ const renderSuffixIcon = () => {
1133
+ const { suffixIcon } = props
1134
+ const { startValue, endValue } = reactData
1135
+ const suffixSlot = slots.suffix
1136
+ const isDisabled = computeIsDisabled.value
1137
+ const isClearable = computeIsClearable.value
1138
+ return h('div', {
1139
+ class: ['vxe-date-range-picker--suffix', {
1140
+ 'is--clear': isClearable && !isDisabled && (startValue || endValue)
1141
+ }]
1142
+ }, [
1143
+ isClearable
1144
+ ? h('div', {
1145
+ class: 'vxe-date-range-picker--clear-icon',
1146
+ onClick: clearValueEvent
1147
+ }, [
1148
+ h('i', {
1149
+ class: getIcon().INPUT_CLEAR
1150
+ })
1151
+ ])
1152
+ : renderEmptyElement($xeDateRangePicker),
1153
+ renderExtraSuffixIcon(),
1154
+ suffixSlot || suffixIcon
1155
+ ? h('div', {
1156
+ class: 'vxe-date-range-picker--suffix-icon',
1157
+ onClick: clickSuffixEvent
1158
+ }, suffixSlot
1159
+ ? getSlotVNs(suffixSlot({}))
1160
+ : [
1161
+ h('i', {
1162
+ class: suffixIcon
1163
+ })
1164
+ ])
1165
+ : renderEmptyElement($xeDateRangePicker)
1166
+ ])
1167
+ }
1168
+
1169
+ const renderExtraSuffixIcon = () => {
1170
+ return h('div', {
1171
+ class: 'vxe-date-range-picker--control-icon',
1172
+ onClick: clickIconEvent
1173
+ }, [
1174
+ h('i', {
1175
+ class: ['vxe-date-range-picker--date-picker-icon', getIcon().DATE_PICKER_DATE]
1176
+ })
1177
+ ])
1178
+ }
1179
+
1180
+ const renderVN = () => {
1181
+ const { className, type, name, autoComplete } = props
1182
+ const { startValue, endValue, visiblePanel, isActivated } = reactData
1183
+ const vSize = computeSize.value
1184
+ const isDisabled = computeIsDisabled.value
1185
+ const formReadonly = computeFormReadonly.value
1186
+ const inputLabel = computeInputLabel.value
1187
+ if (formReadonly) {
1188
+ return h('div', {
1189
+ ref: refElem,
1190
+ class: ['vxe-date-range-picker--readonly', `type--${type}`, className]
1191
+ }, inputLabel)
1192
+ }
1193
+ const inpPlaceholder = computeInpPlaceholder.value
1194
+ const isClearable = computeIsClearable.value
1195
+ const prefix = renderPrefixIcon()
1196
+ const suffix = renderSuffixIcon()
1197
+ return h('div', {
1198
+ ref: refElem,
1199
+ class: ['vxe-date-range-picker', `type--${type}`, className, {
1200
+ [`size--${vSize}`]: vSize,
1201
+ 'is--prefix': !!prefix,
1202
+ 'is--suffix': !!suffix,
1203
+ 'is--visible': visiblePanel,
1204
+ 'is--disabled': isDisabled,
1205
+ 'is--active': isActivated,
1206
+ 'show--clear': isClearable && !isDisabled && (startValue || endValue)
1207
+ }],
1208
+ spellcheck: false
1209
+ }, [
1210
+ prefix || renderEmptyElement($xeDateRangePicker),
1211
+ h('div', {
1212
+ class: 'vxe-date-range-picker--wrapper'
1213
+ }, [
1214
+ h('input', {
1215
+ ref: refInputTarget,
1216
+ class: 'vxe-date-range-picker--inner',
1217
+ value: inputLabel,
1218
+ name,
1219
+ type: 'text',
1220
+ placeholder: inpPlaceholder,
1221
+ editable: false,
1222
+ disabled: isDisabled,
1223
+ autocomplete: autoComplete,
1224
+ onKeydown: keydownEvent,
1225
+ onKeyup: keyupEvent,
1226
+ onClick: clickEvent,
1227
+ onChange: changeEvent,
1228
+ onFocus: focusEvent,
1229
+ onBlur: blurEvent
1230
+ })
1231
+ ]),
1232
+ suffix || renderEmptyElement($xeDateRangePicker),
1233
+ // 下拉面板
1234
+ renderPanel()
1235
+ ])
1236
+ }
1237
+
1238
+ watch(() => props.modelValue, () => {
1239
+ updateModelValue(true)
1240
+ })
1241
+
1242
+ watch(computeMVal, () => {
1243
+ updateModelValue(false)
1244
+ })
1245
+
1246
+ updateModelValue(true)
1247
+
1248
+ nextTick(() => {
1249
+ globalEvents.on($xeDateRangePicker, 'mousewheel', handleGlobalMousewheelEvent)
1250
+ globalEvents.on($xeDateRangePicker, 'mousedown', handleGlobalMousedownEvent)
1251
+ globalEvents.on($xeDateRangePicker, 'keydown', handleGlobalKeydownEvent)
1252
+ globalEvents.on($xeDateRangePicker, 'blur', handleGlobalBlurEvent)
1253
+ globalEvents.on($xeDateRangePicker, 'resize', handleGlobalResizeEvent)
1254
+ })
1255
+
1256
+ onDeactivated(() => {
1257
+ checkValue()
1258
+ })
1259
+
1260
+ onUnmounted(() => {
1261
+ globalEvents.off($xeDateRangePicker, 'mousewheel')
1262
+ globalEvents.off($xeDateRangePicker, 'mousedown')
1263
+ globalEvents.off($xeDateRangePicker, 'blur')
1264
+ globalEvents.off($xeDateRangePicker, 'resize')
1265
+ })
1266
+
1267
+ onBeforeUnmount(() => {
1268
+ checkValue()
1269
+ })
1270
+
1271
+ provide('$xeDateRangePicker', $xeDateRangePicker)
1272
+
1273
+ $xeDateRangePicker.renderVN = renderVN
1274
+
1275
+ return $xeDateRangePicker
1276
+ },
1277
+ render () {
1278
+ return this.renderVN()
1279
+ }
1280
+ })