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,1351 +1,1351 @@
1
- import { h, ref, Ref, computed, reactive, watch, PropType, onMounted } from 'vue'
2
- import { defineVxeComponent } from '../../ui/src/comp'
3
- import { VxeUI, createEvent, useSize, renderEmptyElement } from '../../ui'
4
- import { getDateQuarter } from '../../date-panel/src/util'
5
- import { toCssUnit } from '../../ui/src/dom'
6
- import { isEnableConf } from '../../ui/src/utils'
7
- import { errLog } from '../../ui/src/log'
8
- import VxeButtonComponent from '../../button/src/button'
9
- import XEUtils from 'xe-utils'
10
-
11
- import type { VxeCalendarConstructor, VxeCalendarEmits, CalendarInternalData, CalendarReactData, CalendarMethods, VxeCalendarPropTypes, CalendarPrivateRef, VxeDatePanelDefines, ValueOf } from '../../../types'
12
-
13
- const { menus, getConfig, getI18n } = VxeUI
14
-
15
- export default defineVxeComponent({
16
- name: 'VxeCalendar',
17
- props: {
18
- modelValue: [String, Number, Date] as PropType<VxeCalendarPropTypes.ModelValue>,
19
- type: {
20
- type: String as PropType<VxeCalendarPropTypes.Type>,
21
- default: 'date'
22
- },
23
- className: String as PropType<VxeCalendarPropTypes.ClassName>,
24
- size: {
25
- type: String as PropType<VxeCalendarPropTypes.Size>,
26
- default: () => getConfig().calendar.size || getConfig().size
27
- },
28
- multiple: Boolean as PropType<VxeCalendarPropTypes.Multiple>,
29
-
30
- width: [String, Number] as PropType<VxeCalendarPropTypes.Width>,
31
- height: [String, Number] as PropType<VxeCalendarPropTypes.Height>,
32
-
33
- // date、week、month、quarter、year
34
- minDate: {
35
- type: [String, Number, Date] as PropType<VxeCalendarPropTypes.MinDate>,
36
- default: () => getConfig().calendar.minDate
37
- },
38
- maxDate: {
39
- type: [String, Number, Date] as PropType<VxeCalendarPropTypes.MaxDate>,
40
- default: () => getConfig().calendar.maxDate
41
- },
42
- startDay: {
43
- type: [String, Number] as PropType<VxeCalendarPropTypes.StartDay>,
44
- default: () => getConfig().calendar.startDay
45
- },
46
- labelFormat: String as PropType<VxeCalendarPropTypes.LabelFormat>,
47
- valueFormat: String as PropType<VxeCalendarPropTypes.ValueFormat>,
48
- festivalMethod: {
49
- type: Function as PropType<VxeCalendarPropTypes.FestivalMethod>,
50
- default: () => getConfig().calendar.festivalMethod
51
- },
52
- disabledMethod: {
53
- type: Function as PropType<VxeCalendarPropTypes.DisabledMethod>,
54
- default: () => getConfig().calendar.disabledMethod
55
- },
56
- cellStyle: [Object, Function] as PropType<VxeCalendarPropTypes.CellStyle>,
57
- menuConfig: Object as PropType<VxeCalendarPropTypes.MenuConfig>,
58
-
59
- // week
60
- selectDay: {
61
- type: [String, Number] as PropType<VxeCalendarPropTypes.SelectDay>,
62
- default: () => getConfig().calendar.selectDay
63
- }
64
- },
65
- emits: [
66
- 'update:modelValue',
67
- 'change',
68
- 'cell-click',
69
- 'date-prev',
70
- 'date-today',
71
- 'date-next',
72
- 'view-change',
73
- 'cell-menu',
74
- 'menu-click'
75
- ] as VxeCalendarEmits,
76
- setup (props, context) {
77
- const { emit } = context
78
-
79
- const xID = XEUtils.uniqueId()
80
-
81
- const { computeSize } = useSize(props)
82
-
83
- const reactData = reactive<CalendarReactData>({
84
- selectValue: props.modelValue,
85
- inputValue: props.modelValue,
86
- datePanelValue: null,
87
- datePanelLabel: '',
88
- datePanelType: 'day',
89
- selectMonth: null,
90
- currentDate: null
91
- })
92
-
93
- const internalData: CalendarInternalData = {
94
- yearSize: 12,
95
- monthSize: 20,
96
- quarterSize: 8
97
- }
98
-
99
- const refElem = ref() as Ref<HTMLDivElement>
100
-
101
- const refMaps: CalendarPrivateRef = {
102
- refElem
103
- }
104
-
105
- const $xeCalendar = {
106
- xID,
107
- props,
108
- context,
109
- reactData,
110
- internalData,
111
- getRefMaps: () => refMaps
112
- } as unknown as VxeCalendarConstructor
113
-
114
- const computeCalendarStyle = computed(() => {
115
- const { height, width } = props
116
- const stys: Record<string, string> = {}
117
- if (width) {
118
- stys.width = toCssUnit(width)
119
- }
120
- if (height) {
121
- stys.height = toCssUnit(height)
122
- }
123
- return stys
124
- })
125
-
126
- const computeIsDisabled = computed(() => {
127
- return false
128
- })
129
-
130
- const computeIsCalendarType = computed(() => {
131
- return ['date', 'week', 'month', 'quarter', 'year'].indexOf(props.type) > -1
132
- })
133
-
134
- const computeDateStartTime = computed(() => {
135
- return props.minDate ? XEUtils.toStringDate(props.minDate) : null
136
- })
137
-
138
- const computeDateEndTime = computed(() => {
139
- return props.maxDate ? XEUtils.toStringDate(props.maxDate) : null
140
- })
141
-
142
- const computeSupportMultiples = computed(() => {
143
- return ['date', 'week', 'month', 'quarter', 'year'].indexOf(props.type) > -1
144
- })
145
-
146
- const computeMenuOpts = computed(() => {
147
- return Object.assign({}, getConfig().calendar.menuConfig, props.menuConfig)
148
- })
149
-
150
- const computeDateListValue = computed(() => {
151
- const { multiple } = props
152
- const { selectValue } = reactData
153
- const isCalendarType = computeIsCalendarType.value
154
- const dateValueFormat = computeDateValueFormat.value
155
- if (multiple && selectValue && isCalendarType) {
156
- return XEUtils.toValueString(selectValue).split(',').map(item => {
157
- const date = parseDate(item, dateValueFormat)
158
- if (XEUtils.isValidDate(date)) {
159
- return date
160
- }
161
- return null
162
- })
163
- }
164
- return []
165
- })
166
-
167
- const computeDateMultipleValue = computed(() => {
168
- const dateListValue = computeDateListValue.value
169
- const dateValueFormat = computeDateValueFormat.value
170
- return dateListValue.map(date => XEUtils.toDateString(date, dateValueFormat))
171
- })
172
-
173
- const computeDateMultipleLabel = computed(() => {
174
- const dateListValue = computeDateListValue.value
175
- const dateLabelFormat = computeDateLabelFormat.value
176
- return dateListValue.map(date => XEUtils.toDateString(date, dateLabelFormat)).join(', ')
177
- })
178
-
179
- const computeDateValueFormat = computed(() => {
180
- const { valueFormat } = props
181
- if (valueFormat) {
182
- return valueFormat
183
- }
184
- return 'yyyy-MM-dd'
185
- })
186
-
187
- const computeDateValue = computed(() => {
188
- const { selectValue } = reactData
189
- const isCalendarType = computeIsCalendarType.value
190
- const dateValueFormat = computeDateValueFormat.value
191
- let val = null
192
- if (selectValue && isCalendarType) {
193
- const date = parseDate(selectValue, dateValueFormat)
194
- if (XEUtils.isValidDate(date)) {
195
- val = date
196
- }
197
- }
198
- return val
199
- })
200
-
201
- const computeIsDisabledPrevDateBtn = computed(() => {
202
- const dateStartTime = computeDateStartTime.value
203
- const { selectMonth } = reactData
204
- if (selectMonth && dateStartTime) {
205
- return selectMonth <= dateStartTime
206
- }
207
- return false
208
- })
209
-
210
- const computeIsDisabledNextDateBtn = computed(() => {
211
- const dateEndTime = computeDateEndTime.value
212
- const { selectMonth } = reactData
213
- if (selectMonth && dateEndTime) {
214
- return selectMonth >= dateEndTime
215
- }
216
- return false
217
- })
218
-
219
- const computeDateHMSTime = computed(() => {
220
- const dateValue = computeDateValue.value
221
- return dateValue ? (dateValue.getHours() * 3600 + dateValue.getMinutes() * 60 + dateValue.getSeconds()) * 1000 : 0
222
- })
223
-
224
- const computeDateLabelFormat = computed(() => {
225
- const { labelFormat } = props
226
- const isCalendarType = computeIsCalendarType.value
227
- const dateValueFormat = computeDateValueFormat.value
228
- if (isCalendarType) {
229
- return labelFormat || dateValueFormat || getI18n(`vxe.input.date.labelFormat.${props.type}`)
230
- }
231
- return null
232
- })
233
-
234
- const computeYearList = computed(() => {
235
- const { selectMonth, currentDate } = reactData
236
- const { yearSize } = internalData
237
- const years: VxeDatePanelDefines.DateYearItem[] = []
238
- if (selectMonth && currentDate) {
239
- const currFullYear = currentDate.getFullYear()
240
- const selectFullYear = selectMonth.getFullYear()
241
- const startYearDate = new Date(selectFullYear - selectFullYear % yearSize, 0, 1)
242
- for (let index = -4; index < yearSize + 4; index++) {
243
- const date = XEUtils.getWhatYear(startYearDate, index, 'first')
244
- const itemFullYear = date.getFullYear()
245
- years.push({
246
- date,
247
- isCurrent: true,
248
- isPrev: index < 0,
249
- isNow: currFullYear === itemFullYear,
250
- isNext: index >= yearSize,
251
- year: itemFullYear
252
- })
253
- }
254
- }
255
- return years
256
- })
257
-
258
- const computeSelectDatePanelObj = computed(() => {
259
- const isCalendarType = computeIsCalendarType.value
260
- let y = ''
261
- let m = ''
262
- if (isCalendarType) {
263
- const { datePanelType, selectMonth } = reactData
264
- const yearList = computeYearList.value
265
- let year = ''
266
- let month
267
- if (selectMonth) {
268
- year = selectMonth.getFullYear()
269
- month = selectMonth.getMonth() + 1
270
- }
271
- if (datePanelType === 'quarter' || datePanelType === 'month') {
272
- y = `${year}`
273
- } else if (datePanelType === 'year') {
274
- y = yearList.length ? `${yearList[0].year} - ${yearList[yearList.length - 1].year}` : ''
275
- } else {
276
- y = `${year}`
277
- m = month ? getI18n('vxe.calendar.monthLabel', [month]) : '-'
278
- }
279
- }
280
- return {
281
- y: getI18n('vxe.calendar.yearLabel', [y]),
282
- m
283
- }
284
- })
285
-
286
- const computeFirstDayOfWeek = computed(() => {
287
- const { startDay } = props
288
- return XEUtils.toNumber(startDay) as VxeCalendarPropTypes.StartDay
289
- })
290
-
291
- const computeWeekDatas = computed(() => {
292
- const weeks = []
293
- const isCalendarType = computeIsCalendarType.value
294
- if (isCalendarType) {
295
- let sWeek = computeFirstDayOfWeek.value
296
- weeks.push(sWeek)
297
- for (let index = 0; index < 6; index++) {
298
- if (sWeek >= 6) {
299
- sWeek = 0
300
- } else {
301
- sWeek++
302
- }
303
- weeks.push(sWeek)
304
- }
305
- }
306
- return weeks
307
- })
308
-
309
- const computeDateHeaders = computed(() => {
310
- const isCalendarType = computeIsCalendarType.value
311
- if (isCalendarType) {
312
- const weekDatas = computeWeekDatas.value
313
- return weekDatas.map((day) => {
314
- return {
315
- value: day,
316
- label: getI18n(`vxe.input.date.weeks.w${day}`)
317
- }
318
- })
319
- }
320
- return []
321
- })
322
-
323
- const computeWeekHeaders = computed(() => {
324
- const isCalendarType = computeIsCalendarType.value
325
- if (isCalendarType) {
326
- const dateHeaders = computeDateHeaders.value
327
- return [{ label: getI18n('vxe.input.date.weeks.w') }].concat(dateHeaders)
328
- }
329
- return []
330
- })
331
-
332
- const computeYearDatas = computed(() => {
333
- const yearList = computeYearList.value
334
- return XEUtils.chunk(yearList, 4)
335
- })
336
-
337
- const computeQuarterList = computed(() => {
338
- const { selectMonth, currentDate } = reactData
339
- const { quarterSize } = internalData
340
- const quarters: VxeDatePanelDefines.DateQuarterItem[] = []
341
- if (selectMonth && currentDate) {
342
- const currFullYear = currentDate.getFullYear()
343
- const currQuarter = getDateQuarter(currentDate)
344
- const firstYear = XEUtils.getWhatYear(selectMonth, 0, 'first')
345
- const selFullYear = firstYear.getFullYear()
346
- for (let index = -2; index < quarterSize - 2; index++) {
347
- const date = XEUtils.getWhatQuarter(firstYear, index)
348
- const itemFullYear = date.getFullYear()
349
- const itemQuarter = getDateQuarter(date)
350
- const isPrev = itemFullYear < selFullYear
351
- quarters.push({
352
- date,
353
- isPrev,
354
- isCurrent: itemFullYear === selFullYear,
355
- isNow: itemFullYear === currFullYear && itemQuarter === currQuarter,
356
- isNext: !isPrev && itemFullYear > selFullYear,
357
- quarter: itemQuarter
358
- })
359
- }
360
- }
361
- return quarters
362
- })
363
-
364
- const computeQuarterDatas = computed(() => {
365
- const quarterList = computeQuarterList.value
366
- return XEUtils.chunk(quarterList, 2)
367
- })
368
-
369
- const computeMonthList = computed(() => {
370
- const { selectMonth, currentDate } = reactData
371
- const { monthSize } = internalData
372
- const months: VxeDatePanelDefines.DateMonthItem[] = []
373
- if (selectMonth && currentDate) {
374
- const currFullYear = currentDate.getFullYear()
375
- const currMonth = currentDate.getMonth()
376
- const selFullYear = XEUtils.getWhatYear(selectMonth, 0, 'first').getFullYear()
377
- for (let index = -4; index < monthSize - 4; index++) {
378
- const date = XEUtils.getWhatYear(selectMonth, 0, index)
379
- const itemFullYear = date.getFullYear()
380
- const itemMonth = date.getMonth()
381
- const isPrev = itemFullYear < selFullYear
382
- months.push({
383
- date,
384
- isPrev,
385
- isCurrent: itemFullYear === selFullYear,
386
- isNow: itemFullYear === currFullYear && itemMonth === currMonth,
387
- isNext: !isPrev && itemFullYear > selFullYear,
388
- month: itemMonth
389
- })
390
- }
391
- }
392
- return months
393
- })
394
-
395
- const computeMonthDatas = computed(() => {
396
- const monthList = computeMonthList.value
397
- return XEUtils.chunk(monthList, 4)
398
- })
399
-
400
- const computeDayList = computed(() => {
401
- const { selectMonth, currentDate } = reactData
402
- const days: VxeDatePanelDefines.DateDayItem[] = []
403
- if (selectMonth && currentDate) {
404
- const dateHMSTime = computeDateHMSTime.value
405
- const weekDatas = computeWeekDatas.value
406
- const currFullYear = currentDate.getFullYear()
407
- const currMonth = currentDate.getMonth()
408
- const currDate = currentDate.getDate()
409
- const selFullYear = selectMonth.getFullYear()
410
- const selMonth = selectMonth.getMonth()
411
- const selDay = selectMonth.getDay()
412
- const prevOffsetDate = -weekDatas.indexOf(selDay)
413
- const startDayDate = new Date(XEUtils.getWhatDay(selectMonth, prevOffsetDate).getTime() + dateHMSTime)
414
- for (let index = 0; index < 42; index++) {
415
- const date = XEUtils.getWhatDay(startDayDate, index)
416
- const itemFullYear = date.getFullYear()
417
- const itemMonth = date.getMonth()
418
- const itemDate = date.getDate()
419
- const isPrev = date < selectMonth
420
- days.push({
421
- date,
422
- isPrev,
423
- isCurrent: itemFullYear === selFullYear && itemMonth === selMonth,
424
- isNow: itemFullYear === currFullYear && itemMonth === currMonth && itemDate === currDate,
425
- isNext: !isPrev && selMonth !== itemMonth,
426
- label: itemDate
427
- })
428
- }
429
- }
430
- return days
431
- })
432
-
433
- const computeDayDatas = computed(() => {
434
- const dayList = computeDayList.value
435
- return XEUtils.chunk(dayList, 7)
436
- })
437
-
438
- const computeWeekDates = computed(() => {
439
- const dayDatas = computeDayDatas.value
440
- const firstDayOfWeek = computeFirstDayOfWeek.value
441
- return dayDatas.map((list) => {
442
- const firstItem = list[0]
443
- const item: VxeDatePanelDefines.DateDayItem = {
444
- date: firstItem.date,
445
- isWeekNumber: true,
446
- isPrev: false,
447
- isCurrent: false,
448
- isNow: false,
449
- isNext: false,
450
- label: XEUtils.getYearWeek(firstItem.date, firstDayOfWeek)
451
- }
452
- return [item].concat(list)
453
- })
454
- })
455
-
456
- const parseDate = (value: VxeCalendarPropTypes.ModelValue, format: string) => {
457
- return XEUtils.toStringDate(value, format)
458
- }
459
-
460
- const handleChange = (value: string, evnt: Event | { type: string }) => {
461
- reactData.inputValue = value
462
- emit('update:modelValue', value)
463
- if (XEUtils.toValueString(props.modelValue) !== value) {
464
- dispatchEvent('change', { value }, evnt as any)
465
- }
466
- }
467
-
468
- const dateParseValue = (value?: VxeCalendarPropTypes.ModelValue) => {
469
- const { type } = props
470
- const dateLabelFormat = computeDateLabelFormat.value
471
- const dateValueFormat = computeDateValueFormat.value
472
- const firstDayOfWeek = computeFirstDayOfWeek.value
473
- let dValue: Date | null = null
474
- let dLabel = ''
475
- if (value) {
476
- dValue = parseDate(value, dateValueFormat)
477
- }
478
- if (XEUtils.isValidDate(dValue)) {
479
- dLabel = XEUtils.toDateString(dValue, dateLabelFormat, { firstDay: firstDayOfWeek })
480
- // 由于年份和第几周是冲突的行为,所以需要特殊处理,判断是否跨年
481
- if (dateLabelFormat && type === 'week') {
482
- const firstWeekDate = XEUtils.getWhatWeek(dValue, 0, firstDayOfWeek, firstDayOfWeek)
483
- if (firstWeekDate.getFullYear() < dValue.getFullYear()) {
484
- const yyIndex = dateLabelFormat.indexOf('yyyy')
485
- if (yyIndex > -1) {
486
- const yyNum = Number(dLabel.substring(yyIndex, yyIndex + 4))
487
- if (yyNum && !isNaN(yyNum)) {
488
- dLabel = dLabel.replace(`${yyNum}`, `${yyNum - 1}`)
489
- }
490
- }
491
- }
492
- }
493
- } else {
494
- dValue = null
495
- }
496
- reactData.datePanelValue = dValue
497
- reactData.datePanelLabel = dLabel
498
- }
499
-
500
- /**
501
- * 值变化时处理
502
- */
503
- const changeValue = () => {
504
- const isCalendarType = computeIsCalendarType.value
505
- const { inputValue } = reactData
506
- if (isCalendarType) {
507
- dateParseValue(inputValue)
508
- reactData.inputValue = props.multiple ? computeDateMultipleLabel.value : reactData.datePanelLabel
509
- }
510
- }
511
-
512
- /**
513
- * 检查初始值
514
- */
515
- const initValue = () => {
516
- const isCalendarType = computeIsCalendarType.value
517
- if (isCalendarType) {
518
- changeValue()
519
- }
520
- }
521
-
522
- const dateCheckMonth = (date: Date) => {
523
- const month = XEUtils.getWhatMonth(date, 0, 'first')
524
- if (!XEUtils.isEqual(month, reactData.selectMonth)) {
525
- reactData.selectMonth = month
526
- }
527
- }
528
-
529
- const dateChange = (date: Date) => {
530
- const { modelValue, multiple } = props
531
- const dateValueFormat = computeDateValueFormat.value
532
- const firstDayOfWeek = computeFirstDayOfWeek.value
533
- if (props.type === 'week') {
534
- const sWeek = XEUtils.toNumber(props.selectDay) as VxeCalendarPropTypes.SelectDay
535
- date = XEUtils.getWhatWeek(date, 0, sWeek, firstDayOfWeek)
536
- }
537
- const inpVal = XEUtils.toDateString(date, dateValueFormat, { firstDay: firstDayOfWeek })
538
- dateCheckMonth(date)
539
- reactData.selectValue = date
540
- if (multiple) {
541
- // 如果为多选
542
- const dateMultipleValue = computeDateMultipleValue.value
543
- // 如果是日期类型
544
- if (dateMultipleValue.some(val => XEUtils.isEqual(val, inpVal))) {
545
- handleChange(dateMultipleValue.filter(val => !XEUtils.isEqual(val, inpVal)).join(','), { type: 'update' })
546
- } else {
547
- handleChange(dateMultipleValue.concat([inpVal]).join(','), { type: 'update' })
548
- }
549
- } else {
550
- // 如果为单选
551
- if (!XEUtils.isEqual(modelValue, inpVal)) {
552
- handleChange(inpVal, { type: 'update' })
553
- }
554
- }
555
- }
556
-
557
- const dateMonthHandle = (date: Date, offsetMonth: number) => {
558
- reactData.selectMonth = XEUtils.getWhatMonth(date, offsetMonth, 'first')
559
- }
560
-
561
- const dateNowHandle = () => {
562
- const currentDate = XEUtils.getWhatDay(Date.now(), 0, 'first')
563
- reactData.currentDate = currentDate
564
- dateMonthHandle(currentDate, 0)
565
- }
566
-
567
- const dateToggleYearTypeEvent = () => {
568
- reactData.datePanelType = 'year'
569
- }
570
-
571
- const dateToggleMonthTypeEvent = (evnt: MouseEvent) => {
572
- let { datePanelType } = reactData
573
- if (datePanelType === 'month' || datePanelType === 'quarter') {
574
- datePanelType = 'year'
575
- } else {
576
- datePanelType = 'month'
577
- }
578
- reactData.datePanelType = datePanelType
579
- changeViewEvent(evnt)
580
- }
581
-
582
- const datePrevEvent = (evnt: Event) => {
583
- const { type } = props
584
- const { datePanelType, selectMonth } = reactData
585
- const { yearSize } = internalData
586
- const isDisabledPrevDateBtn = computeIsDisabledPrevDateBtn.value
587
- if (!isDisabledPrevDateBtn) {
588
- if (type === 'year') {
589
- reactData.selectMonth = XEUtils.getWhatYear(selectMonth, -yearSize, 'first')
590
- } else if (type === 'month' || type === 'quarter') {
591
- if (datePanelType === 'year') {
592
- reactData.selectMonth = XEUtils.getWhatYear(selectMonth, -yearSize, 'first')
593
- } else {
594
- reactData.selectMonth = XEUtils.getWhatYear(selectMonth, -1, 'first')
595
- }
596
- } else {
597
- if (datePanelType === 'year') {
598
- reactData.selectMonth = XEUtils.getWhatYear(selectMonth, -yearSize, 'first')
599
- } else if (datePanelType === 'month') {
600
- reactData.selectMonth = XEUtils.getWhatYear(selectMonth, -1, 'first')
601
- } else {
602
- reactData.selectMonth = XEUtils.getWhatMonth(selectMonth, -1, 'first')
603
- }
604
- }
605
- dispatchEvent('date-prev', { type }, evnt)
606
- changeViewEvent(evnt)
607
- }
608
- }
609
-
610
- const dateTodayMonthEvent = (evnt: Event) => {
611
- dateNowHandle()
612
- if (!props.multiple) {
613
- dateChange(reactData.currentDate)
614
- }
615
- dispatchEvent('date-today', { type: props.type }, evnt)
616
- changeViewEvent(evnt)
617
- }
618
-
619
- const dateNextEvent = (evnt: Event) => {
620
- const { type } = props
621
- const { datePanelType, selectMonth } = reactData
622
- const { yearSize } = internalData
623
- const isDisabledNextDateBtn = computeIsDisabledNextDateBtn.value
624
- if (!isDisabledNextDateBtn) {
625
- if (type === 'year') {
626
- reactData.selectMonth = XEUtils.getWhatYear(selectMonth, yearSize, 'first')
627
- } else if (type === 'month' || type === 'quarter') {
628
- if (datePanelType === 'year') {
629
- reactData.selectMonth = XEUtils.getWhatYear(selectMonth, yearSize, 'first')
630
- } else {
631
- reactData.selectMonth = XEUtils.getWhatYear(selectMonth, 1, 'first')
632
- }
633
- } else {
634
- if (datePanelType === 'year') {
635
- reactData.selectMonth = XEUtils.getWhatYear(selectMonth, yearSize, 'first')
636
- } else if (datePanelType === 'month') {
637
- reactData.selectMonth = XEUtils.getWhatYear(selectMonth, 1, 'first')
638
- } else {
639
- reactData.selectMonth = XEUtils.getWhatMonth(selectMonth, 1, 'first')
640
- }
641
- }
642
- dispatchEvent('date-next', { type }, evnt)
643
- changeViewEvent(evnt)
644
- }
645
- }
646
-
647
- const isDateDisabled = (item: { date: Date }) => {
648
- const { disabledMethod } = props
649
- const { datePanelType } = reactData
650
- return disabledMethod && disabledMethod({ type: datePanelType, viewType: datePanelType, date: item.date, $calendar: $xeCalendar })
651
- }
652
-
653
- const changeViewEvent = (evnt: Event | null) => {
654
- const { datePanelType } = reactData
655
- const yearDatas = computeYearDatas.value
656
- const quarterDatas = computeQuarterDatas.value
657
- const monthDatas = computeMonthDatas.value
658
- const weekDates = computeWeekDates.value
659
- const dayDatas = computeDayDatas.value
660
- const viewDates: Date[] = []
661
- let dataList: { date: Date }[][] = []
662
- switch (datePanelType) {
663
- case 'year':
664
- dataList = yearDatas
665
- break
666
- case 'quarter':
667
- dataList = quarterDatas
668
- break
669
- case 'month':
670
- dataList = monthDatas
671
- break
672
- case 'week':
673
- dataList = weekDates
674
- break
675
- case 'day':
676
- dataList = dayDatas
677
- break
678
- }
679
- dataList.forEach(rows => {
680
- rows.forEach(item => {
681
- viewDates.push(item.date)
682
- })
683
- })
684
- dispatchEvent('view-change', { viewType: datePanelType, viewDates }, evnt)
685
- }
686
-
687
- const dateSelectItem = (date: Date) => {
688
- const { type } = props
689
- const { datePanelType } = reactData
690
- if (type === 'month') {
691
- if (datePanelType === 'year') {
692
- reactData.datePanelType = 'month'
693
- dateCheckMonth(date)
694
- changeViewEvent(null)
695
- } else {
696
- dateChange(date)
697
- }
698
- } else if (type === 'year') {
699
- dateChange(date)
700
- } else if (type === 'quarter') {
701
- if (datePanelType === 'year') {
702
- reactData.datePanelType = 'quarter'
703
- dateCheckMonth(date)
704
- changeViewEvent(null)
705
- } else {
706
- dateChange(date)
707
- }
708
- } else {
709
- if (datePanelType === 'month') {
710
- reactData.datePanelType = type === 'week' ? type : 'day'
711
- dateCheckMonth(date)
712
- changeViewEvent(null)
713
- } else if (datePanelType === 'year') {
714
- reactData.datePanelType = 'month'
715
- dateCheckMonth(date)
716
- changeViewEvent(null)
717
- } else {
718
- dateChange(date)
719
- }
720
- }
721
- }
722
-
723
- const dateClickEvent = (evnt: MouseEvent, item: VxeDatePanelDefines.DateYearItem | VxeDatePanelDefines.DateQuarterItem | VxeDatePanelDefines.DateMonthItem | VxeDatePanelDefines.DateDayItem) => {
724
- const { type } = props
725
- const { datePanelType } = reactData
726
- const { date } = item
727
- if (!isDateDisabled(item)) {
728
- dateSelectItem(date)
729
- dispatchEvent('cell-click', { date, type, viewType: datePanelType }, evnt)
730
- }
731
- }
732
-
733
- const datContextmenuEvent = (evnt: MouseEvent, item: VxeDatePanelDefines.DateYearItem | VxeDatePanelDefines.DateQuarterItem | VxeDatePanelDefines.DateMonthItem | VxeDatePanelDefines.DateDayItem) => {
734
- const { type } = props
735
- const { datePanelType } = reactData
736
-
737
- const { menuConfig } = props
738
- const menuOpts = computeMenuOpts.value
739
- if (menuConfig ? isEnableConf(menuOpts) : menuOpts.enabled) {
740
- const { options, visibleMethod } = menuOpts
741
- const { date } = item
742
- if (!visibleMethod || visibleMethod({ $calendar: $xeCalendar, options, date, type, viewType: datePanelType })) {
743
- if (VxeUI.contextMenu) {
744
- VxeUI.contextMenu.openByEvent(evnt, {
745
- options,
746
- events: {
747
- optionClick (eventParams) {
748
- const { option } = eventParams
749
- const gMenuOpts = menus.get(option.code)
750
- const cmMethod = gMenuOpts ? gMenuOpts.calendarMenuMethod : null
751
- const params = { menu: option, date, type, viewType: datePanelType, $event: evnt, $calendar: $xeCalendar }
752
- if (cmMethod) {
753
- cmMethod(params, evnt)
754
- }
755
- dispatchEvent('menu-click', params, eventParams.$event)
756
- }
757
- }
758
- })
759
- }
760
- }
761
- }
762
- dispatchEvent('cell-menu', { date: item.date, type, viewType: datePanelType }, evnt)
763
- }
764
-
765
- const dateMoveDay = (offsetDay: Date) => {
766
- if (!isDateDisabled({ date: offsetDay })) {
767
- const dayList = computeDayList.value
768
- if (!dayList.some((item) => XEUtils.isDateSame(item.date, offsetDay, 'yyyyMMdd'))) {
769
- dateCheckMonth(offsetDay)
770
- }
771
- dateParseValue(offsetDay)
772
- }
773
- }
774
-
775
- const dateMoveYear = (offsetYear: Date) => {
776
- if (!isDateDisabled({ date: offsetYear })) {
777
- const yearList = computeYearList.value
778
- if (!yearList.some((item) => XEUtils.isDateSame(item.date, offsetYear, 'yyyy'))) {
779
- dateCheckMonth(offsetYear)
780
- }
781
- dateParseValue(offsetYear)
782
- }
783
- }
784
-
785
- const dateMoveQuarter = (offsetQuarter: Date) => {
786
- if (!isDateDisabled({ date: offsetQuarter })) {
787
- const quarterList = computeQuarterList.value
788
- if (!quarterList.some((item) => XEUtils.isDateSame(item.date, offsetQuarter, 'yyyyq'))) {
789
- dateCheckMonth(offsetQuarter)
790
- }
791
- dateParseValue(offsetQuarter)
792
- }
793
- }
794
-
795
- const dateMoveMonth = (offsetMonth: Date) => {
796
- if (!isDateDisabled({ date: offsetMonth })) {
797
- const monthList = computeMonthList.value
798
- if (!monthList.some((item) => XEUtils.isDateSame(item.date, offsetMonth, 'yyyyMM'))) {
799
- dateCheckMonth(offsetMonth)
800
- }
801
- dateParseValue(offsetMonth)
802
- }
803
- }
804
-
805
- const dateMouseenterEvent = (item: VxeDatePanelDefines.DateYearItem | VxeDatePanelDefines.DateQuarterItem | VxeDatePanelDefines.DateMonthItem | VxeDatePanelDefines.DateDayItem) => {
806
- if (!isDateDisabled(item)) {
807
- const { datePanelType } = reactData
808
- if (datePanelType === 'month') {
809
- dateMoveMonth(item.date)
810
- } else if (datePanelType === 'quarter') {
811
- dateMoveQuarter(item.date)
812
- } else if (datePanelType === 'year') {
813
- dateMoveYear(item.date)
814
- } else {
815
- dateMoveDay(item.date)
816
- }
817
- }
818
- }
819
-
820
- const dateMouseleaveEvent = () => {
821
- reactData.datePanelValue = null
822
- }
823
-
824
- const dateConfirmEvent = () => {
825
- }
826
-
827
- const dateOpenPanel = () => {
828
- const { type } = props
829
- const dateValue = computeDateValue.value
830
- if (['year', 'quarter', 'month', 'week'].indexOf(type) > -1) {
831
- reactData.datePanelType = type as 'year' | 'quarter' | 'month' | 'week'
832
- } else {
833
- reactData.datePanelType = 'day'
834
- }
835
- reactData.currentDate = XEUtils.getWhatDay(Date.now(), 0, 'first')
836
- if (dateValue) {
837
- dateMonthHandle(dateValue, 0)
838
- dateParseValue(dateValue)
839
- } else {
840
- dateNowHandle()
841
- }
842
- }
843
-
844
- const renderDateLabel = (item: VxeDatePanelDefines.DateYearItem | VxeDatePanelDefines.DateQuarterItem | VxeDatePanelDefines.DateMonthItem | VxeDatePanelDefines.DateDayItem, label: string | number) => {
845
- const { festivalMethod } = props
846
- if (festivalMethod) {
847
- const { datePanelType } = reactData
848
- const festivalRest = festivalMethod({ type: datePanelType, viewType: datePanelType, date: item.date, $calendar: $xeCalendar })
849
- const festivalItem = festivalRest ? (XEUtils.isString(festivalRest) ? { label: festivalRest } : festivalRest) : {}
850
- const extraItem = festivalItem.extra ? (XEUtils.isString(festivalItem.extra) ? { label: festivalItem.extra } : festivalItem.extra) : null
851
- const labels = [
852
- h('span', {
853
- class: ['vxe-calendar--label', {
854
- 'is-notice': festivalItem.notice
855
- }]
856
- }, extraItem && extraItem.label
857
- ? [
858
- h('span', {
859
- class: 'vxe-calendar--label--number'
860
- }, `${label || ''}`),
861
- h('span', {
862
- class: ['vxe-calendar--label--extra', extraItem.important ? 'is-important' : '', extraItem.className],
863
- style: extraItem.style
864
- }, XEUtils.toValueString(extraItem.label))
865
- ]
866
- : [`${label || ''}`])
867
- ]
868
- const festivalLabel = festivalItem.label
869
- if (festivalLabel) {
870
- // 默认最多支持3个节日重叠
871
- const festivalLabels = XEUtils.toValueString(festivalLabel).split(',')
872
- labels.push(
873
- h('span', {
874
- class: ['vxe-calendar--festival', festivalItem.important ? 'is-important' : '', festivalItem.className],
875
- style: festivalItem.style
876
- }, [
877
- festivalLabels.length > 1
878
- ? h('span', {
879
- class: ['vxe-calendar--festival--overlap', `overlap--${festivalLabels.length}`]
880
- }, festivalLabels.map(label => h('span', label.substring(0, 3))))
881
- : h('span', {
882
- class: 'vxe-calendar--festival--label'
883
- }, festivalLabels[0].substring(0, 3))
884
- ])
885
- )
886
- }
887
- return labels
888
- }
889
- return `${label || ''}`
890
- }
891
-
892
- const renderDateDayTable = () => {
893
- const { multiple, cellStyle } = props
894
- const { datePanelType, datePanelValue } = reactData
895
- const dateValue = computeDateValue.value
896
- const dateHeaders = computeDateHeaders.value
897
- const dayDatas = computeDayDatas.value
898
- const dateListValue = computeDateListValue.value
899
- const matchFormat = 'yyyyMMdd'
900
- return [
901
- h('div', {
902
- class: ['vxe-calendar--view-wrapper', `type--${datePanelType}`]
903
- }, [
904
- h('div', {
905
- class: 'vxe-calendar--view-header',
906
- style: {
907
- height: `${100 / (dayDatas.length + 1)}%`
908
- }
909
- }, [
910
- h('div', {
911
- class: 'vxe-calendar--view-row'
912
- }, dateHeaders.map((item) => {
913
- return h('div', {
914
- class: 'vxe-calendar--view-item',
915
- style: {
916
- width: `${100 / dateHeaders.length}%`
917
- }
918
- }, [
919
- h('div', {
920
- class: 'vxe-calendar--view-item-inner'
921
- }, [
922
- h('div', {
923
- class: 'vxe-calendar--view-item-label'
924
- }, item.label)
925
- ])
926
- ])
927
- }))
928
- ]),
929
- h('div', {
930
- class: 'vxe-calendar--view-body'
931
- }, dayDatas.map((rows) => {
932
- return h('div', {
933
- class: 'vxe-calendar--view-row',
934
- style: {
935
- height: `${100 / dayDatas.length}%`
936
- }
937
- }, rows.map((item) => {
938
- const isSelected = multiple ? dateListValue.some(val => XEUtils.isDateSame(val, item.date, matchFormat)) : XEUtils.isDateSame(dateValue, item.date, matchFormat)
939
- return h('div', {
940
- class: ['vxe-calendar--view-item', {
941
- 'is--prev': item.isPrev,
942
- 'is--current': item.isCurrent,
943
- 'is--now': item.isNow,
944
- 'is--next': item.isNext,
945
- 'is--disabled': isDateDisabled(item),
946
- 'is--selected': isSelected,
947
- 'is--hover': XEUtils.isDateSame(datePanelValue, item.date, matchFormat)
948
- }],
949
- style: Object.assign({}, XEUtils.isFunction(cellStyle) ? cellStyle({ type: datePanelType, viewType: datePanelType, date: item.date, $calendar: $xeCalendar }) : cellStyle, {
950
- width: `${100 / rows.length}%`
951
- }),
952
- onClick: (evnt) => dateClickEvent(evnt, item),
953
- onContextmenu: (evnt) => datContextmenuEvent(evnt, item),
954
- onMouseenter: () => dateMouseenterEvent(item),
955
- onMouseleave: dateMouseleaveEvent
956
- }, [
957
- h('div', {
958
- class: 'vxe-calendar--view-item-inner'
959
- }, renderDateLabel(item, item.label))
960
- ])
961
- }))
962
- }))
963
- ])
964
- ]
965
- }
966
-
967
- const renderDateWeekTable = () => {
968
- const { multiple, cellStyle } = props
969
- const { datePanelType, datePanelValue } = reactData
970
- const dateValue = computeDateValue.value
971
- const weekHeaders = computeWeekHeaders.value
972
- const weekDates = computeWeekDates.value
973
- const dateListValue = computeDateListValue.value
974
- const matchFormat = 'yyyyMMdd'
975
- return [
976
- h('div', {
977
- class: ['vxe-calendar--view-wrapper', `type--${datePanelType}`]
978
- }, [
979
- h('div', {
980
- class: 'vxe-calendar--view-header',
981
- style: {
982
- height: `${100 / (weekDates.length + 1)}%`
983
- }
984
- }, [
985
- h('div', {
986
- class: 'vxe-calendar--view-row'
987
- }, weekHeaders.map((item, rIndex) => {
988
- return h('div', {
989
- class: 'vxe-calendar--view-item',
990
- style: {
991
- width: `${rIndex ? 13 : 9}%`
992
- }
993
- }, [
994
- h('div', {
995
- class: 'vxe-calendar--view-item-inner'
996
- }, [
997
- h('div', {
998
- class: 'vxe-calendar--view-item-label'
999
- }, item.label)
1000
- ])
1001
- ])
1002
- }))
1003
- ]),
1004
- h('div', {
1005
- class: 'vxe-calendar--view-body'
1006
- }, weekDates.map((rows) => {
1007
- const isSelected = multiple ? rows.some((item) => dateListValue.some(val => XEUtils.isDateSame(val, item.date, matchFormat))) : rows.some((item) => XEUtils.isDateSame(dateValue, item.date, matchFormat))
1008
- const isHover = rows.some((item) => XEUtils.isDateSame(datePanelValue, item.date, matchFormat))
1009
- const isNowWeek = rows.some(item => item.isNow)
1010
- return h('div', {
1011
- class: 'vxe-calendar--view-row',
1012
- style: {
1013
- height: `${100 / weekDates.length}%`
1014
- }
1015
- }, rows.map((item, rIndex) => {
1016
- return h('div', {
1017
- class: ['vxe-calendar--view-item', {
1018
- 'is--prev': item.isPrev,
1019
- 'is--current': item.isCurrent,
1020
- 'is--now': rIndex ? item.isNow : isNowWeek,
1021
- 'is--next': item.isNext,
1022
- 'is--disabled': isDateDisabled(item),
1023
- 'is--selected': isSelected,
1024
- 'is--hover': isHover
1025
- }],
1026
- style: Object.assign({}, XEUtils.isFunction(cellStyle) ? cellStyle({ type: datePanelType, viewType: datePanelType, date: item.date, $calendar: $xeCalendar }) : cellStyle, {
1027
- width: `${rIndex ? 13 : 9}%`
1028
- }),
1029
- onClick: (evnt) => dateClickEvent(evnt, item),
1030
- onContextmenu: (evnt) => datContextmenuEvent(evnt, item),
1031
- onMouseenter: () => dateMouseenterEvent(item),
1032
- onMouseleave: dateMouseleaveEvent
1033
- }, [
1034
- h('div', {
1035
- class: 'vxe-calendar--view-item-inner'
1036
- }, renderDateLabel(item, item.label))
1037
- ])
1038
- }))
1039
- }))
1040
- ])
1041
- ]
1042
- }
1043
-
1044
- const renderDateMonthTable = () => {
1045
- const { multiple, cellStyle } = props
1046
- const { datePanelType, datePanelValue } = reactData
1047
- const dateValue = computeDateValue.value
1048
- const monthDatas = computeMonthDatas.value
1049
- const dateListValue = computeDateListValue.value
1050
- const matchFormat = 'yyyyMM'
1051
- return [
1052
- h('div', {
1053
- class: ['vxe-calendar--view-wrapper', `type--${datePanelType}`]
1054
- }, [
1055
- h('div', {
1056
- class: 'vxe-calendar--view-body'
1057
- }, monthDatas.map((rows) => {
1058
- return h('div', {
1059
- class: 'vxe-calendar--view-row',
1060
- style: {
1061
- height: `${100 / monthDatas.length}%`
1062
- }
1063
- }, rows.map((item) => {
1064
- const isSelected = multiple ? dateListValue.some(val => XEUtils.isDateSame(val, item.date, matchFormat)) : XEUtils.isDateSame(dateValue, item.date, matchFormat)
1065
- return h('div', {
1066
- class: ['vxe-calendar--view-item', {
1067
- 'is--prev': item.isPrev,
1068
- 'is--current': item.isCurrent,
1069
- 'is--now': item.isNow,
1070
- 'is--next': item.isNext,
1071
- 'is--disabled': isDateDisabled(item),
1072
- 'is--selected': isSelected,
1073
- 'is--hover': XEUtils.isDateSame(datePanelValue, item.date, matchFormat)
1074
- }],
1075
- style: Object.assign({}, XEUtils.isFunction(cellStyle) ? cellStyle({ type: datePanelType, viewType: datePanelType, date: item.date, $calendar: $xeCalendar }) : cellStyle, {
1076
- width: `${100 / rows.length}%`
1077
- }),
1078
- onClick: (evnt) => dateClickEvent(evnt, item),
1079
- onContextmenu: (evnt) => datContextmenuEvent(evnt, item),
1080
- onMouseenter: () => dateMouseenterEvent(item),
1081
- onMouseleave: dateMouseleaveEvent
1082
- }, [
1083
- h('div', {
1084
- class: 'vxe-calendar--view-item-inner'
1085
- }, renderDateLabel(item, getI18n(`vxe.input.date.months.m${item.month}`)))
1086
- ])
1087
- }))
1088
- }))
1089
- ])
1090
- ]
1091
- }
1092
-
1093
- const renderDateQuarterTable = () => {
1094
- const { multiple, cellStyle } = props
1095
- const { datePanelType, datePanelValue } = reactData
1096
- const dateValue = computeDateValue.value
1097
- const quarterDatas = computeQuarterDatas.value
1098
- const dateListValue = computeDateListValue.value
1099
- const matchFormat = 'yyyyq'
1100
- return [
1101
- h('div', {
1102
- class: ['vxe-calendar--view-wrapper', `type--${datePanelType}`]
1103
- }, [
1104
- h('div', {
1105
- class: 'vxe-calendar--view-body'
1106
- }, quarterDatas.map((rows) => {
1107
- return h('div', {
1108
- class: 'vxe-calendar--view-row',
1109
- style: {
1110
- height: `${100 / quarterDatas.length}%`
1111
- }
1112
- }, rows.map((item) => {
1113
- const isSelected = multiple ? dateListValue.some(val => XEUtils.isDateSame(val, item.date, matchFormat)) : XEUtils.isDateSame(dateValue, item.date, matchFormat)
1114
- return h('div', {
1115
- class: ['vxe-calendar--view-item', {
1116
- 'is--prev': item.isPrev,
1117
- 'is--current': item.isCurrent,
1118
- 'is--now': item.isNow,
1119
- 'is--next': item.isNext,
1120
- 'is--disabled': isDateDisabled(item),
1121
- 'is--selected': isSelected,
1122
- 'is--hover': XEUtils.isDateSame(datePanelValue, item.date, matchFormat)
1123
- }],
1124
- style: Object.assign({}, XEUtils.isFunction(cellStyle) ? cellStyle({ type: datePanelType, viewType: datePanelType, date: item.date, $calendar: $xeCalendar }) : cellStyle, {
1125
- width: `${100 / rows.length}%`
1126
- }),
1127
- onClick: (evnt) => dateClickEvent(evnt, item),
1128
- onContextmenu: (evnt) => datContextmenuEvent(evnt, item),
1129
- onMouseenter: () => dateMouseenterEvent(item),
1130
- onMouseleave: dateMouseleaveEvent
1131
- }, [
1132
- h('div', {
1133
- class: 'vxe-calendar--view-item-inner'
1134
- }, renderDateLabel(item, getI18n(`vxe.input.date.quarters.q${item.quarter}`)))
1135
- ])
1136
- }))
1137
- }))
1138
- ])
1139
- ]
1140
- }
1141
-
1142
- const renderDateYearTable = () => {
1143
- const { multiple, cellStyle } = props
1144
- const { datePanelType, datePanelValue } = reactData
1145
- const dateValue = computeDateValue.value
1146
- const yearDatas = computeYearDatas.value
1147
- const dateListValue = computeDateListValue.value
1148
- const matchFormat = 'yyyy'
1149
- return [
1150
- h('div', {
1151
- class: ['vxe-calendar--view-wrapper', `type--${datePanelType}`]
1152
- }, [
1153
- h('div', {
1154
- class: 'vxe-calendar--view-body'
1155
- }, yearDatas.map((rows) => {
1156
- return h('div', {
1157
- class: 'vxe-calendar--view-row',
1158
- style: {
1159
- height: `${100 / yearDatas.length}%`
1160
- }
1161
- }, rows.map((item) => {
1162
- const isSelected = multiple ? dateListValue.some(val => XEUtils.isDateSame(val, item.date, matchFormat)) : XEUtils.isDateSame(dateValue, item.date, matchFormat)
1163
- return h('div', {
1164
- class: ['vxe-calendar--view-item', {
1165
- 'is--prev': item.isPrev,
1166
- 'is--current': item.isCurrent,
1167
- 'is--now': item.isNow,
1168
- 'is--next': item.isNext,
1169
- 'is--disabled': isDateDisabled(item),
1170
- 'is--selected': isSelected,
1171
- 'is--hover': XEUtils.isDateSame(datePanelValue, item.date, matchFormat)
1172
- }],
1173
- style: Object.assign({}, XEUtils.isFunction(cellStyle) ? cellStyle({ type: datePanelType, viewType: datePanelType, date: item.date, $calendar: $xeCalendar }) : cellStyle, {
1174
- width: `${100 / rows.length}%`
1175
- }),
1176
- onClick: (evnt) => dateClickEvent(evnt, item),
1177
- onContextmenu: (evnt) => datContextmenuEvent(evnt, item),
1178
- onMouseenter: () => dateMouseenterEvent(item),
1179
- onMouseleave: dateMouseleaveEvent
1180
- }, [
1181
- h('div', {
1182
- class: 'vxe-calendar--view-item-inner'
1183
- }, renderDateLabel(item, item.year))
1184
- ])
1185
- }))
1186
- }))
1187
- ])
1188
- ]
1189
- }
1190
-
1191
- const renderDateTable = () => {
1192
- const { datePanelType } = reactData
1193
- switch (datePanelType) {
1194
- case 'week' :
1195
- return renderDateWeekTable()
1196
- case 'month' :
1197
- return renderDateMonthTable()
1198
- case 'quarter' :
1199
- return renderDateQuarterTable()
1200
- case 'year' :
1201
- return renderDateYearTable()
1202
- }
1203
- return renderDateDayTable()
1204
- }
1205
-
1206
- const renderDatePanel = () => {
1207
- const { multiple } = props
1208
- const { datePanelType } = reactData
1209
- const isDisabledPrevDateBtn = computeIsDisabledPrevDateBtn.value
1210
- const isDisabledNextDateBtn = computeIsDisabledNextDateBtn.value
1211
- const selectDatePanelObj = computeSelectDatePanelObj.value
1212
- return [
1213
- h('div', {
1214
- class: 'vxe-calendar--header'
1215
- }, [
1216
- h('div', {
1217
- class: 'vxe-calendar--type-wrapper'
1218
- }, [
1219
- datePanelType === 'year'
1220
- ? h(VxeButtonComponent, {
1221
- class: 'vxe-calendar--date-picker-label',
1222
- disabled: datePanelType === 'year',
1223
- content: selectDatePanelObj.y
1224
- })
1225
- : h('span', {
1226
- class: 'vxe-calendar--date-picker-btns'
1227
- }, [
1228
- h(VxeButtonComponent, {
1229
- class: 'vxe-calendar--date-picker-btn',
1230
- content: selectDatePanelObj.y,
1231
- onClick: dateToggleYearTypeEvent
1232
- }),
1233
- selectDatePanelObj.m
1234
- ? h(VxeButtonComponent, {
1235
- class: 'vxe-calendar--date-picker-btn',
1236
- content: selectDatePanelObj.m,
1237
- onClick: dateToggleMonthTypeEvent
1238
- })
1239
- : renderEmptyElement($xeCalendar)
1240
- ])
1241
- ]),
1242
- h('div', {
1243
- class: 'vxe-calendar--btn-wrapper'
1244
- }, [
1245
- h(VxeButtonComponent, {
1246
- disabled: isDisabledPrevDateBtn,
1247
- icon: 'vxe-icon-caret-left',
1248
- onClick: datePrevEvent
1249
- }),
1250
- h(VxeButtonComponent, {
1251
- icon: 'vxe-icon-dot',
1252
- onClick: dateTodayMonthEvent
1253
- }),
1254
- h(VxeButtonComponent, {
1255
- disabled: isDisabledNextDateBtn,
1256
- icon: 'vxe-icon-caret-right',
1257
- onClick: dateNextEvent
1258
- }),
1259
- multiple && computeSupportMultiples.value
1260
- ? h('span', {
1261
- class: 'vxe-calendar--btn vxe-calendar--confirm-btn'
1262
- }, [
1263
- h('button', {
1264
- class: 'vxe-calendar--confirm',
1265
- type: 'button',
1266
- onClick: dateConfirmEvent
1267
- }, getI18n('vxe.button.confirm'))
1268
- ])
1269
- : null
1270
- ])
1271
- ]),
1272
- h('div', {
1273
- class: 'vxe-calendar--body'
1274
- }, renderDateTable())
1275
- ]
1276
- }
1277
-
1278
- const dispatchEvent = (type: ValueOf<VxeCalendarEmits>, params: Record<string, any>, evnt: Event | null) => {
1279
- emit(type, createEvent(evnt, { $input: $xeCalendar }, params))
1280
- }
1281
-
1282
- const calendarMethods: CalendarMethods = {
1283
- dispatchEvent
1284
- }
1285
-
1286
- Object.assign($xeCalendar, calendarMethods)
1287
-
1288
- const renderVN = () => {
1289
- const { className, type } = props
1290
- const vSize = computeSize.value
1291
- const isDisabled = computeIsDisabled.value
1292
- const calendarStyle = computeCalendarStyle.value
1293
- return h('div', {
1294
- ref: refElem,
1295
- class: ['vxe-calendar', `type--${type}`, className, {
1296
- [`size--${vSize}`]: vSize,
1297
- 'is--disabled': isDisabled
1298
- }],
1299
- style: calendarStyle
1300
- }, [
1301
- renderDatePanel()
1302
- ])
1303
- }
1304
-
1305
- $xeCalendar.renderVN = renderVN
1306
-
1307
- watch(() => props.modelValue, (val) => {
1308
- reactData.inputValue = val
1309
- changeValue()
1310
- })
1311
-
1312
- watch(() => props.type, () => {
1313
- // 切换类型是重置内置变量
1314
- Object.assign(reactData, {
1315
- selectValue: null,
1316
- inputValue: null,
1317
- datePanelValue: null,
1318
- datePanelLabel: '',
1319
- datePanelType: 'day',
1320
- selectMonth: null,
1321
- currentDate: null
1322
- })
1323
- initValue()
1324
- dateOpenPanel()
1325
- })
1326
-
1327
- watch(computeDateLabelFormat, () => {
1328
- const isCalendarType = computeIsCalendarType.value
1329
- if (isCalendarType) {
1330
- dateParseValue(reactData.datePanelValue)
1331
- reactData.inputValue = props.multiple ? computeDateMultipleLabel.value : reactData.datePanelLabel
1332
- }
1333
- })
1334
-
1335
- onMounted(() => {
1336
- const { menuConfig } = props
1337
- const VxeUIContextMenu = VxeUI.getComponent('VxeContextMenu')
1338
- if (menuConfig && !VxeUIContextMenu) {
1339
- errLog('vxe.error.reqComp', ['vxe-context-menu'])
1340
- }
1341
- dateOpenPanel()
1342
- })
1343
-
1344
- initValue()
1345
-
1346
- return $xeCalendar
1347
- },
1348
- render () {
1349
- return this.renderVN()
1350
- }
1351
- })
1
+ import { h, ref, Ref, computed, reactive, watch, PropType, onMounted } from 'vue'
2
+ import { defineVxeComponent } from '../../ui/src/comp'
3
+ import { VxeUI, createEvent, useSize, renderEmptyElement } from '../../ui'
4
+ import { getDateQuarter } from '../../date-panel/src/util'
5
+ import { toCssUnit } from '../../ui/src/dom'
6
+ import { isEnableConf } from '../../ui/src/utils'
7
+ import { errLog } from '../../ui/src/log'
8
+ import VxeButtonComponent from '../../button/src/button'
9
+ import XEUtils from 'xe-utils'
10
+
11
+ import type { VxeCalendarConstructor, VxeCalendarEmits, CalendarInternalData, CalendarReactData, CalendarMethods, VxeCalendarPropTypes, CalendarPrivateRef, VxeDatePanelDefines, ValueOf } from '../../../types'
12
+
13
+ const { menus, getConfig, getI18n } = VxeUI
14
+
15
+ export default defineVxeComponent({
16
+ name: 'VxeCalendar',
17
+ props: {
18
+ modelValue: [String, Number, Date] as PropType<VxeCalendarPropTypes.ModelValue>,
19
+ type: {
20
+ type: String as PropType<VxeCalendarPropTypes.Type>,
21
+ default: 'date'
22
+ },
23
+ className: String as PropType<VxeCalendarPropTypes.ClassName>,
24
+ size: {
25
+ type: String as PropType<VxeCalendarPropTypes.Size>,
26
+ default: () => getConfig().calendar.size || getConfig().size
27
+ },
28
+ multiple: Boolean as PropType<VxeCalendarPropTypes.Multiple>,
29
+
30
+ width: [String, Number] as PropType<VxeCalendarPropTypes.Width>,
31
+ height: [String, Number] as PropType<VxeCalendarPropTypes.Height>,
32
+
33
+ // date、week、month、quarter、year
34
+ minDate: {
35
+ type: [String, Number, Date] as PropType<VxeCalendarPropTypes.MinDate>,
36
+ default: () => getConfig().calendar.minDate
37
+ },
38
+ maxDate: {
39
+ type: [String, Number, Date] as PropType<VxeCalendarPropTypes.MaxDate>,
40
+ default: () => getConfig().calendar.maxDate
41
+ },
42
+ startDay: {
43
+ type: [String, Number] as PropType<VxeCalendarPropTypes.StartDay>,
44
+ default: () => getConfig().calendar.startDay
45
+ },
46
+ labelFormat: String as PropType<VxeCalendarPropTypes.LabelFormat>,
47
+ valueFormat: String as PropType<VxeCalendarPropTypes.ValueFormat>,
48
+ festivalMethod: {
49
+ type: Function as PropType<VxeCalendarPropTypes.FestivalMethod>,
50
+ default: () => getConfig().calendar.festivalMethod
51
+ },
52
+ disabledMethod: {
53
+ type: Function as PropType<VxeCalendarPropTypes.DisabledMethod>,
54
+ default: () => getConfig().calendar.disabledMethod
55
+ },
56
+ cellStyle: [Object, Function] as PropType<VxeCalendarPropTypes.CellStyle>,
57
+ menuConfig: Object as PropType<VxeCalendarPropTypes.MenuConfig>,
58
+
59
+ // week
60
+ selectDay: {
61
+ type: [String, Number] as PropType<VxeCalendarPropTypes.SelectDay>,
62
+ default: () => getConfig().calendar.selectDay
63
+ }
64
+ },
65
+ emits: [
66
+ 'update:modelValue',
67
+ 'change',
68
+ 'cell-click',
69
+ 'date-prev',
70
+ 'date-today',
71
+ 'date-next',
72
+ 'view-change',
73
+ 'cell-menu',
74
+ 'menu-click'
75
+ ] as VxeCalendarEmits,
76
+ setup (props, context) {
77
+ const { emit } = context
78
+
79
+ const xID = XEUtils.uniqueId()
80
+
81
+ const { computeSize } = useSize(props)
82
+
83
+ const reactData = reactive<CalendarReactData>({
84
+ selectValue: props.modelValue,
85
+ inputValue: props.modelValue,
86
+ datePanelValue: null,
87
+ datePanelLabel: '',
88
+ datePanelType: 'day',
89
+ selectMonth: null,
90
+ currentDate: null
91
+ })
92
+
93
+ const internalData: CalendarInternalData = {
94
+ yearSize: 12,
95
+ monthSize: 20,
96
+ quarterSize: 8
97
+ }
98
+
99
+ const refElem = ref() as Ref<HTMLDivElement>
100
+
101
+ const refMaps: CalendarPrivateRef = {
102
+ refElem
103
+ }
104
+
105
+ const $xeCalendar = {
106
+ xID,
107
+ props,
108
+ context,
109
+ reactData,
110
+ internalData,
111
+ getRefMaps: () => refMaps
112
+ } as unknown as VxeCalendarConstructor
113
+
114
+ const computeCalendarStyle = computed(() => {
115
+ const { height, width } = props
116
+ const stys: Record<string, string> = {}
117
+ if (width) {
118
+ stys.width = toCssUnit(width)
119
+ }
120
+ if (height) {
121
+ stys.height = toCssUnit(height)
122
+ }
123
+ return stys
124
+ })
125
+
126
+ const computeIsDisabled = computed(() => {
127
+ return false
128
+ })
129
+
130
+ const computeIsCalendarType = computed(() => {
131
+ return ['date', 'week', 'month', 'quarter', 'year'].indexOf(props.type) > -1
132
+ })
133
+
134
+ const computeDateStartTime = computed(() => {
135
+ return props.minDate ? XEUtils.toStringDate(props.minDate) : null
136
+ })
137
+
138
+ const computeDateEndTime = computed(() => {
139
+ return props.maxDate ? XEUtils.toStringDate(props.maxDate) : null
140
+ })
141
+
142
+ const computeSupportMultiples = computed(() => {
143
+ return ['date', 'week', 'month', 'quarter', 'year'].indexOf(props.type) > -1
144
+ })
145
+
146
+ const computeMenuOpts = computed(() => {
147
+ return Object.assign({}, getConfig().calendar.menuConfig, props.menuConfig)
148
+ })
149
+
150
+ const computeDateListValue = computed(() => {
151
+ const { multiple } = props
152
+ const { selectValue } = reactData
153
+ const isCalendarType = computeIsCalendarType.value
154
+ const dateValueFormat = computeDateValueFormat.value
155
+ if (multiple && selectValue && isCalendarType) {
156
+ return XEUtils.toValueString(selectValue).split(',').map(item => {
157
+ const date = parseDate(item, dateValueFormat)
158
+ if (XEUtils.isValidDate(date)) {
159
+ return date
160
+ }
161
+ return null
162
+ })
163
+ }
164
+ return []
165
+ })
166
+
167
+ const computeDateMultipleValue = computed(() => {
168
+ const dateListValue = computeDateListValue.value
169
+ const dateValueFormat = computeDateValueFormat.value
170
+ return dateListValue.map(date => XEUtils.toDateString(date, dateValueFormat))
171
+ })
172
+
173
+ const computeDateMultipleLabel = computed(() => {
174
+ const dateListValue = computeDateListValue.value
175
+ const dateLabelFormat = computeDateLabelFormat.value
176
+ return dateListValue.map(date => XEUtils.toDateString(date, dateLabelFormat)).join(', ')
177
+ })
178
+
179
+ const computeDateValueFormat = computed(() => {
180
+ const { valueFormat } = props
181
+ if (valueFormat) {
182
+ return valueFormat
183
+ }
184
+ return 'yyyy-MM-dd'
185
+ })
186
+
187
+ const computeDateValue = computed(() => {
188
+ const { selectValue } = reactData
189
+ const isCalendarType = computeIsCalendarType.value
190
+ const dateValueFormat = computeDateValueFormat.value
191
+ let val = null
192
+ if (selectValue && isCalendarType) {
193
+ const date = parseDate(selectValue, dateValueFormat)
194
+ if (XEUtils.isValidDate(date)) {
195
+ val = date
196
+ }
197
+ }
198
+ return val
199
+ })
200
+
201
+ const computeIsDisabledPrevDateBtn = computed(() => {
202
+ const dateStartTime = computeDateStartTime.value
203
+ const { selectMonth } = reactData
204
+ if (selectMonth && dateStartTime) {
205
+ return selectMonth <= dateStartTime
206
+ }
207
+ return false
208
+ })
209
+
210
+ const computeIsDisabledNextDateBtn = computed(() => {
211
+ const dateEndTime = computeDateEndTime.value
212
+ const { selectMonth } = reactData
213
+ if (selectMonth && dateEndTime) {
214
+ return selectMonth >= dateEndTime
215
+ }
216
+ return false
217
+ })
218
+
219
+ const computeDateHMSTime = computed(() => {
220
+ const dateValue = computeDateValue.value
221
+ return dateValue ? (dateValue.getHours() * 3600 + dateValue.getMinutes() * 60 + dateValue.getSeconds()) * 1000 : 0
222
+ })
223
+
224
+ const computeDateLabelFormat = computed(() => {
225
+ const { labelFormat } = props
226
+ const isCalendarType = computeIsCalendarType.value
227
+ const dateValueFormat = computeDateValueFormat.value
228
+ if (isCalendarType) {
229
+ return labelFormat || dateValueFormat || getI18n(`vxe.input.date.labelFormat.${props.type}`)
230
+ }
231
+ return null
232
+ })
233
+
234
+ const computeYearList = computed(() => {
235
+ const { selectMonth, currentDate } = reactData
236
+ const { yearSize } = internalData
237
+ const years: VxeDatePanelDefines.DateYearItem[] = []
238
+ if (selectMonth && currentDate) {
239
+ const currFullYear = currentDate.getFullYear()
240
+ const selectFullYear = selectMonth.getFullYear()
241
+ const startYearDate = new Date(selectFullYear - selectFullYear % yearSize, 0, 1)
242
+ for (let index = -4; index < yearSize + 4; index++) {
243
+ const date = XEUtils.getWhatYear(startYearDate, index, 'first')
244
+ const itemFullYear = date.getFullYear()
245
+ years.push({
246
+ date,
247
+ isCurrent: true,
248
+ isPrev: index < 0,
249
+ isNow: currFullYear === itemFullYear,
250
+ isNext: index >= yearSize,
251
+ year: itemFullYear
252
+ })
253
+ }
254
+ }
255
+ return years
256
+ })
257
+
258
+ const computeSelectDatePanelObj = computed(() => {
259
+ const isCalendarType = computeIsCalendarType.value
260
+ let y = ''
261
+ let m = ''
262
+ if (isCalendarType) {
263
+ const { datePanelType, selectMonth } = reactData
264
+ const yearList = computeYearList.value
265
+ let year = ''
266
+ let month
267
+ if (selectMonth) {
268
+ year = selectMonth.getFullYear()
269
+ month = selectMonth.getMonth() + 1
270
+ }
271
+ if (datePanelType === 'quarter' || datePanelType === 'month') {
272
+ y = `${year}`
273
+ } else if (datePanelType === 'year') {
274
+ y = yearList.length ? `${yearList[0].year} - ${yearList[yearList.length - 1].year}` : ''
275
+ } else {
276
+ y = `${year}`
277
+ m = month ? getI18n('vxe.calendar.monthLabel', [month]) : '-'
278
+ }
279
+ }
280
+ return {
281
+ y: getI18n('vxe.calendar.yearLabel', [y]),
282
+ m
283
+ }
284
+ })
285
+
286
+ const computeFirstDayOfWeek = computed(() => {
287
+ const { startDay } = props
288
+ return XEUtils.toNumber(startDay) as VxeCalendarPropTypes.StartDay
289
+ })
290
+
291
+ const computeWeekDatas = computed(() => {
292
+ const weeks = []
293
+ const isCalendarType = computeIsCalendarType.value
294
+ if (isCalendarType) {
295
+ let sWeek = computeFirstDayOfWeek.value
296
+ weeks.push(sWeek)
297
+ for (let index = 0; index < 6; index++) {
298
+ if (sWeek >= 6) {
299
+ sWeek = 0
300
+ } else {
301
+ sWeek++
302
+ }
303
+ weeks.push(sWeek)
304
+ }
305
+ }
306
+ return weeks
307
+ })
308
+
309
+ const computeDateHeaders = computed(() => {
310
+ const isCalendarType = computeIsCalendarType.value
311
+ if (isCalendarType) {
312
+ const weekDatas = computeWeekDatas.value
313
+ return weekDatas.map((day) => {
314
+ return {
315
+ value: day,
316
+ label: getI18n(`vxe.input.date.weeks.w${day}`)
317
+ }
318
+ })
319
+ }
320
+ return []
321
+ })
322
+
323
+ const computeWeekHeaders = computed(() => {
324
+ const isCalendarType = computeIsCalendarType.value
325
+ if (isCalendarType) {
326
+ const dateHeaders = computeDateHeaders.value
327
+ return [{ label: getI18n('vxe.input.date.weeks.w') }].concat(dateHeaders)
328
+ }
329
+ return []
330
+ })
331
+
332
+ const computeYearDatas = computed(() => {
333
+ const yearList = computeYearList.value
334
+ return XEUtils.chunk(yearList, 4)
335
+ })
336
+
337
+ const computeQuarterList = computed(() => {
338
+ const { selectMonth, currentDate } = reactData
339
+ const { quarterSize } = internalData
340
+ const quarters: VxeDatePanelDefines.DateQuarterItem[] = []
341
+ if (selectMonth && currentDate) {
342
+ const currFullYear = currentDate.getFullYear()
343
+ const currQuarter = getDateQuarter(currentDate)
344
+ const firstYear = XEUtils.getWhatYear(selectMonth, 0, 'first')
345
+ const selFullYear = firstYear.getFullYear()
346
+ for (let index = -2; index < quarterSize - 2; index++) {
347
+ const date = XEUtils.getWhatQuarter(firstYear, index)
348
+ const itemFullYear = date.getFullYear()
349
+ const itemQuarter = getDateQuarter(date)
350
+ const isPrev = itemFullYear < selFullYear
351
+ quarters.push({
352
+ date,
353
+ isPrev,
354
+ isCurrent: itemFullYear === selFullYear,
355
+ isNow: itemFullYear === currFullYear && itemQuarter === currQuarter,
356
+ isNext: !isPrev && itemFullYear > selFullYear,
357
+ quarter: itemQuarter
358
+ })
359
+ }
360
+ }
361
+ return quarters
362
+ })
363
+
364
+ const computeQuarterDatas = computed(() => {
365
+ const quarterList = computeQuarterList.value
366
+ return XEUtils.chunk(quarterList, 2)
367
+ })
368
+
369
+ const computeMonthList = computed(() => {
370
+ const { selectMonth, currentDate } = reactData
371
+ const { monthSize } = internalData
372
+ const months: VxeDatePanelDefines.DateMonthItem[] = []
373
+ if (selectMonth && currentDate) {
374
+ const currFullYear = currentDate.getFullYear()
375
+ const currMonth = currentDate.getMonth()
376
+ const selFullYear = XEUtils.getWhatYear(selectMonth, 0, 'first').getFullYear()
377
+ for (let index = -4; index < monthSize - 4; index++) {
378
+ const date = XEUtils.getWhatYear(selectMonth, 0, index)
379
+ const itemFullYear = date.getFullYear()
380
+ const itemMonth = date.getMonth()
381
+ const isPrev = itemFullYear < selFullYear
382
+ months.push({
383
+ date,
384
+ isPrev,
385
+ isCurrent: itemFullYear === selFullYear,
386
+ isNow: itemFullYear === currFullYear && itemMonth === currMonth,
387
+ isNext: !isPrev && itemFullYear > selFullYear,
388
+ month: itemMonth
389
+ })
390
+ }
391
+ }
392
+ return months
393
+ })
394
+
395
+ const computeMonthDatas = computed(() => {
396
+ const monthList = computeMonthList.value
397
+ return XEUtils.chunk(monthList, 4)
398
+ })
399
+
400
+ const computeDayList = computed(() => {
401
+ const { selectMonth, currentDate } = reactData
402
+ const days: VxeDatePanelDefines.DateDayItem[] = []
403
+ if (selectMonth && currentDate) {
404
+ const dateHMSTime = computeDateHMSTime.value
405
+ const weekDatas = computeWeekDatas.value
406
+ const currFullYear = currentDate.getFullYear()
407
+ const currMonth = currentDate.getMonth()
408
+ const currDate = currentDate.getDate()
409
+ const selFullYear = selectMonth.getFullYear()
410
+ const selMonth = selectMonth.getMonth()
411
+ const selDay = selectMonth.getDay()
412
+ const prevOffsetDate = -weekDatas.indexOf(selDay)
413
+ const startDayDate = new Date(XEUtils.getWhatDay(selectMonth, prevOffsetDate).getTime() + dateHMSTime)
414
+ for (let index = 0; index < 42; index++) {
415
+ const date = XEUtils.getWhatDay(startDayDate, index)
416
+ const itemFullYear = date.getFullYear()
417
+ const itemMonth = date.getMonth()
418
+ const itemDate = date.getDate()
419
+ const isPrev = date < selectMonth
420
+ days.push({
421
+ date,
422
+ isPrev,
423
+ isCurrent: itemFullYear === selFullYear && itemMonth === selMonth,
424
+ isNow: itemFullYear === currFullYear && itemMonth === currMonth && itemDate === currDate,
425
+ isNext: !isPrev && selMonth !== itemMonth,
426
+ label: itemDate
427
+ })
428
+ }
429
+ }
430
+ return days
431
+ })
432
+
433
+ const computeDayDatas = computed(() => {
434
+ const dayList = computeDayList.value
435
+ return XEUtils.chunk(dayList, 7)
436
+ })
437
+
438
+ const computeWeekDates = computed(() => {
439
+ const dayDatas = computeDayDatas.value
440
+ const firstDayOfWeek = computeFirstDayOfWeek.value
441
+ return dayDatas.map((list) => {
442
+ const firstItem = list[0]
443
+ const item: VxeDatePanelDefines.DateDayItem = {
444
+ date: firstItem.date,
445
+ isWeekNumber: true,
446
+ isPrev: false,
447
+ isCurrent: false,
448
+ isNow: false,
449
+ isNext: false,
450
+ label: XEUtils.getYearWeek(firstItem.date, firstDayOfWeek)
451
+ }
452
+ return [item].concat(list)
453
+ })
454
+ })
455
+
456
+ const parseDate = (value: VxeCalendarPropTypes.ModelValue, format: string) => {
457
+ return XEUtils.toStringDate(value, format)
458
+ }
459
+
460
+ const handleChange = (value: string, evnt: Event | { type: string }) => {
461
+ reactData.inputValue = value
462
+ emit('update:modelValue', value)
463
+ if (XEUtils.toValueString(props.modelValue) !== value) {
464
+ dispatchEvent('change', { value }, evnt as any)
465
+ }
466
+ }
467
+
468
+ const dateParseValue = (value?: VxeCalendarPropTypes.ModelValue) => {
469
+ const { type } = props
470
+ const dateLabelFormat = computeDateLabelFormat.value
471
+ const dateValueFormat = computeDateValueFormat.value
472
+ const firstDayOfWeek = computeFirstDayOfWeek.value
473
+ let dValue: Date | null = null
474
+ let dLabel = ''
475
+ if (value) {
476
+ dValue = parseDate(value, dateValueFormat)
477
+ }
478
+ if (XEUtils.isValidDate(dValue)) {
479
+ dLabel = XEUtils.toDateString(dValue, dateLabelFormat, { firstDay: firstDayOfWeek })
480
+ // 由于年份和第几周是冲突的行为,所以需要特殊处理,判断是否跨年
481
+ if (dateLabelFormat && type === 'week') {
482
+ const firstWeekDate = XEUtils.getWhatWeek(dValue, 0, firstDayOfWeek, firstDayOfWeek)
483
+ if (firstWeekDate.getFullYear() < dValue.getFullYear()) {
484
+ const yyIndex = dateLabelFormat.indexOf('yyyy')
485
+ if (yyIndex > -1) {
486
+ const yyNum = Number(dLabel.substring(yyIndex, yyIndex + 4))
487
+ if (yyNum && !isNaN(yyNum)) {
488
+ dLabel = dLabel.replace(`${yyNum}`, `${yyNum - 1}`)
489
+ }
490
+ }
491
+ }
492
+ }
493
+ } else {
494
+ dValue = null
495
+ }
496
+ reactData.datePanelValue = dValue
497
+ reactData.datePanelLabel = dLabel
498
+ }
499
+
500
+ /**
501
+ * 值变化时处理
502
+ */
503
+ const changeValue = () => {
504
+ const isCalendarType = computeIsCalendarType.value
505
+ const { inputValue } = reactData
506
+ if (isCalendarType) {
507
+ dateParseValue(inputValue)
508
+ reactData.inputValue = props.multiple ? computeDateMultipleLabel.value : reactData.datePanelLabel
509
+ }
510
+ }
511
+
512
+ /**
513
+ * 检查初始值
514
+ */
515
+ const initValue = () => {
516
+ const isCalendarType = computeIsCalendarType.value
517
+ if (isCalendarType) {
518
+ changeValue()
519
+ }
520
+ }
521
+
522
+ const dateCheckMonth = (date: Date) => {
523
+ const month = XEUtils.getWhatMonth(date, 0, 'first')
524
+ if (!XEUtils.isEqual(month, reactData.selectMonth)) {
525
+ reactData.selectMonth = month
526
+ }
527
+ }
528
+
529
+ const dateChange = (date: Date) => {
530
+ const { modelValue, multiple } = props
531
+ const dateValueFormat = computeDateValueFormat.value
532
+ const firstDayOfWeek = computeFirstDayOfWeek.value
533
+ if (props.type === 'week') {
534
+ const sWeek = XEUtils.toNumber(props.selectDay) as VxeCalendarPropTypes.SelectDay
535
+ date = XEUtils.getWhatWeek(date, 0, sWeek, firstDayOfWeek)
536
+ }
537
+ const inpVal = XEUtils.toDateString(date, dateValueFormat, { firstDay: firstDayOfWeek })
538
+ dateCheckMonth(date)
539
+ reactData.selectValue = date
540
+ if (multiple) {
541
+ // 如果为多选
542
+ const dateMultipleValue = computeDateMultipleValue.value
543
+ // 如果是日期类型
544
+ if (dateMultipleValue.some(val => XEUtils.isEqual(val, inpVal))) {
545
+ handleChange(dateMultipleValue.filter(val => !XEUtils.isEqual(val, inpVal)).join(','), { type: 'update' })
546
+ } else {
547
+ handleChange(dateMultipleValue.concat([inpVal]).join(','), { type: 'update' })
548
+ }
549
+ } else {
550
+ // 如果为单选
551
+ if (!XEUtils.isEqual(modelValue, inpVal)) {
552
+ handleChange(inpVal, { type: 'update' })
553
+ }
554
+ }
555
+ }
556
+
557
+ const dateMonthHandle = (date: Date, offsetMonth: number) => {
558
+ reactData.selectMonth = XEUtils.getWhatMonth(date, offsetMonth, 'first')
559
+ }
560
+
561
+ const dateNowHandle = () => {
562
+ const currentDate = XEUtils.getWhatDay(Date.now(), 0, 'first')
563
+ reactData.currentDate = currentDate
564
+ dateMonthHandle(currentDate, 0)
565
+ }
566
+
567
+ const dateToggleYearTypeEvent = () => {
568
+ reactData.datePanelType = 'year'
569
+ }
570
+
571
+ const dateToggleMonthTypeEvent = (evnt: MouseEvent) => {
572
+ let { datePanelType } = reactData
573
+ if (datePanelType === 'month' || datePanelType === 'quarter') {
574
+ datePanelType = 'year'
575
+ } else {
576
+ datePanelType = 'month'
577
+ }
578
+ reactData.datePanelType = datePanelType
579
+ changeViewEvent(evnt)
580
+ }
581
+
582
+ const datePrevEvent = (evnt: Event) => {
583
+ const { type } = props
584
+ const { datePanelType, selectMonth } = reactData
585
+ const { yearSize } = internalData
586
+ const isDisabledPrevDateBtn = computeIsDisabledPrevDateBtn.value
587
+ if (!isDisabledPrevDateBtn) {
588
+ if (type === 'year') {
589
+ reactData.selectMonth = XEUtils.getWhatYear(selectMonth, -yearSize, 'first')
590
+ } else if (type === 'month' || type === 'quarter') {
591
+ if (datePanelType === 'year') {
592
+ reactData.selectMonth = XEUtils.getWhatYear(selectMonth, -yearSize, 'first')
593
+ } else {
594
+ reactData.selectMonth = XEUtils.getWhatYear(selectMonth, -1, 'first')
595
+ }
596
+ } else {
597
+ if (datePanelType === 'year') {
598
+ reactData.selectMonth = XEUtils.getWhatYear(selectMonth, -yearSize, 'first')
599
+ } else if (datePanelType === 'month') {
600
+ reactData.selectMonth = XEUtils.getWhatYear(selectMonth, -1, 'first')
601
+ } else {
602
+ reactData.selectMonth = XEUtils.getWhatMonth(selectMonth, -1, 'first')
603
+ }
604
+ }
605
+ dispatchEvent('date-prev', { type }, evnt)
606
+ changeViewEvent(evnt)
607
+ }
608
+ }
609
+
610
+ const dateTodayMonthEvent = (evnt: Event) => {
611
+ dateNowHandle()
612
+ if (!props.multiple) {
613
+ dateChange(reactData.currentDate)
614
+ }
615
+ dispatchEvent('date-today', { type: props.type }, evnt)
616
+ changeViewEvent(evnt)
617
+ }
618
+
619
+ const dateNextEvent = (evnt: Event) => {
620
+ const { type } = props
621
+ const { datePanelType, selectMonth } = reactData
622
+ const { yearSize } = internalData
623
+ const isDisabledNextDateBtn = computeIsDisabledNextDateBtn.value
624
+ if (!isDisabledNextDateBtn) {
625
+ if (type === 'year') {
626
+ reactData.selectMonth = XEUtils.getWhatYear(selectMonth, yearSize, 'first')
627
+ } else if (type === 'month' || type === 'quarter') {
628
+ if (datePanelType === 'year') {
629
+ reactData.selectMonth = XEUtils.getWhatYear(selectMonth, yearSize, 'first')
630
+ } else {
631
+ reactData.selectMonth = XEUtils.getWhatYear(selectMonth, 1, 'first')
632
+ }
633
+ } else {
634
+ if (datePanelType === 'year') {
635
+ reactData.selectMonth = XEUtils.getWhatYear(selectMonth, yearSize, 'first')
636
+ } else if (datePanelType === 'month') {
637
+ reactData.selectMonth = XEUtils.getWhatYear(selectMonth, 1, 'first')
638
+ } else {
639
+ reactData.selectMonth = XEUtils.getWhatMonth(selectMonth, 1, 'first')
640
+ }
641
+ }
642
+ dispatchEvent('date-next', { type }, evnt)
643
+ changeViewEvent(evnt)
644
+ }
645
+ }
646
+
647
+ const isDateDisabled = (item: { date: Date }) => {
648
+ const { disabledMethod } = props
649
+ const { datePanelType } = reactData
650
+ return disabledMethod && disabledMethod({ type: datePanelType, viewType: datePanelType, date: item.date, $calendar: $xeCalendar })
651
+ }
652
+
653
+ const changeViewEvent = (evnt: Event | null) => {
654
+ const { datePanelType } = reactData
655
+ const yearDatas = computeYearDatas.value
656
+ const quarterDatas = computeQuarterDatas.value
657
+ const monthDatas = computeMonthDatas.value
658
+ const weekDates = computeWeekDates.value
659
+ const dayDatas = computeDayDatas.value
660
+ const viewDates: Date[] = []
661
+ let dataList: { date: Date }[][] = []
662
+ switch (datePanelType) {
663
+ case 'year':
664
+ dataList = yearDatas
665
+ break
666
+ case 'quarter':
667
+ dataList = quarterDatas
668
+ break
669
+ case 'month':
670
+ dataList = monthDatas
671
+ break
672
+ case 'week':
673
+ dataList = weekDates
674
+ break
675
+ case 'day':
676
+ dataList = dayDatas
677
+ break
678
+ }
679
+ dataList.forEach(rows => {
680
+ rows.forEach(item => {
681
+ viewDates.push(item.date)
682
+ })
683
+ })
684
+ dispatchEvent('view-change', { viewType: datePanelType, viewDates }, evnt)
685
+ }
686
+
687
+ const dateSelectItem = (date: Date) => {
688
+ const { type } = props
689
+ const { datePanelType } = reactData
690
+ if (type === 'month') {
691
+ if (datePanelType === 'year') {
692
+ reactData.datePanelType = 'month'
693
+ dateCheckMonth(date)
694
+ changeViewEvent(null)
695
+ } else {
696
+ dateChange(date)
697
+ }
698
+ } else if (type === 'year') {
699
+ dateChange(date)
700
+ } else if (type === 'quarter') {
701
+ if (datePanelType === 'year') {
702
+ reactData.datePanelType = 'quarter'
703
+ dateCheckMonth(date)
704
+ changeViewEvent(null)
705
+ } else {
706
+ dateChange(date)
707
+ }
708
+ } else {
709
+ if (datePanelType === 'month') {
710
+ reactData.datePanelType = type === 'week' ? type : 'day'
711
+ dateCheckMonth(date)
712
+ changeViewEvent(null)
713
+ } else if (datePanelType === 'year') {
714
+ reactData.datePanelType = 'month'
715
+ dateCheckMonth(date)
716
+ changeViewEvent(null)
717
+ } else {
718
+ dateChange(date)
719
+ }
720
+ }
721
+ }
722
+
723
+ const dateClickEvent = (evnt: MouseEvent, item: VxeDatePanelDefines.DateYearItem | VxeDatePanelDefines.DateQuarterItem | VxeDatePanelDefines.DateMonthItem | VxeDatePanelDefines.DateDayItem) => {
724
+ const { type } = props
725
+ const { datePanelType } = reactData
726
+ const { date } = item
727
+ if (!isDateDisabled(item)) {
728
+ dateSelectItem(date)
729
+ dispatchEvent('cell-click', { date, type, viewType: datePanelType }, evnt)
730
+ }
731
+ }
732
+
733
+ const datContextmenuEvent = (evnt: MouseEvent, item: VxeDatePanelDefines.DateYearItem | VxeDatePanelDefines.DateQuarterItem | VxeDatePanelDefines.DateMonthItem | VxeDatePanelDefines.DateDayItem) => {
734
+ const { type } = props
735
+ const { datePanelType } = reactData
736
+
737
+ const { menuConfig } = props
738
+ const menuOpts = computeMenuOpts.value
739
+ if (menuConfig ? isEnableConf(menuOpts) : menuOpts.enabled) {
740
+ const { options, visibleMethod } = menuOpts
741
+ const { date } = item
742
+ if (!visibleMethod || visibleMethod({ $calendar: $xeCalendar, options, date, type, viewType: datePanelType })) {
743
+ if (VxeUI.contextMenu) {
744
+ VxeUI.contextMenu.openByEvent(evnt, {
745
+ options,
746
+ events: {
747
+ optionClick (eventParams) {
748
+ const { option } = eventParams
749
+ const gMenuOpts = menus.get(option.code)
750
+ const cmMethod = gMenuOpts ? gMenuOpts.calendarMenuMethod : null
751
+ const params = { menu: option, date, type, viewType: datePanelType, $event: evnt, $calendar: $xeCalendar }
752
+ if (cmMethod) {
753
+ cmMethod(params, evnt)
754
+ }
755
+ dispatchEvent('menu-click', params, eventParams.$event)
756
+ }
757
+ }
758
+ })
759
+ }
760
+ }
761
+ }
762
+ dispatchEvent('cell-menu', { date: item.date, type, viewType: datePanelType }, evnt)
763
+ }
764
+
765
+ const dateMoveDay = (offsetDay: Date) => {
766
+ if (!isDateDisabled({ date: offsetDay })) {
767
+ const dayList = computeDayList.value
768
+ if (!dayList.some((item) => XEUtils.isDateSame(item.date, offsetDay, 'yyyyMMdd'))) {
769
+ dateCheckMonth(offsetDay)
770
+ }
771
+ dateParseValue(offsetDay)
772
+ }
773
+ }
774
+
775
+ const dateMoveYear = (offsetYear: Date) => {
776
+ if (!isDateDisabled({ date: offsetYear })) {
777
+ const yearList = computeYearList.value
778
+ if (!yearList.some((item) => XEUtils.isDateSame(item.date, offsetYear, 'yyyy'))) {
779
+ dateCheckMonth(offsetYear)
780
+ }
781
+ dateParseValue(offsetYear)
782
+ }
783
+ }
784
+
785
+ const dateMoveQuarter = (offsetQuarter: Date) => {
786
+ if (!isDateDisabled({ date: offsetQuarter })) {
787
+ const quarterList = computeQuarterList.value
788
+ if (!quarterList.some((item) => XEUtils.isDateSame(item.date, offsetQuarter, 'yyyyq'))) {
789
+ dateCheckMonth(offsetQuarter)
790
+ }
791
+ dateParseValue(offsetQuarter)
792
+ }
793
+ }
794
+
795
+ const dateMoveMonth = (offsetMonth: Date) => {
796
+ if (!isDateDisabled({ date: offsetMonth })) {
797
+ const monthList = computeMonthList.value
798
+ if (!monthList.some((item) => XEUtils.isDateSame(item.date, offsetMonth, 'yyyyMM'))) {
799
+ dateCheckMonth(offsetMonth)
800
+ }
801
+ dateParseValue(offsetMonth)
802
+ }
803
+ }
804
+
805
+ const dateMouseenterEvent = (item: VxeDatePanelDefines.DateYearItem | VxeDatePanelDefines.DateQuarterItem | VxeDatePanelDefines.DateMonthItem | VxeDatePanelDefines.DateDayItem) => {
806
+ if (!isDateDisabled(item)) {
807
+ const { datePanelType } = reactData
808
+ if (datePanelType === 'month') {
809
+ dateMoveMonth(item.date)
810
+ } else if (datePanelType === 'quarter') {
811
+ dateMoveQuarter(item.date)
812
+ } else if (datePanelType === 'year') {
813
+ dateMoveYear(item.date)
814
+ } else {
815
+ dateMoveDay(item.date)
816
+ }
817
+ }
818
+ }
819
+
820
+ const dateMouseleaveEvent = () => {
821
+ reactData.datePanelValue = null
822
+ }
823
+
824
+ const dateConfirmEvent = () => {
825
+ }
826
+
827
+ const dateOpenPanel = () => {
828
+ const { type } = props
829
+ const dateValue = computeDateValue.value
830
+ if (['year', 'quarter', 'month', 'week'].indexOf(type) > -1) {
831
+ reactData.datePanelType = type as 'year' | 'quarter' | 'month' | 'week'
832
+ } else {
833
+ reactData.datePanelType = 'day'
834
+ }
835
+ reactData.currentDate = XEUtils.getWhatDay(Date.now(), 0, 'first')
836
+ if (dateValue) {
837
+ dateMonthHandle(dateValue, 0)
838
+ dateParseValue(dateValue)
839
+ } else {
840
+ dateNowHandle()
841
+ }
842
+ }
843
+
844
+ const renderDateLabel = (item: VxeDatePanelDefines.DateYearItem | VxeDatePanelDefines.DateQuarterItem | VxeDatePanelDefines.DateMonthItem | VxeDatePanelDefines.DateDayItem, label: string | number) => {
845
+ const { festivalMethod } = props
846
+ if (festivalMethod) {
847
+ const { datePanelType } = reactData
848
+ const festivalRest = festivalMethod({ type: datePanelType, viewType: datePanelType, date: item.date, $calendar: $xeCalendar })
849
+ const festivalItem = festivalRest ? (XEUtils.isString(festivalRest) ? { label: festivalRest } : festivalRest) : {}
850
+ const extraItem = festivalItem.extra ? (XEUtils.isString(festivalItem.extra) ? { label: festivalItem.extra } : festivalItem.extra) : null
851
+ const labels = [
852
+ h('span', {
853
+ class: ['vxe-calendar--label', {
854
+ 'is-notice': festivalItem.notice
855
+ }]
856
+ }, extraItem && extraItem.label
857
+ ? [
858
+ h('span', {
859
+ class: 'vxe-calendar--label--number'
860
+ }, `${label || ''}`),
861
+ h('span', {
862
+ class: ['vxe-calendar--label--extra', extraItem.important ? 'is-important' : '', extraItem.className],
863
+ style: extraItem.style
864
+ }, XEUtils.toValueString(extraItem.label))
865
+ ]
866
+ : [`${label || ''}`])
867
+ ]
868
+ const festivalLabel = festivalItem.label
869
+ if (festivalLabel) {
870
+ // 默认最多支持3个节日重叠
871
+ const festivalLabels = XEUtils.toValueString(festivalLabel).split(',')
872
+ labels.push(
873
+ h('span', {
874
+ class: ['vxe-calendar--festival', festivalItem.important ? 'is-important' : '', festivalItem.className],
875
+ style: festivalItem.style
876
+ }, [
877
+ festivalLabels.length > 1
878
+ ? h('span', {
879
+ class: ['vxe-calendar--festival--overlap', `overlap--${festivalLabels.length}`]
880
+ }, festivalLabels.map(label => h('span', label.substring(0, 3))))
881
+ : h('span', {
882
+ class: 'vxe-calendar--festival--label'
883
+ }, festivalLabels[0].substring(0, 3))
884
+ ])
885
+ )
886
+ }
887
+ return labels
888
+ }
889
+ return `${label || ''}`
890
+ }
891
+
892
+ const renderDateDayTable = () => {
893
+ const { multiple, cellStyle } = props
894
+ const { datePanelType, datePanelValue } = reactData
895
+ const dateValue = computeDateValue.value
896
+ const dateHeaders = computeDateHeaders.value
897
+ const dayDatas = computeDayDatas.value
898
+ const dateListValue = computeDateListValue.value
899
+ const matchFormat = 'yyyyMMdd'
900
+ return [
901
+ h('div', {
902
+ class: ['vxe-calendar--view-wrapper', `type--${datePanelType}`]
903
+ }, [
904
+ h('div', {
905
+ class: 'vxe-calendar--view-header',
906
+ style: {
907
+ height: `${100 / (dayDatas.length + 1)}%`
908
+ }
909
+ }, [
910
+ h('div', {
911
+ class: 'vxe-calendar--view-row'
912
+ }, dateHeaders.map((item) => {
913
+ return h('div', {
914
+ class: 'vxe-calendar--view-item',
915
+ style: {
916
+ width: `${100 / dateHeaders.length}%`
917
+ }
918
+ }, [
919
+ h('div', {
920
+ class: 'vxe-calendar--view-item-inner'
921
+ }, [
922
+ h('div', {
923
+ class: 'vxe-calendar--view-item-label'
924
+ }, item.label)
925
+ ])
926
+ ])
927
+ }))
928
+ ]),
929
+ h('div', {
930
+ class: 'vxe-calendar--view-body'
931
+ }, dayDatas.map((rows) => {
932
+ return h('div', {
933
+ class: 'vxe-calendar--view-row',
934
+ style: {
935
+ height: `${100 / dayDatas.length}%`
936
+ }
937
+ }, rows.map((item) => {
938
+ const isSelected = multiple ? dateListValue.some(val => XEUtils.isDateSame(val, item.date, matchFormat)) : XEUtils.isDateSame(dateValue, item.date, matchFormat)
939
+ return h('div', {
940
+ class: ['vxe-calendar--view-item', {
941
+ 'is--prev': item.isPrev,
942
+ 'is--current': item.isCurrent,
943
+ 'is--now': item.isNow,
944
+ 'is--next': item.isNext,
945
+ 'is--disabled': isDateDisabled(item),
946
+ 'is--selected': isSelected,
947
+ 'is--hover': XEUtils.isDateSame(datePanelValue, item.date, matchFormat)
948
+ }],
949
+ style: Object.assign({}, XEUtils.isFunction(cellStyle) ? cellStyle({ type: datePanelType, viewType: datePanelType, date: item.date, $calendar: $xeCalendar }) : cellStyle, {
950
+ width: `${100 / rows.length}%`
951
+ }),
952
+ onClick: (evnt) => dateClickEvent(evnt, item),
953
+ onContextmenu: (evnt) => datContextmenuEvent(evnt, item),
954
+ onMouseenter: () => dateMouseenterEvent(item),
955
+ onMouseleave: dateMouseleaveEvent
956
+ }, [
957
+ h('div', {
958
+ class: 'vxe-calendar--view-item-inner'
959
+ }, renderDateLabel(item, item.label))
960
+ ])
961
+ }))
962
+ }))
963
+ ])
964
+ ]
965
+ }
966
+
967
+ const renderDateWeekTable = () => {
968
+ const { multiple, cellStyle } = props
969
+ const { datePanelType, datePanelValue } = reactData
970
+ const dateValue = computeDateValue.value
971
+ const weekHeaders = computeWeekHeaders.value
972
+ const weekDates = computeWeekDates.value
973
+ const dateListValue = computeDateListValue.value
974
+ const matchFormat = 'yyyyMMdd'
975
+ return [
976
+ h('div', {
977
+ class: ['vxe-calendar--view-wrapper', `type--${datePanelType}`]
978
+ }, [
979
+ h('div', {
980
+ class: 'vxe-calendar--view-header',
981
+ style: {
982
+ height: `${100 / (weekDates.length + 1)}%`
983
+ }
984
+ }, [
985
+ h('div', {
986
+ class: 'vxe-calendar--view-row'
987
+ }, weekHeaders.map((item, rIndex) => {
988
+ return h('div', {
989
+ class: 'vxe-calendar--view-item',
990
+ style: {
991
+ width: `${rIndex ? 13 : 9}%`
992
+ }
993
+ }, [
994
+ h('div', {
995
+ class: 'vxe-calendar--view-item-inner'
996
+ }, [
997
+ h('div', {
998
+ class: 'vxe-calendar--view-item-label'
999
+ }, item.label)
1000
+ ])
1001
+ ])
1002
+ }))
1003
+ ]),
1004
+ h('div', {
1005
+ class: 'vxe-calendar--view-body'
1006
+ }, weekDates.map((rows) => {
1007
+ const isSelected = multiple ? rows.some((item) => dateListValue.some(val => XEUtils.isDateSame(val, item.date, matchFormat))) : rows.some((item) => XEUtils.isDateSame(dateValue, item.date, matchFormat))
1008
+ const isHover = rows.some((item) => XEUtils.isDateSame(datePanelValue, item.date, matchFormat))
1009
+ const isNowWeek = rows.some(item => item.isNow)
1010
+ return h('div', {
1011
+ class: 'vxe-calendar--view-row',
1012
+ style: {
1013
+ height: `${100 / weekDates.length}%`
1014
+ }
1015
+ }, rows.map((item, rIndex) => {
1016
+ return h('div', {
1017
+ class: ['vxe-calendar--view-item', {
1018
+ 'is--prev': item.isPrev,
1019
+ 'is--current': item.isCurrent,
1020
+ 'is--now': rIndex ? item.isNow : isNowWeek,
1021
+ 'is--next': item.isNext,
1022
+ 'is--disabled': isDateDisabled(item),
1023
+ 'is--selected': isSelected,
1024
+ 'is--hover': isHover
1025
+ }],
1026
+ style: Object.assign({}, XEUtils.isFunction(cellStyle) ? cellStyle({ type: datePanelType, viewType: datePanelType, date: item.date, $calendar: $xeCalendar }) : cellStyle, {
1027
+ width: `${rIndex ? 13 : 9}%`
1028
+ }),
1029
+ onClick: (evnt) => dateClickEvent(evnt, item),
1030
+ onContextmenu: (evnt) => datContextmenuEvent(evnt, item),
1031
+ onMouseenter: () => dateMouseenterEvent(item),
1032
+ onMouseleave: dateMouseleaveEvent
1033
+ }, [
1034
+ h('div', {
1035
+ class: 'vxe-calendar--view-item-inner'
1036
+ }, renderDateLabel(item, item.label))
1037
+ ])
1038
+ }))
1039
+ }))
1040
+ ])
1041
+ ]
1042
+ }
1043
+
1044
+ const renderDateMonthTable = () => {
1045
+ const { multiple, cellStyle } = props
1046
+ const { datePanelType, datePanelValue } = reactData
1047
+ const dateValue = computeDateValue.value
1048
+ const monthDatas = computeMonthDatas.value
1049
+ const dateListValue = computeDateListValue.value
1050
+ const matchFormat = 'yyyyMM'
1051
+ return [
1052
+ h('div', {
1053
+ class: ['vxe-calendar--view-wrapper', `type--${datePanelType}`]
1054
+ }, [
1055
+ h('div', {
1056
+ class: 'vxe-calendar--view-body'
1057
+ }, monthDatas.map((rows) => {
1058
+ return h('div', {
1059
+ class: 'vxe-calendar--view-row',
1060
+ style: {
1061
+ height: `${100 / monthDatas.length}%`
1062
+ }
1063
+ }, rows.map((item) => {
1064
+ const isSelected = multiple ? dateListValue.some(val => XEUtils.isDateSame(val, item.date, matchFormat)) : XEUtils.isDateSame(dateValue, item.date, matchFormat)
1065
+ return h('div', {
1066
+ class: ['vxe-calendar--view-item', {
1067
+ 'is--prev': item.isPrev,
1068
+ 'is--current': item.isCurrent,
1069
+ 'is--now': item.isNow,
1070
+ 'is--next': item.isNext,
1071
+ 'is--disabled': isDateDisabled(item),
1072
+ 'is--selected': isSelected,
1073
+ 'is--hover': XEUtils.isDateSame(datePanelValue, item.date, matchFormat)
1074
+ }],
1075
+ style: Object.assign({}, XEUtils.isFunction(cellStyle) ? cellStyle({ type: datePanelType, viewType: datePanelType, date: item.date, $calendar: $xeCalendar }) : cellStyle, {
1076
+ width: `${100 / rows.length}%`
1077
+ }),
1078
+ onClick: (evnt) => dateClickEvent(evnt, item),
1079
+ onContextmenu: (evnt) => datContextmenuEvent(evnt, item),
1080
+ onMouseenter: () => dateMouseenterEvent(item),
1081
+ onMouseleave: dateMouseleaveEvent
1082
+ }, [
1083
+ h('div', {
1084
+ class: 'vxe-calendar--view-item-inner'
1085
+ }, renderDateLabel(item, getI18n(`vxe.input.date.months.m${item.month}`)))
1086
+ ])
1087
+ }))
1088
+ }))
1089
+ ])
1090
+ ]
1091
+ }
1092
+
1093
+ const renderDateQuarterTable = () => {
1094
+ const { multiple, cellStyle } = props
1095
+ const { datePanelType, datePanelValue } = reactData
1096
+ const dateValue = computeDateValue.value
1097
+ const quarterDatas = computeQuarterDatas.value
1098
+ const dateListValue = computeDateListValue.value
1099
+ const matchFormat = 'yyyyq'
1100
+ return [
1101
+ h('div', {
1102
+ class: ['vxe-calendar--view-wrapper', `type--${datePanelType}`]
1103
+ }, [
1104
+ h('div', {
1105
+ class: 'vxe-calendar--view-body'
1106
+ }, quarterDatas.map((rows) => {
1107
+ return h('div', {
1108
+ class: 'vxe-calendar--view-row',
1109
+ style: {
1110
+ height: `${100 / quarterDatas.length}%`
1111
+ }
1112
+ }, rows.map((item) => {
1113
+ const isSelected = multiple ? dateListValue.some(val => XEUtils.isDateSame(val, item.date, matchFormat)) : XEUtils.isDateSame(dateValue, item.date, matchFormat)
1114
+ return h('div', {
1115
+ class: ['vxe-calendar--view-item', {
1116
+ 'is--prev': item.isPrev,
1117
+ 'is--current': item.isCurrent,
1118
+ 'is--now': item.isNow,
1119
+ 'is--next': item.isNext,
1120
+ 'is--disabled': isDateDisabled(item),
1121
+ 'is--selected': isSelected,
1122
+ 'is--hover': XEUtils.isDateSame(datePanelValue, item.date, matchFormat)
1123
+ }],
1124
+ style: Object.assign({}, XEUtils.isFunction(cellStyle) ? cellStyle({ type: datePanelType, viewType: datePanelType, date: item.date, $calendar: $xeCalendar }) : cellStyle, {
1125
+ width: `${100 / rows.length}%`
1126
+ }),
1127
+ onClick: (evnt) => dateClickEvent(evnt, item),
1128
+ onContextmenu: (evnt) => datContextmenuEvent(evnt, item),
1129
+ onMouseenter: () => dateMouseenterEvent(item),
1130
+ onMouseleave: dateMouseleaveEvent
1131
+ }, [
1132
+ h('div', {
1133
+ class: 'vxe-calendar--view-item-inner'
1134
+ }, renderDateLabel(item, getI18n(`vxe.input.date.quarters.q${item.quarter}`)))
1135
+ ])
1136
+ }))
1137
+ }))
1138
+ ])
1139
+ ]
1140
+ }
1141
+
1142
+ const renderDateYearTable = () => {
1143
+ const { multiple, cellStyle } = props
1144
+ const { datePanelType, datePanelValue } = reactData
1145
+ const dateValue = computeDateValue.value
1146
+ const yearDatas = computeYearDatas.value
1147
+ const dateListValue = computeDateListValue.value
1148
+ const matchFormat = 'yyyy'
1149
+ return [
1150
+ h('div', {
1151
+ class: ['vxe-calendar--view-wrapper', `type--${datePanelType}`]
1152
+ }, [
1153
+ h('div', {
1154
+ class: 'vxe-calendar--view-body'
1155
+ }, yearDatas.map((rows) => {
1156
+ return h('div', {
1157
+ class: 'vxe-calendar--view-row',
1158
+ style: {
1159
+ height: `${100 / yearDatas.length}%`
1160
+ }
1161
+ }, rows.map((item) => {
1162
+ const isSelected = multiple ? dateListValue.some(val => XEUtils.isDateSame(val, item.date, matchFormat)) : XEUtils.isDateSame(dateValue, item.date, matchFormat)
1163
+ return h('div', {
1164
+ class: ['vxe-calendar--view-item', {
1165
+ 'is--prev': item.isPrev,
1166
+ 'is--current': item.isCurrent,
1167
+ 'is--now': item.isNow,
1168
+ 'is--next': item.isNext,
1169
+ 'is--disabled': isDateDisabled(item),
1170
+ 'is--selected': isSelected,
1171
+ 'is--hover': XEUtils.isDateSame(datePanelValue, item.date, matchFormat)
1172
+ }],
1173
+ style: Object.assign({}, XEUtils.isFunction(cellStyle) ? cellStyle({ type: datePanelType, viewType: datePanelType, date: item.date, $calendar: $xeCalendar }) : cellStyle, {
1174
+ width: `${100 / rows.length}%`
1175
+ }),
1176
+ onClick: (evnt) => dateClickEvent(evnt, item),
1177
+ onContextmenu: (evnt) => datContextmenuEvent(evnt, item),
1178
+ onMouseenter: () => dateMouseenterEvent(item),
1179
+ onMouseleave: dateMouseleaveEvent
1180
+ }, [
1181
+ h('div', {
1182
+ class: 'vxe-calendar--view-item-inner'
1183
+ }, renderDateLabel(item, item.year))
1184
+ ])
1185
+ }))
1186
+ }))
1187
+ ])
1188
+ ]
1189
+ }
1190
+
1191
+ const renderDateTable = () => {
1192
+ const { datePanelType } = reactData
1193
+ switch (datePanelType) {
1194
+ case 'week' :
1195
+ return renderDateWeekTable()
1196
+ case 'month' :
1197
+ return renderDateMonthTable()
1198
+ case 'quarter' :
1199
+ return renderDateQuarterTable()
1200
+ case 'year' :
1201
+ return renderDateYearTable()
1202
+ }
1203
+ return renderDateDayTable()
1204
+ }
1205
+
1206
+ const renderDatePanel = () => {
1207
+ const { multiple } = props
1208
+ const { datePanelType } = reactData
1209
+ const isDisabledPrevDateBtn = computeIsDisabledPrevDateBtn.value
1210
+ const isDisabledNextDateBtn = computeIsDisabledNextDateBtn.value
1211
+ const selectDatePanelObj = computeSelectDatePanelObj.value
1212
+ return [
1213
+ h('div', {
1214
+ class: 'vxe-calendar--header'
1215
+ }, [
1216
+ h('div', {
1217
+ class: 'vxe-calendar--type-wrapper'
1218
+ }, [
1219
+ datePanelType === 'year'
1220
+ ? h(VxeButtonComponent, {
1221
+ class: 'vxe-calendar--date-picker-label',
1222
+ disabled: datePanelType === 'year',
1223
+ content: selectDatePanelObj.y
1224
+ })
1225
+ : h('span', {
1226
+ class: 'vxe-calendar--date-picker-btns'
1227
+ }, [
1228
+ h(VxeButtonComponent, {
1229
+ class: 'vxe-calendar--date-picker-btn',
1230
+ content: selectDatePanelObj.y,
1231
+ onClick: dateToggleYearTypeEvent
1232
+ }),
1233
+ selectDatePanelObj.m
1234
+ ? h(VxeButtonComponent, {
1235
+ class: 'vxe-calendar--date-picker-btn',
1236
+ content: selectDatePanelObj.m,
1237
+ onClick: dateToggleMonthTypeEvent
1238
+ })
1239
+ : renderEmptyElement($xeCalendar)
1240
+ ])
1241
+ ]),
1242
+ h('div', {
1243
+ class: 'vxe-calendar--btn-wrapper'
1244
+ }, [
1245
+ h(VxeButtonComponent, {
1246
+ disabled: isDisabledPrevDateBtn,
1247
+ icon: 'vxe-icon-caret-left',
1248
+ onClick: datePrevEvent
1249
+ }),
1250
+ h(VxeButtonComponent, {
1251
+ icon: 'vxe-icon-dot',
1252
+ onClick: dateTodayMonthEvent
1253
+ }),
1254
+ h(VxeButtonComponent, {
1255
+ disabled: isDisabledNextDateBtn,
1256
+ icon: 'vxe-icon-caret-right',
1257
+ onClick: dateNextEvent
1258
+ }),
1259
+ multiple && computeSupportMultiples.value
1260
+ ? h('span', {
1261
+ class: 'vxe-calendar--btn vxe-calendar--confirm-btn'
1262
+ }, [
1263
+ h('button', {
1264
+ class: 'vxe-calendar--confirm',
1265
+ type: 'button',
1266
+ onClick: dateConfirmEvent
1267
+ }, getI18n('vxe.button.confirm'))
1268
+ ])
1269
+ : null
1270
+ ])
1271
+ ]),
1272
+ h('div', {
1273
+ class: 'vxe-calendar--body'
1274
+ }, renderDateTable())
1275
+ ]
1276
+ }
1277
+
1278
+ const dispatchEvent = (type: ValueOf<VxeCalendarEmits>, params: Record<string, any>, evnt: Event | null) => {
1279
+ emit(type, createEvent(evnt, { $input: $xeCalendar }, params))
1280
+ }
1281
+
1282
+ const calendarMethods: CalendarMethods = {
1283
+ dispatchEvent
1284
+ }
1285
+
1286
+ Object.assign($xeCalendar, calendarMethods)
1287
+
1288
+ const renderVN = () => {
1289
+ const { className, type } = props
1290
+ const vSize = computeSize.value
1291
+ const isDisabled = computeIsDisabled.value
1292
+ const calendarStyle = computeCalendarStyle.value
1293
+ return h('div', {
1294
+ ref: refElem,
1295
+ class: ['vxe-calendar', `type--${type}`, className, {
1296
+ [`size--${vSize}`]: vSize,
1297
+ 'is--disabled': isDisabled
1298
+ }],
1299
+ style: calendarStyle
1300
+ }, [
1301
+ renderDatePanel()
1302
+ ])
1303
+ }
1304
+
1305
+ $xeCalendar.renderVN = renderVN
1306
+
1307
+ watch(() => props.modelValue, (val) => {
1308
+ reactData.inputValue = val
1309
+ changeValue()
1310
+ })
1311
+
1312
+ watch(() => props.type, () => {
1313
+ // 切换类型是重置内置变量
1314
+ Object.assign(reactData, {
1315
+ selectValue: null,
1316
+ inputValue: null,
1317
+ datePanelValue: null,
1318
+ datePanelLabel: '',
1319
+ datePanelType: 'day',
1320
+ selectMonth: null,
1321
+ currentDate: null
1322
+ })
1323
+ initValue()
1324
+ dateOpenPanel()
1325
+ })
1326
+
1327
+ watch(computeDateLabelFormat, () => {
1328
+ const isCalendarType = computeIsCalendarType.value
1329
+ if (isCalendarType) {
1330
+ dateParseValue(reactData.datePanelValue)
1331
+ reactData.inputValue = props.multiple ? computeDateMultipleLabel.value : reactData.datePanelLabel
1332
+ }
1333
+ })
1334
+
1335
+ onMounted(() => {
1336
+ const { menuConfig } = props
1337
+ const VxeUIContextMenu = VxeUI.getComponent('VxeContextMenu')
1338
+ if (menuConfig && !VxeUIContextMenu) {
1339
+ errLog('vxe.error.reqComp', ['vxe-context-menu'])
1340
+ }
1341
+ dateOpenPanel()
1342
+ })
1343
+
1344
+ initValue()
1345
+
1346
+ return $xeCalendar
1347
+ },
1348
+ render () {
1349
+ return this.renderVN()
1350
+ }
1351
+ })