vxe-pc-ui 4.20.24 → 4.20.26

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