vxe-pc-ui 4.14.4 → 4.14.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (480) hide show
  1. package/LICENSE +21 -21
  2. package/README.en.md +72 -72
  3. package/README.ja-JP.md +72 -72
  4. package/README.md +364 -364
  5. package/README.zh-TW.md +73 -73
  6. package/es/tree/src/tree.js +31 -2
  7. package/es/tree-select/src/tree-select.js +2 -0
  8. package/es/ui/index.js +1 -1
  9. package/es/ui/src/log.js +1 -1
  10. package/lib/index.umd.js +2359 -2257
  11. package/lib/index.umd.min.js +1 -1
  12. package/lib/tree/src/tree.js +27 -2
  13. package/lib/tree/src/tree.min.js +1 -1
  14. package/lib/tree-select/src/tree-select.js +2 -0
  15. package/lib/tree-select/src/tree-select.min.js +1 -1
  16. package/lib/ui/index.js +1 -1
  17. package/lib/ui/index.min.js +1 -1
  18. package/lib/ui/src/log.js +1 -1
  19. package/lib/ui/src/log.min.js +1 -1
  20. package/package.json +88 -88
  21. package/packages/alert/index.ts +16 -16
  22. package/packages/alert/src/alert.ts +124 -124
  23. package/packages/anchor/index.ts +16 -16
  24. package/packages/anchor/src/anchor-link.ts +121 -121
  25. package/packages/anchor/src/anchor.ts +237 -237
  26. package/packages/anchor/src/util.ts +23 -23
  27. package/packages/anchor-link/index.ts +16 -16
  28. package/packages/avatar/index.ts +16 -16
  29. package/packages/avatar/src/avatar.ts +149 -149
  30. package/packages/backtop/index.ts +16 -16
  31. package/packages/backtop/src/backtop.ts +314 -314
  32. package/packages/badge/index.ts +16 -16
  33. package/packages/badge/src/badge.ts +100 -100
  34. package/packages/breadcrumb/index.ts +16 -16
  35. package/packages/breadcrumb/src/breadcrumb-item.ts +106 -106
  36. package/packages/breadcrumb/src/breadcrumb.ts +92 -92
  37. package/packages/breadcrumb-item/index.ts +16 -16
  38. package/packages/button/index.ts +16 -16
  39. package/packages/button/src/button-group.ts +110 -110
  40. package/packages/button/src/button.ts +841 -841
  41. package/packages/button-group/index.ts +16 -16
  42. package/packages/calendar/index.ts +16 -16
  43. package/packages/calendar/src/calendar.ts +1351 -1351
  44. package/packages/card/index.ts +16 -16
  45. package/packages/card/src/card.ts +175 -175
  46. package/packages/carousel/index.ts +16 -16
  47. package/packages/carousel/src/carousel-item.ts +102 -102
  48. package/packages/carousel/src/carousel.ts +414 -414
  49. package/packages/carousel/src/util.ts +21 -21
  50. package/packages/carousel-item/index.ts +16 -16
  51. package/packages/cascader/index.ts +16 -16
  52. package/packages/cascader/src/cascader.ts +741 -741
  53. package/packages/checkbox/index.ts +16 -16
  54. package/packages/checkbox/src/button.ts +144 -144
  55. package/packages/checkbox/src/checkbox.ts +154 -154
  56. package/packages/checkbox/src/group.ts +222 -222
  57. package/packages/checkbox-button/index.ts +16 -16
  58. package/packages/checkbox-group/index.ts +16 -16
  59. package/packages/col/index.ts +16 -16
  60. package/packages/collapse/index.ts +16 -16
  61. package/packages/collapse/src/collapse-pane.ts +114 -114
  62. package/packages/collapse/src/collapse.ts +284 -284
  63. package/packages/collapse/src/util.ts +21 -21
  64. package/packages/collapse-pane/index.ts +16 -16
  65. package/packages/color-picker/index.ts +16 -16
  66. package/packages/color-picker/src/color-picker.ts +1109 -1109
  67. package/packages/color-picker/src/util.ts +198 -198
  68. package/packages/components.ts +307 -307
  69. package/packages/context-menu/index.ts +54 -54
  70. package/packages/context-menu/src/context-menu.ts +681 -681
  71. package/packages/countdown/index.ts +16 -16
  72. package/packages/countdown/src/countdown.ts +262 -262
  73. package/packages/date-panel/index.ts +16 -16
  74. package/packages/date-panel/src/date-panel.ts +1809 -1809
  75. package/packages/date-panel/src/util.ts +244 -244
  76. package/packages/date-picker/index.ts +16 -16
  77. package/packages/date-picker/src/date-picker.ts +1071 -1071
  78. package/packages/date-range-picker/index.ts +16 -16
  79. package/packages/date-range-picker/src/date-range-picker.ts +1280 -1280
  80. package/packages/drawer/index.ts +77 -77
  81. package/packages/drawer/src/drawer.ts +657 -657
  82. package/packages/dynamics/index.ts +89 -89
  83. package/packages/empty/index.ts +16 -16
  84. package/packages/empty/src/empty.ts +100 -100
  85. package/packages/form/index.ts +16 -16
  86. package/packages/form/render/index.ts +598 -598
  87. package/packages/form/src/form-config-item.ts +72 -72
  88. package/packages/form/src/form-group.ts +86 -86
  89. package/packages/form/src/form-item.ts +174 -174
  90. package/packages/form/src/form.ts +987 -987
  91. package/packages/form/src/itemInfo.ts +80 -80
  92. package/packages/form/src/render.ts +387 -387
  93. package/packages/form/src/util.ts +93 -93
  94. package/packages/form-gather/index.ts +26 -26
  95. package/packages/form-group/index.ts +16 -16
  96. package/packages/form-item/index.ts +16 -16
  97. package/packages/icon/index.ts +16 -16
  98. package/packages/icon/src/icon.ts +75 -75
  99. package/packages/icon-picker/index.ts +16 -16
  100. package/packages/icon-picker/src/icon-picker.ts +626 -626
  101. package/packages/image/index.ts +16 -16
  102. package/packages/image/src/group.ts +153 -153
  103. package/packages/image/src/image.ts +298 -298
  104. package/packages/image/src/preview.ts +672 -672
  105. package/packages/image/src/util.ts +59 -59
  106. package/packages/image-group/index.ts +16 -16
  107. package/packages/image-preview/index.ts +19 -19
  108. package/packages/index.ts +4 -4
  109. package/packages/input/index.ts +16 -16
  110. package/packages/input/src/input.ts +2788 -2788
  111. package/packages/language/ar-EG.ts +840 -840
  112. package/packages/language/de-DE.ts +840 -840
  113. package/packages/language/en-US.ts +840 -840
  114. package/packages/language/es-ES.ts +840 -840
  115. package/packages/language/fr-FR.ts +840 -840
  116. package/packages/language/hu-HU.ts +840 -840
  117. package/packages/language/hy-AM.ts +840 -840
  118. package/packages/language/id-ID.ts +840 -840
  119. package/packages/language/it-IT.ts +840 -840
  120. package/packages/language/ja-JP.ts +840 -840
  121. package/packages/language/ko-KR.ts +840 -840
  122. package/packages/language/ms-MY.ts +840 -840
  123. package/packages/language/nb-NO.ts +840 -840
  124. package/packages/language/pt-BR.ts +840 -840
  125. package/packages/language/ru-RU.ts +840 -840
  126. package/packages/language/th-TH.ts +840 -840
  127. package/packages/language/ug-CN.ts +840 -840
  128. package/packages/language/uk-UA.ts +840 -840
  129. package/packages/language/uz-UZ.ts +840 -840
  130. package/packages/language/vi-VN.ts +840 -840
  131. package/packages/language/zh-CHT.ts +840 -840
  132. package/packages/language/zh-CN.ts +840 -840
  133. package/packages/language/zh-HK.ts +3 -3
  134. package/packages/language/zh-MO.ts +3 -3
  135. package/packages/language/zh-TC.ts +3 -3
  136. package/packages/language/zh-TW.ts +3 -3
  137. package/packages/layout-aside/index.ts +16 -16
  138. package/packages/layout-aside/src/layout-aside.ts +123 -123
  139. package/packages/layout-body/index.ts +16 -16
  140. package/packages/layout-body/src/layout-body.ts +142 -142
  141. package/packages/layout-container/index.ts +16 -16
  142. package/packages/layout-container/src/layout-container.ts +82 -82
  143. package/packages/layout-footer/index.ts +16 -16
  144. package/packages/layout-footer/src/layout-footer.ts +74 -74
  145. package/packages/layout-header/index.ts +16 -16
  146. package/packages/layout-header/src/layout-header.ts +73 -73
  147. package/packages/link/index.ts +16 -16
  148. package/packages/link/src/link.ts +161 -161
  149. package/packages/list/index.ts +16 -16
  150. package/packages/list/src/list.ts +442 -442
  151. package/packages/loading/index.ts +34 -34
  152. package/packages/loading/src/loading.ts +152 -152
  153. package/packages/mention/index.ts +16 -16
  154. package/packages/mention/src/mention.ts +71 -71
  155. package/packages/menu/index.ts +16 -16
  156. package/packages/menu/src/menu.ts +581 -581
  157. package/packages/modal/index.ts +136 -136
  158. package/packages/modal/src/modal.ts +1494 -1494
  159. package/packages/notice-bar/index.ts +16 -16
  160. package/packages/notice-bar/src/notice-bar.ts +181 -181
  161. package/packages/number-input/index.ts +16 -16
  162. package/packages/number-input/src/number-input.ts +1096 -1096
  163. package/packages/number-input/src/util.ts +12 -12
  164. package/packages/optgroup/index.ts +16 -16
  165. package/packages/option/index.ts +16 -16
  166. package/packages/pager/index.ts +16 -16
  167. package/packages/pager/src/pager.ts +769 -769
  168. package/packages/password-input/index.ts +16 -16
  169. package/packages/password-input/src/password-input.ts +378 -378
  170. package/packages/print/index.ts +18 -18
  171. package/packages/print/src/page-break.ts +92 -92
  172. package/packages/print/src/print.ts +272 -272
  173. package/packages/print/src/util.ts +284 -284
  174. package/packages/print-page-break/index.ts +16 -16
  175. package/packages/pulldown/index.ts +16 -16
  176. package/packages/pulldown/src/pulldown.ts +457 -457
  177. package/packages/radio/index.ts +16 -16
  178. package/packages/radio/src/button.ts +173 -173
  179. package/packages/radio/src/group.ts +213 -213
  180. package/packages/radio/src/radio.ts +180 -180
  181. package/packages/radio-button/index.ts +16 -16
  182. package/packages/radio-group/index.ts +16 -16
  183. package/packages/rate/index.ts +16 -16
  184. package/packages/rate/src/rate.ts +192 -192
  185. package/packages/result/index.ts +16 -16
  186. package/packages/result/src/result.ts +112 -112
  187. package/packages/row/index.ts +16 -16
  188. package/packages/row/src/col.ts +136 -136
  189. package/packages/row/src/row.ts +119 -119
  190. package/packages/segmented/index.ts +16 -16
  191. package/packages/segmented/src/segmented.ts +264 -264
  192. package/packages/select/index.ts +16 -16
  193. package/packages/select/src/optgroup.ts +49 -49
  194. package/packages/select/src/option-info.ts +20 -20
  195. package/packages/select/src/option.ts +47 -47
  196. package/packages/select/src/select.ts +1699 -1699
  197. package/packages/select/src/util.ts +47 -47
  198. package/packages/slider/index.ts +16 -16
  199. package/packages/slider/src/slider.ts +304 -304
  200. package/packages/split/index.ts +16 -16
  201. package/packages/split-pane/index.ts +17 -17
  202. package/packages/splitter/index.ts +16 -16
  203. package/packages/splitter/src/splitter-panel.ts +145 -145
  204. package/packages/splitter/src/splitter.ts +1009 -1009
  205. package/packages/splitter/src/util.ts +21 -21
  206. package/packages/splitter-panel/index.ts +16 -16
  207. package/packages/steps/index.ts +16 -16
  208. package/packages/steps/src/steps.ts +68 -68
  209. package/packages/switch/index.ts +16 -16
  210. package/packages/switch/src/switch.ts +237 -237
  211. package/packages/tab-pane/index.ts +16 -16
  212. package/packages/table-select/index.ts +16 -16
  213. package/packages/table-select/src/table-select.ts +800 -800
  214. package/packages/tabs/index.ts +16 -16
  215. package/packages/tabs/src/tab-pane.ts +117 -117
  216. package/packages/tabs/src/tabs.ts +940 -940
  217. package/packages/tabs/src/util.ts +21 -21
  218. package/packages/tag/index.ts +16 -16
  219. package/packages/tag/src/tag.ts +187 -187
  220. package/packages/text/index.ts +16 -16
  221. package/packages/text/src/text.ts +260 -260
  222. package/packages/text-ellipsis/index.ts +16 -16
  223. package/packages/text-ellipsis/src/text-ellipsis.ts +282 -282
  224. package/packages/textarea/index.ts +16 -16
  225. package/packages/textarea/src/textarea.ts +373 -373
  226. package/packages/timeline/index.ts +16 -16
  227. package/packages/timeline/src/timeline-item.ts +67 -67
  228. package/packages/timeline/src/timeline.ts +71 -71
  229. package/packages/timeline-item/index.ts +16 -16
  230. package/packages/tip/index.ts +19 -19
  231. package/packages/tip/src/tip.ts +129 -129
  232. package/packages/tooltip/index.ts +16 -16
  233. package/packages/tooltip/src/tooltip.ts +589 -589
  234. package/packages/tour/index.ts +16 -16
  235. package/packages/tour/src/tour.ts +71 -71
  236. package/packages/tree/index.ts +16 -16
  237. package/packages/tree/src/store.ts +14 -14
  238. package/packages/tree/src/tree.ts +2825 -2795
  239. package/packages/tree/src/util.ts +45 -45
  240. package/packages/tree-select/index.ts +16 -16
  241. package/packages/tree-select/src/tree-select.ts +979 -977
  242. package/packages/ui/index.ts +697 -697
  243. package/packages/ui/src/anime.ts +52 -52
  244. package/packages/ui/src/comp.ts +3 -3
  245. package/packages/ui/src/dom.ts +279 -279
  246. package/packages/ui/src/log.ts +6 -6
  247. package/packages/ui/src/utils.ts +49 -49
  248. package/packages/ui/src/vn.ts +39 -39
  249. package/packages/upload/index.ts +20 -20
  250. package/packages/upload/src/upload.ts +1919 -1919
  251. package/packages/upload/src/util.ts +109 -109
  252. package/packages/watermark/index.ts +31 -31
  253. package/packages/watermark/src/util.ts +176 -176
  254. package/packages/watermark/src/watermark.ts +168 -168
  255. package/styles/all.scss +90 -90
  256. package/styles/base.scss +16 -16
  257. package/styles/components/alert.scss +101 -101
  258. package/styles/components/anchor.scss +44 -44
  259. package/styles/components/avatar.scss +115 -115
  260. package/styles/components/backtop.scss +82 -82
  261. package/styles/components/badge.scss +45 -45
  262. package/styles/components/breadcrumb.scss +29 -29
  263. package/styles/components/button-group.scss +30 -30
  264. package/styles/components/button.scss +415 -415
  265. package/styles/components/calendar.scss +471 -471
  266. package/styles/components/card.scss +121 -121
  267. package/styles/components/carousel.scss +184 -184
  268. package/styles/components/cascader.scss +140 -140
  269. package/styles/components/checkbox-button.scss +57 -57
  270. package/styles/components/checkbox.scss +81 -81
  271. package/styles/components/collapse.scss +56 -56
  272. package/styles/components/color-picker.scss +409 -409
  273. package/styles/components/context-menu.scss +102 -102
  274. package/styles/components/countdown.scss +35 -35
  275. package/styles/components/date-panel.scss +505 -505
  276. package/styles/components/date-picker.scss +247 -247
  277. package/styles/components/date-range-picker.scss +252 -252
  278. package/styles/components/drawer.scss +298 -298
  279. package/styles/components/empty.scss +79 -79
  280. package/styles/components/form.scss +668 -668
  281. package/styles/components/icon-picker.scss +211 -211
  282. package/styles/components/icon.scss +1048 -1048
  283. package/styles/components/image-group.scss +2 -2
  284. package/styles/components/image-preview.scss +215 -215
  285. package/styles/components/image.scss +16 -16
  286. package/styles/components/input.scss +846 -846
  287. package/styles/components/layout-aside.scss +22 -22
  288. package/styles/components/layout-body.scss +14 -14
  289. package/styles/components/layout-container.scss +13 -13
  290. package/styles/components/layout-footer.scss +14 -14
  291. package/styles/components/layout-header.scss +11 -11
  292. package/styles/components/link.scss +115 -115
  293. package/styles/components/list.scss +40 -40
  294. package/styles/components/loading.scss +137 -137
  295. package/styles/components/menu.scss +150 -150
  296. package/styles/components/modal.scss +480 -480
  297. package/styles/components/notice-bar.scss +91 -91
  298. package/styles/components/number-input.scss +283 -283
  299. package/styles/components/old-icon.scss +4 -4
  300. package/styles/components/pager.scss +282 -282
  301. package/styles/components/password-input.scss +374 -374
  302. package/styles/components/print.scss +3 -3
  303. package/styles/components/pulldown.scss +75 -75
  304. package/styles/components/radio-button.scss +57 -57
  305. package/styles/components/radio.scss +79 -79
  306. package/styles/components/rate.scss +76 -76
  307. package/styles/components/result.scss +91 -91
  308. package/styles/components/row.scss +69 -69
  309. package/styles/components/segmented.scss +215 -215
  310. package/styles/components/select.scss +244 -244
  311. package/styles/components/slider.scss +139 -139
  312. package/styles/components/split.scss +1 -1
  313. package/styles/components/splitter.scss +318 -318
  314. package/styles/components/switch.scss +128 -128
  315. package/styles/components/table-select.scss +105 -105
  316. package/styles/components/tabs.scss +745 -745
  317. package/styles/components/tag.scss +184 -184
  318. package/styles/components/text-ellipsis.scss +130 -130
  319. package/styles/components/text.scss +123 -123
  320. package/styles/components/textarea.scss +106 -106
  321. package/styles/components/tip.scss +97 -97
  322. package/styles/components/tooltip.scss +141 -141
  323. package/styles/components/tree-select.scss +166 -166
  324. package/styles/components/tree.scss +294 -294
  325. package/styles/components/upload.scss +497 -497
  326. package/styles/components/watermark.scss +26 -26
  327. package/styles/helpers/baseMixin.scss +95 -95
  328. package/styles/helpers/baseVar.scss +3 -3
  329. package/styles/helpers/placement.scss +38 -38
  330. package/styles/theme/base.scss +214 -214
  331. package/styles/theme/dark.scss +119 -119
  332. package/styles/theme/light.scss +118 -118
  333. package/styles/variable.scss +111 -111
  334. package/types/all.d.ts +327 -327
  335. package/types/components/alert.d.ts +87 -87
  336. package/types/components/anchor-link.d.ts +91 -91
  337. package/types/components/anchor.d.ts +104 -104
  338. package/types/components/avatar.d.ts +88 -88
  339. package/types/components/backtop.d.ts +122 -122
  340. package/types/components/badge.d.ts +76 -76
  341. package/types/components/breadcrumb-item.d.ts +80 -80
  342. package/types/components/breadcrumb.d.ts +87 -87
  343. package/types/components/button-group.d.ts +120 -120
  344. package/types/components/button.d.ts +323 -323
  345. package/types/components/calendar.d.ts +264 -264
  346. package/types/components/card.d.ts +93 -93
  347. package/types/components/carousel-item.d.ts +75 -75
  348. package/types/components/carousel.d.ts +134 -134
  349. package/types/components/cascader.d.ts +263 -263
  350. package/types/components/checkbox-button.d.ts +103 -103
  351. package/types/components/checkbox-group.d.ts +143 -143
  352. package/types/components/checkbox.d.ts +123 -123
  353. package/types/components/col.d.ts +80 -80
  354. package/types/components/colgroup.d.ts +137 -137
  355. package/types/components/collapse-pane.d.ts +89 -89
  356. package/types/components/collapse.d.ts +121 -121
  357. package/types/components/color-picker.d.ts +176 -176
  358. package/types/components/column.d.ts +841 -841
  359. package/types/components/context-menu.d.ts +289 -289
  360. package/types/components/countdown.d.ts +112 -112
  361. package/types/components/date-panel.d.ts +280 -280
  362. package/types/components/date-picker.d.ts +332 -332
  363. package/types/components/date-range-picker.d.ts +352 -352
  364. package/types/components/drawer.d.ts +299 -299
  365. package/types/components/empty.d.ts +78 -78
  366. package/types/components/flow-design.d.ts +85 -85
  367. package/types/components/flow-view.d.ts +85 -85
  368. package/types/components/form-design.d.ts +376 -376
  369. package/types/components/form-gather.d.ts +124 -124
  370. package/types/components/form-group.d.ts +77 -77
  371. package/types/components/form-item.d.ts +411 -411
  372. package/types/components/form-view.d.ts +183 -183
  373. package/types/components/form.d.ts +468 -468
  374. package/types/components/gantt-module/gantt-view.d.ts +177 -177
  375. package/types/components/gantt-module/index.d.ts +1 -1
  376. package/types/components/gantt-plugins/extend-gantt-chart.d.ts +131 -131
  377. package/types/components/gantt-plugins/index.d.ts +1 -1
  378. package/types/components/gantt.d.ts +1194 -1185
  379. package/types/components/grid.d.ts +1040 -1040
  380. package/types/components/icon-picker.d.ts +196 -196
  381. package/types/components/icon.d.ts +87 -87
  382. package/types/components/image-group.d.ts +127 -127
  383. package/types/components/image-preview.d.ts +167 -167
  384. package/types/components/image.d.ts +173 -173
  385. package/types/components/input.d.ts +435 -435
  386. package/types/components/layout-aside.d.ts +80 -80
  387. package/types/components/layout-body.d.ts +91 -91
  388. package/types/components/layout-container.d.ts +73 -73
  389. package/types/components/layout-footer.d.ts +73 -73
  390. package/types/components/layout-header.d.ts +69 -69
  391. package/types/components/link.d.ts +111 -111
  392. package/types/components/list-design.d.ts +190 -190
  393. package/types/components/list-view.d.ts +199 -199
  394. package/types/components/list.d.ts +204 -204
  395. package/types/components/loading.d.ts +103 -103
  396. package/types/components/mention.d.ts +77 -77
  397. package/types/components/menu.d.ts +211 -211
  398. package/types/components/modal.d.ts +542 -542
  399. package/types/components/notice-bar.d.ts +102 -102
  400. package/types/components/number-input.d.ts +309 -309
  401. package/types/components/optgroup.d.ts +88 -88
  402. package/types/components/option.d.ts +103 -103
  403. package/types/components/pager.d.ts +335 -335
  404. package/types/components/password-input.d.ts +142 -142
  405. package/types/components/print-page-break.d.ts +69 -69
  406. package/types/components/print.d.ts +206 -206
  407. package/types/components/pulldown.d.ts +231 -231
  408. package/types/components/radio-button.d.ts +114 -114
  409. package/types/components/radio-group.d.ts +144 -144
  410. package/types/components/radio.d.ts +129 -129
  411. package/types/components/rate.d.ts +88 -88
  412. package/types/components/result.d.ts +84 -84
  413. package/types/components/row.d.ts +79 -79
  414. package/types/components/segmented.d.ts +123 -123
  415. package/types/components/select.d.ts +527 -527
  416. package/types/components/slider.d.ts +126 -126
  417. package/types/components/split-pane.d.ts +133 -133
  418. package/types/components/split.d.ts +312 -312
  419. package/types/components/splitter-panel.d.ts +105 -105
  420. package/types/components/splitter.d.ts +288 -288
  421. package/types/components/steps.d.ts +68 -68
  422. package/types/components/switch.d.ts +133 -133
  423. package/types/components/tab-pane.d.ts +114 -114
  424. package/types/components/table-module/custom.d.ts +123 -123
  425. package/types/components/table-module/edit.d.ts +243 -243
  426. package/types/components/table-module/export.d.ts +96 -96
  427. package/types/components/table-module/filter.d.ts +140 -140
  428. package/types/components/table-module/index.d.ts +7 -7
  429. package/types/components/table-module/keyboard.d.ts +26 -26
  430. package/types/components/table-module/menu.d.ts +28 -28
  431. package/types/components/table-module/validator.d.ts +53 -53
  432. package/types/components/table-plugins/extend-cell-area.d.ts +770 -770
  433. package/types/components/table-plugins/extend-pivot-table.d.ts +58 -58
  434. package/types/components/table-plugins/filters-combination.d.ts +15 -15
  435. package/types/components/table-plugins/filters-complex-input.d.ts +9 -9
  436. package/types/components/table-plugins/index.d.ts +4 -4
  437. package/types/components/table-select.d.ts +219 -219
  438. package/types/components/table.d.ts +7465 -7465
  439. package/types/components/tabs.d.ts +332 -332
  440. package/types/components/tag.d.ts +114 -114
  441. package/types/components/text-ellipsis.d.ts +112 -112
  442. package/types/components/text.d.ts +122 -122
  443. package/types/components/textarea.d.ts +247 -247
  444. package/types/components/timeline-item.d.ts +75 -75
  445. package/types/components/timeline.d.ts +77 -77
  446. package/types/components/tip.d.ts +83 -83
  447. package/types/components/toolbar.d.ts +336 -336
  448. package/types/components/tooltip.d.ts +180 -180
  449. package/types/components/tour.d.ts +77 -77
  450. package/types/components/tree-select.d.ts +310 -310
  451. package/types/components/tree.d.ts +843 -833
  452. package/types/components/upload.d.ts +437 -437
  453. package/types/components/watermark.d.ts +120 -120
  454. package/types/handles/form-design.d.ts +50 -50
  455. package/types/handles/index.d.ts +3 -3
  456. package/types/handles/list-design.d.ts +2 -2
  457. package/types/handles/table.d.ts +15 -15
  458. package/types/index.d.ts +8 -8
  459. package/types/ui/commands.d.ts +57 -57
  460. package/types/ui/formats.d.ts +62 -62
  461. package/types/ui/global-config.d.ts +254 -254
  462. package/types/ui/global-icon.d.ts +292 -292
  463. package/types/ui/hooks.d.ts +13 -13
  464. package/types/ui/index.d.ts +96 -96
  465. package/types/ui/interceptor.d.ts +52 -52
  466. package/types/ui/menus.d.ts +77 -77
  467. package/types/ui/renderer.d.ts +1041 -1041
  468. package/types/ui/validators.d.ts +38 -38
  469. /package/es/icon/{iconfont.1778169084473.ttf → iconfont.1778317220469.ttf} +0 -0
  470. /package/es/icon/{iconfont.1778169084473.woff → iconfont.1778317220469.woff} +0 -0
  471. /package/es/icon/{iconfont.1778169084473.woff2 → iconfont.1778317220469.woff2} +0 -0
  472. /package/es/{iconfont.1778169084473.ttf → iconfont.1778317220469.ttf} +0 -0
  473. /package/es/{iconfont.1778169084473.woff → iconfont.1778317220469.woff} +0 -0
  474. /package/es/{iconfont.1778169084473.woff2 → iconfont.1778317220469.woff2} +0 -0
  475. /package/lib/icon/style/{iconfont.1778169084473.ttf → iconfont.1778317220469.ttf} +0 -0
  476. /package/lib/icon/style/{iconfont.1778169084473.woff → iconfont.1778317220469.woff} +0 -0
  477. /package/lib/icon/style/{iconfont.1778169084473.woff2 → iconfont.1778317220469.woff2} +0 -0
  478. /package/lib/{iconfont.1778169084473.ttf → iconfont.1778317220469.ttf} +0 -0
  479. /package/lib/{iconfont.1778169084473.woff → iconfont.1778317220469.woff} +0 -0
  480. /package/lib/{iconfont.1778169084473.woff2 → iconfont.1778317220469.woff2} +0 -0
@@ -1,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
+ })