vxe-pc-ui 4.5.36 → 4.6.0

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