vxe-pc-ui 4.14.6 → 4.14.7

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