vxe-pc-ui 4.14.6 → 4.14.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (611) hide show
  1. package/LICENSE +21 -21
  2. package/README.en.md +72 -72
  3. package/README.ja-JP.md +72 -72
  4. package/README.md +364 -364
  5. package/README.zh-TW.md +73 -73
  6. package/es/checkbox/src/button.js +26 -5
  7. package/es/checkbox/src/checkbox.js +26 -5
  8. package/es/checkbox/src/group.js +23 -3
  9. package/es/checkbox/style.css +6 -3
  10. package/es/checkbox/style.min.css +1 -1
  11. package/es/language/ar-EG.js +4 -0
  12. package/es/language/de-DE.js +4 -0
  13. package/es/language/en-US.js +4 -0
  14. package/es/language/es-ES.js +4 -0
  15. package/es/language/fr-FR.js +4 -0
  16. package/es/language/hu-HU.js +4 -0
  17. package/es/language/hy-AM.js +4 -0
  18. package/es/language/id-ID.js +4 -0
  19. package/es/language/it-IT.js +4 -0
  20. package/es/language/ja-JP.js +4 -0
  21. package/es/language/ko-KR.js +4 -0
  22. package/es/language/ms-MY.js +4 -0
  23. package/es/language/nb-NO.js +4 -0
  24. package/es/language/pt-BR.js +4 -0
  25. package/es/language/ru-RU.js +4 -0
  26. package/es/language/th-TH.js +4 -0
  27. package/es/language/ug-CN.js +4 -0
  28. package/es/language/uk-UA.js +4 -0
  29. package/es/language/uz-UZ.js +4 -0
  30. package/es/language/vi-VN.js +4 -0
  31. package/es/language/zh-CHT.js +4 -0
  32. package/es/language/zh-CN.js +4 -0
  33. package/es/radio/src/button.js +27 -5
  34. package/es/radio/src/group.js +17 -2
  35. package/es/radio/src/radio.js +27 -5
  36. package/es/radio/style.css +5 -3
  37. package/es/radio/style.min.css +1 -1
  38. package/es/style.css +1 -1
  39. package/es/style.min.css +1 -1
  40. package/es/switch/src/switch.js +19 -11
  41. package/es/tree/style.css +11 -6
  42. package/es/tree/style.min.css +1 -1
  43. package/es/ui/index.js +1 -1
  44. package/es/ui/src/log.js +1 -1
  45. package/es/vxe-checkbox/style.css +6 -3
  46. package/es/vxe-checkbox/style.min.css +1 -1
  47. package/es/vxe-radio/style.css +5 -3
  48. package/es/vxe-radio/style.min.css +1 -1
  49. package/es/vxe-tree/style.css +11 -6
  50. package/es/vxe-tree/style.min.css +1 -1
  51. package/lib/checkbox/src/button.js +26 -3
  52. package/lib/checkbox/src/button.min.js +1 -1
  53. package/lib/checkbox/src/checkbox.js +26 -3
  54. package/lib/checkbox/src/checkbox.min.js +1 -1
  55. package/lib/checkbox/src/group.js +25 -3
  56. package/lib/checkbox/src/group.min.js +1 -1
  57. package/lib/checkbox/style/style.css +6 -3
  58. package/lib/checkbox/style/style.min.css +1 -1
  59. package/lib/index.umd.js +2446 -2376
  60. package/lib/index.umd.min.js +1 -1
  61. package/lib/language/ar-EG.js +4 -0
  62. package/lib/language/ar-EG.min.js +1 -1
  63. package/lib/language/ar-EG.umd.js +4 -0
  64. package/lib/language/de-DE.js +4 -0
  65. package/lib/language/de-DE.min.js +1 -1
  66. package/lib/language/de-DE.umd.js +4 -0
  67. package/lib/language/en-US.js +4 -0
  68. package/lib/language/en-US.min.js +1 -1
  69. package/lib/language/en-US.umd.js +4 -0
  70. package/lib/language/es-ES.js +4 -0
  71. package/lib/language/es-ES.min.js +1 -1
  72. package/lib/language/es-ES.umd.js +4 -0
  73. package/lib/language/fr-FR.js +4 -0
  74. package/lib/language/fr-FR.min.js +1 -1
  75. package/lib/language/fr-FR.umd.js +4 -0
  76. package/lib/language/hu-HU.js +4 -0
  77. package/lib/language/hu-HU.min.js +1 -1
  78. package/lib/language/hu-HU.umd.js +4 -0
  79. package/lib/language/hy-AM.js +4 -0
  80. package/lib/language/hy-AM.min.js +1 -1
  81. package/lib/language/hy-AM.umd.js +4 -0
  82. package/lib/language/id-ID.js +4 -0
  83. package/lib/language/id-ID.min.js +1 -1
  84. package/lib/language/id-ID.umd.js +4 -0
  85. package/lib/language/it-IT.js +4 -0
  86. package/lib/language/it-IT.min.js +1 -1
  87. package/lib/language/it-IT.umd.js +4 -0
  88. package/lib/language/ja-JP.js +4 -0
  89. package/lib/language/ja-JP.min.js +1 -1
  90. package/lib/language/ja-JP.umd.js +4 -0
  91. package/lib/language/ko-KR.js +4 -0
  92. package/lib/language/ko-KR.min.js +1 -1
  93. package/lib/language/ko-KR.umd.js +4 -0
  94. package/lib/language/ms-MY.js +4 -0
  95. package/lib/language/ms-MY.min.js +1 -1
  96. package/lib/language/ms-MY.umd.js +4 -0
  97. package/lib/language/nb-NO.js +4 -0
  98. package/lib/language/nb-NO.min.js +1 -1
  99. package/lib/language/nb-NO.umd.js +4 -0
  100. package/lib/language/pt-BR.js +4 -0
  101. package/lib/language/pt-BR.min.js +1 -1
  102. package/lib/language/pt-BR.umd.js +4 -0
  103. package/lib/language/ru-RU.js +4 -0
  104. package/lib/language/ru-RU.min.js +1 -1
  105. package/lib/language/ru-RU.umd.js +4 -0
  106. package/lib/language/th-TH.js +4 -0
  107. package/lib/language/th-TH.min.js +1 -1
  108. package/lib/language/th-TH.umd.js +4 -0
  109. package/lib/language/ug-CN.js +4 -0
  110. package/lib/language/ug-CN.min.js +1 -1
  111. package/lib/language/ug-CN.umd.js +4 -0
  112. package/lib/language/uk-UA.js +4 -0
  113. package/lib/language/uk-UA.min.js +1 -1
  114. package/lib/language/uk-UA.umd.js +4 -0
  115. package/lib/language/uz-UZ.js +4 -0
  116. package/lib/language/uz-UZ.min.js +1 -1
  117. package/lib/language/uz-UZ.umd.js +4 -0
  118. package/lib/language/vi-VN.js +4 -0
  119. package/lib/language/vi-VN.min.js +1 -1
  120. package/lib/language/vi-VN.umd.js +4 -0
  121. package/lib/language/zh-CHT.js +4 -0
  122. package/lib/language/zh-CHT.min.js +1 -1
  123. package/lib/language/zh-CHT.umd.js +4 -0
  124. package/lib/language/zh-CN.js +4 -0
  125. package/lib/language/zh-CN.min.js +1 -1
  126. package/lib/language/zh-CN.umd.js +4 -0
  127. package/lib/radio/src/button.js +27 -3
  128. package/lib/radio/src/button.min.js +1 -1
  129. package/lib/radio/src/group.js +19 -2
  130. package/lib/radio/src/group.min.js +1 -1
  131. package/lib/radio/src/radio.js +27 -3
  132. package/lib/radio/src/radio.min.js +1 -1
  133. package/lib/radio/style/style.css +5 -3
  134. package/lib/radio/style/style.min.css +1 -1
  135. package/lib/style.css +1 -1
  136. package/lib/style.min.css +1 -1
  137. package/lib/switch/src/switch.js +18 -10
  138. package/lib/switch/src/switch.min.js +1 -1
  139. package/lib/tree/style/style.css +11 -6
  140. package/lib/tree/style/style.min.css +1 -1
  141. package/lib/ui/index.js +1 -1
  142. package/lib/ui/index.min.js +1 -1
  143. package/lib/ui/src/log.js +1 -1
  144. package/lib/ui/src/log.min.js +1 -1
  145. package/lib/vxe-checkbox/style/style.css +6 -3
  146. package/lib/vxe-checkbox/style/style.min.css +1 -1
  147. package/lib/vxe-radio/style/style.css +5 -3
  148. package/lib/vxe-radio/style/style.min.css +1 -1
  149. package/lib/vxe-tree/style/style.css +11 -6
  150. package/lib/vxe-tree/style/style.min.css +1 -1
  151. package/package.json +88 -88
  152. package/packages/alert/index.ts +16 -16
  153. package/packages/alert/src/alert.ts +124 -124
  154. package/packages/anchor/index.ts +16 -16
  155. package/packages/anchor/src/anchor-link.ts +121 -121
  156. package/packages/anchor/src/anchor.ts +237 -237
  157. package/packages/anchor/src/util.ts +23 -23
  158. package/packages/anchor-link/index.ts +16 -16
  159. package/packages/avatar/index.ts +16 -16
  160. package/packages/avatar/src/avatar.ts +149 -149
  161. package/packages/backtop/index.ts +16 -16
  162. package/packages/backtop/src/backtop.ts +314 -314
  163. package/packages/badge/index.ts +16 -16
  164. package/packages/badge/src/badge.ts +100 -100
  165. package/packages/breadcrumb/index.ts +16 -16
  166. package/packages/breadcrumb/src/breadcrumb-item.ts +106 -106
  167. package/packages/breadcrumb/src/breadcrumb.ts +92 -92
  168. package/packages/breadcrumb-item/index.ts +16 -16
  169. package/packages/button/index.ts +16 -16
  170. package/packages/button/src/button-group.ts +110 -110
  171. package/packages/button/src/button.ts +841 -841
  172. package/packages/button-group/index.ts +16 -16
  173. package/packages/calendar/index.ts +16 -16
  174. package/packages/calendar/src/calendar.ts +1351 -1351
  175. package/packages/card/index.ts +16 -16
  176. package/packages/card/src/card.ts +175 -175
  177. package/packages/carousel/index.ts +16 -16
  178. package/packages/carousel/src/carousel-item.ts +102 -102
  179. package/packages/carousel/src/carousel.ts +414 -414
  180. package/packages/carousel/src/util.ts +21 -21
  181. package/packages/carousel-item/index.ts +16 -16
  182. package/packages/cascader/index.ts +16 -16
  183. package/packages/cascader/src/cascader.ts +741 -741
  184. package/packages/checkbox/index.ts +16 -16
  185. package/packages/checkbox/src/button.ts +165 -144
  186. package/packages/checkbox/src/checkbox.ts +176 -154
  187. package/packages/checkbox/src/group.ts +243 -222
  188. package/packages/checkbox-button/index.ts +16 -16
  189. package/packages/checkbox-group/index.ts +16 -16
  190. package/packages/col/index.ts +16 -16
  191. package/packages/collapse/index.ts +16 -16
  192. package/packages/collapse/src/collapse-pane.ts +114 -114
  193. package/packages/collapse/src/collapse.ts +284 -284
  194. package/packages/collapse/src/util.ts +21 -21
  195. package/packages/collapse-pane/index.ts +16 -16
  196. package/packages/color-picker/index.ts +16 -16
  197. package/packages/color-picker/src/color-picker.ts +1109 -1109
  198. package/packages/color-picker/src/util.ts +198 -198
  199. package/packages/components.ts +307 -307
  200. package/packages/context-menu/index.ts +54 -54
  201. package/packages/context-menu/src/context-menu.ts +681 -681
  202. package/packages/countdown/index.ts +16 -16
  203. package/packages/countdown/src/countdown.ts +262 -262
  204. package/packages/date-panel/index.ts +16 -16
  205. package/packages/date-panel/src/date-panel.ts +1809 -1809
  206. package/packages/date-panel/src/util.ts +244 -244
  207. package/packages/date-picker/index.ts +16 -16
  208. package/packages/date-picker/src/date-picker.ts +1071 -1071
  209. package/packages/date-range-picker/index.ts +16 -16
  210. package/packages/date-range-picker/src/date-range-picker.ts +1280 -1280
  211. package/packages/drawer/index.ts +77 -77
  212. package/packages/drawer/src/drawer.ts +657 -657
  213. package/packages/dynamics/index.ts +89 -89
  214. package/packages/empty/index.ts +16 -16
  215. package/packages/empty/src/empty.ts +100 -100
  216. package/packages/form/index.ts +16 -16
  217. package/packages/form/render/index.ts +598 -598
  218. package/packages/form/src/form-config-item.ts +72 -72
  219. package/packages/form/src/form-group.ts +86 -86
  220. package/packages/form/src/form-item.ts +174 -174
  221. package/packages/form/src/form.ts +987 -987
  222. package/packages/form/src/itemInfo.ts +80 -80
  223. package/packages/form/src/render.ts +387 -387
  224. package/packages/form/src/util.ts +93 -93
  225. package/packages/form-gather/index.ts +26 -26
  226. package/packages/form-group/index.ts +16 -16
  227. package/packages/form-item/index.ts +16 -16
  228. package/packages/icon/index.ts +16 -16
  229. package/packages/icon/src/icon.ts +75 -75
  230. package/packages/icon-picker/index.ts +16 -16
  231. package/packages/icon-picker/src/icon-picker.ts +626 -626
  232. package/packages/image/index.ts +16 -16
  233. package/packages/image/src/group.ts +153 -153
  234. package/packages/image/src/image.ts +298 -298
  235. package/packages/image/src/preview.ts +672 -672
  236. package/packages/image/src/util.ts +59 -59
  237. package/packages/image-group/index.ts +16 -16
  238. package/packages/image-preview/index.ts +19 -19
  239. package/packages/index.ts +4 -4
  240. package/packages/input/index.ts +16 -16
  241. package/packages/input/src/input.ts +2788 -2788
  242. package/packages/language/ar-EG.ts +844 -840
  243. package/packages/language/de-DE.ts +844 -840
  244. package/packages/language/en-US.ts +844 -840
  245. package/packages/language/es-ES.ts +844 -840
  246. package/packages/language/fr-FR.ts +844 -840
  247. package/packages/language/hu-HU.ts +844 -840
  248. package/packages/language/hy-AM.ts +844 -840
  249. package/packages/language/id-ID.ts +844 -840
  250. package/packages/language/it-IT.ts +844 -840
  251. package/packages/language/ja-JP.ts +844 -840
  252. package/packages/language/ko-KR.ts +844 -840
  253. package/packages/language/ms-MY.ts +844 -840
  254. package/packages/language/nb-NO.ts +844 -840
  255. package/packages/language/pt-BR.ts +844 -840
  256. package/packages/language/ru-RU.ts +844 -840
  257. package/packages/language/th-TH.ts +844 -840
  258. package/packages/language/ug-CN.ts +844 -840
  259. package/packages/language/uk-UA.ts +844 -840
  260. package/packages/language/uz-UZ.ts +844 -840
  261. package/packages/language/vi-VN.ts +844 -840
  262. package/packages/language/zh-CHT.ts +844 -840
  263. package/packages/language/zh-CN.ts +844 -840
  264. package/packages/language/zh-HK.ts +3 -3
  265. package/packages/language/zh-MO.ts +3 -3
  266. package/packages/language/zh-TC.ts +3 -3
  267. package/packages/language/zh-TW.ts +3 -3
  268. package/packages/layout-aside/index.ts +16 -16
  269. package/packages/layout-aside/src/layout-aside.ts +123 -123
  270. package/packages/layout-body/index.ts +16 -16
  271. package/packages/layout-body/src/layout-body.ts +142 -142
  272. package/packages/layout-container/index.ts +16 -16
  273. package/packages/layout-container/src/layout-container.ts +82 -82
  274. package/packages/layout-footer/index.ts +16 -16
  275. package/packages/layout-footer/src/layout-footer.ts +74 -74
  276. package/packages/layout-header/index.ts +16 -16
  277. package/packages/layout-header/src/layout-header.ts +73 -73
  278. package/packages/link/index.ts +16 -16
  279. package/packages/link/src/link.ts +161 -161
  280. package/packages/list/index.ts +16 -16
  281. package/packages/list/src/list.ts +442 -442
  282. package/packages/loading/index.ts +34 -34
  283. package/packages/loading/src/loading.ts +152 -152
  284. package/packages/mention/index.ts +16 -16
  285. package/packages/mention/src/mention.ts +71 -71
  286. package/packages/menu/index.ts +16 -16
  287. package/packages/menu/src/menu.ts +581 -581
  288. package/packages/modal/index.ts +136 -136
  289. package/packages/modal/src/modal.ts +1494 -1494
  290. package/packages/notice-bar/index.ts +16 -16
  291. package/packages/notice-bar/src/notice-bar.ts +181 -181
  292. package/packages/number-input/index.ts +16 -16
  293. package/packages/number-input/src/number-input.ts +1096 -1096
  294. package/packages/number-input/src/util.ts +12 -12
  295. package/packages/optgroup/index.ts +16 -16
  296. package/packages/option/index.ts +16 -16
  297. package/packages/pager/index.ts +16 -16
  298. package/packages/pager/src/pager.ts +769 -769
  299. package/packages/password-input/index.ts +16 -16
  300. package/packages/password-input/src/password-input.ts +378 -378
  301. package/packages/print/index.ts +18 -18
  302. package/packages/print/src/page-break.ts +92 -92
  303. package/packages/print/src/print.ts +272 -272
  304. package/packages/print/src/util.ts +284 -284
  305. package/packages/print-page-break/index.ts +16 -16
  306. package/packages/pulldown/index.ts +16 -16
  307. package/packages/pulldown/src/pulldown.ts +457 -457
  308. package/packages/radio/index.ts +16 -16
  309. package/packages/radio/src/button.ts +195 -173
  310. package/packages/radio/src/group.ts +229 -213
  311. package/packages/radio/src/radio.ts +203 -180
  312. package/packages/radio-button/index.ts +16 -16
  313. package/packages/radio-group/index.ts +16 -16
  314. package/packages/rate/index.ts +16 -16
  315. package/packages/rate/src/rate.ts +192 -192
  316. package/packages/result/index.ts +16 -16
  317. package/packages/result/src/result.ts +112 -112
  318. package/packages/row/index.ts +16 -16
  319. package/packages/row/src/col.ts +136 -136
  320. package/packages/row/src/row.ts +119 -119
  321. package/packages/segmented/index.ts +16 -16
  322. package/packages/segmented/src/segmented.ts +264 -264
  323. package/packages/select/index.ts +16 -16
  324. package/packages/select/src/optgroup.ts +49 -49
  325. package/packages/select/src/option-info.ts +20 -20
  326. package/packages/select/src/option.ts +47 -47
  327. package/packages/select/src/select.ts +1699 -1699
  328. package/packages/select/src/util.ts +47 -47
  329. package/packages/slider/index.ts +16 -16
  330. package/packages/slider/src/slider.ts +304 -304
  331. package/packages/split/index.ts +16 -16
  332. package/packages/split-pane/index.ts +17 -17
  333. package/packages/splitter/index.ts +16 -16
  334. package/packages/splitter/src/splitter-panel.ts +145 -145
  335. package/packages/splitter/src/splitter.ts +1009 -1009
  336. package/packages/splitter/src/util.ts +21 -21
  337. package/packages/splitter-panel/index.ts +16 -16
  338. package/packages/steps/index.ts +16 -16
  339. package/packages/steps/src/steps.ts +68 -68
  340. package/packages/switch/index.ts +16 -16
  341. package/packages/switch/src/switch.ts +245 -237
  342. package/packages/tab-pane/index.ts +16 -16
  343. package/packages/table-select/index.ts +16 -16
  344. package/packages/table-select/src/table-select.ts +800 -800
  345. package/packages/tabs/index.ts +16 -16
  346. package/packages/tabs/src/tab-pane.ts +117 -117
  347. package/packages/tabs/src/tabs.ts +940 -940
  348. package/packages/tabs/src/util.ts +21 -21
  349. package/packages/tag/index.ts +16 -16
  350. package/packages/tag/src/tag.ts +187 -187
  351. package/packages/text/index.ts +16 -16
  352. package/packages/text/src/text.ts +260 -260
  353. package/packages/text-ellipsis/index.ts +16 -16
  354. package/packages/text-ellipsis/src/text-ellipsis.ts +282 -282
  355. package/packages/textarea/index.ts +16 -16
  356. package/packages/textarea/src/textarea.ts +373 -373
  357. package/packages/timeline/index.ts +16 -16
  358. package/packages/timeline/src/timeline-item.ts +67 -67
  359. package/packages/timeline/src/timeline.ts +71 -71
  360. package/packages/timeline-item/index.ts +16 -16
  361. package/packages/tip/index.ts +19 -19
  362. package/packages/tip/src/tip.ts +129 -129
  363. package/packages/tooltip/index.ts +16 -16
  364. package/packages/tooltip/src/tooltip.ts +589 -589
  365. package/packages/tour/index.ts +16 -16
  366. package/packages/tour/src/tour.ts +71 -71
  367. package/packages/tree/index.ts +16 -16
  368. package/packages/tree/src/store.ts +14 -14
  369. package/packages/tree/src/tree.ts +2825 -2825
  370. package/packages/tree/src/util.ts +45 -45
  371. package/packages/tree-select/index.ts +16 -16
  372. package/packages/tree-select/src/tree-select.ts +979 -979
  373. package/packages/ui/index.ts +697 -697
  374. package/packages/ui/src/anime.ts +52 -52
  375. package/packages/ui/src/comp.ts +3 -3
  376. package/packages/ui/src/dom.ts +279 -279
  377. package/packages/ui/src/log.ts +6 -6
  378. package/packages/ui/src/utils.ts +49 -49
  379. package/packages/ui/src/vn.ts +39 -39
  380. package/packages/upload/index.ts +20 -20
  381. package/packages/upload/src/upload.ts +1919 -1919
  382. package/packages/upload/src/util.ts +109 -109
  383. package/packages/watermark/index.ts +31 -31
  384. package/packages/watermark/src/util.ts +176 -176
  385. package/packages/watermark/src/watermark.ts +168 -168
  386. package/styles/all.scss +90 -90
  387. package/styles/base.scss +16 -16
  388. package/styles/components/alert.scss +101 -101
  389. package/styles/components/anchor.scss +44 -44
  390. package/styles/components/avatar.scss +115 -115
  391. package/styles/components/backtop.scss +82 -82
  392. package/styles/components/badge.scss +45 -45
  393. package/styles/components/breadcrumb.scss +29 -29
  394. package/styles/components/button-group.scss +30 -30
  395. package/styles/components/button.scss +415 -415
  396. package/styles/components/calendar.scss +471 -471
  397. package/styles/components/card.scss +121 -121
  398. package/styles/components/carousel.scss +184 -184
  399. package/styles/components/cascader.scss +140 -140
  400. package/styles/components/checkbox-button.scss +57 -57
  401. package/styles/components/checkbox.scss +81 -81
  402. package/styles/components/collapse.scss +56 -56
  403. package/styles/components/color-picker.scss +409 -409
  404. package/styles/components/context-menu.scss +102 -102
  405. package/styles/components/countdown.scss +35 -35
  406. package/styles/components/date-panel.scss +505 -505
  407. package/styles/components/date-picker.scss +247 -247
  408. package/styles/components/date-range-picker.scss +252 -252
  409. package/styles/components/drawer.scss +298 -298
  410. package/styles/components/empty.scss +79 -79
  411. package/styles/components/form.scss +668 -668
  412. package/styles/components/icon-picker.scss +211 -211
  413. package/styles/components/icon.scss +1048 -1048
  414. package/styles/components/image-group.scss +2 -2
  415. package/styles/components/image-preview.scss +215 -215
  416. package/styles/components/image.scss +16 -16
  417. package/styles/components/input.scss +846 -846
  418. package/styles/components/layout-aside.scss +22 -22
  419. package/styles/components/layout-body.scss +14 -14
  420. package/styles/components/layout-container.scss +13 -13
  421. package/styles/components/layout-footer.scss +14 -14
  422. package/styles/components/layout-header.scss +11 -11
  423. package/styles/components/link.scss +115 -115
  424. package/styles/components/list.scss +40 -40
  425. package/styles/components/loading.scss +137 -137
  426. package/styles/components/menu.scss +150 -150
  427. package/styles/components/modal.scss +480 -480
  428. package/styles/components/notice-bar.scss +91 -91
  429. package/styles/components/number-input.scss +283 -283
  430. package/styles/components/old-icon.scss +4 -4
  431. package/styles/components/pager.scss +282 -282
  432. package/styles/components/password-input.scss +374 -374
  433. package/styles/components/print.scss +3 -3
  434. package/styles/components/pulldown.scss +75 -75
  435. package/styles/components/radio-button.scss +57 -57
  436. package/styles/components/radio.scss +79 -79
  437. package/styles/components/rate.scss +76 -76
  438. package/styles/components/result.scss +91 -91
  439. package/styles/components/row.scss +69 -69
  440. package/styles/components/segmented.scss +215 -215
  441. package/styles/components/select.scss +244 -244
  442. package/styles/components/slider.scss +139 -139
  443. package/styles/components/split.scss +1 -1
  444. package/styles/components/splitter.scss +318 -318
  445. package/styles/components/switch.scss +128 -128
  446. package/styles/components/table-select.scss +105 -105
  447. package/styles/components/tabs.scss +745 -745
  448. package/styles/components/tag.scss +184 -184
  449. package/styles/components/text-ellipsis.scss +130 -130
  450. package/styles/components/text.scss +123 -123
  451. package/styles/components/textarea.scss +106 -106
  452. package/styles/components/tip.scss +97 -97
  453. package/styles/components/tooltip.scss +141 -141
  454. package/styles/components/tree-select.scss +166 -166
  455. package/styles/components/tree.scss +294 -294
  456. package/styles/components/upload.scss +497 -497
  457. package/styles/components/watermark.scss +26 -26
  458. package/styles/helpers/baseMixin.scss +104 -95
  459. package/styles/helpers/baseVar.scss +3 -3
  460. package/styles/helpers/placement.scss +38 -38
  461. package/styles/theme/base.scss +214 -214
  462. package/styles/theme/dark.scss +119 -119
  463. package/styles/theme/light.scss +118 -118
  464. package/styles/variable.scss +111 -111
  465. package/types/all.d.ts +327 -327
  466. package/types/components/alert.d.ts +87 -87
  467. package/types/components/anchor-link.d.ts +91 -91
  468. package/types/components/anchor.d.ts +104 -104
  469. package/types/components/avatar.d.ts +88 -88
  470. package/types/components/backtop.d.ts +122 -122
  471. package/types/components/badge.d.ts +76 -76
  472. package/types/components/breadcrumb-item.d.ts +80 -80
  473. package/types/components/breadcrumb.d.ts +87 -87
  474. package/types/components/button-group.d.ts +120 -120
  475. package/types/components/button.d.ts +323 -323
  476. package/types/components/calendar.d.ts +264 -264
  477. package/types/components/card.d.ts +93 -93
  478. package/types/components/carousel-item.d.ts +75 -75
  479. package/types/components/carousel.d.ts +134 -134
  480. package/types/components/cascader.d.ts +263 -263
  481. package/types/components/checkbox-button.d.ts +103 -103
  482. package/types/components/checkbox-group.d.ts +146 -143
  483. package/types/components/checkbox.d.ts +123 -123
  484. package/types/components/col.d.ts +80 -80
  485. package/types/components/colgroup.d.ts +137 -137
  486. package/types/components/collapse-pane.d.ts +89 -89
  487. package/types/components/collapse.d.ts +121 -121
  488. package/types/components/color-picker.d.ts +176 -176
  489. package/types/components/column.d.ts +841 -841
  490. package/types/components/context-menu.d.ts +289 -289
  491. package/types/components/countdown.d.ts +112 -112
  492. package/types/components/date-panel.d.ts +280 -280
  493. package/types/components/date-picker.d.ts +332 -332
  494. package/types/components/date-range-picker.d.ts +352 -352
  495. package/types/components/drawer.d.ts +299 -299
  496. package/types/components/empty.d.ts +78 -78
  497. package/types/components/flow-design.d.ts +85 -85
  498. package/types/components/flow-view.d.ts +85 -85
  499. package/types/components/form-design.d.ts +376 -376
  500. package/types/components/form-gather.d.ts +124 -124
  501. package/types/components/form-group.d.ts +77 -77
  502. package/types/components/form-item.d.ts +411 -411
  503. package/types/components/form-view.d.ts +183 -183
  504. package/types/components/form.d.ts +468 -468
  505. package/types/components/gantt-module/gantt-view.d.ts +177 -177
  506. package/types/components/gantt-module/index.d.ts +1 -1
  507. package/types/components/gantt-plugins/extend-gantt-chart.d.ts +131 -131
  508. package/types/components/gantt-plugins/index.d.ts +1 -1
  509. package/types/components/gantt.d.ts +1194 -1194
  510. package/types/components/grid.d.ts +1040 -1040
  511. package/types/components/icon-picker.d.ts +196 -196
  512. package/types/components/icon.d.ts +87 -87
  513. package/types/components/image-group.d.ts +127 -127
  514. package/types/components/image-preview.d.ts +167 -167
  515. package/types/components/image.d.ts +173 -173
  516. package/types/components/input.d.ts +435 -435
  517. package/types/components/layout-aside.d.ts +80 -80
  518. package/types/components/layout-body.d.ts +91 -91
  519. package/types/components/layout-container.d.ts +73 -73
  520. package/types/components/layout-footer.d.ts +73 -73
  521. package/types/components/layout-header.d.ts +69 -69
  522. package/types/components/link.d.ts +111 -111
  523. package/types/components/list-design.d.ts +190 -190
  524. package/types/components/list-view.d.ts +199 -199
  525. package/types/components/list.d.ts +204 -204
  526. package/types/components/loading.d.ts +103 -103
  527. package/types/components/mention.d.ts +77 -77
  528. package/types/components/menu.d.ts +211 -211
  529. package/types/components/modal.d.ts +542 -542
  530. package/types/components/notice-bar.d.ts +102 -102
  531. package/types/components/number-input.d.ts +309 -309
  532. package/types/components/optgroup.d.ts +88 -88
  533. package/types/components/option.d.ts +103 -103
  534. package/types/components/pager.d.ts +335 -335
  535. package/types/components/password-input.d.ts +142 -142
  536. package/types/components/print-page-break.d.ts +69 -69
  537. package/types/components/print.d.ts +206 -206
  538. package/types/components/pulldown.d.ts +231 -231
  539. package/types/components/radio-button.d.ts +114 -114
  540. package/types/components/radio-group.d.ts +147 -144
  541. package/types/components/radio.d.ts +129 -129
  542. package/types/components/rate.d.ts +88 -88
  543. package/types/components/result.d.ts +84 -84
  544. package/types/components/row.d.ts +79 -79
  545. package/types/components/segmented.d.ts +123 -123
  546. package/types/components/select.d.ts +527 -527
  547. package/types/components/slider.d.ts +126 -126
  548. package/types/components/split-pane.d.ts +133 -133
  549. package/types/components/split.d.ts +312 -312
  550. package/types/components/splitter-panel.d.ts +105 -105
  551. package/types/components/splitter.d.ts +288 -288
  552. package/types/components/steps.d.ts +68 -68
  553. package/types/components/switch.d.ts +133 -133
  554. package/types/components/tab-pane.d.ts +114 -114
  555. package/types/components/table-module/custom.d.ts +123 -123
  556. package/types/components/table-module/edit.d.ts +243 -243
  557. package/types/components/table-module/export.d.ts +96 -96
  558. package/types/components/table-module/filter.d.ts +140 -140
  559. package/types/components/table-module/index.d.ts +7 -7
  560. package/types/components/table-module/keyboard.d.ts +26 -26
  561. package/types/components/table-module/menu.d.ts +28 -28
  562. package/types/components/table-module/validator.d.ts +53 -53
  563. package/types/components/table-plugins/extend-cell-area.d.ts +770 -770
  564. package/types/components/table-plugins/extend-pivot-table.d.ts +58 -58
  565. package/types/components/table-plugins/filters-combination.d.ts +15 -15
  566. package/types/components/table-plugins/filters-complex-input.d.ts +9 -9
  567. package/types/components/table-plugins/index.d.ts +4 -4
  568. package/types/components/table-select.d.ts +219 -219
  569. package/types/components/table.d.ts +7465 -7465
  570. package/types/components/tabs.d.ts +332 -332
  571. package/types/components/tag.d.ts +114 -114
  572. package/types/components/text-ellipsis.d.ts +112 -112
  573. package/types/components/text.d.ts +122 -122
  574. package/types/components/textarea.d.ts +247 -247
  575. package/types/components/timeline-item.d.ts +75 -75
  576. package/types/components/timeline.d.ts +77 -77
  577. package/types/components/tip.d.ts +83 -83
  578. package/types/components/toolbar.d.ts +336 -336
  579. package/types/components/tooltip.d.ts +180 -180
  580. package/types/components/tour.d.ts +77 -77
  581. package/types/components/tree-select.d.ts +310 -310
  582. package/types/components/tree.d.ts +843 -843
  583. package/types/components/upload.d.ts +437 -437
  584. package/types/components/watermark.d.ts +120 -120
  585. package/types/handles/form-design.d.ts +50 -50
  586. package/types/handles/index.d.ts +3 -3
  587. package/types/handles/list-design.d.ts +2 -2
  588. package/types/handles/table.d.ts +15 -15
  589. package/types/index.d.ts +8 -8
  590. package/types/ui/commands.d.ts +57 -57
  591. package/types/ui/formats.d.ts +62 -62
  592. package/types/ui/global-config.d.ts +254 -254
  593. package/types/ui/global-icon.d.ts +292 -292
  594. package/types/ui/hooks.d.ts +13 -13
  595. package/types/ui/index.d.ts +96 -96
  596. package/types/ui/interceptor.d.ts +52 -52
  597. package/types/ui/menus.d.ts +77 -77
  598. package/types/ui/renderer.d.ts +1041 -1041
  599. package/types/ui/validators.d.ts +38 -38
  600. /package/es/icon/{iconfont.1778317220469.ttf → iconfont.1778465063324.ttf} +0 -0
  601. /package/es/icon/{iconfont.1778317220469.woff → iconfont.1778465063324.woff} +0 -0
  602. /package/es/icon/{iconfont.1778317220469.woff2 → iconfont.1778465063324.woff2} +0 -0
  603. /package/es/{iconfont.1778317220469.ttf → iconfont.1778465063324.ttf} +0 -0
  604. /package/es/{iconfont.1778317220469.woff → iconfont.1778465063324.woff} +0 -0
  605. /package/es/{iconfont.1778317220469.woff2 → iconfont.1778465063324.woff2} +0 -0
  606. /package/lib/icon/style/{iconfont.1778317220469.ttf → iconfont.1778465063324.ttf} +0 -0
  607. /package/lib/icon/style/{iconfont.1778317220469.woff → iconfont.1778465063324.woff} +0 -0
  608. /package/lib/icon/style/{iconfont.1778317220469.woff2 → iconfont.1778465063324.woff2} +0 -0
  609. /package/lib/{iconfont.1778317220469.ttf → iconfont.1778465063324.ttf} +0 -0
  610. /package/lib/{iconfont.1778317220469.woff → iconfont.1778465063324.woff} +0 -0
  611. /package/lib/{iconfont.1778317220469.woff2 → iconfont.1778465063324.woff2} +0 -0
