vxe-pc-ui 3.14.6 → 3.14.8

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