vxe-pc-ui 4.20.24 → 4.20.26

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