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