@@ -1,1809 +1,1809 @@
1
- import { h, ref, Ref, computed, reactive, nextTick, watch, PropType, VNode } from 'vue'
2
- import { defineVxeComponent } from '../../ui/src/comp'
3
- import XEUtils from 'xe-utils'
4
- import { getConfig, getI18n, createEvent, useSize, renderEmptyElement } from '../../ui'
5
- import { toStringTimeDate, getDateQuarter, parseDateValue, parseDateObj, handleValueFormat, hasDateValueType, hasTimestampValueType } from './util'
6
-
7
- import type { VxeDatePanelConstructor, DatePanelInternalData, DatePanelReactData, VxeDatePanelPropTypes, DatePanelMethods, ValueOf, VxeDatePanelEmits, VxeDatePanelDefines } from '../../../types'
8
-
9
- export default defineVxeComponent({
10
- name: 'VxeDatePanel',
11
- props: {
12
- modelValue: [String, Number, Date] as PropType<VxeDatePanelPropTypes.ModelValue>,
13
- type: {
14
- type: String as PropType<VxeDatePanelPropTypes.Type>,
15
- default: 'date'
16
- },
17
- className: String as PropType<VxeDatePanelPropTypes.ClassName>,
18
- size: {
19
- type: String as PropType<VxeDatePanelPropTypes.Size>,
20
- default: () => getConfig().datePanel.size || getConfig().size
21
- },
22
- multiple: Boolean as PropType<VxeDatePanelPropTypes.Multiple>,
23
- limitCount: {
24
- type: [String, Number] as PropType<VxeDatePanelPropTypes.LimitCount>,
25
- default: () => getConfig().datePanel.limitCount
26
- },
27
-
28
- // date、week、month、quarter、year
29
- startDate: {
30
- type: [String, Number, Date] as PropType<VxeDatePanelPropTypes.StartDate>,
31
- default: () => getConfig().datePanel.startDate
32
- },
33
- endDate: {
34
- type: [String, Number, Date] as PropType<VxeDatePanelPropTypes.EndDate>,
35
- default: () => getConfig().datePanel.endDate
36
- },
37
- defaultDate: [String, Number, Date] as PropType<VxeDatePanelPropTypes.DefaultDate>,
38
- defaultTime: [String, Number, Date] as PropType<VxeDatePanelPropTypes.DefaultTime>,
39
- minDate: [String, Number, Date] as PropType<VxeDatePanelPropTypes.MinDate>,
40
- maxDate: [String, Number, Date] as PropType<VxeDatePanelPropTypes.MaxDate>,
41
- startDay: {
42
- type: [String, Number] as PropType<VxeDatePanelPropTypes.StartDay>,
43
- default: () => getConfig().datePanel.startDay
44
- },
45
- labelFormat: String as PropType<VxeDatePanelPropTypes.LabelFormat>,
46
- valueFormat: String as PropType<VxeDatePanelPropTypes.ValueFormat>,
47
- timeFormat: String as PropType<VxeDatePanelPropTypes.TimeFormat>,
48
- festivalMethod: {
49
- type: Function as PropType<VxeDatePanelPropTypes.FestivalMethod>,
50
- default: () => getConfig().datePanel.festivalMethod
51
- },
52
- disabledMethod: {
53
- type: Function as PropType<VxeDatePanelPropTypes.DisabledMethod>,
54
- default: () => getConfig().datePanel.disabledMethod
55
- },
56
-
57
- timeConfig: Object as PropType<VxeDatePanelPropTypes.TimeConfig>,
58
-
59
- // week
60
- selectDay: {
61
- type: [String, Number] as PropType<VxeDatePanelPropTypes.SelectDay>,
62
- default: () => getConfig().datePanel.selectDay
63
- }
64
- },
65
- emits: [
66
- 'update:modelValue',
67
- 'change',
68
- 'click',
69
- 'clear',
70
- 'date-prev',
71
- 'date-today',
72
- 'date-next',
73
- 'confirm'
74
- ] as VxeDatePanelEmits,
75
- setup (props, context) {
76
- const { emit } = context
77
-
78
- const xID = XEUtils.uniqueId()
79
-
80
- const { computeSize } = useSize(props)
81
-
82
- const reactData = reactive<DatePanelReactData>({
83
- visiblePanel: false,
84
- isAniVisible: false,
85
- isActivated: false,
86
- inputValue: '',
87
- inputLabel: '',
88
- datetimePanelValue: null,
89
- datePanelValue: null,
90
- datePanelLabel: '',
91
- datePanelType: 'day',
92
- selectMonth: null,
93
- currentDate: null
94
- })
95
-
96
- const internalData: DatePanelInternalData = {
97
- yearSize: 12,
98
- monthSize: 20,
99
- quarterSize: 8,
100
- hpTimeout: undefined as any
101
- }
102
-
103
- const refElem = ref() as Ref<HTMLDivElement>
104
- const refPanelWrapper = ref() as Ref<HTMLDivElement>
105
- const refInputTimeBody = ref() as Ref<HTMLDivElement>
106
-
107
- const refMaps = {
108
- refElem
109
- }
110
-
111
- const $xeDatePanel = {
112
- xID,
113
- props,
114
- context,
115
- reactData,
116
- internalData,
117
- getRefMaps: () => refMaps
118
- } as unknown as VxeDatePanelConstructor
119
-
120
- const computeIsDateTimeType = computed(() => {
121
- const { type } = props
122
- return type === 'time' || type === 'datetime'
123
- })
124
-
125
- const computeIsDatePanelType = computed(() => {
126
- const isDateTimeType = computeIsDateTimeType.value
127
- return isDateTimeType || ['date', 'week', 'month', 'quarter', 'year'].indexOf(props.type) > -1
128
- })
129
-
130
- const computeDateStartTime = computed(() => {
131
- return props.startDate ? XEUtils.toStringDate(props.startDate) : null
132
- })
133
-
134
- const computeDateEndTime = computed(() => {
135
- return props.endDate ? XEUtils.toStringDate(props.endDate) : null
136
- })
137
-
138
- const computeDateListValue = computed(() => {
139
- const { modelValue, multiple } = props
140
- const isDatePanelType = computeIsDatePanelType.value
141
- const dateValueFormat = computeDateValueFormat.value
142
- if (multiple && modelValue && isDatePanelType) {
143
- return XEUtils.toValueString(modelValue).split(',').map(item => {
144
- const date = parseDate(item, dateValueFormat)
145
- if (XEUtils.isValidDate(date)) {
146
- return date
147
- }
148
- return date
149
- })
150
- }
151
- return []
152
- })
153
-
154
- const computeDateMultipleValue = computed(() => {
155
- const dateListValue = computeDateListValue.value
156
- const dateValueFormat = computeDateValueFormat.value
157
- return dateListValue.map(date => XEUtils.toDateString(date, dateValueFormat))
158
- })
159
-
160
- const computeDateMultipleLabel = computed(() => {
161
- const dateListValue = computeDateListValue.value
162
- const dateLabelFormat = computeDateLabelFormat.value
163
- return dateListValue.map(date => XEUtils.toDateString(date, dateLabelFormat)).join(', ')
164
- })
165
-
166
- const computeLimitMaxCount = computed(() => {
167
- return props.multiple ? XEUtils.toNumber(props.limitCount) : 0
168
- })
169
-
170
- const computeOverCount = computed(() => {
171
- const { multiple } = props
172
- const limitMaxCount = computeLimitMaxCount.value
173
- const dateMultipleValue = computeDateMultipleValue.value
174
- if (multiple && limitMaxCount) {
175
- return dateMultipleValue.length >= limitMaxCount
176
- }
177
- return false
178
- })
179
-
180
- const computeTimeOpts = computed(() => {
181
- return Object.assign({}, getConfig().datePanel.timeConfig, props.timeConfig)
182
- })
183
-
184
- const computeDateValueFormat = computed(() => {
185
- const { type, valueFormat } = props
186
- return handleValueFormat(type, valueFormat)
187
- })
188
-
189
- const computeDateValue = computed(() => {
190
- const { modelValue } = props
191
- const isDatePanelType = computeIsDatePanelType.value
192
- const dateValueFormat = computeDateValueFormat.value
193
- let val = null
194
- if (modelValue && isDatePanelType) {
195
- const date = parseDate(modelValue, dateValueFormat)
196
- if (XEUtils.isValidDate(date)) {
197
- val = date
198
- }
199
- }
200
- return val
201
- })
202
-
203
- const computeIsDisabledPrevDateBtn = computed(() => {
204
- const dateStartTime = computeDateStartTime.value
205
- const { selectMonth } = reactData
206
- if (selectMonth && dateStartTime) {
207
- return selectMonth <= dateStartTime
208
- }
209
- return false
210
- })
211
-
212
- const computeIsDisabledNextDateBtn = computed(() => {
213
- const dateEndTime = computeDateEndTime.value
214
- const { selectMonth } = reactData
215
- if (selectMonth && dateEndTime) {
216
- return XEUtils.getWhatMonth(selectMonth, 0, 'last') >= dateEndTime
217
- }
218
- return false
219
- })
220
-
221
- const computeDateTimeLabel = computed(() => {
222
- const { datetimePanelValue } = reactData
223
- const hasTimeSecond = computeHasTimeSecond.value
224
- const hasTimeMinute = computeHasTimeMinute.value
225
- if (datetimePanelValue) {
226
- return XEUtils.toDateString(datetimePanelValue, hasTimeMinute && hasTimeSecond ? 'HH:mm:ss' : (hasTimeMinute ? 'HH:mm' : 'HH'))
227
- }
228
- return ''
229
- })
230
-
231
- const computeDateHMSTime = computed(() => {
232
- const dateValue = computeDateValue.value
233
- const isDateTimeType = computeIsDateTimeType.value
234
- return dateValue && isDateTimeType ? (dateValue.getHours() * 3600 + dateValue.getMinutes() * 60 + dateValue.getSeconds()) * 1000 : 0
235
- })
236
-
237
- const computeDateLabelFormat = computed(() => {
238
- const { labelFormat } = props
239
- const isDatePanelType = computeIsDatePanelType.value
240
- if (isDatePanelType) {
241
- return labelFormat || getI18n(`vxe.input.date.labelFormat.${props.type}`)
242
- }
243
- return ''
244
- })
245
-
246
- const computeYearList = computed(() => {
247
- const { yearSize } = internalData
248
- const { selectMonth, currentDate } = reactData
249
- const years: VxeDatePanelDefines.DateYearItem[] = []
250
- if (selectMonth && currentDate) {
251
- const currFullYear = currentDate.getFullYear()
252
- const selectFullYear = selectMonth.getFullYear()
253
- const startYearDate = new Date(selectFullYear - selectFullYear % yearSize, 0, 1)
254
- for (let index = -4; index < yearSize + 4; index++) {
255
- const date = XEUtils.getWhatYear(startYearDate, index, 'first')
256
- const itemFullYear = date.getFullYear()
257
- years.push({
258
- date,
259
- isCurrent: true,
260
- isPrev: index < 0,
261
- isNow: currFullYear === itemFullYear,
262
- isNext: index >= yearSize,
263
- year: itemFullYear
264
- })
265
- }
266
- }
267
- return years
268
- })
269
-
270
- const computeSelectDatePanelObj = computed(() => {
271
- const isDatePanelType = computeIsDatePanelType.value
272
- let y = ''
273
- let m = ''
274
- if (isDatePanelType) {
275
- const { datePanelType, selectMonth } = reactData
276
- const yearList = computeYearList.value
277
- let year = ''
278
- let month
279
- if (selectMonth) {
280
- year = selectMonth.getFullYear()
281
- month = selectMonth.getMonth() + 1
282
- }
283
- if (datePanelType === 'quarter' || datePanelType === 'month') {
284
- y = getI18n('vxe.datePicker.yearTitle', [year])
285
- } else if (datePanelType === 'year') {
286
- y = yearList.length ? `${yearList[0].year} - ${yearList[yearList.length - 1].year}` : ''
287
- } else {
288
- y = getI18n('vxe.datePicker.yearTitle', [year])
289
- m = month ? getI18n(`vxe.input.date.m${month}`) : '-'
290
- }
291
- }
292
- return {
293
- y,
294
- m
295
- }
296
- })
297
-
298
- const computeFirstDayOfWeek = computed(() => {
299
- const { startDay } = props
300
- return XEUtils.toNumber(startDay) as VxeDatePanelPropTypes.StartDay
301
- })
302
-
303
- const computeWeekDatas = computed(() => {
304
- const weeks: number[] = []
305
- const isDatePanelType = computeIsDatePanelType.value
306
- if (isDatePanelType) {
307
- let sWeek = computeFirstDayOfWeek.value
308
- weeks.push(sWeek)
309
- for (let index = 0; index < 6; index++) {
310
- if (sWeek >= 6) {
311
- sWeek = 0
312
- } else {
313
- sWeek++
314
- }
315
- weeks.push(sWeek)
316
- }
317
- }
318
- return weeks
319
- })
320
-
321
- const computeDateHeaders = computed(() => {
322
- const isDatePanelType = computeIsDatePanelType.value
323
- if (isDatePanelType) {
324
- const weekDatas = computeWeekDatas.value
325
- return weekDatas.map((day) => {
326
- return {
327
- value: day,
328
- label: getI18n(`vxe.input.date.weeks.w${day}`)
329
- }
330
- })
331
- }
332
- return []
333
- })
334
-
335
- const computeWeekHeaders = computed(() => {
336
- const isDatePanelType = computeIsDatePanelType.value
337
- if (isDatePanelType) {
338
- const dateHeaders = computeDateHeaders.value
339
- return [{ label: getI18n('vxe.input.date.weeks.w') }].concat(dateHeaders)
340
- }
341
- return []
342
- })
343
-
344
- const computeYearDatas = computed(() => {
345
- const yearList = computeYearList.value
346
- return XEUtils.chunk(yearList, 4)
347
- })
348
-
349
- const computeQuarterList = computed(() => {
350
- const { quarterSize } = internalData
351
- const { selectMonth, currentDate } = reactData
352
- const quarters: VxeDatePanelDefines.DateQuarterItem[] = []
353
- if (selectMonth && currentDate) {
354
- const currFullYear = currentDate.getFullYear()
355
- const currQuarter = getDateQuarter(currentDate)
356
- const firstYear = XEUtils.getWhatYear(selectMonth, 0, 'first')
357
- const selFullYear = firstYear.getFullYear()
358
- for (let index = -2; index < quarterSize - 2; index++) {
359
- const date = XEUtils.getWhatQuarter(firstYear, index)
360
- const itemFullYear = date.getFullYear()
361
- const itemQuarter = getDateQuarter(date)
362
- const isPrev = itemFullYear < selFullYear
363
- quarters.push({
364
- date,
365
- isPrev,
366
- isCurrent: itemFullYear === selFullYear,
367
- isNow: itemFullYear === currFullYear && itemQuarter === currQuarter,
368
- isNext: !isPrev && itemFullYear > selFullYear,
369
- quarter: itemQuarter
370
- })
371
- }
372
- }
373
- return quarters
374
- })
375
-
376
- const computeQuarterDatas = computed(() => {
377
- const quarterList = computeQuarterList.value
378
- return XEUtils.chunk(quarterList, 2)
379
- })
380
-
381
- const computeMonthList = computed(() => {
382
- const { monthSize } = internalData
383
- const { selectMonth, currentDate } = reactData
384
- const months: VxeDatePanelDefines.DateMonthItem[] = []
385
- if (selectMonth && currentDate) {
386
- const currFullYear = currentDate.getFullYear()
387
- const currMonth = currentDate.getMonth()
388
- const selFullYear = XEUtils.getWhatYear(selectMonth, 0, 'first').getFullYear()
389
- for (let index = -4; index < monthSize - 4; index++) {
390
- const date = XEUtils.getWhatYear(selectMonth, 0, index)
391
- const itemFullYear = date.getFullYear()
392
- const itemMonth = date.getMonth()
393
- const isPrev = itemFullYear < selFullYear
394
- months.push({
395
- date,
396
- isPrev,
397
- isCurrent: itemFullYear === selFullYear,
398
- isNow: itemFullYear === currFullYear && itemMonth === currMonth,
399
- isNext: !isPrev && itemFullYear > selFullYear,
400
- month: itemMonth
401
- })
402
- }
403
- }
404
- return months
405
- })
406
-
407
- const computeMonthDatas = computed(() => {
408
- const monthList = computeMonthList.value
409
- return XEUtils.chunk(monthList, 4)
410
- })
411
-
412
- const computeDayList = computed(() => {
413
- const { selectMonth, currentDate } = reactData
414
- const days: VxeDatePanelDefines.DateDayItem[] = []
415
- if (selectMonth && currentDate) {
416
- const dateHMSTime = computeDateHMSTime.value
417
- const weekDatas = computeWeekDatas.value
418
- const currFullYear = currentDate.getFullYear()
419
- const currMonth = currentDate.getMonth()
420
- const currDate = currentDate.getDate()
421
- const selFullYear = selectMonth.getFullYear()
422
- const selMonth = selectMonth.getMonth()
423
- const selDay = selectMonth.getDay()
424
- const prevOffsetDate = -weekDatas.indexOf(selDay)
425
- const startDayDate = new Date(XEUtils.getWhatDay(selectMonth, prevOffsetDate).getTime() + dateHMSTime)
426
- for (let index = 0; index < 42; index++) {
427
- const date = XEUtils.getWhatDay(startDayDate, index)
428
- const itemFullYear = date.getFullYear()
429
- const itemMonth = date.getMonth()
430
- const itemDate = date.getDate()
431
- const isPrev = date < selectMonth
432
- days.push({
433
- date,
434
- isPrev,
435
- isCurrent: itemFullYear === selFullYear && itemMonth === selMonth,
436
- isNow: itemFullYear === currFullYear && itemMonth === currMonth && itemDate === currDate,
437
- isNext: !isPrev && selMonth !== itemMonth,
438
- label: itemDate
439
- })
440
- }
441
- }
442
- return days
443
- })
444
-
445
- const computeDayDatas = computed(() => {
446
- const dayList = computeDayList.value
447
- return XEUtils.chunk(dayList, 7)
448
- })
449
-
450
- const computeWeekDates = computed(() => {
451
- const dayDatas = computeDayDatas.value
452
- const firstDayOfWeek = computeFirstDayOfWeek.value
453
- return dayDatas.map((list) => {
454
- const firstItem = list[0]
455
- const item: VxeDatePanelDefines.DateDayItem = {
456
- date: firstItem.date,
457
- isWeekNumber: true,
458
- isPrev: false,
459
- isCurrent: false,
460
- isNow: false,
461
- isNext: false,
462
- label: XEUtils.getYearWeek(firstItem.date, firstDayOfWeek)
463
- }
464
- return [item].concat(list)
465
- })
466
- })
467
-
468
- const computeHourList = computed(() => {
469
- const timeOpts = computeTimeOpts.value
470
- const { hours: hourOptions, hourDisabledMethod } = timeOpts
471
- const list: VxeDatePanelDefines.DateHourMinuteSecondItem[] = []
472
- const isDateTimeType = computeIsDateTimeType.value
473
- if (isDateTimeType) {
474
- if (hourOptions && hourOptions.length) {
475
- hourOptions.forEach(item => {
476
- if (XEUtils.isNumber(item) || XEUtils.isString(item)) {
477
- const hour = XEUtils.toNumber(item)
478
- list.push({
479
- value: hour,
480
- label: ('' + hour).padStart(2, '0'),
481
- disabled: !!(hourDisabledMethod && hourDisabledMethod({ hour }))
482
- })
483
- } else if (item) {
484
- const hour = XEUtils.toNumber(item.value)
485
- list.push({
486
- value: hour,
487
- label: ('' + (item.label || hour)).padStart(2, '0'),
488
- disabled: XEUtils.isBoolean(item.disabled) ? item.disabled : !!(hourDisabledMethod && hourDisabledMethod({ hour }))
489
- })
490
- }
491
- })
492
- } else {
493
- for (let index = 0; index < 24; index++) {
494
- const hour = index
495
- list.push({
496
- value: hour,
497
- label: ('' + hour).padStart(2, '0'),
498
- disabled: !!(hourDisabledMethod && hourDisabledMethod({ hour }))
499
- })
500
- }
501
- }
502
- }
503
- return list
504
- })
505
-
506
- const computeMinuteList = computed(() => {
507
- const timeOpts = computeTimeOpts.value
508
- const { minutes: minuteOptions, minuteDisabledMethod } = timeOpts
509
- const list: VxeDatePanelDefines.DateHourMinuteSecondItem[] = []
510
- const isDateTimeType = computeIsDateTimeType.value
511
- if (isDateTimeType) {
512
- if (minuteOptions && minuteOptions.length) {
513
- minuteOptions.forEach(item => {
514
- if (XEUtils.isNumber(item) || XEUtils.isString(item)) {
515
- const minute = XEUtils.toNumber(item)
516
- list.push({
517
- value: minute,
518
- label: ('' + minute).padStart(2, '0'),
519
- disabled: !!(minuteDisabledMethod && minuteDisabledMethod({ minute }))
520
- })
521
- } else if (item) {
522
- const minute = XEUtils.toNumber(item.value)
523
- list.push({
524
- value: minute,
525
- label: ('' + (item.label || minute)).padStart(2, '0'),
526
- disabled: XEUtils.isBoolean(item.disabled) ? item.disabled : !!(minuteDisabledMethod && minuteDisabledMethod({ minute }))
527
- })
528
- }
529
- })
530
- } else {
531
- for (let index = 0; index < 60; index++) {
532
- const minute = index
533
- list.push({
534
- value: minute,
535
- label: ('' + minute).padStart(2, '0'),
536
- disabled: !!(minuteDisabledMethod && minuteDisabledMethod({ minute }))
537
- })
538
- }
539
- }
540
- }
541
- return list
542
- })
543
-
544
- const computeHasTimeMinute = computed(() => {
545
- const { timeFormat } = props
546
- const dateValueFormat = computeDateValueFormat.value
547
- return !/HH/.test(timeFormat || dateValueFormat) || /mm/.test(timeFormat || dateValueFormat)
548
- })
549
-
550
- const computeHasTimeSecond = computed(() => {
551
- const { timeFormat } = props
552
- const dateValueFormat = computeDateValueFormat.value
553
- return !/HH/.test(timeFormat || dateValueFormat) || /ss/.test(timeFormat || dateValueFormat)
554
- })
555
-
556
- const computeSecondList = computed(() => {
557
- const timeOpts = computeTimeOpts.value
558
- const { seconds: secondOptions, secondDisabledMethod } = timeOpts
559
- const list: VxeDatePanelDefines.DateHourMinuteSecondItem[] = []
560
- const isDateTimeType = computeIsDateTimeType.value
561
- if (isDateTimeType) {
562
- if (secondOptions && secondOptions.length) {
563
- secondOptions.forEach(item => {
564
- if (XEUtils.isNumber(item) || XEUtils.isString(item)) {
565
- const second = XEUtils.toNumber(item)
566
- list.push({
567
- value: second,
568
- label: ('' + second).padStart(2, '0'),
569
- disabled: !!(secondDisabledMethod && secondDisabledMethod({ second }))
570
- })
571
- } else if (item) {
572
- const second = XEUtils.toNumber(item.value)
573
- list.push({
574
- value: second,
575
- label: ('' + (item.label || second)).padStart(2, '0'),
576
- disabled: XEUtils.isBoolean(item.disabled) ? item.disabled : !!(secondDisabledMethod && secondDisabledMethod({ second }))
577
- })
578
- }
579
- })
580
- } else {
581
- for (let index = 0; index < 60; index++) {
582
- const second = index
583
- list.push({
584
- value: second,
585
- label: ('' + second).padStart(2, '0'),
586
- disabled: !!(secondDisabledMethod && secondDisabledMethod({ second }))
587
- })
588
- }
589
- }
590
- }
591
- return list
592
- })
593
-
594
- const updateModelValue = (modelValue: VxeDatePanelPropTypes.ModelValue | undefined) => {
595
- const { type } = props
596
- const dateValueFormat = computeDateValueFormat.value
597
- const inpDate = parseDateValue(modelValue, type, { valueFormat: dateValueFormat })
598
- reactData.inputValue = inpDate
599
- reactData.inputLabel = inpDate
600
- dateOpenPanel()
601
- }
602
-
603
- const parseDate = (value: VxeDatePanelPropTypes.ModelValue, format: string) => {
604
- const { type, multiple } = props
605
- if (type === 'time') {
606
- return toStringTimeDate(value)
607
- }
608
- if (XEUtils.isArray(value)) {
609
- return XEUtils.toStringDate(value[0], format)
610
- }
611
- if (XEUtils.isString(value)) {
612
- return XEUtils.toStringDate(multiple ? XEUtils.last(value.split(',')) : value, format)
613
- }
614
- return XEUtils.toStringDate(value, format)
615
- }
616
-
617
- const dateRevert = () => {
618
- reactData.inputLabel = props.multiple ? computeDateMultipleLabel.value : reactData.datePanelLabel
619
- }
620
-
621
- const afterCheckValue = (inpVal: string) => {
622
- const { type } = props
623
- const { inputLabel, datetimePanelValue } = reactData
624
- const dateLabelFormat = computeDateLabelFormat.value
625
- if (inpVal) {
626
- let inpDateVal: VxeDatePanelPropTypes.ModelValue = parseDate(inpVal, dateLabelFormat as string)
627
- if (XEUtils.isValidDate(inpDateVal)) {
628
- if (type === 'time') {
629
- inpDateVal = XEUtils.toDateString(inpDateVal, dateLabelFormat)
630
- if (inputLabel !== inpDateVal) {
631
- handleChange(inpDateVal, { type: 'check' })
632
- }
633
- reactData.inputLabel = inpDateVal
634
- } else {
635
- let isChange = false
636
- const firstDayOfWeek = computeFirstDayOfWeek.value
637
- if (type === 'datetime') {
638
- const dateValue = computeDateValue.value
639
- if (inpVal !== XEUtils.toDateString(dateValue, dateLabelFormat) || inpVal !== XEUtils.toDateString(inpDateVal, dateLabelFormat)) {
640
- isChange = true
641
- if (datetimePanelValue) {
642
- datetimePanelValue.setHours(inpDateVal.getHours())
643
- datetimePanelValue.setMinutes(inpDateVal.getMinutes())
644
- datetimePanelValue.setSeconds(inpDateVal.getSeconds())
645
- }
646
- }
647
- } else {
648
- isChange = true
649
- }
650
- reactData.inputLabel = XEUtils.toDateString(inpDateVal, dateLabelFormat, { firstDay: firstDayOfWeek })
651
- if (isChange) {
652
- dateChange(inpDateVal)
653
- }
654
- }
655
- } else {
656
- dateRevert()
657
- }
658
- } else {
659
- handleChange('', { type: 'check' })
660
- }
661
- }
662
-
663
- const emitModel = (value: any) => {
664
- reactData.inputValue = value
665
- emit('update:modelValue', value)
666
- }
667
-
668
- const handleChange = (value: string, evnt: Event | { type: string }) => {
669
- const { type, modelValue, valueFormat } = props
670
- const dateValueFormat = computeDateValueFormat.value
671
- reactData.inputLabel = value
672
- if (hasTimestampValueType(valueFormat)) {
673
- const dateVal = parseDateValue(value, type, { valueFormat: dateValueFormat })
674
- const timeNum = dateVal ? dateVal.getTime() : null
675
- emitModel(timeNum)
676
- if (modelValue !== timeNum) {
677
- dispatchEvent('change', { value: timeNum }, evnt as Event)
678
- }
679
- } else if (hasDateValueType(valueFormat)) {
680
- const dateVal = parseDateValue(value, type, { valueFormat: dateValueFormat })
681
- emitModel(dateVal)
682
- if (modelValue && dateVal ? XEUtils.toStringDate(modelValue).getTime() !== dateVal.getTime() : modelValue !== dateVal) {
683
- dispatchEvent('change', { value: dateVal }, evnt as Event)
684
- }
685
- } else {
686
- emitModel(value)
687
- if (XEUtils.toValueString(modelValue) !== value) {
688
- dispatchEvent('change', { value }, evnt as Event)
689
- }
690
- }
691
- }
692
-
693
- const hidePanel = () => {
694
- return new Promise<void>(resolve => {
695
- reactData.visiblePanel = false
696
- internalData.hpTimeout = setTimeout(() => {
697
- reactData.isAniVisible = false
698
- resolve()
699
- }, 350)
700
- })
701
- }
702
-
703
- const dateParseValue = (val?: VxeDatePanelPropTypes.ModelValue) => {
704
- const { type } = props
705
- const dateLabelFormat = computeDateLabelFormat.value
706
- const dateValueFormat = computeDateValueFormat.value
707
- const firstDayOfWeek = computeFirstDayOfWeek.value
708
- const dateObj = parseDateObj(val, type, {
709
- valueFormat: dateValueFormat,
710
- labelFormat: dateLabelFormat,
711
- firstDay: firstDayOfWeek
712
- })
713
- reactData.datePanelValue = dateObj.value
714
- reactData.datePanelLabel = dateObj.label
715
- }
716
-
717
- /**
718
- * 值变化时处理
719
- */
720
- const changeValue = () => {
721
- const isDatePanelType = computeIsDatePanelType.value
722
- const { inputLabel } = reactData
723
- if (isDatePanelType) {
724
- dateParseValue(inputLabel)
725
- reactData.inputLabel = props.multiple ? computeDateMultipleLabel.value : reactData.datePanelLabel
726
- }
727
- }
728
-
729
- /**
730
- * 检查初始值
731
- */
732
- const initValue = () => {
733
- const { modelValue } = props
734
- const isDatePanelType = computeIsDatePanelType.value
735
- updateModelValue(modelValue)
736
- if (isDatePanelType) {
737
- changeValue()
738
- }
739
- }
740
-
741
- const dateCheckMonth = (date: Date) => {
742
- const firstDayOfWeek = computeFirstDayOfWeek.value
743
- const weekNum = XEUtils.getYearWeek(date, firstDayOfWeek)
744
- const weekStartDate = XEUtils.getWhatWeek(date, 0, firstDayOfWeek, firstDayOfWeek)
745
- const month = XEUtils.getWhatMonth(weekNum === 1 ? XEUtils.getWhatDay(weekStartDate, 6) : date, 0, 'first')
746
- if (!XEUtils.isEqual(month, reactData.selectMonth)) {
747
- reactData.selectMonth = month
748
- }
749
- }
750
-
751
- const dateChange = (date: Date, isReload?: boolean) => {
752
- const { modelValue, multiple } = props
753
- const { datetimePanelValue } = reactData
754
- const isDateTimeType = computeIsDateTimeType.value
755
- const dateValueFormat = computeDateValueFormat.value
756
- const firstDayOfWeek = computeFirstDayOfWeek.value
757
- if (props.type === 'week') {
758
- const sWeek = XEUtils.toNumber(props.selectDay) as VxeDatePanelPropTypes.SelectDay
759
- date = XEUtils.getWhatWeek(date, 0, sWeek, firstDayOfWeek)
760
- } else if (isDateTimeType) {
761
- if (datetimePanelValue) {
762
- date.setHours(datetimePanelValue.getHours())
763
- date.setMinutes(datetimePanelValue.getMinutes())
764
- date.setSeconds(datetimePanelValue.getSeconds())
765
- }
766
- }
767
- const inpVal = XEUtils.toDateString(date, dateValueFormat, { firstDay: firstDayOfWeek })
768
- dateCheckMonth(date)
769
- if (multiple) {
770
- const overCount = computeOverCount.value
771
- // 如果为多选
772
- if (isDateTimeType) {
773
- // 如果是datetime特殊类型
774
- const dateListValue = isReload ? [] : [...computeDateListValue.value]
775
- const datetimeRest: Date[] = []
776
- const eqIndex = XEUtils.findIndexOf(dateListValue, val => XEUtils.isDateSame(date, val, 'yyyyMMdd'))
777
- if (eqIndex === -1) {
778
- if (overCount) {
779
- // 如果超出最大多选数量
780
- return
781
- }
782
- dateListValue.push(date)
783
- } else {
784
- dateListValue.splice(eqIndex, 1)
785
- }
786
- dateListValue.forEach(item => {
787
- if (item) {
788
- if (datetimePanelValue) {
789
- item.setHours(datetimePanelValue.getHours())
790
- item.setMinutes(datetimePanelValue.getMinutes())
791
- item.setSeconds(datetimePanelValue.getSeconds())
792
- }
793
- datetimeRest.push(item)
794
- }
795
- })
796
- handleChange(datetimeRest.map(date => XEUtils.toDateString(date, dateValueFormat)).join(','), { type: 'update' })
797
- } else {
798
- const dateMultipleValue = isReload ? [] : computeDateMultipleValue.value
799
- // 如果是日期类型
800
- if (dateMultipleValue.some(val => XEUtils.isEqual(val, inpVal))) {
801
- handleChange(dateMultipleValue.filter(val => !XEUtils.isEqual(val, inpVal)).join(','), { type: 'update' })
802
- } else {
803
- if (overCount) {
804
- // 如果超出最大多选数量
805
- return
806
- }
807
- handleChange(dateMultipleValue.concat([inpVal]).join(','), { type: 'update' })
808
- }
809
- }
810
- } else {
811
- // 如果为单选
812
- if (!XEUtils.isEqual(modelValue, inpVal)) {
813
- handleChange(inpVal, { type: 'update' })
814
- }
815
- }
816
- }
817
-
818
- // 日期
819
- const dateMonthHandle = (date: Date, offsetMonth: number) => {
820
- const firstDayOfWeek = computeFirstDayOfWeek.value
821
- const weekNum = XEUtils.getYearWeek(date, firstDayOfWeek)
822
- const weekStartDate = XEUtils.getWhatWeek(date, 0, firstDayOfWeek, firstDayOfWeek)
823
- const month = XEUtils.getWhatMonth(weekNum === 1 ? XEUtils.getWhatDay(weekStartDate, 6) : date, offsetMonth, 'first')
824
- reactData.selectMonth = month
825
- }
826
-
827
- const dateNowHandle = () => {
828
- const { type } = props
829
- const firstDayOfWeek = computeFirstDayOfWeek.value
830
- let currentDate = new Date()
831
- switch (type) {
832
- case 'week':
833
- currentDate = XEUtils.getWhatWeek(currentDate, 0, firstDayOfWeek)
834
- break
835
- case 'datetime':
836
- currentDate = new Date()
837
- reactData.datetimePanelValue = new Date()
838
- break
839
- default:
840
- currentDate = XEUtils.getWhatDay(Date.now(), 0, 'first')
841
- break
842
- }
843
- reactData.currentDate = currentDate
844
- dateMonthHandle(currentDate, 0)
845
- }
846
-
847
- const dateToggleYearTypeEvent = () => {
848
- reactData.datePanelType = 'year'
849
- }
850
-
851
- const dateToggleMonthTypeEvent = () => {
852
- let { datePanelType } = reactData
853
- if (datePanelType === 'month' || datePanelType === 'quarter') {
854
- datePanelType = 'year'
855
- } else {
856
- datePanelType = 'month'
857
- }
858
- reactData.datePanelType = datePanelType
859
- }
860
-
861
- const datePrevEvent = (evnt: Event) => {
862
- const { type } = props
863
- const { datePanelType, selectMonth, inputLabel } = reactData
864
- const { yearSize } = internalData
865
- const value = inputLabel
866
- const isDisabledPrevDateBtn = computeIsDisabledPrevDateBtn.value
867
- if (!isDisabledPrevDateBtn) {
868
- let viewDate
869
- if (type === 'year') {
870
- viewDate = XEUtils.getWhatYear(selectMonth, -yearSize, 'first')
871
- } else if (type === 'month' || type === 'quarter') {
872
- if (datePanelType === 'year') {
873
- viewDate = XEUtils.getWhatYear(selectMonth, -yearSize, 'first')
874
- } else {
875
- viewDate = XEUtils.getWhatYear(selectMonth, -1, 'first')
876
- }
877
- } else {
878
- if (datePanelType === 'year') {
879
- viewDate = XEUtils.getWhatYear(selectMonth, -yearSize, 'first')
880
- } else if (datePanelType === 'month') {
881
- viewDate = XEUtils.getWhatYear(selectMonth, -1, 'first')
882
- } else {
883
- viewDate = XEUtils.getWhatMonth(selectMonth, -1, 'first')
884
- }
885
- }
886
- reactData.selectMonth = viewDate
887
- dispatchEvent('date-prev', { viewType: datePanelType, viewDate, value, type }, evnt)
888
- }
889
- }
890
-
891
- const dateTodayMonthEvent = (evnt: Event) => {
892
- dateNowHandle()
893
- dateChange(reactData.currentDate, true)
894
- if (!props.multiple) {
895
- hidePanel()
896
- }
897
- dispatchEvent('date-today', { type: props.type }, evnt)
898
- }
899
-
900
- const dateNextEvent = (evnt: Event) => {
901
- const { type } = props
902
- const { datePanelType, selectMonth, inputLabel } = reactData
903
- const { yearSize } = internalData
904
- const value = inputLabel
905
- const isDisabledNextDateBtn = computeIsDisabledNextDateBtn.value
906
- if (!isDisabledNextDateBtn) {
907
- let viewDate
908
- if (type === 'year') {
909
- viewDate = XEUtils.getWhatYear(selectMonth, yearSize, 'first')
910
- } else if (type === 'month' || type === 'quarter') {
911
- if (datePanelType === 'year') {
912
- viewDate = XEUtils.getWhatYear(selectMonth, yearSize, 'first')
913
- } else {
914
- viewDate = XEUtils.getWhatYear(selectMonth, 1, 'first')
915
- }
916
- } else {
917
- if (datePanelType === 'year') {
918
- viewDate = XEUtils.getWhatYear(selectMonth, yearSize, 'first')
919
- } else if (datePanelType === 'month') {
920
- viewDate = XEUtils.getWhatYear(selectMonth, 1, 'first')
921
- } else {
922
- viewDate = XEUtils.getWhatMonth(selectMonth, 1, 'first')
923
- }
924
- }
925
- reactData.selectMonth = viewDate
926
- dispatchEvent('date-next', { viewType: datePanelType, value, type }, evnt)
927
- }
928
- }
929
-
930
- const isRangeDisabled = (item: { date: Date }) => {
931
- const dateStartTime = computeDateStartTime.value
932
- const dateEndTime = computeDateEndTime.value
933
- const { date } = item
934
- if (dateStartTime && dateStartTime.getTime() > date.getTime()) {
935
- return true
936
- }
937
- if (dateEndTime && dateEndTime.getTime() < date.getTime()) {
938
- return true
939
- }
940
- return false
941
- }
942
-
943
- const isDateDisabled = (item: { date: Date }) => {
944
- const { disabledMethod } = props
945
- const { datePanelType } = reactData
946
- const { date } = item
947
- if (disabledMethod) {
948
- return disabledMethod({ type: datePanelType, viewType: datePanelType, date, $datePanel: $xeDatePanel })
949
- }
950
- return false
951
- }
952
-
953
- const hasAllDisabled = (item: { date: Date }) => {
954
- return isRangeDisabled(item) || isDateDisabled(item)
955
- }
956
-
957
- const dateSelectItem = (date: Date) => {
958
- const { type, multiple } = props
959
- const { datePanelType } = reactData
960
- if (type === 'month') {
961
- if (datePanelType === 'year') {
962
- reactData.datePanelType = 'month'
963
- dateCheckMonth(date)
964
- } else {
965
- dateChange(date)
966
- if (!multiple) {
967
- hidePanel()
968
- }
969
- }
970
- } else if (type === 'year') {
971
- dateChange(date)
972
- if (!multiple) {
973
- hidePanel()
974
- }
975
- } else if (type === 'quarter') {
976
- if (datePanelType === 'year') {
977
- reactData.datePanelType = 'quarter'
978
- dateCheckMonth(date)
979
- } else {
980
- dateChange(date)
981
- if (!multiple) {
982
- hidePanel()
983
- }
984
- }
985
- } else {
986
- if (datePanelType === 'month') {
987
- reactData.datePanelType = type === 'week' ? type : 'day'
988
- dateCheckMonth(date)
989
- } else if (datePanelType === 'year') {
990
- reactData.datePanelType = 'month'
991
- dateCheckMonth(date)
992
- } else {
993
- dateChange(date)
994
- if (type === 'datetime') {
995
- // 日期带时间
996
- } else {
997
- if (!multiple) {
998
- hidePanel()
999
- }
1000
- }
1001
- }
1002
- }
1003
- }
1004
-
1005
- const dateSelectEvent = (item: VxeDatePanelDefines.DateYearItem | VxeDatePanelDefines.DateQuarterItem | VxeDatePanelDefines.DateMonthItem | VxeDatePanelDefines.DateDayItem) => {
1006
- if (!hasAllDisabled(item)) {
1007
- dateSelectItem(item.date)
1008
- }
1009
- }
1010
-
1011
- const dateMoveDay = (offsetDay: Date) => {
1012
- if (!hasAllDisabled({ date: offsetDay })) {
1013
- const dayList = computeDayList.value
1014
- if (!dayList.some((item) => XEUtils.isDateSame(item.date, offsetDay, 'yyyyMMdd'))) {
1015
- dateCheckMonth(offsetDay)
1016
- }
1017
- dateParseValue(offsetDay)
1018
- }
1019
- }
1020
-
1021
- const dateMoveYear = (offsetYear: Date) => {
1022
- if (!hasAllDisabled({ date: offsetYear })) {
1023
- const yearList = computeYearList.value
1024
- if (!yearList.some((item) => XEUtils.isDateSame(item.date, offsetYear, 'yyyy'))) {
1025
- dateCheckMonth(offsetYear)
1026
- }
1027
- dateParseValue(offsetYear)
1028
- }
1029
- }
1030
-
1031
- const dateMoveQuarter = (offsetQuarter: Date) => {
1032
- if (!hasAllDisabled({ date: offsetQuarter })) {
1033
- const quarterList = computeQuarterList.value
1034
- if (!quarterList.some((item) => XEUtils.isDateSame(item.date, offsetQuarter, 'yyyyq'))) {
1035
- dateCheckMonth(offsetQuarter)
1036
- }
1037
- dateParseValue(offsetQuarter)
1038
- }
1039
- }
1040
-
1041
- const dateMoveMonth = (offsetMonth: Date) => {
1042
- if (!hasAllDisabled({ date: offsetMonth })) {
1043
- const monthList = computeMonthList.value
1044
- if (!monthList.some((item) => XEUtils.isDateSame(item.date, offsetMonth, 'yyyyMM'))) {
1045
- dateCheckMonth(offsetMonth)
1046
- }
1047
- dateParseValue(offsetMonth)
1048
- }
1049
- }
1050
-
1051
- const dateMouseenterEvent = (item: VxeDatePanelDefines.DateYearItem | VxeDatePanelDefines.DateQuarterItem | VxeDatePanelDefines.DateMonthItem | VxeDatePanelDefines.DateDayItem) => {
1052
- if (!hasAllDisabled(item)) {
1053
- const { datePanelType } = reactData
1054
- if (datePanelType === 'month') {
1055
- dateMoveMonth(item.date)
1056
- } else if (datePanelType === 'quarter') {
1057
- dateMoveQuarter(item.date)
1058
- } else if (datePanelType === 'year') {
1059
- dateMoveYear(item.date)
1060
- } else {
1061
- dateMoveDay(item.date)
1062
- }
1063
- }
1064
- }
1065
-
1066
- const dateMouseleaveEvent = () => {
1067
- reactData.datePanelValue = null
1068
- }
1069
-
1070
- const updateTimePos = (liElem: Element) => {
1071
- if (liElem) {
1072
- const height = (liElem as HTMLElement).offsetHeight
1073
- const ulElem = liElem.parentNode as HTMLElement
1074
- ulElem.scrollTop = (liElem as HTMLElement).offsetTop - height * 4
1075
- }
1076
- }
1077
-
1078
- const dateTimeChangeEvent = (evnt: Event) => {
1079
- const { datetimePanelValue } = reactData
1080
- reactData.datetimePanelValue = datetimePanelValue ? new Date(datetimePanelValue.getTime()) : new Date()
1081
- updateTimePos(evnt.currentTarget as HTMLLIElement)
1082
- }
1083
-
1084
- const dateHourEvent = (evnt: MouseEvent, item: VxeDatePanelDefines.DateHourMinuteSecondItem) => {
1085
- const { datetimePanelValue } = reactData
1086
- if (!item.disabled) {
1087
- if (datetimePanelValue) {
1088
- datetimePanelValue.setHours(item.value)
1089
- }
1090
- dateTimeChangeEvent(evnt)
1091
- }
1092
- }
1093
-
1094
- const dateConfirmEvent = (evnt: Event) => {
1095
- const { multiple } = props
1096
- const { datetimePanelValue } = reactData
1097
- const dateValue = computeDateValue.value
1098
- const isDateTimeType = computeIsDateTimeType.value
1099
- if (isDateTimeType) {
1100
- const dateValueFormat = computeDateValueFormat.value
1101
- if (multiple) {
1102
- // 如果为多选
1103
- const dateMultipleValue = computeDateMultipleValue.value
1104
- if (isDateTimeType) {
1105
- // 如果是datetime特殊类型
1106
- const dateListValue = [...computeDateListValue.value]
1107
- const datetimeRest: Date[] = []
1108
- dateListValue.forEach(item => {
1109
- if (item) {
1110
- if (datetimePanelValue) {
1111
- item.setHours(datetimePanelValue.getHours())
1112
- item.setMinutes(datetimePanelValue.getMinutes())
1113
- item.setSeconds(datetimePanelValue.getSeconds())
1114
- }
1115
- datetimeRest.push(item)
1116
- }
1117
- })
1118
- handleChange(datetimeRest.map(date => XEUtils.toDateString(date, dateValueFormat)).join(','), { type: 'update' })
1119
- } else {
1120
- // 如果是日期类型
1121
- handleChange(dateMultipleValue.join(','), { type: 'update' })
1122
- }
1123
- } else {
1124
- dateChange(dateValue || reactData.currentDate)
1125
- }
1126
- }
1127
- hidePanel()
1128
- dispatchEvent('confirm', {}, evnt)
1129
- }
1130
-
1131
- const dateMinuteEvent = (evnt: MouseEvent, item: VxeDatePanelDefines.DateHourMinuteSecondItem) => {
1132
- const { datetimePanelValue } = reactData
1133
- if (!item.disabled) {
1134
- if (datetimePanelValue) {
1135
- datetimePanelValue.setMinutes(item.value)
1136
- }
1137
- dateTimeChangeEvent(evnt)
1138
- }
1139
- }
1140
-
1141
- const dateSecondEvent = (evnt: MouseEvent, item: VxeDatePanelDefines.DateHourMinuteSecondItem) => {
1142
- const { datetimePanelValue } = reactData
1143
- if (!item.disabled) {
1144
- if (datetimePanelValue) {
1145
- datetimePanelValue.setSeconds(item.value)
1146
- }
1147
- dateTimeChangeEvent(evnt)
1148
- }
1149
- }
1150
-
1151
- const dateOpenPanel = () => {
1152
- const { type, defaultDate, defaultTime } = props
1153
- const isDateTimeType = computeIsDateTimeType.value
1154
- const dateValue = computeDateValue.value
1155
- if (['year', 'quarter', 'month', 'week'].indexOf(type) > -1) {
1156
- reactData.datePanelType = type as VxeDatePanelDefines.DatePanelType
1157
- } else {
1158
- reactData.datePanelType = 'day'
1159
- }
1160
- reactData.currentDate = XEUtils.getWhatDay(Date.now(), 0, 'first')
1161
- if (dateValue) {
1162
- dateMonthHandle(dateValue, 0)
1163
- dateParseValue(dateValue)
1164
- } else {
1165
- if (defaultDate) {
1166
- // 面板默认日期仅支持解析 yyyy-MM-dd
1167
- const defDate = parseDate(defaultDate, 'yyyy-MM-dd')
1168
- if (XEUtils.isValidDate(defDate)) {
1169
- dateMonthHandle(defDate, 0)
1170
- } else {
1171
- dateNowHandle()
1172
- }
1173
- } else {
1174
- dateNowHandle()
1175
- }
1176
- }
1177
- if (isDateTimeType) {
1178
- let dtPanelValue = reactData.datePanelValue
1179
- if (!dtPanelValue) {
1180
- dtPanelValue = XEUtils.getWhatDay(Date.now(), 0, 'first')
1181
- if (defaultTime) {
1182
- const defTime = toStringTimeDate(defaultTime)
1183
- if (XEUtils.isValidDate(defTime)) {
1184
- dtPanelValue.setHours(defTime.getHours())
1185
- dtPanelValue.setMinutes(defTime.getMinutes())
1186
- dtPanelValue.setSeconds(defTime.getSeconds())
1187
- }
1188
- }
1189
- }
1190
- reactData.datetimePanelValue = dtPanelValue
1191
- nextTick(() => {
1192
- const timeBodyElem = refInputTimeBody.value
1193
- XEUtils.arrayEach(timeBodyElem.querySelectorAll('li.is--selected'), (elem) => {
1194
- updateTimePos(elem)
1195
- })
1196
- })
1197
- }
1198
- }
1199
-
1200
- const dispatchEvent = (type: ValueOf<VxeDatePanelEmits>, params: Record<string, any>, evnt: Event | null) => {
1201
- emit(type, createEvent(evnt, { $datePanel: $xeDatePanel }, params))
1202
- }
1203
-
1204
- const datePanelMethods: DatePanelMethods = {
1205
- dispatchEvent,
1206
-
1207
- getModelValue () {
1208
- return reactData.inputValue
1209
- },
1210
- setPanelDate (date) {
1211
- if (date) {
1212
- dateCheckMonth(date)
1213
- }
1214
- },
1215
- getPanelDate () {
1216
- return reactData.selectMonth
1217
- },
1218
- checkValue (value) {
1219
- afterCheckValue(value)
1220
- },
1221
- confirmByEvent (evnt) {
1222
- dateConfirmEvent(evnt)
1223
- }
1224
- }
1225
-
1226
- Object.assign($xeDatePanel, datePanelMethods)
1227
-
1228
- const renderDateLabel = (item: VxeDatePanelDefines.DateYearItem | VxeDatePanelDefines.DateQuarterItem | VxeDatePanelDefines.DateMonthItem | VxeDatePanelDefines.DateDayItem, label: string | number) => {
1229
- const { festivalMethod } = props
1230
- const labelVNs: VNode[] = []
1231
- if (festivalMethod) {
1232
- const { datePanelType } = reactData
1233
- const festivalRest = festivalMethod({ type: datePanelType, viewType: datePanelType, date: item.date, $datePanel: $xeDatePanel })
1234
- const festivalItem = festivalRest ? (XEUtils.isString(festivalRest) ? { label: festivalRest } : festivalRest) : {}
1235
- const extraItem = festivalItem.extra ? (XEUtils.isString(festivalItem.extra) ? { label: festivalItem.extra } : festivalItem.extra) : null
1236
- labelVNs.push(
1237
- h('div', {
1238
- class: ['vxe-date-panel--label', {
1239
- 'is-notice': festivalItem.notice
1240
- }]
1241
- }, extraItem && extraItem.label
1242
- ? [
1243
- h('div', {
1244
- class: 'vxe-date-panel--label--number'
1245
- }, `${label}`),
1246
- h('div', {
1247
- class: ['vxe-date-panel--label--extra', extraItem.important ? 'is-important' : '', extraItem.className],
1248
- style: extraItem.style
1249
- }, XEUtils.toValueString(extraItem.label))
1250
- ]
1251
- : `${label}`)
1252
- )
1253
- const festivalLabel = festivalItem.label
1254
- if (festivalLabel) {
1255
- // 默认最多支持3个节日重叠
1256
- const festivalLabels = XEUtils.toValueString(festivalLabel).split(',')
1257
- labelVNs.push(
1258
- h('div', {
1259
- class: ['vxe-date-panel--festival', festivalItem.important ? 'is-important' : '', festivalItem.className],
1260
- style: festivalItem.style
1261
- }, [
1262
- festivalLabels.length > 1
1263
- ? h('div', {
1264
- class: ['vxe-date-panel--festival--overlap', `overlap--${festivalLabels.length}`]
1265
- }, festivalLabels.map(label => h('div', label.substring(0, 3))))
1266
- : h('div', {
1267
- class: 'vxe-date-panel--festival--label'
1268
- }, festivalLabels[0].substring(0, 3))
1269
- ])
1270
- )
1271
- }
1272
- }
1273
- return labelVNs
1274
- }
1275
-
1276
- const renderDateDayTable = () => {
1277
- const { multiple } = props
1278
- const { datePanelType, datePanelValue } = reactData
1279
- const dateValue = computeDateValue.value
1280
- const dateHeaders = computeDateHeaders.value
1281
- const dayDatas = computeDayDatas.value
1282
- const dateListValue = computeDateListValue.value
1283
- const overCount = computeOverCount.value
1284
- const matchFormat = 'yyyyMMdd'
1285
- return [
1286
- h('div', {
1287
- class: ['vxe-date-panel--view-wrapper', `type--${datePanelType}`]
1288
- }, [
1289
- h('div', {
1290
- class: 'vxe-date-panel--view-header'
1291
- }, [
1292
- h('div', {
1293
- class: 'vxe-date-panel--view-row'
1294
- }, dateHeaders.map((item) => {
1295
- return h('div', {
1296
- class: 'vxe-date-panel--view-item',
1297
- style: {
1298
- width: `${100 / dateHeaders.length}%`
1299
- }
1300
- }, [
1301
- h('div', {
1302
- class: 'vxe-date-panel--view-item-inner'
1303
- }, [
1304
- h('div', {
1305
- class: 'vxe-date-panel--view-item-label'
1306
- }, item.label)
1307
- ])
1308
- ])
1309
- }))
1310
- ]),
1311
- h('div', {
1312
- class: 'vxe-date-panel--view-body'
1313
- }, dayDatas.map((rows) => {
1314
- return h('div', {
1315
- class: 'vxe-date-panel--view-row',
1316
- style: {
1317
- height: `${100 / dayDatas.length}%`
1318
- }
1319
- }, rows.map((item) => {
1320
- const isSelected = multiple ? dateListValue.some(val => XEUtils.isDateSame(val, item.date, matchFormat)) : XEUtils.isDateSame(dateValue, item.date, matchFormat)
1321
- return h('div', {
1322
- class: ['vxe-date-panel--view-item', {
1323
- 'is--prev': item.isPrev,
1324
- 'is--current': item.isCurrent,
1325
- 'is--now': item.isNow,
1326
- 'is--next': item.isNext,
1327
- 'is--range-disabled': isRangeDisabled(item),
1328
- 'is--disabled': isDateDisabled(item),
1329
- 'is--selected': isSelected,
1330
- 'is--over': overCount && !isSelected,
1331
- 'is--hover': !overCount && XEUtils.isDateSame(datePanelValue, item.date, matchFormat)
1332
- }],
1333
- style: {
1334
- width: `${100 / rows.length}%`
1335
- },
1336
- onClick: () => dateSelectEvent(item),
1337
- onMouseenter: () => dateMouseenterEvent(item),
1338
- onMouseleave: dateMouseleaveEvent
1339
- }, [
1340
- h('div', {
1341
- class: 'vxe-date-panel--view-item-inner'
1342
- }, renderDateLabel(item, item.label))
1343
- ])
1344
- }))
1345
- }))
1346
- ])
1347
- ]
1348
- }
1349
-
1350
- const renderDateWeekTable = () => {
1351
- const { multiple } = props
1352
- const { datePanelType, datePanelValue } = reactData
1353
- const dateValue = computeDateValue.value
1354
- const weekHeaders = computeWeekHeaders.value
1355
- const weekDates = computeWeekDates.value
1356
- const dateListValue = computeDateListValue.value
1357
- const overCount = computeOverCount.value
1358
- const matchFormat = 'yyyyMMdd'
1359
- return [
1360
- h('div', {
1361
- class: ['vxe-date-panel--view-wrapper', `type--${datePanelType}`]
1362
- }, [
1363
- h('div', {
1364
- class: 'vxe-date-panel--view-header'
1365
- }, [
1366
- h('div', {
1367
- class: 'vxe-date-panel--view-row'
1368
- }, weekHeaders.map((item, rIndex) => {
1369
- return h('div', {
1370
- class: 'vxe-date-panel--view-item',
1371
- style: {
1372
- width: `${rIndex ? 13 : 9}%`
1373
- }
1374
- }, [
1375
- h('div', {
1376
- class: 'vxe-date-panel--view-item-inner'
1377
- }, [
1378
- h('div', {
1379
- class: 'vxe-date-panel--view-item-label'
1380
- }, item.label)
1381
- ])
1382
- ])
1383
- }))
1384
- ]),
1385
- h('div', {
1386
- class: 'vxe-date-panel--view-body'
1387
- }, weekDates.map((rows) => {
1388
- const isSelected = multiple ? rows.some((item) => dateListValue.some(val => XEUtils.isDateSame(val, item.date, matchFormat))) : rows.some((item) => XEUtils.isDateSame(dateValue, item.date, matchFormat))
1389
- const isHover = rows.some((item) => XEUtils.isDateSame(datePanelValue, item.date, matchFormat))
1390
- const isNowWeek = rows.some(item => item.isNow)
1391
- return h('div', {
1392
- class: 'vxe-date-panel--view-row',
1393
- style: {
1394
- height: `${100 / weekDates.length}%`
1395
- }
1396
- }, rows.map((item, rIndex) => {
1397
- return h('div', {
1398
- class: ['vxe-date-panel--view-item', {
1399
- 'is--prev': item.isPrev,
1400
- 'is--current': item.isCurrent,
1401
- 'is--now': rIndex ? item.isNow : isNowWeek,
1402
- 'is--next': item.isNext,
1403
- 'is--range-disabled': isRangeDisabled(item),
1404
- 'is--disabled': isDateDisabled(item),
1405
- 'is--selected': isSelected,
1406
- 'is--over': overCount && !isSelected,
1407
- 'is--hover': !overCount && isHover
1408
- }],
1409
- style: {
1410
- width: `${rIndex ? 13 : 9}%`
1411
- },
1412
- onClick: () => dateSelectEvent(item),
1413
- onMouseenter: () => dateMouseenterEvent(item),
1414
- onMouseleave: dateMouseleaveEvent
1415
- }, [
1416
- h('div', {
1417
- class: 'vxe-date-panel--view-item-inner'
1418
- }, renderDateLabel(item, item.label))
1419
- ])
1420
- }))
1421
- }))
1422
- ])
1423
- ]
1424
- }
1425
-
1426
- const renderDateMonthTable = () => {
1427
- const { multiple } = props
1428
- const { datePanelType, datePanelValue } = reactData
1429
- const dateValue = computeDateValue.value
1430
- const monthDatas = computeMonthDatas.value
1431
- const dateListValue = computeDateListValue.value
1432
- const overCount = computeOverCount.value
1433
- const matchFormat = 'yyyyMM'
1434
- return [
1435
- h('div', {
1436
- class: ['vxe-date-panel--view-wrapper', `type--${datePanelType}`]
1437
- }, [
1438
- h('div', {
1439
- class: 'vxe-date-panel--view-body'
1440
- }, monthDatas.map((rows) => {
1441
- return h('div', {
1442
- class: 'vxe-date-panel--view-row',
1443
- style: {
1444
- height: `${100 / monthDatas.length}%`
1445
- }
1446
- }, rows.map((item) => {
1447
- const isSelected = multiple ? dateListValue.some(val => XEUtils.isDateSame(val, item.date, matchFormat)) : XEUtils.isDateSame(dateValue, item.date, matchFormat)
1448
- return h('div', {
1449
- class: ['vxe-date-panel--view-item', {
1450
- 'is--prev': item.isPrev,
1451
- 'is--current': item.isCurrent,
1452
- 'is--now': item.isNow,
1453
- 'is--next': item.isNext,
1454
- 'is--range-disabled': isRangeDisabled(item),
1455
- 'is--disabled': isDateDisabled(item),
1456
- 'is--selected': isSelected,
1457
- 'is--over': overCount && !isSelected,
1458
- 'is--hover': !overCount && XEUtils.isDateSame(datePanelValue, item.date, matchFormat)
1459
- }],
1460
- style: {
1461
- width: `${100 / rows.length}%`
1462
- },
1463
- onClick: () => dateSelectEvent(item),
1464
- onMouseenter: () => dateMouseenterEvent(item),
1465
- onMouseleave: dateMouseleaveEvent
1466
- }, [
1467
- h('div', {
1468
- class: 'vxe-date-panel--view-item-inner'
1469
- }, renderDateLabel(item, getI18n(`vxe.input.date.months.m${item.month}`)))
1470
- ])
1471
- }))
1472
- }))
1473
- ])
1474
- ]
1475
- }
1476
-
1477
- const renderDateQuarterTable = () => {
1478
- const { multiple } = props
1479
- const { datePanelType, datePanelValue } = reactData
1480
- const dateValue = computeDateValue.value
1481
- const quarterDatas = computeQuarterDatas.value
1482
- const dateListValue = computeDateListValue.value
1483
- const overCount = computeOverCount.value
1484
- const matchFormat = 'yyyyq'
1485
- return [
1486
- h('div', {
1487
- class: ['vxe-date-panel--view-wrapper', `type--${datePanelType}`]
1488
- }, [
1489
- h('div', {
1490
- class: 'vxe-date-panel--view-body'
1491
- }, quarterDatas.map((rows) => {
1492
- return h('div', {
1493
- class: 'vxe-date-panel--view-row',
1494
- style: {
1495
- height: `${100 / quarterDatas.length}%`
1496
- }
1497
- }, rows.map((item) => {
1498
- const isSelected = multiple ? dateListValue.some(val => XEUtils.isDateSame(val, item.date, matchFormat)) : XEUtils.isDateSame(dateValue, item.date, matchFormat)
1499
- return h('div', {
1500
- class: ['vxe-date-panel--view-item', {
1501
- 'is--prev': item.isPrev,
1502
- 'is--current': item.isCurrent,
1503
- 'is--now': item.isNow,
1504
- 'is--next': item.isNext,
1505
- 'is--range-disabled': isRangeDisabled(item),
1506
- 'is--disabled': isDateDisabled(item),
1507
- 'is--selected': isSelected,
1508
- 'is--over': overCount && !isSelected,
1509
- 'is--hover': !overCount && XEUtils.isDateSame(datePanelValue, item.date, matchFormat)
1510
- }],
1511
- style: {
1512
- width: `${100 / rows.length}%`
1513
- },
1514
- onClick: () => dateSelectEvent(item),
1515
- onMouseenter: () => dateMouseenterEvent(item),
1516
- onMouseleave: dateMouseleaveEvent
1517
- }, [
1518
- h('div', {
1519
- class: 'vxe-date-panel--view-item-inner'
1520
- }, renderDateLabel(item, getI18n(`vxe.input.date.quarters.q${item.quarter}`)))
1521
- ])
1522
- }))
1523
- }))
1524
- ])
1525
- ]
1526
- }
1527
-
1528
- const renderDateYearTable = () => {
1529
- const { multiple } = props
1530
- const { datePanelType, datePanelValue } = reactData
1531
- const dateValue = computeDateValue.value
1532
- const yearDatas = computeYearDatas.value
1533
- const dateListValue = computeDateListValue.value
1534
- const overCount = computeOverCount.value
1535
- const matchFormat = 'yyyy'
1536
- return [
1537
- h('div', {
1538
- class: ['vxe-date-panel--view-wrapper', `type--${datePanelType}`]
1539
- }, [
1540
- h('div', {
1541
- class: 'vxe-date-panel--view-body'
1542
- }, yearDatas.map((rows) => {
1543
- return h('div', {
1544
- class: 'vxe-date-panel--view-row',
1545
- style: {
1546
- height: `${100 / yearDatas.length}%`
1547
- }
1548
- }, rows.map((item) => {
1549
- const isSelected = multiple ? dateListValue.some(val => XEUtils.isDateSame(val, item.date, matchFormat)) : XEUtils.isDateSame(dateValue, item.date, matchFormat)
1550
- return h('div', {
1551
- class: ['vxe-date-panel--view-item', {
1552
- 'is--prev': item.isPrev,
1553
- 'is--current': item.isCurrent,
1554
- 'is--now': item.isNow,
1555
- 'is--next': item.isNext,
1556
- 'is--range-disabled': isRangeDisabled(item),
1557
- 'is--disabled': isDateDisabled(item),
1558
- 'is--selected': isSelected,
1559
- 'is--over': overCount && !isSelected,
1560
- 'is--hover': !overCount && XEUtils.isDateSame(datePanelValue, item.date, matchFormat)
1561
- }],
1562
- style: {
1563
- width: `${100 / rows.length}%`
1564
- },
1565
- onClick: () => dateSelectEvent(item),
1566
- onMouseenter: () => dateMouseenterEvent(item),
1567
- onMouseleave: dateMouseleaveEvent
1568
- }, [
1569
- h('div', {
1570
- class: 'vxe-date-panel--view-item-inner'
1571
- }, renderDateLabel(item, item.year))
1572
- ])
1573
- }))
1574
- }))
1575
- ])
1576
- ]
1577
- }
1578
-
1579
- const renderDateTable = () => {
1580
- const { datePanelType } = reactData
1581
- switch (datePanelType) {
1582
- case 'week' :
1583
- return renderDateWeekTable()
1584
- case 'month' :
1585
- return renderDateMonthTable()
1586
- case 'quarter' :
1587
- return renderDateQuarterTable()
1588
- case 'year' :
1589
- return renderDateYearTable()
1590
- }
1591
- return renderDateDayTable()
1592
- }
1593
-
1594
- const renderDatePanel = () => {
1595
- const { datePanelType } = reactData
1596
- const isDisabledPrevDateBtn = computeIsDisabledPrevDateBtn.value
1597
- const isDisabledNextDateBtn = computeIsDisabledNextDateBtn.value
1598
- const selectDatePanelObj = computeSelectDatePanelObj.value
1599
- return [
1600
- h('div', {
1601
- class: 'vxe-date-panel--picker-header'
1602
- }, [
1603
- h('div', {
1604
- class: 'vxe-date-panel--picker-type-wrapper'
1605
- }, [
1606
- datePanelType === 'year'
1607
- ? h('span', {
1608
- class: 'vxe-date-panel--picker-label'
1609
- }, selectDatePanelObj.y)
1610
- : h('span', {
1611
- class: 'vxe-date-panel--picker-btns'
1612
- }, [
1613
- h('span', {
1614
- class: 'vxe-date-panel--picker-btn',
1615
- onClick: dateToggleYearTypeEvent
1616
- }, selectDatePanelObj.y),
1617
- selectDatePanelObj.m
1618
- ? h('span', {
1619
- class: 'vxe-date-panel--picker-btn',
1620
- onClick: dateToggleMonthTypeEvent
1621
- }, selectDatePanelObj.m)
1622
- : renderEmptyElement($xeDatePanel)
1623
- ])
1624
- ]),
1625
- h('div', {
1626
- class: 'vxe-date-panel--picker-btn-wrapper'
1627
- }, [
1628
- h('span', {
1629
- class: ['vxe-date-panel--picker-btn vxe-date-panel--picker-prev-btn', {
1630
- 'is--disabled': isDisabledPrevDateBtn
1631
- }],
1632
- onClick: datePrevEvent
1633
- }, [
1634
- h('i', {
1635
- class: 'vxe-icon-caret-left'
1636
- })
1637
- ]),
1638
- h('span', {
1639
- class: 'vxe-date-panel--picker-btn vxe-date-panel--picker-current-btn',
1640
- onClick: dateTodayMonthEvent
1641
- }, [
1642
- h('i', {
1643
- class: 'vxe-icon-dot'
1644
- })
1645
- ]),
1646
- h('span', {
1647
- class: ['vxe-date-panel--picker-btn vxe-date-panel--picker-next-btn', {
1648
- 'is--disabled': isDisabledNextDateBtn
1649
- }],
1650
- onClick: dateNextEvent
1651
- }, [
1652
- h('i', {
1653
- class: 'vxe-icon-caret-right'
1654
- })
1655
- ])
1656
- ])
1657
- ]),
1658
- h('div', {
1659
- class: 'vxe-date-panel--picker-body'
1660
- }, renderDateTable())
1661
- ]
1662
- }
1663
-
1664
- const renderTimePanel = () => {
1665
- const { type } = props
1666
- const { datetimePanelValue } = reactData
1667
- const dateTimeLabel = computeDateTimeLabel.value
1668
- const hourList = computeHourList.value
1669
- const hasTimeMinute = computeHasTimeMinute.value
1670
- const minuteList = computeMinuteList.value
1671
- const hasTimeSecond = computeHasTimeSecond.value
1672
- const secondList = computeSecondList.value
1673
- return [
1674
- type === 'time'
1675
- ? renderEmptyElement($xeDatePanel)
1676
- : h('div', {
1677
- class: 'vxe-date-panel--time-header'
1678
- }, [
1679
- h('div', {
1680
- class: 'vxe-date-panel--time-title'
1681
- }, dateTimeLabel)
1682
- ]),
1683
- h('div', {
1684
- ref: refInputTimeBody,
1685
- class: 'vxe-date-panel--time-body'
1686
- }, [
1687
- h('ul', {
1688
- class: 'vxe-date-panel--time-hour-list'
1689
- }, hourList.map((item, index) => {
1690
- return h('li', {
1691
- key: index,
1692
- class: {
1693
- 'is--disabled': item.disabled,
1694
- 'is--selected': datetimePanelValue && datetimePanelValue.getHours() === item.value
1695
- },
1696
- onClick: (evnt: MouseEvent) => dateHourEvent(evnt, item)
1697
- }, item.label)
1698
- })),
1699
- hasTimeMinute
1700
- ? h('ul', {
1701
- class: 'vxe-date-panel--time-minute-list'
1702
- }, minuteList.map((item, index) => {
1703
- return h('li', {
1704
- key: index,
1705
- class: {
1706
- 'is--disabled': item.disabled,
1707
- 'is--selected': datetimePanelValue && datetimePanelValue.getMinutes() === item.value
1708
- },
1709
- onClick: (evnt: MouseEvent) => dateMinuteEvent(evnt, item)
1710
- }, item.label)
1711
- }))
1712
- : renderEmptyElement($xeDatePanel),
1713
- hasTimeMinute && hasTimeSecond
1714
- ? h('ul', {
1715
- class: 'vxe-date-panel--time-second-list'
1716
- }, secondList.map((item, index) => {
1717
- return h('li', {
1718
- key: index,
1719
- class: {
1720
- 'is--disabled': item.disabled,
1721
- 'is--selected': datetimePanelValue && datetimePanelValue.getSeconds() === item.value
1722
- },
1723
- onClick: (evnt: MouseEvent) => dateSecondEvent(evnt, item)
1724
- }, item.label)
1725
- }))
1726
- : renderEmptyElement($xeDatePanel)
1727
- ])
1728
- ]
1729
- }
1730
-
1731
- const renderPickerPanel = () => {
1732
- const { type } = props
1733
- if (type === 'datetime') {
1734
- return h('div', {
1735
- key: type,
1736
- ref: refPanelWrapper,
1737
- class: 'vxe-date-panel--time-layout-wrapper'
1738
- }, [
1739
- h('div', {
1740
- class: 'vxe-date-panel--time-left-wrapper'
1741
- }, renderDatePanel()),
1742
- h('div', {
1743
- class: 'vxe-date-panel--time-right-wrapper'
1744
- }, renderTimePanel())
1745
- ])
1746
- } else if (type === 'time') {
1747
- return h('div', {
1748
- key: type,
1749
- ref: refPanelWrapper,
1750
- class: 'vxe-date-panel--wrapper'
1751
- }, renderTimePanel())
1752
- }
1753
- return h('div', {
1754
- key: type || 'default',
1755
- ref: refPanelWrapper,
1756
- class: 'vxe-date-panel--wrapper'
1757
- }, renderDatePanel())
1758
- }
1759
-
1760
- const renderVN = () => {
1761
- const { type } = props
1762
- const vSize = computeSize.value
1763
- return h('div', {
1764
- class: ['vxe-date-panel', `type--${type}`, {
1765
- [`size--${vSize}`]: vSize
1766
- }]
1767
- }, [
1768
- renderPickerPanel()
1769
- ])
1770
- }
1771
-
1772
- watch(() => props.modelValue, (val) => {
1773
- updateModelValue(val)
1774
- changeValue()
1775
- })
1776
-
1777
- watch(() => props.type, () => {
1778
- // 切换类型是重置内置变量
1779
- Object.assign(reactData, {
1780
- inputLabel: '',
1781
- datetimePanelValue: null,
1782
- datePanelValue: null,
1783
- datePanelLabel: '',
1784
- datePanelType: 'day',
1785
- selectMonth: null,
1786
- currentDate: null
1787
- })
1788
- initValue()
1789
- })
1790
-
1791
- watch(computeDateLabelFormat, () => {
1792
- const isDatePanelType = computeIsDatePanelType.value
1793
- if (isDatePanelType) {
1794
- dateParseValue(reactData.datePanelValue)
1795
- reactData.inputLabel = props.multiple ? computeDateMultipleLabel.value : reactData.datePanelLabel
1796
- }
1797
- })
1798
-
1799
- initValue()
1800
- dateOpenPanel()
1801
-
1802
- $xeDatePanel.renderVN = renderVN
1803
-
1804
- return $xeDatePanel
1805
- },
1806
- render () {
1807
- return this.renderVN()
1808
- }
1809
- })
1
+ import { h, ref, Ref, computed, reactive, nextTick, watch, PropType, VNode } from 'vue'
2
+ import { defineVxeComponent } from '../../ui/src/comp'
3
+ import XEUtils from 'xe-utils'
4
+ import { getConfig, getI18n, createEvent, useSize, renderEmptyElement } from '../../ui'
5
+ import { toStringTimeDate, getDateQuarter, parseDateValue, parseDateObj, handleValueFormat, hasDateValueType, hasTimestampValueType } from './util'
6
+
7
+ import type { VxeDatePanelConstructor, DatePanelInternalData, DatePanelReactData, VxeDatePanelPropTypes, DatePanelMethods, ValueOf, VxeDatePanelEmits, VxeDatePanelDefines } from '../../../types'
8
+
9
+ export default defineVxeComponent({
10
+ name: 'VxeDatePanel',
11
+ props: {
12
+ modelValue: [String, Number, Date] as PropType<VxeDatePanelPropTypes.ModelValue>,
13
+ type: {
14
+ type: String as PropType<VxeDatePanelPropTypes.Type>,
15
+ default: 'date'
16
+ },
17
+ className: String as PropType<VxeDatePanelPropTypes.ClassName>,
18
+ size: {
19
+ type: String as PropType<VxeDatePanelPropTypes.Size>,
20
+ default: () => getConfig().datePanel.size || getConfig().size
21
+ },
22
+ multiple: Boolean as PropType<VxeDatePanelPropTypes.Multiple>,
23
+ limitCount: {
24
+ type: [String, Number] as PropType<VxeDatePanelPropTypes.LimitCount>,
25
+ default: () => getConfig().datePanel.limitCount
26
+ },
27
+
28
+ // date、week、month、quarter、year
29
+ startDate: {
30
+ type: [String, Number, Date] as PropType<VxeDatePanelPropTypes.StartDate>,
31
+ default: () => getConfig().datePanel.startDate
32
+ },
33
+ endDate: {
34
+ type: [String, Number, Date] as PropType<VxeDatePanelPropTypes.EndDate>,
35
+ default: () => getConfig().datePanel.endDate
36
+ },
37
+ defaultDate: [String, Number, Date] as PropType<VxeDatePanelPropTypes.DefaultDate>,
38
+ defaultTime: [String, Number, Date] as PropType<VxeDatePanelPropTypes.DefaultTime>,
39
+ minDate: [String, Number, Date] as PropType<VxeDatePanelPropTypes.MinDate>,
40
+ maxDate: [String, Number, Date] as PropType<VxeDatePanelPropTypes.MaxDate>,
41
+ startDay: {
42
+ type: [String, Number] as PropType<VxeDatePanelPropTypes.StartDay>,
43
+ default: () => getConfig().datePanel.startDay
44
+ },
45
+ labelFormat: String as PropType<VxeDatePanelPropTypes.LabelFormat>,
46
+ valueFormat: String as PropType<VxeDatePanelPropTypes.ValueFormat>,
47
+ timeFormat: String as PropType<VxeDatePanelPropTypes.TimeFormat>,
48
+ festivalMethod: {
49
+ type: Function as PropType<VxeDatePanelPropTypes.FestivalMethod>,
50
+ default: () => getConfig().datePanel.festivalMethod
51
+ },
52
+ disabledMethod: {
53
+ type: Function as PropType<VxeDatePanelPropTypes.DisabledMethod>,
54
+ default: () => getConfig().datePanel.disabledMethod
55
+ },
56
+
57
+ timeConfig: Object as PropType<VxeDatePanelPropTypes.TimeConfig>,
58
+
59
+ // week
60
+ selectDay: {
61
+ type: [String, Number] as PropType<VxeDatePanelPropTypes.SelectDay>,
62
+ default: () => getConfig().datePanel.selectDay
63
+ }
64
+ },
65
+ emits: [
66
+ 'update:modelValue',
67
+ 'change',
68
+ 'click',
69
+ 'clear',
70
+ 'date-prev',
71
+ 'date-today',
72
+ 'date-next',
73
+ 'confirm'
74
+ ] as VxeDatePanelEmits,
75
+ setup (props, context) {
76
+ const { emit } = context
77
+
78
+ const xID = XEUtils.uniqueId()
79
+
80
+ const { computeSize } = useSize(props)
81
+
82
+ const reactData = reactive<DatePanelReactData>({
83
+ visiblePanel: false,
84
+ isAniVisible: false,
85
+ isActivated: false,
86
+ inputValue: '',
87
+ inputLabel: '',
88
+ datetimePanelValue: null,
89
+ datePanelValue: null,
90
+ datePanelLabel: '',
91
+ datePanelType: 'day',
92
+ selectMonth: null,
93
+ currentDate: null
94
+ })
95
+
96
+ const internalData: DatePanelInternalData = {
97
+ yearSize: 12,
98
+ monthSize: 20,
99
+ quarterSize: 8,
100
+ hpTimeout: undefined as any
101
+ }
102
+
103
+ const refElem = ref() as Ref<HTMLDivElement>
104
+ const refPanelWrapper = ref() as Ref<HTMLDivElement>
105
+ const refInputTimeBody = ref() as Ref<HTMLDivElement>
106
+
107
+ const refMaps = {
108
+ refElem
109
+ }
110
+
111
+ const $xeDatePanel = {
112
+ xID,
113
+ props,
114
+ context,
115
+ reactData,
116
+ internalData,
117
+ getRefMaps: () => refMaps
118
+ } as unknown as VxeDatePanelConstructor
119
+
120
+ const computeIsDateTimeType = computed(() => {
121
+ const { type } = props
122
+ return type === 'time' || type === 'datetime'
123
+ })
124
+
125
+ const computeIsDatePanelType = computed(() => {
126
+ const isDateTimeType = computeIsDateTimeType.value
127
+ return isDateTimeType || ['date', 'week', 'month', 'quarter', 'year'].indexOf(props.type) > -1
128
+ })
129
+
130
+ const computeDateStartTime = computed(() => {
131
+ return props.startDate ? XEUtils.toStringDate(props.startDate) : null
132
+ })
133
+
134
+ const computeDateEndTime = computed(() => {
135
+ return props.endDate ? XEUtils.toStringDate(props.endDate) : null
136
+ })
137
+
138
+ const computeDateListValue = computed(() => {
139
+ const { modelValue, multiple } = props
140
+ const isDatePanelType = computeIsDatePanelType.value
141
+ const dateValueFormat = computeDateValueFormat.value
142
+ if (multiple && modelValue && isDatePanelType) {
143
+ return XEUtils.toValueString(modelValue).split(',').map(item => {
144
+ const date = parseDate(item, dateValueFormat)
145
+ if (XEUtils.isValidDate(date)) {
146
+ return date
147
+ }
148
+ return date
149
+ })
150
+ }
151
+ return []
152
+ })
153
+
154
+ const computeDateMultipleValue = computed(() => {
155
+ const dateListValue = computeDateListValue.value
156
+ const dateValueFormat = computeDateValueFormat.value
157
+ return dateListValue.map(date => XEUtils.toDateString(date, dateValueFormat))
158
+ })
159
+
160
+ const computeDateMultipleLabel = computed(() => {
161
+ const dateListValue = computeDateListValue.value
162
+ const dateLabelFormat = computeDateLabelFormat.value
163
+ return dateListValue.map(date => XEUtils.toDateString(date, dateLabelFormat)).join(', ')
164
+ })
165
+
166
+ const computeLimitMaxCount = computed(() => {
167
+ return props.multiple ? XEUtils.toNumber(props.limitCount) : 0
168
+ })
169
+
170
+ const computeOverCount = computed(() => {
171
+ const { multiple } = props
172
+ const limitMaxCount = computeLimitMaxCount.value
173
+ const dateMultipleValue = computeDateMultipleValue.value
174
+ if (multiple && limitMaxCount) {
175
+ return dateMultipleValue.length >= limitMaxCount
176
+ }
177
+ return false
178
+ })
179
+
180
+ const computeTimeOpts = computed(() => {
181
+ return Object.assign({}, getConfig().datePanel.timeConfig, props.timeConfig)
182
+ })
183
+
184
+ const computeDateValueFormat = computed(() => {
185
+ const { type, valueFormat } = props
186
+ return handleValueFormat(type, valueFormat)
187
+ })
188
+
189
+ const computeDateValue = computed(() => {
190
+ const { modelValue } = props
191
+ const isDatePanelType = computeIsDatePanelType.value
192
+ const dateValueFormat = computeDateValueFormat.value
193
+ let val = null
194
+ if (modelValue && isDatePanelType) {
195
+ const date = parseDate(modelValue, dateValueFormat)
196
+ if (XEUtils.isValidDate(date)) {
197
+ val = date
198
+ }
199
+ }
200
+ return val
201
+ })
202
+
203
+ const computeIsDisabledPrevDateBtn = computed(() => {
204
+ const dateStartTime = computeDateStartTime.value
205
+ const { selectMonth } = reactData
206
+ if (selectMonth && dateStartTime) {
207
+ return selectMonth <= dateStartTime
208
+ }
209
+ return false
210
+ })
211
+
212
+ const computeIsDisabledNextDateBtn = computed(() => {
213
+ const dateEndTime = computeDateEndTime.value
214
+ const { selectMonth } = reactData
215
+ if (selectMonth && dateEndTime) {
216
+ return XEUtils.getWhatMonth(selectMonth, 0, 'last') >= dateEndTime
217
+ }
218
+ return false
219
+ })
220
+
221
+ const computeDateTimeLabel = computed(() => {
222
+ const { datetimePanelValue } = reactData
223
+ const hasTimeSecond = computeHasTimeSecond.value
224
+ const hasTimeMinute = computeHasTimeMinute.value
225
+ if (datetimePanelValue) {
226
+ return XEUtils.toDateString(datetimePanelValue, hasTimeMinute && hasTimeSecond ? 'HH:mm:ss' : (hasTimeMinute ? 'HH:mm' : 'HH'))
227
+ }
228
+ return ''
229
+ })
230
+
231
+ const computeDateHMSTime = computed(() => {
232
+ const dateValue = computeDateValue.value
233
+ const isDateTimeType = computeIsDateTimeType.value
234
+ return dateValue && isDateTimeType ? (dateValue.getHours() * 3600 + dateValue.getMinutes() * 60 + dateValue.getSeconds()) * 1000 : 0
235
+ })
236
+
237
+ const computeDateLabelFormat = computed(() => {
238
+ const { labelFormat } = props
239
+ const isDatePanelType = computeIsDatePanelType.value
240
+ if (isDatePanelType) {
241
+ return labelFormat || getI18n(`vxe.input.date.labelFormat.${props.type}`)
242
+ }
243
+ return ''
244
+ })
245
+
246
+ const computeYearList = computed(() => {
247
+ const { yearSize } = internalData
248
+ const { selectMonth, currentDate } = reactData
249
+ const years: VxeDatePanelDefines.DateYearItem[] = []
250
+ if (selectMonth && currentDate) {
251
+ const currFullYear = currentDate.getFullYear()
252
+ const selectFullYear = selectMonth.getFullYear()
253
+ const startYearDate = new Date(selectFullYear - selectFullYear % yearSize, 0, 1)
254
+ for (let index = -4; index < yearSize + 4; index++) {
255
+ const date = XEUtils.getWhatYear(startYearDate, index, 'first')
256
+ const itemFullYear = date.getFullYear()
257
+ years.push({
258
+ date,
259
+ isCurrent: true,
260
+ isPrev: index < 0,
261
+ isNow: currFullYear === itemFullYear,
262
+ isNext: index >= yearSize,
263
+ year: itemFullYear
264
+ })
265
+ }
266
+ }
267
+ return years
268
+ })
269
+
270
+ const computeSelectDatePanelObj = computed(() => {
271
+ const isDatePanelType = computeIsDatePanelType.value
272
+ let y = ''
273
+ let m = ''
274
+ if (isDatePanelType) {
275
+ const { datePanelType, selectMonth } = reactData
276
+ const yearList = computeYearList.value
277
+ let year = ''
278
+ let month
279
+ if (selectMonth) {
280
+ year = selectMonth.getFullYear()
281
+ month = selectMonth.getMonth() + 1
282
+ }
283
+ if (datePanelType === 'quarter' || datePanelType === 'month') {
284
+ y = getI18n('vxe.datePicker.yearTitle', [year])
285
+ } else if (datePanelType === 'year') {
286
+ y = yearList.length ? `${yearList[0].year} - ${yearList[yearList.length - 1].year}` : ''
287
+ } else {
288
+ y = getI18n('vxe.datePicker.yearTitle', [year])
289
+ m = month ? getI18n(`vxe.input.date.m${month}`) : '-'
290
+ }
291
+ }
292
+ return {
293
+ y,
294
+ m
295
+ }
296
+ })
297
+
298
+ const computeFirstDayOfWeek = computed(() => {
299
+ const { startDay } = props
300
+ return XEUtils.toNumber(startDay) as VxeDatePanelPropTypes.StartDay
301
+ })
302
+
303
+ const computeWeekDatas = computed(() => {
304
+ const weeks: number[] = []
305
+ const isDatePanelType = computeIsDatePanelType.value
306
+ if (isDatePanelType) {
307
+ let sWeek = computeFirstDayOfWeek.value
308
+ weeks.push(sWeek)
309
+ for (let index = 0; index < 6; index++) {
310
+ if (sWeek >= 6) {
311
+ sWeek = 0
312
+ } else {
313
+ sWeek++
314
+ }
315
+ weeks.push(sWeek)
316
+ }
317
+ }
318
+ return weeks
319
+ })
320
+
321
+ const computeDateHeaders = computed(() => {
322
+ const isDatePanelType = computeIsDatePanelType.value
323
+ if (isDatePanelType) {
324
+ const weekDatas = computeWeekDatas.value
325
+ return weekDatas.map((day) => {
326
+ return {
327
+ value: day,
328
+ label: getI18n(`vxe.input.date.weeks.w${day}`)
329
+ }
330
+ })
331
+ }
332
+ return []
333
+ })
334
+
335
+ const computeWeekHeaders = computed(() => {
336
+ const isDatePanelType = computeIsDatePanelType.value
337
+ if (isDatePanelType) {
338
+ const dateHeaders = computeDateHeaders.value
339
+ return [{ label: getI18n('vxe.input.date.weeks.w') }].concat(dateHeaders)
340
+ }
341
+ return []
342
+ })
343
+
344
+ const computeYearDatas = computed(() => {
345
+ const yearList = computeYearList.value
346
+ return XEUtils.chunk(yearList, 4)
347
+ })
348
+
349
+ const computeQuarterList = computed(() => {
350
+ const { quarterSize } = internalData
351
+ const { selectMonth, currentDate } = reactData
352
+ const quarters: VxeDatePanelDefines.DateQuarterItem[] = []
353
+ if (selectMonth && currentDate) {
354
+ const currFullYear = currentDate.getFullYear()
355
+ const currQuarter = getDateQuarter(currentDate)
356
+ const firstYear = XEUtils.getWhatYear(selectMonth, 0, 'first')
357
+ const selFullYear = firstYear.getFullYear()
358
+ for (let index = -2; index < quarterSize - 2; index++) {
359
+ const date = XEUtils.getWhatQuarter(firstYear, index)
360
+ const itemFullYear = date.getFullYear()
361
+ const itemQuarter = getDateQuarter(date)
362
+ const isPrev = itemFullYear < selFullYear
363
+ quarters.push({
364
+ date,
365
+ isPrev,
366
+ isCurrent: itemFullYear === selFullYear,
367
+ isNow: itemFullYear === currFullYear && itemQuarter === currQuarter,
368
+ isNext: !isPrev && itemFullYear > selFullYear,
369
+ quarter: itemQuarter
370
+ })
371
+ }
372
+ }
373
+ return quarters
374
+ })
375
+
376
+ const computeQuarterDatas = computed(() => {
377
+ const quarterList = computeQuarterList.value
378
+ return XEUtils.chunk(quarterList, 2)
379
+ })
380
+
381
+ const computeMonthList = computed(() => {
382
+ const { monthSize } = internalData
383
+ const { selectMonth, currentDate } = reactData
384
+ const months: VxeDatePanelDefines.DateMonthItem[] = []
385
+ if (selectMonth && currentDate) {
386
+ const currFullYear = currentDate.getFullYear()
387
+ const currMonth = currentDate.getMonth()
388
+ const selFullYear = XEUtils.getWhatYear(selectMonth, 0, 'first').getFullYear()
389
+ for (let index = -4; index < monthSize - 4; index++) {
390
+ const date = XEUtils.getWhatYear(selectMonth, 0, index)
391
+ const itemFullYear = date.getFullYear()
392
+ const itemMonth = date.getMonth()
393
+ const isPrev = itemFullYear < selFullYear
394
+ months.push({
395
+ date,
396
+ isPrev,
397
+ isCurrent: itemFullYear === selFullYear,
398
+ isNow: itemFullYear === currFullYear && itemMonth === currMonth,
399
+ isNext: !isPrev && itemFullYear > selFullYear,
400
+ month: itemMonth
401
+ })
402
+ }
403
+ }
404
+ return months
405
+ })
406
+
407
+ const computeMonthDatas = computed(() => {
408
+ const monthList = computeMonthList.value
409
+ return XEUtils.chunk(monthList, 4)
410
+ })
411
+
412
+ const computeDayList = computed(() => {
413
+ const { selectMonth, currentDate } = reactData
414
+ const days: VxeDatePanelDefines.DateDayItem[] = []
415
+ if (selectMonth && currentDate) {
416
+ const dateHMSTime = computeDateHMSTime.value
417
+ const weekDatas = computeWeekDatas.value
418
+ const currFullYear = currentDate.getFullYear()
419
+ const currMonth = currentDate.getMonth()
420
+ const currDate = currentDate.getDate()
421
+ const selFullYear = selectMonth.getFullYear()
422
+ const selMonth = selectMonth.getMonth()
423
+ const selDay = selectMonth.getDay()
424
+ const prevOffsetDate = -weekDatas.indexOf(selDay)
425
+ const startDayDate = new Date(XEUtils.getWhatDay(selectMonth, prevOffsetDate).getTime() + dateHMSTime)
426
+ for (let index = 0; index < 42; index++) {
427
+ const date = XEUtils.getWhatDay(startDayDate, index)
428
+ const itemFullYear = date.getFullYear()
429
+ const itemMonth = date.getMonth()
430
+ const itemDate = date.getDate()
431
+ const isPrev = date < selectMonth
432
+ days.push({
433
+ date,
434
+ isPrev,
435
+ isCurrent: itemFullYear === selFullYear && itemMonth === selMonth,
436
+ isNow: itemFullYear === currFullYear && itemMonth === currMonth && itemDate === currDate,
437
+ isNext: !isPrev && selMonth !== itemMonth,
438
+ label: itemDate
439
+ })
440
+ }
441
+ }
442
+ return days
443
+ })
444
+
445
+ const computeDayDatas = computed(() => {
446
+ const dayList = computeDayList.value
447
+ return XEUtils.chunk(dayList, 7)
448
+ })
449
+
450
+ const computeWeekDates = computed(() => {
451
+ const dayDatas = computeDayDatas.value
452
+ const firstDayOfWeek = computeFirstDayOfWeek.value
453
+ return dayDatas.map((list) => {
454
+ const firstItem = list[0]
455
+ const item: VxeDatePanelDefines.DateDayItem = {
456
+ date: firstItem.date,
457
+ isWeekNumber: true,
458
+ isPrev: false,
459
+ isCurrent: false,
460
+ isNow: false,
461
+ isNext: false,
462
+ label: XEUtils.getYearWeek(firstItem.date, firstDayOfWeek)
463
+ }
464
+ return [item].concat(list)
465
+ })
466
+ })
467
+
468
+ const computeHourList = computed(() => {
469
+ const timeOpts = computeTimeOpts.value
470
+ const { hours: hourOptions, hourDisabledMethod } = timeOpts
471
+ const list: VxeDatePanelDefines.DateHourMinuteSecondItem[] = []
472
+ const isDateTimeType = computeIsDateTimeType.value
473
+ if (isDateTimeType) {
474
+ if (hourOptions && hourOptions.length) {
475
+ hourOptions.forEach(item => {
476
+ if (XEUtils.isNumber(item) || XEUtils.isString(item)) {
477
+ const hour = XEUtils.toNumber(item)
478
+ list.push({
479
+ value: hour,
480
+ label: ('' + hour).padStart(2, '0'),
481
+ disabled: !!(hourDisabledMethod && hourDisabledMethod({ hour }))
482
+ })
483
+ } else if (item) {
484
+ const hour = XEUtils.toNumber(item.value)
485
+ list.push({
486
+ value: hour,
487
+ label: ('' + (item.label || hour)).padStart(2, '0'),
488
+ disabled: XEUtils.isBoolean(item.disabled) ? item.disabled : !!(hourDisabledMethod && hourDisabledMethod({ hour }))
489
+ })
490
+ }
491
+ })
492
+ } else {
493
+ for (let index = 0; index < 24; index++) {
494
+ const hour = index
495
+ list.push({
496
+ value: hour,
497
+ label: ('' + hour).padStart(2, '0'),
498
+ disabled: !!(hourDisabledMethod && hourDisabledMethod({ hour }))
499
+ })
500
+ }
501
+ }
502
+ }
503
+ return list
504
+ })
505
+
506
+ const computeMinuteList = computed(() => {
507
+ const timeOpts = computeTimeOpts.value
508
+ const { minutes: minuteOptions, minuteDisabledMethod } = timeOpts
509
+ const list: VxeDatePanelDefines.DateHourMinuteSecondItem[] = []
510
+ const isDateTimeType = computeIsDateTimeType.value
511
+ if (isDateTimeType) {
512
+ if (minuteOptions && minuteOptions.length) {
513
+ minuteOptions.forEach(item => {
514
+ if (XEUtils.isNumber(item) || XEUtils.isString(item)) {
515
+ const minute = XEUtils.toNumber(item)
516
+ list.push({
517
+ value: minute,
518
+ label: ('' + minute).padStart(2, '0'),
519
+ disabled: !!(minuteDisabledMethod && minuteDisabledMethod({ minute }))
520
+ })
521
+ } else if (item) {
522
+ const minute = XEUtils.toNumber(item.value)
523
+ list.push({
524
+ value: minute,
525
+ label: ('' + (item.label || minute)).padStart(2, '0'),
526
+ disabled: XEUtils.isBoolean(item.disabled) ? item.disabled : !!(minuteDisabledMethod && minuteDisabledMethod({ minute }))
527
+ })
528
+ }
529
+ })
530
+ } else {
531
+ for (let index = 0; index < 60; index++) {
532
+ const minute = index
533
+ list.push({
534
+ value: minute,
535
+ label: ('' + minute).padStart(2, '0'),
536
+ disabled: !!(minuteDisabledMethod && minuteDisabledMethod({ minute }))
537
+ })
538
+ }
539
+ }
540
+ }
541
+ return list
542
+ })
543
+
544
+ const computeHasTimeMinute = computed(() => {
545
+ const { timeFormat } = props
546
+ const dateValueFormat = computeDateValueFormat.value
547
+ return !/HH/.test(timeFormat || dateValueFormat) || /mm/.test(timeFormat || dateValueFormat)
548
+ })
549
+
550
+ const computeHasTimeSecond = computed(() => {
551
+ const { timeFormat } = props
552
+ const dateValueFormat = computeDateValueFormat.value
553
+ return !/HH/.test(timeFormat || dateValueFormat) || /ss/.test(timeFormat || dateValueFormat)
554
+ })
555
+
556
+ const computeSecondList = computed(() => {
557
+ const timeOpts = computeTimeOpts.value
558
+ const { seconds: secondOptions, secondDisabledMethod } = timeOpts
559
+ const list: VxeDatePanelDefines.DateHourMinuteSecondItem[] = []
560
+ const isDateTimeType = computeIsDateTimeType.value
561
+ if (isDateTimeType) {
562
+ if (secondOptions && secondOptions.length) {
563
+ secondOptions.forEach(item => {
564
+ if (XEUtils.isNumber(item) || XEUtils.isString(item)) {
565
+ const second = XEUtils.toNumber(item)
566
+ list.push({
567
+ value: second,
568
+ label: ('' + second).padStart(2, '0'),
569
+ disabled: !!(secondDisabledMethod && secondDisabledMethod({ second }))
570
+ })
571
+ } else if (item) {
572
+ const second = XEUtils.toNumber(item.value)
573
+ list.push({
574
+ value: second,
575
+ label: ('' + (item.label || second)).padStart(2, '0'),
576
+ disabled: XEUtils.isBoolean(item.disabled) ? item.disabled : !!(secondDisabledMethod && secondDisabledMethod({ second }))
577
+ })
578
+ }
579
+ })
580
+ } else {
581
+ for (let index = 0; index < 60; index++) {
582
+ const second = index
583
+ list.push({
584
+ value: second,
585
+ label: ('' + second).padStart(2, '0'),
586
+ disabled: !!(secondDisabledMethod && secondDisabledMethod({ second }))
587
+ })
588
+ }
589
+ }
590
+ }
591
+ return list
592
+ })
593
+
594
+ const updateModelValue = (modelValue: VxeDatePanelPropTypes.ModelValue | undefined) => {
595
+ const { type } = props
596
+ const dateValueFormat = computeDateValueFormat.value
597
+ const inpDate = parseDateValue(modelValue, type, { valueFormat: dateValueFormat })
598
+ reactData.inputValue = inpDate
599
+ reactData.inputLabel = inpDate
600
+ dateOpenPanel()
601
+ }
602
+
603
+ const parseDate = (value: VxeDatePanelPropTypes.ModelValue, format: string) => {
604
+ const { type, multiple } = props
605
+ if (type === 'time') {
606
+ return toStringTimeDate(value)
607
+ }
608
+ if (XEUtils.isArray(value)) {
609
+ return XEUtils.toStringDate(value[0], format)
610
+ }
611
+ if (XEUtils.isString(value)) {
612
+ return XEUtils.toStringDate(multiple ? XEUtils.last(value.split(',')) : value, format)
613
+ }
614
+ return XEUtils.toStringDate(value, format)
615
+ }
616
+
617
+ const dateRevert = () => {
618
+ reactData.inputLabel = props.multiple ? computeDateMultipleLabel.value : reactData.datePanelLabel
619
+ }
620
+
621
+ const afterCheckValue = (inpVal: string) => {
622
+ const { type } = props
623
+ const { inputLabel, datetimePanelValue } = reactData
624
+ const dateLabelFormat = computeDateLabelFormat.value
625
+ if (inpVal) {
626
+ let inpDateVal: VxeDatePanelPropTypes.ModelValue = parseDate(inpVal, dateLabelFormat as string)
627
+ if (XEUtils.isValidDate(inpDateVal)) {
628
+ if (type === 'time') {
629
+ inpDateVal = XEUtils.toDateString(inpDateVal, dateLabelFormat)
630
+ if (inputLabel !== inpDateVal) {
631
+ handleChange(inpDateVal, { type: 'check' })
632
+ }
633
+ reactData.inputLabel = inpDateVal
634
+ } else {
635
+ let isChange = false
636
+ const firstDayOfWeek = computeFirstDayOfWeek.value
637
+ if (type === 'datetime') {
638
+ const dateValue = computeDateValue.value
639
+ if (inpVal !== XEUtils.toDateString(dateValue, dateLabelFormat) || inpVal !== XEUtils.toDateString(inpDateVal, dateLabelFormat)) {
640
+ isChange = true
641
+ if (datetimePanelValue) {
642
+ datetimePanelValue.setHours(inpDateVal.getHours())
643
+ datetimePanelValue.setMinutes(inpDateVal.getMinutes())
644
+ datetimePanelValue.setSeconds(inpDateVal.getSeconds())
645
+ }
646
+ }
647
+ } else {
648
+ isChange = true
649
+ }
650
+ reactData.inputLabel = XEUtils.toDateString(inpDateVal, dateLabelFormat, { firstDay: firstDayOfWeek })
651
+ if (isChange) {
652
+ dateChange(inpDateVal)
653
+ }
654
+ }
655
+ } else {
656
+ dateRevert()
657
+ }
658
+ } else {
659
+ handleChange('', { type: 'check' })
660
+ }
661
+ }
662
+
663
+ const emitModel = (value: any) => {
664
+ reactData.inputValue = value
665
+ emit('update:modelValue', value)
666
+ }
667
+
668
+ const handleChange = (value: string, evnt: Event | { type: string }) => {
669
+ const { type, modelValue, valueFormat } = props
670
+ const dateValueFormat = computeDateValueFormat.value
671
+ reactData.inputLabel = value
672
+ if (hasTimestampValueType(valueFormat)) {
673
+ const dateVal = parseDateValue(value, type, { valueFormat: dateValueFormat })
674
+ const timeNum = dateVal ? dateVal.getTime() : null
675
+ emitModel(timeNum)
676
+ if (modelValue !== timeNum) {
677
+ dispatchEvent('change', { value: timeNum }, evnt as Event)
678
+ }
679
+ } else if (hasDateValueType(valueFormat)) {
680
+ const dateVal = parseDateValue(value, type, { valueFormat: dateValueFormat })
681
+ emitModel(dateVal)
682
+ if (modelValue && dateVal ? XEUtils.toStringDate(modelValue).getTime() !== dateVal.getTime() : modelValue !== dateVal) {
683
+ dispatchEvent('change', { value: dateVal }, evnt as Event)
684
+ }
685
+ } else {
686
+ emitModel(value)
687
+ if (XEUtils.toValueString(modelValue) !== value) {
688
+ dispatchEvent('change', { value }, evnt as Event)
689
+ }
690
+ }
691
+ }
692
+
693
+ const hidePanel = () => {
694
+ return new Promise<void>(resolve => {
695
+ reactData.visiblePanel = false
696
+ internalData.hpTimeout = setTimeout(() => {
697
+ reactData.isAniVisible = false
698
+ resolve()
699
+ }, 350)
700
+ })
701
+ }
702
+
703
+ const dateParseValue = (val?: VxeDatePanelPropTypes.ModelValue) => {
704
+ const { type } = props
705
+ const dateLabelFormat = computeDateLabelFormat.value
706
+ const dateValueFormat = computeDateValueFormat.value
707
+ const firstDayOfWeek = computeFirstDayOfWeek.value
708
+ const dateObj = parseDateObj(val, type, {
709
+ valueFormat: dateValueFormat,
710
+ labelFormat: dateLabelFormat,
711
+ firstDay: firstDayOfWeek
712
+ })
713
+ reactData.datePanelValue = dateObj.value
714
+ reactData.datePanelLabel = dateObj.label
715
+ }
716
+
717
+ /**
718
+ * 值变化时处理
719
+ */
720
+ const changeValue = () => {
721
+ const isDatePanelType = computeIsDatePanelType.value
722
+ const { inputLabel } = reactData
723
+ if (isDatePanelType) {
724
+ dateParseValue(inputLabel)
725
+ reactData.inputLabel = props.multiple ? computeDateMultipleLabel.value : reactData.datePanelLabel
726
+ }
727
+ }
728
+
729
+ /**
730
+ * 检查初始值
731
+ */
732
+ const initValue = () => {
733
+ const { modelValue } = props
734
+ const isDatePanelType = computeIsDatePanelType.value
735
+ updateModelValue(modelValue)
736
+ if (isDatePanelType) {
737
+ changeValue()
738
+ }
739
+ }
740
+
741
+ const dateCheckMonth = (date: Date) => {
742
+ const firstDayOfWeek = computeFirstDayOfWeek.value
743
+ const weekNum = XEUtils.getYearWeek(date, firstDayOfWeek)
744
+ const weekStartDate = XEUtils.getWhatWeek(date, 0, firstDayOfWeek, firstDayOfWeek)
745
+ const month = XEUtils.getWhatMonth(weekNum === 1 ? XEUtils.getWhatDay(weekStartDate, 6) : date, 0, 'first')
746
+ if (!XEUtils.isEqual(month, reactData.selectMonth)) {
747
+ reactData.selectMonth = month
748
+ }
749
+ }
750
+
751
+ const dateChange = (date: Date, isReload?: boolean) => {
752
+ const { modelValue, multiple } = props
753
+ const { datetimePanelValue } = reactData
754
+ const isDateTimeType = computeIsDateTimeType.value
755
+ const dateValueFormat = computeDateValueFormat.value
756
+ const firstDayOfWeek = computeFirstDayOfWeek.value
757
+ if (props.type === 'week') {
758
+ const sWeek = XEUtils.toNumber(props.selectDay) as VxeDatePanelPropTypes.SelectDay
759
+ date = XEUtils.getWhatWeek(date, 0, sWeek, firstDayOfWeek)
760
+ } else if (isDateTimeType) {
761
+ if (datetimePanelValue) {
762
+ date.setHours(datetimePanelValue.getHours())
763
+ date.setMinutes(datetimePanelValue.getMinutes())
764
+ date.setSeconds(datetimePanelValue.getSeconds())
765
+ }
766
+ }
767
+ const inpVal = XEUtils.toDateString(date, dateValueFormat, { firstDay: firstDayOfWeek })
768
+ dateCheckMonth(date)
769
+ if (multiple) {
770
+ const overCount = computeOverCount.value
771
+ // 如果为多选
772
+ if (isDateTimeType) {
773
+ // 如果是datetime特殊类型
774
+ const dateListValue = isReload ? [] : [...computeDateListValue.value]
775
+ const datetimeRest: Date[] = []
776
+ const eqIndex = XEUtils.findIndexOf(dateListValue, val => XEUtils.isDateSame(date, val, 'yyyyMMdd'))
777
+ if (eqIndex === -1) {
778
+ if (overCount) {
779
+ // 如果超出最大多选数量
780
+ return
781
+ }
782
+ dateListValue.push(date)
783
+ } else {
784
+ dateListValue.splice(eqIndex, 1)
785
+ }
786
+ dateListValue.forEach(item => {
787
+ if (item) {
788
+ if (datetimePanelValue) {
789
+ item.setHours(datetimePanelValue.getHours())
790
+ item.setMinutes(datetimePanelValue.getMinutes())
791
+ item.setSeconds(datetimePanelValue.getSeconds())
792
+ }
793
+ datetimeRest.push(item)
794
+ }
795
+ })
796
+ handleChange(datetimeRest.map(date => XEUtils.toDateString(date, dateValueFormat)).join(','), { type: 'update' })
797
+ } else {
798
+ const dateMultipleValue = isReload ? [] : computeDateMultipleValue.value
799
+ // 如果是日期类型
800
+ if (dateMultipleValue.some(val => XEUtils.isEqual(val, inpVal))) {
801
+ handleChange(dateMultipleValue.filter(val => !XEUtils.isEqual(val, inpVal)).join(','), { type: 'update' })
802
+ } else {
803
+ if (overCount) {
804
+ // 如果超出最大多选数量
805
+ return
806
+ }
807
+ handleChange(dateMultipleValue.concat([inpVal]).join(','), { type: 'update' })
808
+ }
809
+ }
810
+ } else {
811
+ // 如果为单选
812
+ if (!XEUtils.isEqual(modelValue, inpVal)) {
813
+ handleChange(inpVal, { type: 'update' })
814
+ }
815
+ }
816
+ }
817
+
818
+ // 日期
819
+ const dateMonthHandle = (date: Date, offsetMonth: number) => {
820
+ const firstDayOfWeek = computeFirstDayOfWeek.value
821
+ const weekNum = XEUtils.getYearWeek(date, firstDayOfWeek)
822
+ const weekStartDate = XEUtils.getWhatWeek(date, 0, firstDayOfWeek, firstDayOfWeek)
823
+ const month = XEUtils.getWhatMonth(weekNum === 1 ? XEUtils.getWhatDay(weekStartDate, 6) : date, offsetMonth, 'first')
824
+ reactData.selectMonth = month
825
+ }
826
+
827
+ const dateNowHandle = () => {
828
+ const { type } = props
829
+ const firstDayOfWeek = computeFirstDayOfWeek.value
830
+ let currentDate = new Date()
831
+ switch (type) {
832
+ case 'week':
833
+ currentDate = XEUtils.getWhatWeek(currentDate, 0, firstDayOfWeek)
834
+ break
835
+ case 'datetime':
836
+ currentDate = new Date()
837
+ reactData.datetimePanelValue = new Date()
838
+ break
839
+ default:
840
+ currentDate = XEUtils.getWhatDay(Date.now(), 0, 'first')
841
+ break
842
+ }
843
+ reactData.currentDate = currentDate
844
+ dateMonthHandle(currentDate, 0)
845
+ }
846
+
847
+ const dateToggleYearTypeEvent = () => {
848
+ reactData.datePanelType = 'year'
849
+ }
850
+
851
+ const dateToggleMonthTypeEvent = () => {
852
+ let { datePanelType } = reactData
853
+ if (datePanelType === 'month' || datePanelType === 'quarter') {
854
+ datePanelType = 'year'
855
+ } else {
856
+ datePanelType = 'month'
857
+ }
858
+ reactData.datePanelType = datePanelType
859
+ }
860
+
861
+ const datePrevEvent = (evnt: Event) => {
862
+ const { type } = props
863
+ const { datePanelType, selectMonth, inputLabel } = reactData
864
+ const { yearSize } = internalData
865
+ const value = inputLabel
866
+ const isDisabledPrevDateBtn = computeIsDisabledPrevDateBtn.value
867
+ if (!isDisabledPrevDateBtn) {
868
+ let viewDate
869
+ if (type === 'year') {
870
+ viewDate = XEUtils.getWhatYear(selectMonth, -yearSize, 'first')
871
+ } else if (type === 'month' || type === 'quarter') {
872
+ if (datePanelType === 'year') {
873
+ viewDate = XEUtils.getWhatYear(selectMonth, -yearSize, 'first')
874
+ } else {
875
+ viewDate = XEUtils.getWhatYear(selectMonth, -1, 'first')
876
+ }
877
+ } else {
878
+ if (datePanelType === 'year') {
879
+ viewDate = XEUtils.getWhatYear(selectMonth, -yearSize, 'first')
880
+ } else if (datePanelType === 'month') {
881
+ viewDate = XEUtils.getWhatYear(selectMonth, -1, 'first')
882
+ } else {
883
+ viewDate = XEUtils.getWhatMonth(selectMonth, -1, 'first')
884
+ }
885
+ }
886
+ reactData.selectMonth = viewDate
887
+ dispatchEvent('date-prev', { viewType: datePanelType, viewDate, value, type }, evnt)
888
+ }
889
+ }
890
+
891
+ const dateTodayMonthEvent = (evnt: Event) => {
892
+ dateNowHandle()
893
+ dateChange(reactData.currentDate, true)
894
+ if (!props.multiple) {
895
+ hidePanel()
896
+ }
897
+ dispatchEvent('date-today', { type: props.type }, evnt)
898
+ }
899
+
900
+ const dateNextEvent = (evnt: Event) => {
901
+ const { type } = props
902
+ const { datePanelType, selectMonth, inputLabel } = reactData
903
+ const { yearSize } = internalData
904
+ const value = inputLabel
905
+ const isDisabledNextDateBtn = computeIsDisabledNextDateBtn.value
906
+ if (!isDisabledNextDateBtn) {
907
+ let viewDate
908
+ if (type === 'year') {
909
+ viewDate = XEUtils.getWhatYear(selectMonth, yearSize, 'first')
910
+ } else if (type === 'month' || type === 'quarter') {
911
+ if (datePanelType === 'year') {
912
+ viewDate = XEUtils.getWhatYear(selectMonth, yearSize, 'first')
913
+ } else {
914
+ viewDate = XEUtils.getWhatYear(selectMonth, 1, 'first')
915
+ }
916
+ } else {
917
+ if (datePanelType === 'year') {
918
+ viewDate = XEUtils.getWhatYear(selectMonth, yearSize, 'first')
919
+ } else if (datePanelType === 'month') {
920
+ viewDate = XEUtils.getWhatYear(selectMonth, 1, 'first')
921
+ } else {
922
+ viewDate = XEUtils.getWhatMonth(selectMonth, 1, 'first')
923
+ }
924
+ }
925
+ reactData.selectMonth = viewDate
926
+ dispatchEvent('date-next', { viewType: datePanelType, value, type }, evnt)
927
+ }
928
+ }
929
+
930
+ const isRangeDisabled = (item: { date: Date }) => {
931
+ const dateStartTime = computeDateStartTime.value
932
+ const dateEndTime = computeDateEndTime.value
933
+ const { date } = item
934
+ if (dateStartTime && dateStartTime.getTime() > date.getTime()) {
935
+ return true
936
+ }
937
+ if (dateEndTime && dateEndTime.getTime() < date.getTime()) {
938
+ return true
939
+ }
940
+ return false
941
+ }
942
+
943
+ const isDateDisabled = (item: { date: Date }) => {
944
+ const { disabledMethod } = props
945
+ const { datePanelType } = reactData
946
+ const { date } = item
947
+ if (disabledMethod) {
948
+ return disabledMethod({ type: datePanelType, viewType: datePanelType, date, $datePanel: $xeDatePanel })
949
+ }
950
+ return false
951
+ }
952
+
953
+ const hasAllDisabled = (item: { date: Date }) => {
954
+ return isRangeDisabled(item) || isDateDisabled(item)
955
+ }
956
+
957
+ const dateSelectItem = (date: Date) => {
958
+ const { type, multiple } = props
959
+ const { datePanelType } = reactData
960
+ if (type === 'month') {
961
+ if (datePanelType === 'year') {
962
+ reactData.datePanelType = 'month'
963
+ dateCheckMonth(date)
964
+ } else {
965
+ dateChange(date)
966
+ if (!multiple) {
967
+ hidePanel()
968
+ }
969
+ }
970
+ } else if (type === 'year') {
971
+ dateChange(date)
972
+ if (!multiple) {
973
+ hidePanel()
974
+ }
975
+ } else if (type === 'quarter') {
976
+ if (datePanelType === 'year') {
977
+ reactData.datePanelType = 'quarter'
978
+ dateCheckMonth(date)
979
+ } else {
980
+ dateChange(date)
981
+ if (!multiple) {
982
+ hidePanel()
983
+ }
984
+ }
985
+ } else {
986
+ if (datePanelType === 'month') {
987
+ reactData.datePanelType = type === 'week' ? type : 'day'
988
+ dateCheckMonth(date)
989
+ } else if (datePanelType === 'year') {
990
+ reactData.datePanelType = 'month'
991
+ dateCheckMonth(date)
992
+ } else {
993
+ dateChange(date)
994
+ if (type === 'datetime') {
995
+ // 日期带时间
996
+ } else {
997
+ if (!multiple) {
998
+ hidePanel()
999
+ }
1000
+ }
1001
+ }
1002
+ }
1003
+ }
1004
+
1005
+ const dateSelectEvent = (item: VxeDatePanelDefines.DateYearItem | VxeDatePanelDefines.DateQuarterItem | VxeDatePanelDefines.DateMonthItem | VxeDatePanelDefines.DateDayItem) => {
1006
+ if (!hasAllDisabled(item)) {
1007
+ dateSelectItem(item.date)
1008
+ }
1009
+ }
1010
+
1011
+ const dateMoveDay = (offsetDay: Date) => {
1012
+ if (!hasAllDisabled({ date: offsetDay })) {
1013
+ const dayList = computeDayList.value
1014
+ if (!dayList.some((item) => XEUtils.isDateSame(item.date, offsetDay, 'yyyyMMdd'))) {
1015
+ dateCheckMonth(offsetDay)
1016
+ }
1017
+ dateParseValue(offsetDay)
1018
+ }
1019
+ }
1020
+
1021
+ const dateMoveYear = (offsetYear: Date) => {
1022
+ if (!hasAllDisabled({ date: offsetYear })) {
1023
+ const yearList = computeYearList.value
1024
+ if (!yearList.some((item) => XEUtils.isDateSame(item.date, offsetYear, 'yyyy'))) {
1025
+ dateCheckMonth(offsetYear)
1026
+ }
1027
+ dateParseValue(offsetYear)
1028
+ }
1029
+ }
1030
+
1031
+ const dateMoveQuarter = (offsetQuarter: Date) => {
1032
+ if (!hasAllDisabled({ date: offsetQuarter })) {
1033
+ const quarterList = computeQuarterList.value
1034
+ if (!quarterList.some((item) => XEUtils.isDateSame(item.date, offsetQuarter, 'yyyyq'))) {
1035
+ dateCheckMonth(offsetQuarter)
1036
+ }
1037
+ dateParseValue(offsetQuarter)
1038
+ }
1039
+ }
1040
+
1041
+ const dateMoveMonth = (offsetMonth: Date) => {
1042
+ if (!hasAllDisabled({ date: offsetMonth })) {
1043
+ const monthList = computeMonthList.value
1044
+ if (!monthList.some((item) => XEUtils.isDateSame(item.date, offsetMonth, 'yyyyMM'))) {
1045
+ dateCheckMonth(offsetMonth)
1046
+ }
1047
+ dateParseValue(offsetMonth)
1048
+ }
1049
+ }
1050
+
1051
+ const dateMouseenterEvent = (item: VxeDatePanelDefines.DateYearItem | VxeDatePanelDefines.DateQuarterItem | VxeDatePanelDefines.DateMonthItem | VxeDatePanelDefines.DateDayItem) => {
1052
+ if (!hasAllDisabled(item)) {
1053
+ const { datePanelType } = reactData
1054
+ if (datePanelType === 'month') {
1055
+ dateMoveMonth(item.date)
1056
+ } else if (datePanelType === 'quarter') {
1057
+ dateMoveQuarter(item.date)
1058
+ } else if (datePanelType === 'year') {
1059
+ dateMoveYear(item.date)
1060
+ } else {
1061
+ dateMoveDay(item.date)
1062
+ }
1063
+ }
1064
+ }
1065
+
1066
+ const dateMouseleaveEvent = () => {
1067
+ reactData.datePanelValue = null
1068
+ }
1069
+
1070
+ const updateTimePos = (liElem: Element) => {
1071
+ if (liElem) {
1072
+ const height = (liElem as HTMLElement).offsetHeight
1073
+ const ulElem = liElem.parentNode as HTMLElement
1074
+ ulElem.scrollTop = (liElem as HTMLElement).offsetTop - height * 4
1075
+ }
1076
+ }
1077
+
1078
+ const dateTimeChangeEvent = (evnt: Event) => {
1079
+ const { datetimePanelValue } = reactData
1080
+ reactData.datetimePanelValue = datetimePanelValue ? new Date(datetimePanelValue.getTime()) : new Date()
1081
+ updateTimePos(evnt.currentTarget as HTMLLIElement)
1082
+ }
1083
+
1084
+ const dateHourEvent = (evnt: MouseEvent, item: VxeDatePanelDefines.DateHourMinuteSecondItem) => {
1085
+ const { datetimePanelValue } = reactData
1086
+ if (!item.disabled) {
1087
+ if (datetimePanelValue) {
1088
+ datetimePanelValue.setHours(item.value)
1089
+ }
1090
+ dateTimeChangeEvent(evnt)
1091
+ }
1092
+ }
1093
+
1094
+ const dateConfirmEvent = (evnt: Event) => {
1095
+ const { multiple } = props
1096
+ const { datetimePanelValue } = reactData
1097
+ const dateValue = computeDateValue.value
1098
+ const isDateTimeType = computeIsDateTimeType.value
1099
+ if (isDateTimeType) {
1100
+ const dateValueFormat = computeDateValueFormat.value
1101
+ if (multiple) {
1102
+ // 如果为多选
1103
+ const dateMultipleValue = computeDateMultipleValue.value
1104
+ if (isDateTimeType) {
1105
+ // 如果是datetime特殊类型
1106
+ const dateListValue = [...computeDateListValue.value]
1107
+ const datetimeRest: Date[] = []
1108
+ dateListValue.forEach(item => {
1109
+ if (item) {
1110
+ if (datetimePanelValue) {
1111
+ item.setHours(datetimePanelValue.getHours())
1112
+ item.setMinutes(datetimePanelValue.getMinutes())
1113
+ item.setSeconds(datetimePanelValue.getSeconds())
1114
+ }
1115
+ datetimeRest.push(item)
1116
+ }
1117
+ })
1118
+ handleChange(datetimeRest.map(date => XEUtils.toDateString(date, dateValueFormat)).join(','), { type: 'update' })
1119
+ } else {
1120
+ // 如果是日期类型
1121
+ handleChange(dateMultipleValue.join(','), { type: 'update' })
1122
+ }
1123
+ } else {
1124
+ dateChange(dateValue || reactData.currentDate)
1125
+ }
1126
+ }
1127
+ hidePanel()
1128
+ dispatchEvent('confirm', {}, evnt)
1129
+ }
1130
+
1131
+ const dateMinuteEvent = (evnt: MouseEvent, item: VxeDatePanelDefines.DateHourMinuteSecondItem) => {
1132
+ const { datetimePanelValue } = reactData
1133
+ if (!item.disabled) {
1134
+ if (datetimePanelValue) {
1135
+ datetimePanelValue.setMinutes(item.value)
1136
+ }
1137
+ dateTimeChangeEvent(evnt)
1138
+ }
1139
+ }
1140
+
1141
+ const dateSecondEvent = (evnt: MouseEvent, item: VxeDatePanelDefines.DateHourMinuteSecondItem) => {
1142
+ const { datetimePanelValue } = reactData
1143
+ if (!item.disabled) {
1144
+ if (datetimePanelValue) {
1145
+ datetimePanelValue.setSeconds(item.value)
1146
+ }
1147
+ dateTimeChangeEvent(evnt)
1148
+ }
1149
+ }
1150
+
1151
+ const dateOpenPanel = () => {
1152
+ const { type, defaultDate, defaultTime } = props
1153
+ const isDateTimeType = computeIsDateTimeType.value
1154
+ const dateValue = computeDateValue.value
1155
+ if (['year', 'quarter', 'month', 'week'].indexOf(type) > -1) {
1156
+ reactData.datePanelType = type as VxeDatePanelDefines.DatePanelType
1157
+ } else {
1158
+ reactData.datePanelType = 'day'
1159
+ }
1160
+ reactData.currentDate = XEUtils.getWhatDay(Date.now(), 0, 'first')
1161
+ if (dateValue) {
1162
+ dateMonthHandle(dateValue, 0)
1163
+ dateParseValue(dateValue)
1164
+ } else {
1165
+ if (defaultDate) {
1166
+ // 面板默认日期仅支持解析 yyyy-MM-dd
1167
+ const defDate = parseDate(defaultDate, 'yyyy-MM-dd')
1168
+ if (XEUtils.isValidDate(defDate)) {
1169
+ dateMonthHandle(defDate, 0)
1170
+ } else {
1171
+ dateNowHandle()
1172
+ }
1173
+ } else {
1174
+ dateNowHandle()
1175
+ }
1176
+ }
1177
+ if (isDateTimeType) {
1178
+ let dtPanelValue = reactData.datePanelValue
1179
+ if (!dtPanelValue) {
1180
+ dtPanelValue = XEUtils.getWhatDay(Date.now(), 0, 'first')
1181
+ if (defaultTime) {
1182
+ const defTime = toStringTimeDate(defaultTime)
1183
+ if (XEUtils.isValidDate(defTime)) {
1184
+ dtPanelValue.setHours(defTime.getHours())
1185
+ dtPanelValue.setMinutes(defTime.getMinutes())
1186
+ dtPanelValue.setSeconds(defTime.getSeconds())
1187
+ }
1188
+ }
1189
+ }
1190
+ reactData.datetimePanelValue = dtPanelValue
1191
+ nextTick(() => {
1192
+ const timeBodyElem = refInputTimeBody.value
1193
+ XEUtils.arrayEach(timeBodyElem.querySelectorAll('li.is--selected'), (elem) => {
1194
+ updateTimePos(elem)
1195
+ })
1196
+ })
1197
+ }
1198
+ }
1199
+
1200
+ const dispatchEvent = (type: ValueOf<VxeDatePanelEmits>, params: Record<string, any>, evnt: Event | null) => {
1201
+ emit(type, createEvent(evnt, { $datePanel: $xeDatePanel }, params))
1202
+ }
1203
+
1204
+ const datePanelMethods: DatePanelMethods = {
1205
+ dispatchEvent,
1206
+
1207
+ getModelValue () {
1208
+ return reactData.inputValue
1209
+ },
1210
+ setPanelDate (date) {
1211
+ if (date) {
1212
+ dateCheckMonth(date)
1213
+ }
1214
+ },
1215
+ getPanelDate () {
1216
+ return reactData.selectMonth
1217
+ },
1218
+ checkValue (value) {
1219
+ afterCheckValue(value)
1220
+ },
1221
+ confirmByEvent (evnt) {
1222
+ dateConfirmEvent(evnt)
1223
+ }
1224
+ }
1225
+
1226
+ Object.assign($xeDatePanel, datePanelMethods)
1227
+
1228
+ const renderDateLabel = (item: VxeDatePanelDefines.DateYearItem | VxeDatePanelDefines.DateQuarterItem | VxeDatePanelDefines.DateMonthItem | VxeDatePanelDefines.DateDayItem, label: string | number) => {
1229
+ const { festivalMethod } = props
1230
+ const labelVNs: VNode[] = []
1231
+ if (festivalMethod) {
1232
+ const { datePanelType } = reactData
1233
+ const festivalRest = festivalMethod({ type: datePanelType, viewType: datePanelType, date: item.date, $datePanel: $xeDatePanel })
1234
+ const festivalItem = festivalRest ? (XEUtils.isString(festivalRest) ? { label: festivalRest } : festivalRest) : {}
1235
+ const extraItem = festivalItem.extra ? (XEUtils.isString(festivalItem.extra) ? { label: festivalItem.extra } : festivalItem.extra) : null
1236
+ labelVNs.push(
1237
+ h('div', {
1238
+ class: ['vxe-date-panel--label', {
1239
+ 'is-notice': festivalItem.notice
1240
+ }]
1241
+ }, extraItem && extraItem.label
1242
+ ? [
1243
+ h('div', {
1244
+ class: 'vxe-date-panel--label--number'
1245
+ }, `${label}`),
1246
+ h('div', {
1247
+ class: ['vxe-date-panel--label--extra', extraItem.important ? 'is-important' : '', extraItem.className],
1248
+ style: extraItem.style
1249
+ }, XEUtils.toValueString(extraItem.label))
1250
+ ]
1251
+ : `${label}`)
1252
+ )
1253
+ const festivalLabel = festivalItem.label
1254
+ if (festivalLabel) {
1255
+ // 默认最多支持3个节日重叠
1256
+ const festivalLabels = XEUtils.toValueString(festivalLabel).split(',')
1257
+ labelVNs.push(
1258
+ h('div', {
1259
+ class: ['vxe-date-panel--festival', festivalItem.important ? 'is-important' : '', festivalItem.className],
1260
+ style: festivalItem.style
1261
+ }, [
1262
+ festivalLabels.length > 1
1263
+ ? h('div', {
1264
+ class: ['vxe-date-panel--festival--overlap', `overlap--${festivalLabels.length}`]
1265
+ }, festivalLabels.map(label => h('div', label.substring(0, 3))))
1266
+ : h('div', {
1267
+ class: 'vxe-date-panel--festival--label'
1268
+ }, festivalLabels[0].substring(0, 3))
1269
+ ])
1270
+ )
1271
+ }
1272
+ }
1273
+ return labelVNs
1274
+ }
1275
+
1276
+ const renderDateDayTable = () => {
1277
+ const { multiple } = props
1278
+ const { datePanelType, datePanelValue } = reactData
1279
+ const dateValue = computeDateValue.value
1280
+ const dateHeaders = computeDateHeaders.value
1281
+ const dayDatas = computeDayDatas.value
1282
+ const dateListValue = computeDateListValue.value
1283
+ const overCount = computeOverCount.value
1284
+ const matchFormat = 'yyyyMMdd'
1285
+ return [
1286
+ h('div', {
1287
+ class: ['vxe-date-panel--view-wrapper', `type--${datePanelType}`]
1288
+ }, [
1289
+ h('div', {
1290
+ class: 'vxe-date-panel--view-header'
1291
+ }, [
1292
+ h('div', {
1293
+ class: 'vxe-date-panel--view-row'
1294
+ }, dateHeaders.map((item) => {
1295
+ return h('div', {
1296
+ class: 'vxe-date-panel--view-item',
1297
+ style: {
1298
+ width: `${100 / dateHeaders.length}%`
1299
+ }
1300
+ }, [
1301
+ h('div', {
1302
+ class: 'vxe-date-panel--view-item-inner'
1303
+ }, [
1304
+ h('div', {
1305
+ class: 'vxe-date-panel--view-item-label'
1306
+ }, item.label)
1307
+ ])
1308
+ ])
1309
+ }))
1310
+ ]),
1311
+ h('div', {
1312
+ class: 'vxe-date-panel--view-body'
1313
+ }, dayDatas.map((rows) => {
1314
+ return h('div', {
1315
+ class: 'vxe-date-panel--view-row',
1316
+ style: {
1317
+ height: `${100 / dayDatas.length}%`
1318
+ }
1319
+ }, rows.map((item) => {
1320
+ const isSelected = multiple ? dateListValue.some(val => XEUtils.isDateSame(val, item.date, matchFormat)) : XEUtils.isDateSame(dateValue, item.date, matchFormat)
1321
+ return h('div', {
1322
+ class: ['vxe-date-panel--view-item', {
1323
+ 'is--prev': item.isPrev,
1324
+ 'is--current': item.isCurrent,
1325
+ 'is--now': item.isNow,
1326
+ 'is--next': item.isNext,
1327
+ 'is--range-disabled': isRangeDisabled(item),
1328
+ 'is--disabled': isDateDisabled(item),
1329
+ 'is--selected': isSelected,
1330
+ 'is--over': overCount && !isSelected,
1331
+ 'is--hover': !overCount && XEUtils.isDateSame(datePanelValue, item.date, matchFormat)
1332
+ }],
1333
+ style: {
1334
+ width: `${100 / rows.length}%`
1335
+ },
1336
+ onClick: () => dateSelectEvent(item),
1337
+ onMouseenter: () => dateMouseenterEvent(item),
1338
+ onMouseleave: dateMouseleaveEvent
1339
+ }, [
1340
+ h('div', {
1341
+ class: 'vxe-date-panel--view-item-inner'
1342
+ }, renderDateLabel(item, item.label))
1343
+ ])
1344
+ }))
1345
+ }))
1346
+ ])
1347
+ ]
1348
+ }
1349
+
1350
+ const renderDateWeekTable = () => {
1351
+ const { multiple } = props
1352
+ const { datePanelType, datePanelValue } = reactData
1353
+ const dateValue = computeDateValue.value
1354
+ const weekHeaders = computeWeekHeaders.value
1355
+ const weekDates = computeWeekDates.value
1356
+ const dateListValue = computeDateListValue.value
1357
+ const overCount = computeOverCount.value
1358
+ const matchFormat = 'yyyyMMdd'
1359
+ return [
1360
+ h('div', {
1361
+ class: ['vxe-date-panel--view-wrapper', `type--${datePanelType}`]
1362
+ }, [
1363
+ h('div', {
1364
+ class: 'vxe-date-panel--view-header'
1365
+ }, [
1366
+ h('div', {
1367
+ class: 'vxe-date-panel--view-row'
1368
+ }, weekHeaders.map((item, rIndex) => {
1369
+ return h('div', {
1370
+ class: 'vxe-date-panel--view-item',
1371
+ style: {
1372
+ width: `${rIndex ? 13 : 9}%`
1373
+ }
1374
+ }, [
1375
+ h('div', {
1376
+ class: 'vxe-date-panel--view-item-inner'
1377
+ }, [
1378
+ h('div', {
1379
+ class: 'vxe-date-panel--view-item-label'
1380
+ }, item.label)
1381
+ ])
1382
+ ])
1383
+ }))
1384
+ ]),
1385
+ h('div', {
1386
+ class: 'vxe-date-panel--view-body'
1387
+ }, weekDates.map((rows) => {
1388
+ const isSelected = multiple ? rows.some((item) => dateListValue.some(val => XEUtils.isDateSame(val, item.date, matchFormat))) : rows.some((item) => XEUtils.isDateSame(dateValue, item.date, matchFormat))
1389
+ const isHover = rows.some((item) => XEUtils.isDateSame(datePanelValue, item.date, matchFormat))
1390
+ const isNowWeek = rows.some(item => item.isNow)
1391
+ return h('div', {
1392
+ class: 'vxe-date-panel--view-row',
1393
+ style: {
1394
+ height: `${100 / weekDates.length}%`
1395
+ }
1396
+ }, rows.map((item, rIndex) => {
1397
+ return h('div', {
1398
+ class: ['vxe-date-panel--view-item', {
1399
+ 'is--prev': item.isPrev,
1400
+ 'is--current': item.isCurrent,
1401
+ 'is--now': rIndex ? item.isNow : isNowWeek,
1402
+ 'is--next': item.isNext,
1403
+ 'is--range-disabled': isRangeDisabled(item),
1404
+ 'is--disabled': isDateDisabled(item),
1405
+ 'is--selected': isSelected,
1406
+ 'is--over': overCount && !isSelected,
1407
+ 'is--hover': !overCount && isHover
1408
+ }],
1409
+ style: {
1410
+ width: `${rIndex ? 13 : 9}%`
1411
+ },
1412
+ onClick: () => dateSelectEvent(item),
1413
+ onMouseenter: () => dateMouseenterEvent(item),
1414
+ onMouseleave: dateMouseleaveEvent
1415
+ }, [
1416
+ h('div', {
1417
+ class: 'vxe-date-panel--view-item-inner'
1418
+ }, renderDateLabel(item, item.label))
1419
+ ])
1420
+ }))
1421
+ }))
1422
+ ])
1423
+ ]
1424
+ }
1425
+
1426
+ const renderDateMonthTable = () => {
1427
+ const { multiple } = props
1428
+ const { datePanelType, datePanelValue } = reactData
1429
+ const dateValue = computeDateValue.value
1430
+ const monthDatas = computeMonthDatas.value
1431
+ const dateListValue = computeDateListValue.value
1432
+ const overCount = computeOverCount.value
1433
+ const matchFormat = 'yyyyMM'
1434
+ return [
1435
+ h('div', {
1436
+ class: ['vxe-date-panel--view-wrapper', `type--${datePanelType}`]
1437
+ }, [
1438
+ h('div', {
1439
+ class: 'vxe-date-panel--view-body'
1440
+ }, monthDatas.map((rows) => {
1441
+ return h('div', {
1442
+ class: 'vxe-date-panel--view-row',
1443
+ style: {
1444
+ height: `${100 / monthDatas.length}%`
1445
+ }
1446
+ }, rows.map((item) => {
1447
+ const isSelected = multiple ? dateListValue.some(val => XEUtils.isDateSame(val, item.date, matchFormat)) : XEUtils.isDateSame(dateValue, item.date, matchFormat)
1448
+ return h('div', {
1449
+ class: ['vxe-date-panel--view-item', {
1450
+ 'is--prev': item.isPrev,
1451
+ 'is--current': item.isCurrent,
1452
+ 'is--now': item.isNow,
1453
+ 'is--next': item.isNext,
1454
+ 'is--range-disabled': isRangeDisabled(item),
1455
+ 'is--disabled': isDateDisabled(item),
1456
+ 'is--selected': isSelected,
1457
+ 'is--over': overCount && !isSelected,
1458
+ 'is--hover': !overCount && XEUtils.isDateSame(datePanelValue, item.date, matchFormat)
1459
+ }],
1460
+ style: {
1461
+ width: `${100 / rows.length}%`
1462
+ },
1463
+ onClick: () => dateSelectEvent(item),
1464
+ onMouseenter: () => dateMouseenterEvent(item),
1465
+ onMouseleave: dateMouseleaveEvent
1466
+ }, [
1467
+ h('div', {
1468
+ class: 'vxe-date-panel--view-item-inner'
1469
+ }, renderDateLabel(item, getI18n(`vxe.input.date.months.m${item.month}`)))
1470
+ ])
1471
+ }))
1472
+ }))
1473
+ ])
1474
+ ]
1475
+ }
1476
+
1477
+ const renderDateQuarterTable = () => {
1478
+ const { multiple } = props
1479
+ const { datePanelType, datePanelValue } = reactData
1480
+ const dateValue = computeDateValue.value
1481
+ const quarterDatas = computeQuarterDatas.value
1482
+ const dateListValue = computeDateListValue.value
1483
+ const overCount = computeOverCount.value
1484
+ const matchFormat = 'yyyyq'
1485
+ return [
1486
+ h('div', {
1487
+ class: ['vxe-date-panel--view-wrapper', `type--${datePanelType}`]
1488
+ }, [
1489
+ h('div', {
1490
+ class: 'vxe-date-panel--view-body'
1491
+ }, quarterDatas.map((rows) => {
1492
+ return h('div', {
1493
+ class: 'vxe-date-panel--view-row',
1494
+ style: {
1495
+ height: `${100 / quarterDatas.length}%`
1496
+ }
1497
+ }, rows.map((item) => {
1498
+ const isSelected = multiple ? dateListValue.some(val => XEUtils.isDateSame(val, item.date, matchFormat)) : XEUtils.isDateSame(dateValue, item.date, matchFormat)
1499
+ return h('div', {
1500
+ class: ['vxe-date-panel--view-item', {
1501
+ 'is--prev': item.isPrev,
1502
+ 'is--current': item.isCurrent,
1503
+ 'is--now': item.isNow,
1504
+ 'is--next': item.isNext,
1505
+ 'is--range-disabled': isRangeDisabled(item),
1506
+ 'is--disabled': isDateDisabled(item),
1507
+ 'is--selected': isSelected,
1508
+ 'is--over': overCount && !isSelected,
1509
+ 'is--hover': !overCount && XEUtils.isDateSame(datePanelValue, item.date, matchFormat)
1510
+ }],
1511
+ style: {
1512
+ width: `${100 / rows.length}%`
1513
+ },
1514
+ onClick: () => dateSelectEvent(item),
1515
+ onMouseenter: () => dateMouseenterEvent(item),
1516
+ onMouseleave: dateMouseleaveEvent
1517
+ }, [
1518
+ h('div', {
1519
+ class: 'vxe-date-panel--view-item-inner'
1520
+ }, renderDateLabel(item, getI18n(`vxe.input.date.quarters.q${item.quarter}`)))
1521
+ ])
1522
+ }))
1523
+ }))
1524
+ ])
1525
+ ]
1526
+ }
1527
+
1528
+ const renderDateYearTable = () => {
1529
+ const { multiple } = props
1530
+ const { datePanelType, datePanelValue } = reactData
1531
+ const dateValue = computeDateValue.value
1532
+ const yearDatas = computeYearDatas.value
1533
+ const dateListValue = computeDateListValue.value
1534
+ const overCount = computeOverCount.value
1535
+ const matchFormat = 'yyyy'
1536
+ return [
1537
+ h('div', {
1538
+ class: ['vxe-date-panel--view-wrapper', `type--${datePanelType}`]
1539
+ }, [
1540
+ h('div', {
1541
+ class: 'vxe-date-panel--view-body'
1542
+ }, yearDatas.map((rows) => {
1543
+ return h('div', {
1544
+ class: 'vxe-date-panel--view-row',
1545
+ style: {
1546
+ height: `${100 / yearDatas.length}%`
1547
+ }
1548
+ }, rows.map((item) => {
1549
+ const isSelected = multiple ? dateListValue.some(val => XEUtils.isDateSame(val, item.date, matchFormat)) : XEUtils.isDateSame(dateValue, item.date, matchFormat)
1550
+ return h('div', {
1551
+ class: ['vxe-date-panel--view-item', {
1552
+ 'is--prev': item.isPrev,
1553
+ 'is--current': item.isCurrent,
1554
+ 'is--now': item.isNow,
1555
+ 'is--next': item.isNext,
1556
+ 'is--range-disabled': isRangeDisabled(item),
1557
+ 'is--disabled': isDateDisabled(item),
1558
+ 'is--selected': isSelected,
1559
+ 'is--over': overCount && !isSelected,
1560
+ 'is--hover': !overCount && XEUtils.isDateSame(datePanelValue, item.date, matchFormat)
1561
+ }],
1562
+ style: {
1563
+ width: `${100 / rows.length}%`
1564
+ },
1565
+ onClick: () => dateSelectEvent(item),
1566
+ onMouseenter: () => dateMouseenterEvent(item),
1567
+ onMouseleave: dateMouseleaveEvent
1568
+ }, [
1569
+ h('div', {
1570
+ class: 'vxe-date-panel--view-item-inner'
1571
+ }, renderDateLabel(item, item.year))
1572
+ ])
1573
+ }))
1574
+ }))
1575
+ ])
1576
+ ]
1577
+ }
1578
+
1579
+ const renderDateTable = () => {
1580
+ const { datePanelType } = reactData
1581
+ switch (datePanelType) {
1582
+ case 'week' :
1583
+ return renderDateWeekTable()
1584
+ case 'month' :
1585
+ return renderDateMonthTable()
1586
+ case 'quarter' :
1587
+ return renderDateQuarterTable()
1588
+ case 'year' :
1589
+ return renderDateYearTable()
1590
+ }
1591
+ return renderDateDayTable()
1592
+ }
1593
+
1594
+ const renderDatePanel = () => {
1595
+ const { datePanelType } = reactData
1596
+ const isDisabledPrevDateBtn = computeIsDisabledPrevDateBtn.value
1597
+ const isDisabledNextDateBtn = computeIsDisabledNextDateBtn.value
1598
+ const selectDatePanelObj = computeSelectDatePanelObj.value
1599
+ return [
1600
+ h('div', {
1601
+ class: 'vxe-date-panel--picker-header'
1602
+ }, [
1603
+ h('div', {
1604
+ class: 'vxe-date-panel--picker-type-wrapper'
1605
+ }, [
1606
+ datePanelType === 'year'
1607
+ ? h('span', {
1608
+ class: 'vxe-date-panel--picker-label'
1609
+ }, selectDatePanelObj.y)
1610
+ : h('span', {
1611
+ class: 'vxe-date-panel--picker-btns'
1612
+ }, [
1613
+ h('span', {
1614
+ class: 'vxe-date-panel--picker-btn',
1615
+ onClick: dateToggleYearTypeEvent
1616
+ }, selectDatePanelObj.y),
1617
+ selectDatePanelObj.m
1618
+ ? h('span', {
1619
+ class: 'vxe-date-panel--picker-btn',
1620
+ onClick: dateToggleMonthTypeEvent
1621
+ }, selectDatePanelObj.m)
1622
+ : renderEmptyElement($xeDatePanel)
1623
+ ])
1624
+ ]),
1625
+ h('div', {
1626
+ class: 'vxe-date-panel--picker-btn-wrapper'
1627
+ }, [
1628
+ h('span', {
1629
+ class: ['vxe-date-panel--picker-btn vxe-date-panel--picker-prev-btn', {
1630
+ 'is--disabled': isDisabledPrevDateBtn
1631
+ }],
1632
+ onClick: datePrevEvent
1633
+ }, [
1634
+ h('i', {
1635
+ class: 'vxe-icon-caret-left'
1636
+ })
1637
+ ]),
1638
+ h('span', {
1639
+ class: 'vxe-date-panel--picker-btn vxe-date-panel--picker-current-btn',
1640
+ onClick: dateTodayMonthEvent
1641
+ }, [
1642
+ h('i', {
1643
+ class: 'vxe-icon-dot'
1644
+ })
1645
+ ]),
1646
+ h('span', {
1647
+ class: ['vxe-date-panel--picker-btn vxe-date-panel--picker-next-btn', {
1648
+ 'is--disabled': isDisabledNextDateBtn
1649
+ }],
1650
+ onClick: dateNextEvent
1651
+ }, [
1652
+ h('i', {
1653
+ class: 'vxe-icon-caret-right'
1654
+ })
1655
+ ])
1656
+ ])
1657
+ ]),
1658
+ h('div', {
1659
+ class: 'vxe-date-panel--picker-body'
1660
+ }, renderDateTable())
1661
+ ]
1662
+ }
1663
+
1664
+ const renderTimePanel = () => {
1665
+ const { type } = props
1666
+ const { datetimePanelValue } = reactData
1667
+ const dateTimeLabel = computeDateTimeLabel.value
1668
+ const hourList = computeHourList.value
1669
+ const hasTimeMinute = computeHasTimeMinute.value
1670
+ const minuteList = computeMinuteList.value
1671
+ const hasTimeSecond = computeHasTimeSecond.value
1672
+ const secondList = computeSecondList.value
1673
+ return [
1674
+ type === 'time'
1675
+ ? renderEmptyElement($xeDatePanel)
1676
+ : h('div', {
1677
+ class: 'vxe-date-panel--time-header'
1678
+ }, [
1679
+ h('div', {
1680
+ class: 'vxe-date-panel--time-title'
1681
+ }, dateTimeLabel)
1682
+ ]),
1683
+ h('div', {
1684
+ ref: refInputTimeBody,
1685
+ class: 'vxe-date-panel--time-body'
1686
+ }, [
1687
+ h('ul', {
1688
+ class: 'vxe-date-panel--time-hour-list'
1689
+ }, hourList.map((item, index) => {
1690
+ return h('li', {
1691
+ key: index,
1692
+ class: {
1693
+ 'is--disabled': item.disabled,
1694
+ 'is--selected': datetimePanelValue && datetimePanelValue.getHours() === item.value
1695
+ },
1696
+ onClick: (evnt: MouseEvent) => dateHourEvent(evnt, item)
1697
+ }, item.label)
1698
+ })),
1699
+ hasTimeMinute
1700
+ ? h('ul', {
1701
+ class: 'vxe-date-panel--time-minute-list'
1702
+ }, minuteList.map((item, index) => {
1703
+ return h('li', {
1704
+ key: index,
1705
+ class: {
1706
+ 'is--disabled': item.disabled,
1707
+ 'is--selected': datetimePanelValue && datetimePanelValue.getMinutes() === item.value
1708
+ },
1709
+ onClick: (evnt: MouseEvent) => dateMinuteEvent(evnt, item)
1710
+ }, item.label)
1711
+ }))
1712
+ : renderEmptyElement($xeDatePanel),
1713
+ hasTimeMinute && hasTimeSecond
1714
+ ? h('ul', {
1715
+ class: 'vxe-date-panel--time-second-list'
1716
+ }, secondList.map((item, index) => {
1717
+ return h('li', {
1718
+ key: index,
1719
+ class: {
1720
+ 'is--disabled': item.disabled,
1721
+ 'is--selected': datetimePanelValue && datetimePanelValue.getSeconds() === item.value
1722
+ },
1723
+ onClick: (evnt: MouseEvent) => dateSecondEvent(evnt, item)
1724
+ }, item.label)
1725
+ }))
1726
+ : renderEmptyElement($xeDatePanel)
1727
+ ])
1728
+ ]
1729
+ }
1730
+
1731
+ const renderPickerPanel = () => {
1732
+ const { type } = props
1733
+ if (type === 'datetime') {
1734
+ return h('div', {
1735
+ key: type,
1736
+ ref: refPanelWrapper,
1737
+ class: 'vxe-date-panel--time-layout-wrapper'
1738
+ }, [
1739
+ h('div', {
1740
+ class: 'vxe-date-panel--time-left-wrapper'
1741
+ }, renderDatePanel()),
1742
+ h('div', {
1743
+ class: 'vxe-date-panel--time-right-wrapper'
1744
+ }, renderTimePanel())
1745
+ ])
1746
+ } else if (type === 'time') {
1747
+ return h('div', {
1748
+ key: type,
1749
+ ref: refPanelWrapper,
1750
+ class: 'vxe-date-panel--wrapper'
1751
+ }, renderTimePanel())
1752
+ }
1753
+ return h('div', {
1754
+ key: type || 'default',
1755
+ ref: refPanelWrapper,
1756
+ class: 'vxe-date-panel--wrapper'
1757
+ }, renderDatePanel())
1758
+ }
1759
+
1760
+ const renderVN = () => {
1761
+ const { type } = props
1762
+ const vSize = computeSize.value
1763
+ return h('div', {
1764
+ class: ['vxe-date-panel', `type--${type}`, {
1765
+ [`size--${vSize}`]: vSize
1766
+ }]
1767
+ }, [
1768
+ renderPickerPanel()
1769
+ ])
1770
+ }
1771
+
1772
+ watch(() => props.modelValue, (val) => {
1773
+ updateModelValue(val)
1774
+ changeValue()
1775
+ })
1776
+
1777
+ watch(() => props.type, () => {
1778
+ // 切换类型是重置内置变量
1779
+ Object.assign(reactData, {
1780
+ inputLabel: '',
1781
+ datetimePanelValue: null,
1782
+ datePanelValue: null,
1783
+ datePanelLabel: '',
1784
+ datePanelType: 'day',
1785
+ selectMonth: null,
1786
+ currentDate: null
1787
+ })
1788
+ initValue()
1789
+ })
1790
+
1791
+ watch(computeDateLabelFormat, () => {
1792
+ const isDatePanelType = computeIsDatePanelType.value
1793
+ if (isDatePanelType) {
1794
+ dateParseValue(reactData.datePanelValue)
1795
+ reactData.inputLabel = props.multiple ? computeDateMultipleLabel.value : reactData.datePanelLabel
1796
+ }
1797
+ })
1798
+
1799
+ initValue()
1800
+ dateOpenPanel()
1801
+
1802
+ $xeDatePanel.renderVN = renderVN
1803
+
1804
+ return $xeDatePanel
1805
+ },
1806
+ render () {
1807
+ return this.renderVN()
1808
+ }
1809
+ })