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
@@ -1,13 +1,16 @@
1
- import { defineComponent, h, Teleport, ref, Ref, computed, reactive, inject, nextTick, watch, onUnmounted, PropType, createCommentVNode } from 'vue'
1
+ import { defineComponent, h, Teleport, ref, Ref, computed, provide, reactive, inject, nextTick, watch, PropType, onUnmounted } from 'vue'
2
2
  import XEUtils from 'xe-utils'
3
- import { getConfig, getIcon, getI18n, globalEvents, GLOBAL_EVENT_KEYS, createEvent, useSize, renderEmptyElement } from '../../ui'
3
+ import { getConfig, getIcon, getI18n, commands, createEvent, globalEvents, useSize, renderEmptyElement } from '../../ui'
4
4
  import { getFuncText, getLastZIndex, nextZIndex, isEnableConf } from '../../ui/src/utils'
5
5
  import { getAbsolutePos, getEventTargetNode } from '../../ui/src/dom'
6
- import { toStringTimeDate, getDateQuarter } from './util'
7
6
  import { getSlotVNs } from '../../ui/src/vn'
7
+ import { parseDateObj, getDateByCode } from '../../date-panel/src/util'
8
+ import { errLog } from '../../ui/src/log'
9
+ import VxeDatePanelComponent from '../../date-panel/src/date-panel'
10
+ import VxeButtonComponent from '../../button/src/button'
8
11
  import VxeButtonGroupComponent from '../../button/src/button-group'
9
12
 
10
- import type { VxeDatePickerConstructor, VxeDatePickerEmits, DatePickerInternalData, DatePickerReactData, VxeComponentStyleType, DatePickerMethods, VxeDatePickerPropTypes, DatePickerPrivateRef, VxeFormConstructor, VxeFormPrivateMethods, VxeFormDefines, ValueOf, VxeModalConstructor, VxeDrawerConstructor, VxeModalMethods, VxeDrawerMethods, VxeDatePickerDefines, VxeButtonGroupEvents } from '../../../types'
13
+ import type { VxeDatePickerConstructor, VxeDatePickerEmits, DatePickerInternalData, DatePickerReactData, VxeComponentStyleType, DatePickerMethods, VxeDatePickerPropTypes, DatePickerPrivateRef, VxeFormConstructor, VxeFormPrivateMethods, VxeFormDefines, ValueOf, VxeModalConstructor, VxeDrawerConstructor, VxeModalMethods, VxeDrawerMethods, VxeDatePickerDefines, VxeButtonGroupEvents, VxeDatePanelConstructor } from '../../../types'
11
14
  import type { VxeTableConstructor, VxeTablePrivateMethods } from '../../../types/components/table'
12
15
 
13
16
  export default defineComponent({
@@ -36,12 +39,10 @@ export default defineComponent({
36
39
  default: null
37
40
  },
38
41
  placeholder: String as PropType<VxeDatePickerPropTypes.Placeholder>,
39
- maxLength: [String, Number] as PropType<VxeDatePickerPropTypes.MaxLength>,
40
42
  autoComplete: {
41
43
  type: String as PropType<VxeDatePickerPropTypes.AutoComplete>,
42
44
  default: 'off'
43
45
  },
44
- align: String as PropType<VxeDatePickerPropTypes.Align>,
45
46
  form: String as PropType<VxeDatePickerPropTypes.Form>,
46
47
  className: String as PropType<VxeDatePickerPropTypes.ClassName>,
47
48
  size: {
@@ -89,6 +90,18 @@ export default defineComponent({
89
90
  type: [String, Number] as PropType<VxeDatePickerPropTypes.SelectDay>,
90
91
  default: () => getConfig().datePicker.selectDay
91
92
  },
93
+ showClearButton: {
94
+ type: Boolean as PropType<VxeDatePickerPropTypes.ShowClearButton>,
95
+ default: () => getConfig().datePicker.showClearButton
96
+ },
97
+ showConfirmButton: {
98
+ type: Boolean as PropType<VxeDatePickerPropTypes.ShowConfirmButton>,
99
+ default: () => getConfig().datePicker.showConfirmButton
100
+ },
101
+ autoClose: {
102
+ type: Boolean as PropType<VxeDatePickerPropTypes.AutoClose>,
103
+ default: () => getConfig().datePicker.autoClose
104
+ },
92
105
 
93
106
  prefixIcon: String as PropType<VxeDatePickerPropTypes.PrefixIcon>,
94
107
  suffixIcon: String as PropType<VxeDatePickerPropTypes.SuffixIcon>,
@@ -101,11 +114,7 @@ export default defineComponent({
101
114
  shortcutConfig: Object as PropType<VxeDatePickerPropTypes.ShortcutConfig>,
102
115
 
103
116
  // 已废弃 startWeek,被 startDay 替换
104
- startWeek: Number as PropType<VxeDatePickerPropTypes.StartDay>,
105
- // 已废弃
106
- maxlength: [String, Number] as PropType<VxeDatePickerPropTypes.MaxLength>,
107
- // 已废弃
108
- autocomplete: String as PropType<VxeDatePickerPropTypes.AutoComplete>
117
+ startWeek: Number as PropType<VxeDatePickerPropTypes.StartDay>
109
118
  },
110
119
  emits: [
111
120
  'update:modelValue',
@@ -146,26 +155,19 @@ export default defineComponent({
146
155
  panelPlacement: '',
147
156
  isActivated: false,
148
157
  inputValue: '',
149
- datetimePanelValue: null,
150
- datePanelValue: null,
151
- datePanelLabel: '',
152
- datePanelType: 'day',
153
- selectMonth: null,
154
- currentDate: null
158
+ inputLabel: ''
155
159
  })
156
160
 
157
161
  const internalData: DatePickerInternalData = {
158
- yearSize: 12,
159
- monthSize: 20,
160
- quarterSize: 8,
161
162
  hpTimeout: undefined
162
163
  }
163
164
 
164
165
  const refElem = ref() as Ref<HTMLDivElement>
165
166
  const refInputTarget = ref() as Ref<HTMLInputElement>
166
- const refInputPanel = ref() as Ref<HTMLDivElement>
167
- const refPanelWrapper = ref() as Ref<HTMLDivElement>
168
- const refInputTimeBody = ref() as Ref<HTMLDivElement>
167
+ const refInputPanel = ref<HTMLDivElement>()
168
+ const refPanelWrapper = ref<HTMLDivElement>()
169
+
170
+ const refDatePanel = ref<VxeDatePanelConstructor>()
169
171
 
170
172
  const refMaps: DatePickerPrivateRef = {
171
173
  refElem,
@@ -181,8 +183,6 @@ export default defineComponent({
181
183
  getRefMaps: () => refMaps
182
184
  } as unknown as VxeDatePickerConstructor
183
185
 
184
- let datePickerMethods = {} as DatePickerMethods
185
-
186
186
  const computeBtnTransfer = computed(() => {
187
187
  const { transfer } = props
188
188
  if (transfer === null) {
@@ -233,58 +233,49 @@ export default defineComponent({
233
233
  return props.clearable
234
234
  })
235
235
 
236
- const computeDateStartTime = computed(() => {
237
- return props.startDate ? XEUtils.toStringDate(props.startDate) : null
238
- })
239
-
240
- const computeDateEndTime = computed(() => {
241
- return props.endDate ? XEUtils.toStringDate(props.endDate) : null
242
- })
243
-
244
- const computeSupportMultiples = computed(() => {
245
- return ['date', 'week', 'month', 'quarter', 'year'].indexOf(props.type) > -1
236
+ const computeInputReadonly = computed(() => {
237
+ const { type, editable, multiple } = props
238
+ const formReadonly = computeFormReadonly.value
239
+ return formReadonly || multiple || !editable || type === 'week' || type === 'quarter'
246
240
  })
247
241
 
248
- const computeDateListValue = computed(() => {
249
- const { modelValue, multiple } = props
250
- const isDatePickerType = computeIsDatePickerType.value
251
- const dateValueFormat = computeDateValueFormat.value
252
- if (multiple && modelValue && isDatePickerType) {
253
- return XEUtils.toValueString(modelValue).split(',').map(item => {
254
- const date = parseDate(item, dateValueFormat)
255
- if (XEUtils.isValidDate(date)) {
256
- return date
257
- }
258
- return date
259
- })
242
+ const computeInpPlaceholder = computed(() => {
243
+ const { placeholder } = props
244
+ if (placeholder) {
245
+ return getFuncText(placeholder)
260
246
  }
261
- return []
247
+ const globalPlaceholder = getConfig().datePicker.placeholder
248
+ if (globalPlaceholder) {
249
+ return getFuncText(globalPlaceholder)
250
+ }
251
+ return getI18n('vxe.base.pleaseSelect')
262
252
  })
263
253
 
264
- const computeDateMultipleValue = computed(() => {
265
- const dateListValue = computeDateListValue.value
266
- const dateValueFormat = computeDateValueFormat.value
267
- return dateListValue.map(date => XEUtils.toDateString(date, dateValueFormat))
254
+ const computeInpImmediate = computed(() => {
255
+ const { immediate } = props
256
+ return immediate
268
257
  })
269
258
 
270
- const computeDateMultipleLabel = computed(() => {
271
- const dateListValue = computeDateListValue.value
272
- const dateLabelFormat = computeDateLabelFormat.value
273
- return dateListValue.map(date => XEUtils.toDateString(date, dateLabelFormat)).join(', ')
259
+ const computeShortcutOpts = computed(() => {
260
+ return Object.assign({}, getConfig().datePicker.shortcutConfig, props.shortcutConfig)
274
261
  })
275
262
 
276
- const computeLimitMaxCount = computed(() => {
277
- return props.multiple ? XEUtils.toNumber(props.limitCount) : 0
263
+ const computeShortcutList = computed(() => {
264
+ const shortcutOpts = computeShortcutOpts.value
265
+ const { options } = shortcutOpts
266
+ if (options) {
267
+ return options.map((option, index) => {
268
+ return Object.assign({
269
+ name: `${option.name || option.code || index}`
270
+ }, option)
271
+ })
272
+ }
273
+ return []
278
274
  })
279
275
 
280
- const computeOverCount = computed(() => {
281
- const { multiple } = props
282
- const limitMaxCount = computeLimitMaxCount.value
283
- const dateMultipleValue = computeDateMultipleValue.value
284
- if (multiple && limitMaxCount) {
285
- return dateMultipleValue.length >= limitMaxCount
286
- }
287
- return false
276
+ const computeDateLabelFormat = computed(() => {
277
+ const { labelFormat } = props
278
+ return labelFormat || getI18n(`vxe.input.date.labelFormat.${props.type}`)
288
279
  })
289
280
 
290
281
  const computeDateValueFormat = computed(() => {
@@ -301,360 +292,30 @@ export default defineComponent({
301
292
  return 'yyyy-MM-dd'
302
293
  })
303
294
 
304
- const computeDateValue = computed(() => {
305
- const { modelValue } = props
306
- const isDatePickerType = computeIsDatePickerType.value
307
- const dateValueFormat = computeDateValueFormat.value
308
- let val = null
309
- if (modelValue && isDatePickerType) {
310
- const date = parseDate(modelValue, dateValueFormat)
311
- if (XEUtils.isValidDate(date)) {
312
- val = date
313
- }
314
- }
315
- return val
316
- })
317
-
318
- const computeIsDisabledPrevDateBtn = computed(() => {
319
- const dateStartTime = computeDateStartTime.value
320
- const { selectMonth } = reactData
321
- if (selectMonth && dateStartTime) {
322
- return selectMonth <= dateStartTime
323
- }
324
- return false
325
- })
326
-
327
- const computeIsDisabledNextDateBtn = computed(() => {
328
- const dateEndTime = computeDateEndTime.value
329
- const { selectMonth } = reactData
330
- if (selectMonth && dateEndTime) {
331
- return selectMonth >= dateEndTime
332
- }
333
- return false
334
- })
335
-
336
- const computeDateTimeLabel = computed(() => {
337
- const { datetimePanelValue } = reactData
338
- const hasTimeSecond = computeHasTimeSecond.value
339
- if (datetimePanelValue) {
340
- return XEUtils.toDateString(datetimePanelValue, hasTimeSecond ? 'HH:mm:ss' : 'HH:mm')
341
- }
342
- return ''
343
- })
344
-
345
- const computeDateHMSTime = computed(() => {
346
- const dateValue = computeDateValue.value
347
- const isDateTimeType = computeIsDateTimeType.value
348
- return dateValue && isDateTimeType ? (dateValue.getHours() * 3600 + dateValue.getMinutes() * 60 + dateValue.getSeconds()) * 1000 : 0
349
- })
350
-
351
- const computeDateLabelFormat = computed(() => {
352
- const { labelFormat } = props
353
- const isDatePickerType = computeIsDatePickerType.value
354
- if (isDatePickerType) {
355
- return labelFormat || getI18n(`vxe.input.date.labelFormat.${props.type}`)
356
- }
357
- return null
358
- })
359
-
360
- const computeYearList = computed(() => {
361
- const { yearSize } = internalData
362
- const { selectMonth, currentDate } = reactData
363
- const years: VxeDatePickerDefines.DateYearItem[] = []
364
- if (selectMonth && currentDate) {
365
- const currFullYear = currentDate.getFullYear()
366
- const selectFullYear = selectMonth.getFullYear()
367
- const startYearDate = new Date(selectFullYear - selectFullYear % yearSize, 0, 1)
368
- for (let index = -4; index < yearSize + 4; index++) {
369
- const date = XEUtils.getWhatYear(startYearDate, index, 'first')
370
- const itemFullYear = date.getFullYear()
371
- years.push({
372
- date,
373
- isCurrent: true,
374
- isPrev: index < 0,
375
- isNow: currFullYear === itemFullYear,
376
- isNext: index >= yearSize,
377
- year: itemFullYear
378
- })
379
- }
380
- }
381
- return years
382
- })
383
-
384
- const computeSelectDatePanelObj = computed(() => {
385
- const isDatePickerType = computeIsDatePickerType.value
386
- let y = ''
387
- let m = ''
388
- if (isDatePickerType) {
389
- const { datePanelType, selectMonth } = reactData
390
- const yearList = computeYearList.value
391
- let year = ''
392
- let month
393
- if (selectMonth) {
394
- year = selectMonth.getFullYear()
395
- month = selectMonth.getMonth() + 1
396
- }
397
- if (datePanelType === 'quarter' || datePanelType === 'month') {
398
- y = getI18n('vxe.datePicker.yearTitle', [year])
399
- } else if (datePanelType === 'year') {
400
- y = yearList.length ? `${yearList[0].year} - ${yearList[yearList.length - 1].year}` : ''
401
- } else {
402
- y = getI18n('vxe.datePicker.yearTitle', [year])
403
- m = month ? getI18n(`vxe.input.date.m${month}`) : '-'
404
- }
405
- }
406
- return {
407
- y,
408
- m
409
- }
410
- })
411
-
412
295
  const computeFirstDayOfWeek = computed(() => {
413
- const { startDay, startWeek } = props
414
- return XEUtils.toNumber(XEUtils.isNumber(startDay) || XEUtils.isString(startDay) ? startDay : startWeek) as VxeDatePickerPropTypes.StartDay
415
- })
416
-
417
- const computeWeekDatas = computed(() => {
418
- const weeks: number[] = []
419
- const isDatePickerType = computeIsDatePickerType.value
420
- if (isDatePickerType) {
421
- let sWeek = computeFirstDayOfWeek.value
422
- weeks.push(sWeek)
423
- for (let index = 0; index < 6; index++) {
424
- if (sWeek >= 6) {
425
- sWeek = 0
426
- } else {
427
- sWeek++
428
- }
429
- weeks.push(sWeek)
430
- }
431
- }
432
- return weeks
296
+ const { startDay } = props
297
+ return XEUtils.toNumber(startDay) as VxeDatePickerPropTypes.StartDay
433
298
  })
434
299
 
435
- const computeDateHeaders = computed(() => {
436
- const isDatePickerType = computeIsDatePickerType.value
437
- if (isDatePickerType) {
438
- const weekDatas = computeWeekDatas.value
439
- return weekDatas.map((day) => {
440
- return {
441
- value: day,
442
- label: getI18n(`vxe.input.date.weeks.w${day}`)
443
- }
444
- })
445
- }
446
- return []
447
- })
448
-
449
- const computeWeekHeaders = computed(() => {
450
- const isDatePickerType = computeIsDatePickerType.value
451
- if (isDatePickerType) {
452
- const dateHeaders = computeDateHeaders.value
453
- return [{ label: getI18n('vxe.input.date.weeks.w') }].concat(dateHeaders)
454
- }
455
- return []
456
- })
457
-
458
- const computeYearDatas = computed(() => {
459
- const yearList = computeYearList.value
460
- return XEUtils.chunk(yearList, 4)
461
- })
462
-
463
- const computeQuarterList = computed(() => {
464
- const { quarterSize } = internalData
465
- const { selectMonth, currentDate } = reactData
466
- const quarters: VxeDatePickerDefines.DateQuarterItem[] = []
467
- if (selectMonth && currentDate) {
468
- const currFullYear = currentDate.getFullYear()
469
- const currQuarter = getDateQuarter(currentDate)
470
- const firstYear = XEUtils.getWhatYear(selectMonth, 0, 'first')
471
- const selFullYear = firstYear.getFullYear()
472
- for (let index = -2; index < quarterSize - 2; index++) {
473
- const date = XEUtils.getWhatQuarter(firstYear, index)
474
- const itemFullYear = date.getFullYear()
475
- const itemQuarter = getDateQuarter(date)
476
- const isPrev = itemFullYear < selFullYear
477
- quarters.push({
478
- date,
479
- isPrev,
480
- isCurrent: itemFullYear === selFullYear,
481
- isNow: itemFullYear === currFullYear && itemQuarter === currQuarter,
482
- isNext: !isPrev && itemFullYear > selFullYear,
483
- quarter: itemQuarter
484
- })
485
- }
486
- }
487
- return quarters
488
- })
489
-
490
- const computeQuarterDatas = computed(() => {
491
- const quarterList = computeQuarterList.value
492
- return XEUtils.chunk(quarterList, 2)
493
- })
494
-
495
- const computeMonthList = computed(() => {
496
- const { monthSize } = internalData
497
- const { selectMonth, currentDate } = reactData
498
- const months: VxeDatePickerDefines.DateMonthItem[] = []
499
- if (selectMonth && currentDate) {
500
- const currFullYear = currentDate.getFullYear()
501
- const currMonth = currentDate.getMonth()
502
- const selFullYear = XEUtils.getWhatYear(selectMonth, 0, 'first').getFullYear()
503
- for (let index = -4; index < monthSize - 4; index++) {
504
- const date = XEUtils.getWhatYear(selectMonth, 0, index)
505
- const itemFullYear = date.getFullYear()
506
- const itemMonth = date.getMonth()
507
- const isPrev = itemFullYear < selFullYear
508
- months.push({
509
- date,
510
- isPrev,
511
- isCurrent: itemFullYear === selFullYear,
512
- isNow: itemFullYear === currFullYear && itemMonth === currMonth,
513
- isNext: !isPrev && itemFullYear > selFullYear,
514
- month: itemMonth
515
- })
516
- }
517
- }
518
- return months
519
- })
520
-
521
- const computeMonthDatas = computed(() => {
522
- const monthList = computeMonthList.value
523
- return XEUtils.chunk(monthList, 4)
524
- })
525
-
526
- const computeDayList = computed(() => {
527
- const { selectMonth, currentDate } = reactData
528
- const days: VxeDatePickerDefines.DateDayItem[] = []
529
- if (selectMonth && currentDate) {
530
- const dateHMSTime = computeDateHMSTime.value
531
- const weekDatas = computeWeekDatas.value
532
- const currFullYear = currentDate.getFullYear()
533
- const currMonth = currentDate.getMonth()
534
- const currDate = currentDate.getDate()
535
- const selFullYear = selectMonth.getFullYear()
536
- const selMonth = selectMonth.getMonth()
537
- const selDay = selectMonth.getDay()
538
- const prevOffsetDate = -weekDatas.indexOf(selDay)
539
- const startDayDate = new Date(XEUtils.getWhatDay(selectMonth, prevOffsetDate).getTime() + dateHMSTime)
540
- for (let index = 0; index < 42; index++) {
541
- const date = XEUtils.getWhatDay(startDayDate, index)
542
- const itemFullYear = date.getFullYear()
543
- const itemMonth = date.getMonth()
544
- const itemDate = date.getDate()
545
- const isPrev = date < selectMonth
546
- days.push({
547
- date,
548
- isPrev,
549
- isCurrent: itemFullYear === selFullYear && itemMonth === selMonth,
550
- isNow: itemFullYear === currFullYear && itemMonth === currMonth && itemDate === currDate,
551
- isNext: !isPrev && selMonth !== itemMonth,
552
- label: itemDate
553
- })
554
- }
555
- }
556
- return days
557
- })
558
-
559
- const computeDayDatas = computed(() => {
560
- const dayList = computeDayList.value
561
- return XEUtils.chunk(dayList, 7)
562
- })
563
-
564
- const computeWeekDates = computed(() => {
565
- const dayDatas = computeDayDatas.value
566
- const firstDayOfWeek = computeFirstDayOfWeek.value
567
- return dayDatas.map((list) => {
568
- const firstItem = list[0]
569
- const item: VxeDatePickerDefines.DateDayItem = {
570
- date: firstItem.date,
571
- isWeekNumber: true,
572
- isPrev: false,
573
- isCurrent: false,
574
- isNow: false,
575
- isNext: false,
576
- label: XEUtils.getYearWeek(firstItem.date, firstDayOfWeek)
577
- }
578
- return [item].concat(list)
579
- })
580
- })
581
-
582
- const computeHourList = computed(() => {
583
- const list: VxeDatePickerDefines.DateHourMinuteSecondItem[] = []
584
- const isDateTimeType = computeIsDateTimeType.value
585
- if (isDateTimeType) {
586
- for (let index = 0; index < 24; index++) {
587
- list.push({
588
- value: index,
589
- label: ('' + index).padStart(2, '0')
590
- })
591
- }
592
- }
593
- return list
594
- })
595
-
596
- const computeMinuteList = computed(() => {
597
- const list: VxeDatePickerDefines.DateHourMinuteSecondItem[] = []
598
- const isDateTimeType = computeIsDateTimeType.value
599
- if (isDateTimeType) {
600
- for (let index = 0; index < 60; index++) {
601
- list.push({
602
- value: index,
603
- label: ('' + index).padStart(2, '0')
604
- })
605
- }
606
- }
607
- return list
608
- })
609
-
610
- const computeHasTimeMinute = computed(() => {
611
- const dateValueFormat = computeDateValueFormat.value
612
- return !/HH/.test(dateValueFormat) || /mm/.test(dateValueFormat)
613
- })
614
-
615
- const computeHasTimeSecond = computed(() => {
300
+ const computePanelLabel = computed(() => {
301
+ const { type, multiple } = props
302
+ const { inputValue } = reactData
303
+ const dateLabelFormat = computeDateLabelFormat.value
616
304
  const dateValueFormat = computeDateValueFormat.value
617
- return !/HH/.test(dateValueFormat) || /ss/.test(dateValueFormat)
618
- })
619
-
620
- const computeSecondList = computed(() => {
621
- const minuteList = computeMinuteList.value
622
- return minuteList
623
- })
624
-
625
- const computeInputReadonly = computed(() => {
626
- const { type, editable, multiple } = props
627
- const formReadonly = computeFormReadonly.value
628
- return formReadonly || multiple || !editable || type === 'week' || type === 'quarter'
629
- })
630
-
631
- const computeDatePickerType = computed(() => {
632
- return 'text'
633
- })
634
-
635
- const computeInpPlaceholder = computed(() => {
636
- const { placeholder } = props
637
- if (placeholder) {
638
- return getFuncText(placeholder)
639
- }
640
- const globalPlaceholder = getConfig().datePicker.placeholder
641
- if (globalPlaceholder) {
642
- return getFuncText(globalPlaceholder)
643
- }
644
- return getI18n('vxe.base.pleaseSelect')
645
- })
646
-
647
- const computeInpImmediate = computed(() => {
648
- const { immediate } = props
649
- return immediate
650
- })
651
-
652
- const computeShortcutOpts = computed(() => {
653
- return Object.assign({}, getConfig().datePicker.shortcutConfig, props.shortcutConfig)
305
+ const firstDayOfWeek = computeFirstDayOfWeek.value
306
+ const vals: string[] = inputValue ? (multiple ? inputValue.split(',') : [inputValue]) : []
307
+ return vals.map(val => {
308
+ const dateObj = parseDateObj(val, type, {
309
+ valueFormat: dateValueFormat,
310
+ labelFormat: dateLabelFormat,
311
+ firstDay: firstDayOfWeek
312
+ })
313
+ return dateObj.label
314
+ }).join(', ')
654
315
  })
655
316
 
656
- const updateModelValue = (modelValue: VxeDatePickerPropTypes.ModelValue | undefined) => {
657
- const { isActivated, visiblePanel } = reactData
317
+ const updateModelValue = () => {
318
+ const { modelValue } = props
658
319
  let val: any = ''
659
320
  if (modelValue) {
660
321
  if (XEUtils.isNumber(modelValue) && /^[0-9]{11,15}$/.test(`${modelValue}`)) {
@@ -664,23 +325,6 @@ export default defineComponent({
664
325
  }
665
326
  }
666
327
  reactData.inputValue = val
667
- if (isActivated && visiblePanel) {
668
- dateOpenPanel()
669
- }
670
- }
671
-
672
- const parseDate = (value: VxeDatePickerPropTypes.ModelValue, format: string) => {
673
- const { type, multiple } = props
674
- if (type === 'time') {
675
- return toStringTimeDate(value)
676
- }
677
- if (XEUtils.isArray(value)) {
678
- return XEUtils.toStringDate(value[0], format)
679
- }
680
- if (XEUtils.isString(value)) {
681
- return XEUtils.toStringDate(multiple ? XEUtils.last(value.split(',')) : value, format)
682
- }
683
- return XEUtils.toStringDate(value, format)
684
328
  }
685
329
 
686
330
  const triggerEvent = (evnt: Event & { type: 'input' | 'change' | 'keydown' | 'keyup' | 'click' | 'focus' | 'blur' }) => {
@@ -688,10 +332,11 @@ export default defineComponent({
688
332
  dispatchEvent(evnt.type, { value: inputValue }, evnt)
689
333
  }
690
334
 
691
- const handleChange = (value: string, evnt: Event | { type: string }) => {
335
+ const handleChange = (value: string | number | Date, evnt: Event | { type: string }) => {
336
+ const { modelValue } = props
692
337
  reactData.inputValue = value
693
338
  emit('update:modelValue', value)
694
- if (XEUtils.toValueString(props.modelValue) !== value) {
339
+ if (XEUtils.toValueString(modelValue) !== value) {
695
340
  dispatchEvent('change', { value }, evnt as any)
696
341
  // 自动更新校验状态
697
342
  if ($xeForm && formItemInfo) {
@@ -701,18 +346,10 @@ export default defineComponent({
701
346
  }
702
347
 
703
348
  const inputEvent = (evnt: Event & { type: 'input' }) => {
704
- const isDatePickerType = computeIsDatePickerType.value
705
- const inpImmediate = computeInpImmediate.value
706
349
  const inputElem = evnt.target as HTMLInputElement
707
350
  const value = inputElem.value
708
- reactData.inputValue = value
709
- if (!isDatePickerType) {
710
- if (inpImmediate) {
711
- handleChange(value, evnt)
712
- } else {
713
- dispatchEvent('input', { value }, evnt)
714
- }
715
- }
351
+ reactData.inputLabel = value
352
+ dispatchEvent('input', { value }, evnt)
716
353
  }
717
354
 
718
355
  const changeEvent = (evnt: Event & { type: 'change' }) => {
@@ -752,661 +389,117 @@ export default defineComponent({
752
389
  const clearValueEvent = (evnt: Event, value: VxeDatePickerPropTypes.ModelValue) => {
753
390
  const isDatePickerType = computeIsDatePickerType.value
754
391
  if (isDatePickerType) {
755
- hidePanel()
756
- }
757
- handleChange('', evnt)
758
- dispatchEvent('clear', { value }, evnt)
759
- }
760
-
761
- const clickSuffixEvent = (evnt: Event) => {
762
- const isDisabled = computeIsDisabled.value
763
- if (!isDisabled) {
764
- const { inputValue } = reactData
765
- dispatchEvent('suffix-click', { value: inputValue }, evnt)
766
- }
767
- }
768
-
769
- const dateParseValue = (value?: VxeDatePickerPropTypes.ModelValue) => {
770
- const { type } = props
771
- const dateLabelFormat = computeDateLabelFormat.value
772
- const dateValueFormat = computeDateValueFormat.value
773
- const firstDayOfWeek = computeFirstDayOfWeek.value
774
- let dValue: Date | null = null
775
- let dLabel = ''
776
- if (value) {
777
- dValue = parseDate(value, dateValueFormat)
778
- }
779
- if (XEUtils.isValidDate(dValue)) {
780
- dLabel = XEUtils.toDateString(dValue, dateLabelFormat, { firstDay: firstDayOfWeek })
781
- // 周选择器,由于年份和第几周是冲突的行为,所以需要特殊处理,判断是否跨年,例如
782
- // '2024-12-31' 'yyyy-MM-dd W' >> '2024-12-31 1'
783
- // '2025-01-01' 'yyyy-MM-dd W' >> '2025-01-01 1'
784
- if (dateLabelFormat && type === 'week') {
785
- const weekNum = XEUtils.getYearWeek(dValue, firstDayOfWeek)
786
- const weekDate = XEUtils.getWhatWeek(dValue, 0, weekNum === 1 ? ((6 + firstDayOfWeek) % 7) as VxeDatePickerPropTypes.StartDay : firstDayOfWeek, firstDayOfWeek)
787
- const weekFullYear = weekDate.getFullYear()
788
- if (weekFullYear !== dValue.getFullYear()) {
789
- const yyIndex = dateLabelFormat.indexOf('yyyy')
790
- if (yyIndex > -1) {
791
- const yyNum = Number(dLabel.substring(yyIndex, yyIndex + 4))
792
- if (yyNum && !isNaN(yyNum)) {
793
- dLabel = dLabel.replace(`${yyNum}`, `${weekFullYear}`)
794
- }
795
- }
796
- }
797
- }
798
- } else {
799
- dValue = null
800
- }
801
- reactData.datePanelValue = dValue
802
- reactData.datePanelLabel = dLabel
803
- }
804
-
805
- /**
806
- * 值变化时处理
807
- */
808
- const changeValue = () => {
809
- const isDatePickerType = computeIsDatePickerType.value
810
- const { inputValue } = reactData
811
- if (isDatePickerType) {
812
- dateParseValue(inputValue)
813
- reactData.inputValue = props.multiple ? computeDateMultipleLabel.value : reactData.datePanelLabel
814
- }
815
- }
816
-
817
- /**
818
- * 检查初始值
819
- */
820
- const initValue = () => {
821
- const isDatePickerType = computeIsDatePickerType.value
822
- updateModelValue(props.modelValue)
823
- if (isDatePickerType) {
824
- changeValue()
825
- }
826
- }
827
-
828
- const dateRevert = () => {
829
- reactData.inputValue = props.multiple ? computeDateMultipleLabel.value : reactData.datePanelLabel
830
- }
831
-
832
- const dateCheckMonth = (date: Date) => {
833
- const firstDayOfWeek = computeFirstDayOfWeek.value
834
- const weekNum = XEUtils.getYearWeek(date, firstDayOfWeek)
835
- const weekStartDate = XEUtils.getWhatWeek(date, 0, firstDayOfWeek, firstDayOfWeek)
836
- const month = XEUtils.getWhatMonth(weekNum === 1 ? XEUtils.getWhatDay(weekStartDate, 6) : date, 0, 'first')
837
- if (!XEUtils.isEqual(month, reactData.selectMonth)) {
838
- reactData.selectMonth = month
839
- }
840
- }
841
-
842
- const dateChange = (date: Date, isReload?: boolean) => {
843
- const { modelValue, multiple } = props
844
- const { datetimePanelValue } = reactData
845
- const isDateTimeType = computeIsDateTimeType.value
846
- const dateValueFormat = computeDateValueFormat.value
847
- const firstDayOfWeek = computeFirstDayOfWeek.value
848
- if (props.type === 'week') {
849
- const sWeek = XEUtils.toNumber(props.selectDay) as VxeDatePickerPropTypes.SelectDay
850
- date = XEUtils.getWhatWeek(date, 0, sWeek, firstDayOfWeek)
851
- } else if (isDateTimeType) {
852
- if (datetimePanelValue) {
853
- date.setHours(datetimePanelValue.getHours())
854
- date.setMinutes(datetimePanelValue.getMinutes())
855
- date.setSeconds(datetimePanelValue.getSeconds())
856
- }
857
- }
858
- const inpVal = XEUtils.toDateString(date, dateValueFormat, { firstDay: firstDayOfWeek })
859
- dateCheckMonth(date)
860
- if (multiple) {
861
- const overCount = computeOverCount.value
862
- // 如果为多选
863
- if (isDateTimeType) {
864
- // 如果是datetime特殊类型
865
- const dateListValue = isReload ? [] : [...computeDateListValue.value]
866
- const datetimeRest: Date[] = []
867
- const eqIndex = XEUtils.findIndexOf(dateListValue, val => XEUtils.isDateSame(date, val, 'yyyyMMdd'))
868
- if (eqIndex === -1) {
869
- if (overCount) {
870
- // 如果超出最大多选数量
871
- return
872
- }
873
- dateListValue.push(date)
874
- } else {
875
- dateListValue.splice(eqIndex, 1)
876
- }
877
- dateListValue.forEach(item => {
878
- if (item) {
879
- if (datetimePanelValue) {
880
- item.setHours(datetimePanelValue.getHours())
881
- item.setMinutes(datetimePanelValue.getMinutes())
882
- item.setSeconds(datetimePanelValue.getSeconds())
883
- }
884
- datetimeRest.push(item)
885
- }
886
- })
887
- handleChange(datetimeRest.map(date => XEUtils.toDateString(date, dateValueFormat)).join(','), { type: 'update' })
888
- } else {
889
- const dateMultipleValue = isReload ? [] : computeDateMultipleValue.value
890
- // 如果是日期类型
891
- if (dateMultipleValue.some(val => XEUtils.isEqual(val, inpVal))) {
892
- handleChange(dateMultipleValue.filter(val => !XEUtils.isEqual(val, inpVal)).join(','), { type: 'update' })
893
- } else {
894
- if (overCount) {
895
- // 如果超出最大多选数量
896
- return
897
- }
898
- handleChange(dateMultipleValue.concat([inpVal]).join(','), { type: 'update' })
899
- }
900
- }
901
- } else {
902
- // 如果为单选
903
- if (!XEUtils.isEqual(modelValue, inpVal)) {
904
- handleChange(inpVal, { type: 'update' })
905
- }
906
- }
907
- }
908
-
909
- const afterCheckValue = () => {
910
- const { type } = props
911
- const { inputValue, datetimePanelValue } = reactData
912
- const dateLabelFormat = computeDateLabelFormat.value
913
- const inputReadonly = computeInputReadonly.value
914
- if (!inputReadonly) {
915
- if (inputValue) {
916
- let inpDateVal: VxeDatePickerPropTypes.ModelValue = parseDate(inputValue, dateLabelFormat as string)
917
- if (XEUtils.isValidDate(inpDateVal)) {
918
- if (type === 'time') {
919
- inpDateVal = XEUtils.toDateString(inpDateVal, dateLabelFormat)
920
- if (inputValue !== inpDateVal) {
921
- handleChange(inpDateVal, { type: 'check' })
922
- }
923
- reactData.inputValue = inpDateVal
924
- } else {
925
- let isChange = false
926
- const firstDayOfWeek = computeFirstDayOfWeek.value
927
- if (type === 'datetime') {
928
- const dateValue = computeDateValue.value
929
- if (inputValue !== XEUtils.toDateString(dateValue, dateLabelFormat) || inputValue !== XEUtils.toDateString(inpDateVal, dateLabelFormat)) {
930
- isChange = true
931
- if (datetimePanelValue) {
932
- datetimePanelValue.setHours(inpDateVal.getHours())
933
- datetimePanelValue.setMinutes(inpDateVal.getMinutes())
934
- datetimePanelValue.setSeconds(inpDateVal.getSeconds())
935
- }
936
- }
937
- } else {
938
- isChange = true
939
- }
940
- reactData.inputValue = XEUtils.toDateString(inpDateVal, dateLabelFormat, { firstDay: firstDayOfWeek })
941
- if (isChange) {
942
- dateChange(inpDateVal)
943
- }
944
- }
945
- } else {
946
- dateRevert()
947
- }
948
- } else {
949
- handleChange('', { type: 'check' })
950
- }
951
- }
952
- }
953
-
954
- const blurEvent = (evnt: Event & { type: 'blur' }) => {
955
- const { inputValue } = reactData
956
- const inpImmediate = computeInpImmediate.value
957
- const value = inputValue
958
- if (!inpImmediate) {
959
- handleChange(value, evnt)
960
- }
961
- afterCheckValue()
962
- if (!reactData.visiblePanel) {
963
- reactData.isActivated = false
964
- }
965
- dispatchEvent('blur', { value }, evnt)
966
- // 自动更新校验状态
967
- if ($xeForm && formItemInfo) {
968
- $xeForm.triggerItemEvent(evnt, formItemInfo.itemConfig.field, value)
969
- }
970
- }
971
-
972
- const keydownEvent = (evnt: KeyboardEvent & { type: 'keydown' }) => {
973
- triggerEvent(evnt)
974
- }
975
-
976
- const keyupEvent = (evnt: KeyboardEvent & { type: 'keyup' }) => {
977
- triggerEvent(evnt)
978
- }
979
-
980
- // 日期
981
- const dateMonthHandle = (date: Date, offsetMonth: number) => {
982
- const firstDayOfWeek = computeFirstDayOfWeek.value
983
- const weekNum = XEUtils.getYearWeek(date, firstDayOfWeek)
984
- const weekStartDate = XEUtils.getWhatWeek(date, 0, firstDayOfWeek, firstDayOfWeek)
985
- const month = XEUtils.getWhatMonth(weekNum === 1 ? XEUtils.getWhatDay(weekStartDate, 6) : date, offsetMonth, 'first')
986
- reactData.selectMonth = month
987
- }
988
-
989
- const dateNowHandle = () => {
990
- const { type } = props
991
- const firstDayOfWeek = computeFirstDayOfWeek.value
992
- let currentDate = new Date()
993
- switch (type) {
994
- case 'week':
995
- currentDate = XEUtils.getWhatWeek(currentDate, 0, firstDayOfWeek)
996
- break
997
- case 'datetime':
998
- currentDate = new Date()
999
- reactData.datetimePanelValue = new Date()
1000
- break
1001
- default:
1002
- currentDate = XEUtils.getWhatDay(Date.now(), 0, 'first')
1003
- break
1004
- }
1005
- reactData.currentDate = currentDate
1006
- dateMonthHandle(currentDate, 0)
1007
- }
1008
-
1009
- const dateToggleYearTypeEvent = () => {
1010
- reactData.datePanelType = 'year'
1011
- }
1012
-
1013
- const dateToggleMonthTypeEvent = () => {
1014
- let { datePanelType } = reactData
1015
- if (datePanelType === 'month' || datePanelType === 'quarter') {
1016
- datePanelType = 'year'
1017
- } else {
1018
- datePanelType = 'month'
1019
- }
1020
- reactData.datePanelType = datePanelType
1021
- }
1022
-
1023
- const datePrevEvent = (evnt: Event) => {
1024
- const { type } = props
1025
- const { datePanelType, selectMonth, inputValue } = reactData
1026
- const { yearSize } = internalData
1027
- const value = inputValue
1028
- const isDisabledPrevDateBtn = computeIsDisabledPrevDateBtn.value
1029
- if (!isDisabledPrevDateBtn) {
1030
- let viewDate
1031
- if (type === 'year') {
1032
- viewDate = XEUtils.getWhatYear(selectMonth, -yearSize, 'first')
1033
- } else if (type === 'month' || type === 'quarter') {
1034
- if (datePanelType === 'year') {
1035
- viewDate = XEUtils.getWhatYear(selectMonth, -yearSize, 'first')
1036
- } else {
1037
- viewDate = XEUtils.getWhatYear(selectMonth, -1, 'first')
1038
- }
1039
- } else {
1040
- if (datePanelType === 'year') {
1041
- viewDate = XEUtils.getWhatYear(selectMonth, -yearSize, 'first')
1042
- } else if (datePanelType === 'month') {
1043
- viewDate = XEUtils.getWhatYear(selectMonth, -1, 'first')
1044
- } else {
1045
- viewDate = XEUtils.getWhatMonth(selectMonth, -1, 'first')
1046
- }
1047
- }
1048
- reactData.selectMonth = viewDate
1049
- dispatchEvent('date-prev', { viewType: datePanelType, viewDate, value, type }, evnt)
1050
- }
1051
- }
1052
-
1053
- const dateTodayMonthEvent = (evnt: Event) => {
1054
- dateNowHandle()
1055
- dateChange(reactData.currentDate, true)
1056
- if (!props.multiple) {
1057
- hidePanel()
1058
- }
1059
- dispatchEvent('date-today', { type: props.type }, evnt)
1060
- }
1061
-
1062
- const dateNextEvent = (evnt: Event) => {
1063
- const { type } = props
1064
- const { datePanelType, selectMonth, inputValue } = reactData
1065
- const { yearSize } = internalData
1066
- const value = inputValue
1067
- const isDisabledNextDateBtn = computeIsDisabledNextDateBtn.value
1068
- if (!isDisabledNextDateBtn) {
1069
- let viewDate
1070
- if (type === 'year') {
1071
- viewDate = XEUtils.getWhatYear(selectMonth, yearSize, 'first')
1072
- } else if (type === 'month' || type === 'quarter') {
1073
- if (datePanelType === 'year') {
1074
- viewDate = XEUtils.getWhatYear(selectMonth, yearSize, 'first')
1075
- } else {
1076
- viewDate = XEUtils.getWhatYear(selectMonth, 1, 'first')
1077
- }
1078
- } else {
1079
- if (datePanelType === 'year') {
1080
- viewDate = XEUtils.getWhatYear(selectMonth, yearSize, 'first')
1081
- } else if (datePanelType === 'month') {
1082
- viewDate = XEUtils.getWhatYear(selectMonth, 1, 'first')
1083
- } else {
1084
- viewDate = XEUtils.getWhatMonth(selectMonth, 1, 'first')
1085
- }
1086
- }
1087
- reactData.selectMonth = viewDate
1088
- dispatchEvent('date-next', { viewType: datePanelType, value, type }, evnt)
1089
- }
1090
- }
1091
-
1092
- const isDateDisabled = (item: { date: Date }) => {
1093
- const { disabledMethod } = props
1094
- const { datePanelType } = reactData
1095
- const dateStartTime = computeDateStartTime.value
1096
- const dateEndTime = computeDateEndTime.value
1097
- const { date } = item
1098
- if (dateStartTime && dateStartTime.getTime() > date.getTime()) {
1099
- return true
1100
- }
1101
- if (dateEndTime && dateEndTime.getTime() < date.getTime()) {
1102
- return true
1103
- }
1104
- if (disabledMethod) {
1105
- return disabledMethod({ type: datePanelType, viewType: datePanelType, date, $datePicker: $xeDatePicker })
1106
- }
1107
- return false
1108
- }
1109
-
1110
- const dateSelectItem = (date: Date) => {
1111
- const { type, multiple } = props
1112
- const { datePanelType } = reactData
1113
- if (type === 'month') {
1114
- if (datePanelType === 'year') {
1115
- reactData.datePanelType = 'month'
1116
- dateCheckMonth(date)
1117
- } else {
1118
- dateChange(date)
1119
- if (!multiple) {
1120
- hidePanel()
1121
- }
1122
- }
1123
- } else if (type === 'year') {
1124
- dateChange(date)
1125
- if (!multiple) {
1126
- hidePanel()
1127
- }
1128
- } else if (type === 'quarter') {
1129
- if (datePanelType === 'year') {
1130
- reactData.datePanelType = 'quarter'
1131
- dateCheckMonth(date)
1132
- } else {
1133
- dateChange(date)
1134
- if (!multiple) {
1135
- hidePanel()
1136
- }
1137
- }
1138
- } else {
1139
- if (datePanelType === 'month') {
1140
- reactData.datePanelType = type === 'week' ? type : 'day'
1141
- dateCheckMonth(date)
1142
- } else if (datePanelType === 'year') {
1143
- reactData.datePanelType = 'month'
1144
- dateCheckMonth(date)
1145
- } else {
1146
- dateChange(date)
1147
- if (type === 'datetime') {
1148
- // 日期带时间
1149
- } else {
1150
- if (!multiple) {
1151
- hidePanel()
1152
- }
1153
- }
1154
- }
1155
- }
1156
- }
1157
-
1158
- const dateSelectEvent = (item: VxeDatePickerDefines.DateYearItem | VxeDatePickerDefines.DateQuarterItem | VxeDatePickerDefines.DateMonthItem | VxeDatePickerDefines.DateDayItem) => {
1159
- if (!isDateDisabled(item)) {
1160
- dateSelectItem(item.date)
1161
- }
1162
- }
1163
-
1164
- const dateMoveDay = (offsetDay: Date) => {
1165
- if (!isDateDisabled({ date: offsetDay })) {
1166
- const dayList = computeDayList.value
1167
- if (!dayList.some((item) => XEUtils.isDateSame(item.date, offsetDay, 'yyyyMMdd'))) {
1168
- dateCheckMonth(offsetDay)
1169
- }
1170
- dateParseValue(offsetDay)
1171
- }
1172
- }
1173
-
1174
- const dateMoveYear = (offsetYear: Date) => {
1175
- if (!isDateDisabled({ date: offsetYear })) {
1176
- const yearList = computeYearList.value
1177
- if (!yearList.some((item) => XEUtils.isDateSame(item.date, offsetYear, 'yyyy'))) {
1178
- dateCheckMonth(offsetYear)
1179
- }
1180
- dateParseValue(offsetYear)
1181
- }
1182
- }
1183
-
1184
- const dateMoveQuarter = (offsetQuarter: Date) => {
1185
- if (!isDateDisabled({ date: offsetQuarter })) {
1186
- const quarterList = computeQuarterList.value
1187
- if (!quarterList.some((item) => XEUtils.isDateSame(item.date, offsetQuarter, 'yyyyq'))) {
1188
- dateCheckMonth(offsetQuarter)
1189
- }
1190
- dateParseValue(offsetQuarter)
392
+ hidePanel()
1191
393
  }
394
+ handleChange('', evnt)
395
+ dispatchEvent('clear', { value }, evnt)
1192
396
  }
1193
397
 
1194
- const dateMoveMonth = (offsetMonth: Date) => {
1195
- if (!isDateDisabled({ date: offsetMonth })) {
1196
- const monthList = computeMonthList.value
1197
- if (!monthList.some((item) => XEUtils.isDateSame(item.date, offsetMonth, 'yyyyMM'))) {
1198
- dateCheckMonth(offsetMonth)
1199
- }
1200
- dateParseValue(offsetMonth)
398
+ const clickSuffixEvent = (evnt: Event) => {
399
+ const isDisabled = computeIsDisabled.value
400
+ if (!isDisabled) {
401
+ const { inputValue } = reactData
402
+ dispatchEvent('suffix-click', { value: inputValue }, evnt)
1201
403
  }
1202
404
  }
1203
405
 
1204
- const dateMouseenterEvent = (item: VxeDatePickerDefines.DateYearItem | VxeDatePickerDefines.DateQuarterItem | VxeDatePickerDefines.DateMonthItem | VxeDatePickerDefines.DateDayItem) => {
1205
- if (!isDateDisabled(item)) {
1206
- const { datePanelType } = reactData
1207
- if (datePanelType === 'month') {
1208
- dateMoveMonth(item.date)
1209
- } else if (datePanelType === 'quarter') {
1210
- dateMoveQuarter(item.date)
1211
- } else if (datePanelType === 'year') {
1212
- dateMoveYear(item.date)
1213
- } else {
1214
- dateMoveDay(item.date)
1215
- }
406
+ const blurEvent = (evnt: Event & { type: 'blur' }) => {
407
+ const $datePanel = refDatePanel.value
408
+ const { inputValue } = reactData
409
+ const inpImmediate = computeInpImmediate.value
410
+ const value = inputValue
411
+ if (!inpImmediate) {
412
+ handleChange(value, evnt)
1216
413
  }
1217
- }
1218
-
1219
- const updateTimePos = (liElem: Element) => {
1220
- if (liElem) {
1221
- const height = (liElem as HTMLElement).offsetHeight
1222
- const ulElem = liElem.parentNode as HTMLElement
1223
- ulElem.scrollTop = (liElem as HTMLElement).offsetTop - height * 4
414
+ if (!reactData.visiblePanel) {
415
+ reactData.isActivated = false
416
+ }
417
+ if ($datePanel) {
418
+ $datePanel.checkValue(reactData.inputLabel)
419
+ }
420
+ dispatchEvent('blur', { value }, evnt)
421
+ // 自动更新校验状态
422
+ if ($xeForm && formItemInfo) {
423
+ $xeForm.triggerItemEvent(evnt, formItemInfo.itemConfig.field, value)
1224
424
  }
1225
425
  }
1226
426
 
1227
- const dateTimeChangeEvent = (evnt: Event) => {
1228
- const { datetimePanelValue } = reactData
1229
- reactData.datetimePanelValue = datetimePanelValue ? new Date(datetimePanelValue.getTime()) : new Date()
1230
- updateTimePos(evnt.currentTarget as HTMLLIElement)
427
+ const keydownEvent = (evnt: KeyboardEvent & { type: 'keydown' }) => {
428
+ triggerEvent(evnt)
1231
429
  }
1232
430
 
1233
- const dateHourEvent = (evnt: MouseEvent, item: VxeDatePickerDefines.DateHourMinuteSecondItem) => {
1234
- const { datetimePanelValue } = reactData
1235
- if (datetimePanelValue) {
1236
- datetimePanelValue.setHours(item.value)
1237
- }
1238
- dateTimeChangeEvent(evnt)
431
+ const keyupEvent = (evnt: KeyboardEvent & { type: 'keyup' }) => {
432
+ triggerEvent(evnt)
1239
433
  }
1240
434
 
1241
- // const dateClearEvent = (evnt: MouseEvent) => {
1242
- // const value = ''
1243
- // handleChange(value, evnt)
1244
- // dispatchEvent('clear', { value }, evnt)
1245
- // }
1246
-
1247
- const dateConfirmEvent = () => {
1248
- const { multiple } = props
1249
- const { datetimePanelValue } = reactData
1250
- const dateValue = computeDateValue.value
1251
- const isDateTimeType = computeIsDateTimeType.value
1252
- if (isDateTimeType) {
1253
- const dateValueFormat = computeDateValueFormat.value
1254
- if (multiple) {
1255
- // 如果为多选
1256
- const dateMultipleValue = computeDateMultipleValue.value
1257
- if (isDateTimeType) {
1258
- // 如果是datetime特殊类型
1259
- const dateListValue = [...computeDateListValue.value]
1260
- const datetimeRest: Date[] = []
1261
- dateListValue.forEach(item => {
1262
- if (item) {
1263
- if (datetimePanelValue) {
1264
- item.setHours(datetimePanelValue.getHours())
1265
- item.setMinutes(datetimePanelValue.getMinutes())
1266
- item.setSeconds(datetimePanelValue.getSeconds())
1267
- }
1268
- datetimeRest.push(item)
1269
- }
1270
- })
1271
- handleChange(datetimeRest.map(date => XEUtils.toDateString(date, dateValueFormat)).join(','), { type: 'update' })
1272
- } else {
1273
- // 如果是日期类型
1274
- handleChange(dateMultipleValue.join(','), { type: 'update' })
1275
- }
1276
- } else {
1277
- dateChange(dateValue || reactData.currentDate)
1278
- }
435
+ const confirmEvent = (evnt: MouseEvent) => {
436
+ const $datePanel = refDatePanel.value
437
+ if ($datePanel) {
438
+ $datePanel.confirmByEvent(evnt)
1279
439
  }
1280
440
  hidePanel()
1281
441
  }
1282
442
 
1283
- const dateMinuteEvent = (evnt: MouseEvent, item: VxeDatePickerDefines.DateHourMinuteSecondItem) => {
1284
- const { datetimePanelValue } = reactData
1285
- if (datetimePanelValue) {
1286
- datetimePanelValue.setMinutes(item.value)
1287
- }
1288
- dateTimeChangeEvent(evnt)
1289
- }
1290
-
1291
- const dateSecondEvent = (evnt: MouseEvent, item: VxeDatePickerDefines.DateHourMinuteSecondItem) => {
1292
- const { datetimePanelValue } = reactData
1293
- if (datetimePanelValue) {
1294
- datetimePanelValue.setSeconds(item.value)
443
+ const panelChangeEvent = (params: any) => {
444
+ const { multiple } = props
445
+ const { value, $event } = params
446
+ const isDateTimeType = computeIsDateTimeType.value
447
+ handleChange(value, $event)
448
+ if (!multiple && !isDateTimeType) {
449
+ hidePanel()
1295
450
  }
1296
- dateTimeChangeEvent(evnt)
1297
451
  }
1298
452
 
1299
- const dateOffsetEvent = (evnt: KeyboardEvent) => {
1300
- const { isActivated, datePanelValue, datePanelType } = reactData
1301
- if (isActivated) {
1302
- evnt.preventDefault()
1303
- const isLeftArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_LEFT)
1304
- const isUpArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_UP)
1305
- const isRightArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_RIGHT)
1306
- const isDwArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_DOWN)
1307
- if (datePanelType === 'year') {
1308
- let offsetYear = XEUtils.getWhatYear(datePanelValue || Date.now(), 0, 'first')
1309
- if (isLeftArrow) {
1310
- offsetYear = XEUtils.getWhatYear(offsetYear, -1)
1311
- } else if (isUpArrow) {
1312
- offsetYear = XEUtils.getWhatYear(offsetYear, -4)
1313
- } else if (isRightArrow) {
1314
- offsetYear = XEUtils.getWhatYear(offsetYear, 1)
1315
- } else if (isDwArrow) {
1316
- offsetYear = XEUtils.getWhatYear(offsetYear, 4)
1317
- }
1318
- dateMoveYear(offsetYear)
1319
- } else if (datePanelType === 'quarter') {
1320
- let offsetQuarter = XEUtils.getWhatQuarter(datePanelValue || Date.now(), 0, 'first')
1321
- if (isLeftArrow) {
1322
- offsetQuarter = XEUtils.getWhatQuarter(offsetQuarter, -1)
1323
- } else if (isUpArrow) {
1324
- offsetQuarter = XEUtils.getWhatQuarter(offsetQuarter, -2)
1325
- } else if (isRightArrow) {
1326
- offsetQuarter = XEUtils.getWhatQuarter(offsetQuarter, 1)
1327
- } else if (isDwArrow) {
1328
- offsetQuarter = XEUtils.getWhatQuarter(offsetQuarter, 2)
1329
- }
1330
- dateMoveQuarter(offsetQuarter)
1331
- } else if (datePanelType === 'month') {
1332
- let offsetMonth = XEUtils.getWhatMonth(datePanelValue || Date.now(), 0, 'first')
1333
- if (isLeftArrow) {
1334
- offsetMonth = XEUtils.getWhatMonth(offsetMonth, -1)
1335
- } else if (isUpArrow) {
1336
- offsetMonth = XEUtils.getWhatMonth(offsetMonth, -4)
1337
- } else if (isRightArrow) {
1338
- offsetMonth = XEUtils.getWhatMonth(offsetMonth, 1)
1339
- } else if (isDwArrow) {
1340
- offsetMonth = XEUtils.getWhatMonth(offsetMonth, 4)
1341
- }
1342
- dateMoveMonth(offsetMonth)
1343
- } else if (datePanelType === 'week') {
1344
- let offsetDay = datePanelValue || XEUtils.getWhatDay(Date.now(), 0, 'first')
1345
- const firstDayOfWeek = computeFirstDayOfWeek.value
1346
- if (isUpArrow) {
1347
- offsetDay = XEUtils.getWhatWeek(offsetDay, -1, firstDayOfWeek)
1348
- } else if (isDwArrow) {
1349
- offsetDay = XEUtils.getWhatWeek(offsetDay, 1, firstDayOfWeek)
1350
- }
1351
- dateMoveDay(offsetDay)
1352
- } else {
1353
- let offsetDay = datePanelValue || XEUtils.getWhatDay(Date.now(), 0, 'first')
1354
- if (isLeftArrow) {
1355
- offsetDay = XEUtils.getWhatDay(offsetDay, -1)
1356
- } else if (isUpArrow) {
1357
- offsetDay = XEUtils.getWhatWeek(offsetDay, -1, offsetDay.getDay() as VxeDatePickerPropTypes.StartDay)
1358
- } else if (isRightArrow) {
1359
- offsetDay = XEUtils.getWhatDay(offsetDay, 1)
1360
- } else if (isDwArrow) {
1361
- offsetDay = XEUtils.getWhatWeek(offsetDay, 1, offsetDay.getDay() as VxeDatePickerPropTypes.StartDay)
453
+ // 全局事件
454
+ const handleGlobalMousedownEvent = (evnt: Event) => {
455
+ const $datePanel = refDatePanel.value
456
+ const { visiblePanel, isActivated } = reactData
457
+ const el = refElem.value
458
+ const panelWrapperElem = refPanelWrapper.value
459
+ const isDisabled = computeIsDisabled.value
460
+ if (!isDisabled && isActivated) {
461
+ reactData.isActivated = getEventTargetNode(evnt, el).flag || getEventTargetNode(evnt, panelWrapperElem).flag
462
+ if (!reactData.isActivated) {
463
+ if (visiblePanel) {
464
+ hidePanel()
465
+ if ($datePanel) {
466
+ $datePanel.checkValue(reactData.inputLabel)
467
+ }
1362
468
  }
1363
- dateMoveDay(offsetDay)
1364
469
  }
1365
470
  }
1366
471
  }
1367
472
 
1368
- const datePgOffsetEvent = (evnt: KeyboardEvent) => {
1369
- const { isActivated } = reactData
1370
- if (isActivated) {
1371
- const isPgUp = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.PAGE_UP)
1372
- evnt.preventDefault()
1373
- if (isPgUp) {
1374
- datePrevEvent(evnt)
1375
- } else {
1376
- dateNextEvent(evnt)
473
+ const handleGlobalMousewheelEvent = (evnt: Event) => {
474
+ const { visiblePanel } = reactData
475
+ const isDisabled = computeIsDisabled.value
476
+ if (!isDisabled) {
477
+ if (visiblePanel) {
478
+ const panelWrapperElem = refPanelWrapper.value
479
+ if (getEventTargetNode(evnt, panelWrapperElem).flag) {
480
+ updatePlacement()
481
+ } else {
482
+ hidePanel()
483
+ }
1377
484
  }
1378
485
  }
1379
486
  }
1380
487
 
1381
- const dateOpenPanel = () => {
1382
- const { type } = props
1383
- const isDateTimeType = computeIsDateTimeType.value
1384
- const dateValue = computeDateValue.value
1385
- if (['year', 'quarter', 'month', 'week'].indexOf(type) > -1) {
1386
- reactData.datePanelType = type as 'year' | 'quarter' | 'month' | 'week'
1387
- } else {
1388
- reactData.datePanelType = 'day'
1389
- }
1390
- reactData.currentDate = XEUtils.getWhatDay(Date.now(), 0, 'first')
1391
- if (dateValue) {
1392
- dateMonthHandle(dateValue, 0)
1393
- dateParseValue(dateValue)
1394
- } else {
1395
- dateNowHandle()
1396
- }
1397
- if (isDateTimeType) {
1398
- reactData.datetimePanelValue = reactData.datePanelValue || XEUtils.getWhatDay(Date.now(), 0, 'first')
1399
- nextTick(() => {
1400
- const timeBodyElem = refInputTimeBody.value
1401
- XEUtils.arrayEach(timeBodyElem.querySelectorAll('li.is--selected'), (elem) => {
1402
- updateTimePos(elem)
1403
- })
1404
- })
488
+ const handleGlobalBlurEvent = () => {
489
+ const $datePanel = refDatePanel.value
490
+ const { isActivated, visiblePanel } = reactData
491
+ if (visiblePanel) {
492
+ hidePanel()
493
+ if ($datePanel) {
494
+ $datePanel.checkValue(reactData.inputLabel)
495
+ }
496
+ } else if (isActivated) {
497
+ if ($datePanel) {
498
+ $datePanel.checkValue(reactData.inputLabel)
499
+ }
1405
500
  }
1406
501
  }
1407
502
 
1408
- // 日期
1409
-
1410
503
  // 弹出面板
1411
504
  const updateZindex = () => {
1412
505
  if (reactData.panelIndex < getLastZIndex()) {
@@ -1490,7 +583,6 @@ export default defineComponent({
1490
583
  const showPanel = () => {
1491
584
  const { visiblePanel } = reactData
1492
585
  const isDisabled = computeIsDisabled.value
1493
- const isDatePickerType = computeIsDatePickerType.value
1494
586
  if (!isDisabled && !visiblePanel) {
1495
587
  if (!reactData.initialized) {
1496
588
  reactData.initialized = true
@@ -1501,9 +593,6 @@ export default defineComponent({
1501
593
  }
1502
594
  reactData.isActivated = true
1503
595
  reactData.isAniVisible = true
1504
- if (isDatePickerType) {
1505
- dateOpenPanel()
1506
- }
1507
596
  setTimeout(() => {
1508
597
  reactData.visiblePanel = true
1509
598
  }, 10)
@@ -1526,143 +615,72 @@ export default defineComponent({
1526
615
  }
1527
616
 
1528
617
  const handleShortcutEvent: VxeButtonGroupEvents.Click = ({ option, $event }) => {
618
+ const { type } = props
619
+ const { inputValue } = reactData
1529
620
  const shortcutOpts = computeShortcutOpts.value
1530
621
  const { autoClose } = shortcutOpts
1531
- const clickMethod = (option as VxeDatePickerDefines.ShortcutOption).clickMethod || shortcutOpts.clickMethod
622
+ const { code, clickMethod } = option as VxeDatePickerDefines.ShortcutOption
623
+ let value = inputValue
1532
624
  const shortcutParams = {
1533
625
  $datePicker: $xeDatePicker,
1534
- option: option as VxeDatePickerDefines.ShortcutOption
1535
- }
1536
- if (clickMethod) {
1537
- clickMethod(shortcutParams)
1538
- }
1539
- if (autoClose) {
1540
- hidePanel()
1541
- }
1542
- dispatchEvent('shortcut-click', shortcutParams, $event)
1543
- }
1544
-
1545
- // 全局事件
1546
- const handleGlobalMousedownEvent = (evnt: Event) => {
1547
- const { visiblePanel, isActivated } = reactData
1548
- const isDatePickerType = computeIsDatePickerType.value
1549
- const el = refElem.value
1550
- const panelWrapperElem = refPanelWrapper.value
1551
- const isDisabled = computeIsDisabled.value
1552
- if (!isDisabled && isActivated) {
1553
- reactData.isActivated = getEventTargetNode(evnt, el).flag || getEventTargetNode(evnt, panelWrapperElem).flag
1554
- if (!reactData.isActivated) {
1555
- // 如果是日期类型
1556
- if (isDatePickerType) {
1557
- if (visiblePanel) {
1558
- hidePanel()
1559
- afterCheckValue()
1560
- }
1561
- } else {
1562
- afterCheckValue()
1563
- }
1564
- }
1565
- }
1566
- }
1567
-
1568
- const handleGlobalKeydownEvent = (evnt: KeyboardEvent) => {
1569
- const { clearable } = props
1570
- const { visiblePanel } = reactData
1571
- const isDatePickerType = computeIsDatePickerType.value
1572
- const isDisabled = computeIsDisabled.value
1573
- if (!isDisabled) {
1574
- const isTab = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.TAB)
1575
- const isDel = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.DELETE)
1576
- const isEsc = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ESCAPE)
1577
- const isEnter = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ENTER)
1578
- const isLeftArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_LEFT)
1579
- const isUpArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_UP)
1580
- const isRightArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_RIGHT)
1581
- const isDwArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_DOWN)
1582
- const isPgUp = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.PAGE_UP)
1583
- const isPgDn = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.PAGE_DOWN)
1584
- const operArrow = isLeftArrow || isUpArrow || isRightArrow || isDwArrow
1585
- let isActivated = reactData.isActivated
1586
- if (isTab) {
1587
- if (isActivated) {
1588
- afterCheckValue()
1589
- }
1590
- isActivated = false
1591
- reactData.isActivated = isActivated
1592
- } else if (operArrow) {
1593
- if (isDatePickerType) {
1594
- if (isActivated) {
1595
- if (visiblePanel) {
1596
- dateOffsetEvent(evnt)
1597
- } else if (isUpArrow || isDwArrow) {
1598
- datePickerOpenEvent(evnt)
1599
- }
1600
- }
1601
- }
1602
- } else if (isEnter) {
1603
- if (isDatePickerType) {
1604
- if (visiblePanel) {
1605
- if (reactData.datePanelValue) {
1606
- dateSelectItem(reactData.datePanelValue)
1607
- } else {
1608
- hidePanel()
1609
- }
1610
- } else if (isActivated) {
1611
- datePickerOpenEvent(evnt)
1612
- }
1613
- }
1614
- } else if (isPgUp || isPgDn) {
1615
- if (isDatePickerType) {
1616
- if (isActivated) {
1617
- datePgOffsetEvent(evnt)
626
+ option,
627
+ value,
628
+ code
629
+ }
630
+ if (!clickMethod && code) {
631
+ const gCommandOpts = commands.get(code)
632
+ const dpCommandMethod = gCommandOpts ? gCommandOpts.datePickerCommandMethod : null
633
+ if (dpCommandMethod) {
634
+ dpCommandMethod(shortcutParams)
635
+ } else {
636
+ const dateValueFormat = computeDateValueFormat.value
637
+ const firstDayOfWeek = computeFirstDayOfWeek.value
638
+ switch (code) {
639
+ case 'now':
640
+ case 'prev':
641
+ case 'next':
642
+ case 'minus':
643
+ case 'plus': {
644
+ const restObj = getDateByCode(code, value, type, {
645
+ valueFormat: dateValueFormat,
646
+ firstDay: firstDayOfWeek
647
+ })
648
+ value = restObj.value
649
+ shortcutParams.value = value
650
+ handleChange(value, $event)
651
+ break
1618
652
  }
653
+ default:
654
+ errLog('vxe.error.notCommands', [code])
655
+ break
1619
656
  }
1620
657
  }
1621
- if (isTab || isEsc) {
1622
- if (visiblePanel) {
1623
- hidePanel()
1624
- }
1625
- } else if (isDel && clearable) {
1626
- if (isActivated) {
1627
- clearValueEvent(evnt, null)
1628
- }
1629
- }
1630
- }
1631
- }
1632
-
1633
- const handleGlobalMousewheelEvent = (evnt: Event) => {
1634
- const { visiblePanel } = reactData
1635
- const isDisabled = computeIsDisabled.value
1636
- if (!isDisabled) {
1637
- if (visiblePanel) {
1638
- const panelWrapperElem = refPanelWrapper.value
1639
- if (getEventTargetNode(evnt, panelWrapperElem).flag) {
1640
- updatePlacement()
1641
- } else {
1642
- hidePanel()
1643
- afterCheckValue()
1644
- }
658
+ } else {
659
+ const optClickMethod = clickMethod || shortcutOpts.clickMethod
660
+ if (optClickMethod) {
661
+ optClickMethod(shortcutParams)
1645
662
  }
1646
663
  }
1647
- }
1648
-
1649
- const handleGlobalBlurEvent = () => {
1650
- const { isActivated, visiblePanel } = reactData
1651
- if (visiblePanel) {
664
+ if (autoClose) {
1652
665
  hidePanel()
1653
- afterCheckValue()
1654
- } else if (isActivated) {
1655
- afterCheckValue()
1656
666
  }
667
+ dispatchEvent('shortcut-click', shortcutParams, $event)
1657
668
  }
1658
669
 
1659
670
  const dispatchEvent = (type: ValueOf<VxeDatePickerEmits>, params: Record<string, any>, evnt: Event | null) => {
1660
671
  emit(type, createEvent(evnt, { $datePicker: $xeDatePicker }, params))
1661
672
  }
1662
673
 
1663
- datePickerMethods = {
674
+ const datePickerMethods: DatePickerMethods = {
1664
675
  dispatchEvent,
1665
676
 
677
+ setModelValue (value) {
678
+ reactData.inputValue = value
679
+ emit('update:modelValue', value)
680
+ },
681
+ setModelValueByEvent (evnt, value) {
682
+ handleChange(value || '', evnt)
683
+ },
1666
684
  focus () {
1667
685
  const inputElem = refInputTarget.value
1668
686
  reactData.isActivated = true
@@ -1688,435 +706,16 @@ export default defineComponent({
1688
706
 
1689
707
  Object.assign($xeDatePicker, datePickerMethods)
1690
708
 
1691
- const renderDateLabel = (item: VxeDatePickerDefines.DateYearItem | VxeDatePickerDefines.DateQuarterItem | VxeDatePickerDefines.DateMonthItem | VxeDatePickerDefines.DateDayItem, label: string | number) => {
1692
- const { festivalMethod } = props
1693
- if (festivalMethod) {
1694
- const { datePanelType } = reactData
1695
- const festivalRest = festivalMethod({ type: datePanelType, viewType: datePanelType, date: item.date, $datePicker: $xeDatePicker })
1696
- const festivalItem = festivalRest ? (XEUtils.isString(festivalRest) ? { label: festivalRest } : festivalRest) : {}
1697
- const extraItem = festivalItem.extra ? (XEUtils.isString(festivalItem.extra) ? { label: festivalItem.extra } : festivalItem.extra) : null
1698
- const labels = [
1699
- h('span', {
1700
- class: ['vxe-date-picker--date-label', {
1701
- 'is-notice': festivalItem.notice
1702
- }]
1703
- }, extraItem && extraItem.label
1704
- ? [
1705
- h('span', `${label}`),
1706
- h('span', {
1707
- class: ['vxe-date-picker--date-label--extra', extraItem.important ? 'is-important' : '', extraItem.className],
1708
- style: extraItem.style
1709
- }, XEUtils.toValueString(extraItem.label))
1710
- ]
1711
- : `${label}`)
1712
- ]
1713
- const festivalLabel = festivalItem.label
1714
- if (festivalLabel) {
1715
- // 默认最多支持3个节日重叠
1716
- const festivalLabels = XEUtils.toValueString(festivalLabel).split(',')
1717
- labels.push(
1718
- h('span', {
1719
- class: ['vxe-date-picker--date-festival', festivalItem.important ? 'is-important' : '', festivalItem.className],
1720
- style: festivalItem.style
1721
- }, [
1722
- festivalLabels.length > 1
1723
- ? h('span', {
1724
- class: ['vxe-date-picker--date-festival--overlap', `overlap--${festivalLabels.length}`]
1725
- }, festivalLabels.map(label => h('span', label.substring(0, 3))))
1726
- : h('span', {
1727
- class: 'vxe-date-picker--date-festival--label'
1728
- }, festivalLabels[0].substring(0, 3))
1729
- ])
1730
- )
1731
- }
1732
- return labels
1733
- }
1734
- return label
1735
- }
1736
-
1737
- const renderDateDayTable = () => {
1738
- const { multiple } = props
1739
- const { datePanelType, datePanelValue } = reactData
1740
- const dateValue = computeDateValue.value
1741
- const dateHeaders = computeDateHeaders.value
1742
- const dayDatas = computeDayDatas.value
1743
- const dateListValue = computeDateListValue.value
1744
- const overCount = computeOverCount.value
1745
- const matchFormat = 'yyyyMMdd'
1746
- return [
1747
- h('table', {
1748
- class: `vxe-date-picker--date-${datePanelType}-view`,
1749
- cellspacing: 0,
1750
- cellpadding: 0,
1751
- border: 0
1752
- }, [
1753
- h('thead', [
1754
- h('tr', dateHeaders.map((item) => {
1755
- return h('th', item.label)
1756
- }))
1757
- ]),
1758
- h('tbody', dayDatas.map((rows) => {
1759
- return h('tr', rows.map((item) => {
1760
- const isSelected = multiple ? dateListValue.some(val => XEUtils.isDateSame(val, item.date, matchFormat)) : XEUtils.isDateSame(dateValue, item.date, matchFormat)
1761
- return h('td', {
1762
- class: {
1763
- 'is--prev': item.isPrev,
1764
- 'is--current': item.isCurrent,
1765
- 'is--now': item.isNow,
1766
- 'is--next': item.isNext,
1767
- 'is--disabled': isDateDisabled(item),
1768
- 'is--selected': isSelected,
1769
- 'is--over': overCount && !isSelected,
1770
- 'is--hover': !overCount && XEUtils.isDateSame(datePanelValue, item.date, matchFormat)
1771
- },
1772
- onClick: () => dateSelectEvent(item),
1773
- onMouseenter: () => dateMouseenterEvent(item)
1774
- }, renderDateLabel(item, item.label))
1775
- }))
1776
- }))
1777
- ])
1778
- ]
1779
- }
1780
-
1781
- const renderDateWeekTable = () => {
1782
- const { multiple } = props
1783
- const { datePanelType, datePanelValue } = reactData
1784
- const dateValue = computeDateValue.value
1785
- const weekHeaders = computeWeekHeaders.value
1786
- const weekDates = computeWeekDates.value
1787
- const dateListValue = computeDateListValue.value
1788
- const overCount = computeOverCount.value
1789
- const matchFormat = 'yyyyMMdd'
1790
- return [
1791
- h('table', {
1792
- class: `vxe-date-picker--date-${datePanelType}-view`,
1793
- cellspacing: 0,
1794
- cellpadding: 0,
1795
- border: 0
1796
- }, [
1797
- h('thead', [
1798
- h('tr', weekHeaders.map((item) => {
1799
- return h('th', item.label)
1800
- }))
1801
- ]),
1802
- h('tbody', weekDates.map((rows) => {
1803
- const isSelected = multiple ? rows.some((item) => dateListValue.some(val => XEUtils.isDateSame(val, item.date, matchFormat))) : rows.some((item) => XEUtils.isDateSame(dateValue, item.date, matchFormat))
1804
- const isHover = rows.some((item) => XEUtils.isDateSame(datePanelValue, item.date, matchFormat))
1805
- return h('tr', rows.map((item) => {
1806
- return h('td', {
1807
- class: {
1808
- 'is--prev': item.isPrev,
1809
- 'is--current': item.isCurrent,
1810
- 'is--now': item.isNow,
1811
- 'is--next': item.isNext,
1812
- 'is--disabled': isDateDisabled(item),
1813
- 'is--selected': isSelected,
1814
- 'is--over': overCount && !isSelected,
1815
- 'is--hover': !overCount && isHover
1816
- },
1817
- // event
1818
- onClick: () => dateSelectEvent(item),
1819
- onMouseenter: () => dateMouseenterEvent(item)
1820
- }, renderDateLabel(item, item.label))
1821
- }))
1822
- }))
1823
- ])
1824
- ]
1825
- }
1826
-
1827
- const renderDateMonthTable = () => {
1828
- const { multiple } = props
1829
- const { datePanelType, datePanelValue } = reactData
1830
- const dateValue = computeDateValue.value
1831
- const monthDatas = computeMonthDatas.value
1832
- const dateListValue = computeDateListValue.value
1833
- const overCount = computeOverCount.value
1834
- const matchFormat = 'yyyyMM'
1835
- return [
1836
- h('table', {
1837
- class: `vxe-date-picker--date-${datePanelType}-view`,
1838
- cellspacing: 0,
1839
- cellpadding: 0,
1840
- border: 0
1841
- }, [
1842
- h('tbody', monthDatas.map((rows) => {
1843
- return h('tr', rows.map((item) => {
1844
- const isSelected = multiple ? dateListValue.some(val => XEUtils.isDateSame(val, item.date, matchFormat)) : XEUtils.isDateSame(dateValue, item.date, matchFormat)
1845
- return h('td', {
1846
- class: {
1847
- 'is--prev': item.isPrev,
1848
- 'is--current': item.isCurrent,
1849
- 'is--now': item.isNow,
1850
- 'is--next': item.isNext,
1851
- 'is--disabled': isDateDisabled(item),
1852
- 'is--selected': isSelected,
1853
- 'is--over': overCount && !isSelected,
1854
- 'is--hover': !overCount && XEUtils.isDateSame(datePanelValue, item.date, matchFormat)
1855
- },
1856
- onClick: () => dateSelectEvent(item),
1857
- onMouseenter: () => dateMouseenterEvent(item)
1858
- }, renderDateLabel(item, getI18n(`vxe.input.date.months.m${item.month}`)))
1859
- }))
1860
- }))
1861
- ])
1862
- ]
1863
- }
1864
-
1865
- const renderDateQuarterTable = () => {
1866
- const { multiple } = props
1867
- const { datePanelType, datePanelValue } = reactData
1868
- const dateValue = computeDateValue.value
1869
- const quarterDatas = computeQuarterDatas.value
1870
- const dateListValue = computeDateListValue.value
1871
- const overCount = computeOverCount.value
1872
- const matchFormat = 'yyyyq'
1873
- return [
1874
- h('table', {
1875
- class: `vxe-date-picker--date-${datePanelType}-view`,
1876
- cellspacing: 0,
1877
- cellpadding: 0,
1878
- border: 0
1879
- }, [
1880
- h('tbody', quarterDatas.map((rows) => {
1881
- return h('tr', rows.map((item) => {
1882
- const isSelected = multiple ? dateListValue.some(val => XEUtils.isDateSame(val, item.date, matchFormat)) : XEUtils.isDateSame(dateValue, item.date, matchFormat)
1883
- return h('td', {
1884
- class: {
1885
- 'is--prev': item.isPrev,
1886
- 'is--current': item.isCurrent,
1887
- 'is--now': item.isNow,
1888
- 'is--next': item.isNext,
1889
- 'is--disabled': isDateDisabled(item),
1890
- 'is--selected': isSelected,
1891
- 'is--over': overCount && !isSelected,
1892
- 'is--hover': !overCount && XEUtils.isDateSame(datePanelValue, item.date, matchFormat)
1893
- },
1894
- onClick: () => dateSelectEvent(item),
1895
- onMouseenter: () => dateMouseenterEvent(item)
1896
- }, renderDateLabel(item, getI18n(`vxe.input.date.quarters.q${item.quarter}`)))
1897
- }))
1898
- }))
1899
- ])
1900
- ]
1901
- }
1902
-
1903
- const renderDateYearTable = () => {
1904
- const { multiple } = props
1905
- const { datePanelType, datePanelValue } = reactData
1906
- const dateValue = computeDateValue.value
1907
- const yearDatas = computeYearDatas.value
1908
- const dateListValue = computeDateListValue.value
1909
- const overCount = computeOverCount.value
1910
- const matchFormat = 'yyyy'
1911
- return [
1912
- h('table', {
1913
- class: `vxe-date-picker--date-${datePanelType}-view`,
1914
- cellspacing: 0,
1915
- cellpadding: 0,
1916
- border: 0
1917
- }, [
1918
- h('tbody', yearDatas.map((rows) => {
1919
- return h('tr', rows.map((item) => {
1920
- const isSelected = multiple ? dateListValue.some(val => XEUtils.isDateSame(val, item.date, matchFormat)) : XEUtils.isDateSame(dateValue, item.date, matchFormat)
1921
- return h('td', {
1922
- class: {
1923
- 'is--prev': item.isPrev,
1924
- 'is--current': item.isCurrent,
1925
- 'is--now': item.isNow,
1926
- 'is--next': item.isNext,
1927
- 'is--disabled': isDateDisabled(item),
1928
- 'is--selected': isSelected,
1929
- 'is--over': overCount && !isSelected,
1930
- 'is--hover': !overCount && XEUtils.isDateSame(datePanelValue, item.date, matchFormat)
1931
- },
1932
- onClick: () => dateSelectEvent(item),
1933
- onMouseenter: () => dateMouseenterEvent(item)
1934
- }, renderDateLabel(item, item.year))
1935
- }))
1936
- }))
1937
- ])
1938
- ]
1939
- }
1940
-
1941
- const renderDateTable = () => {
1942
- const { datePanelType } = reactData
1943
- switch (datePanelType) {
1944
- case 'week' :
1945
- return renderDateWeekTable()
1946
- case 'month' :
1947
- return renderDateMonthTable()
1948
- case 'quarter' :
1949
- return renderDateQuarterTable()
1950
- case 'year' :
1951
- return renderDateYearTable()
1952
- }
1953
- return renderDateDayTable()
1954
- }
1955
-
1956
- const renderDatePanel = () => {
1957
- const { multiple } = props
1958
- const { datePanelType } = reactData
1959
- const isDisabledPrevDateBtn = computeIsDisabledPrevDateBtn.value
1960
- const isDisabledNextDateBtn = computeIsDisabledNextDateBtn.value
1961
- const selectDatePanelObj = computeSelectDatePanelObj.value
1962
- const supportMultiples = computeSupportMultiples.value
1963
- return [
1964
- h('div', {
1965
- class: 'vxe-date-picker--date-picker-header'
1966
- }, [
1967
- h('div', {
1968
- class: 'vxe-date-picker--date-picker-type-wrapper'
1969
- }, [
1970
- datePanelType === 'year'
1971
- ? h('span', {
1972
- class: 'vxe-date-picker--date-picker-label'
1973
- }, selectDatePanelObj.y)
1974
- : h('span', {
1975
- class: 'vxe-date-picker--date-picker-btns'
1976
- }, [
1977
- h('span', {
1978
- class: 'vxe-date-picker--date-picker-btn',
1979
- onClick: dateToggleYearTypeEvent
1980
- }, selectDatePanelObj.y),
1981
- selectDatePanelObj.m
1982
- ? h('span', {
1983
- class: 'vxe-date-picker--date-picker-btn',
1984
- onClick: dateToggleMonthTypeEvent
1985
- }, selectDatePanelObj.m)
1986
- : renderEmptyElement($xeDatePicker)
1987
- ])
1988
- ]),
1989
- h('div', {
1990
- class: 'vxe-date-picker--date-picker-btn-wrapper'
1991
- }, [
1992
- h('span', {
1993
- class: ['vxe-date-picker--date-picker-btn vxe-date-picker--date-picker-prev-btn', {
1994
- 'is--disabled': isDisabledPrevDateBtn
1995
- }],
1996
- onClick: datePrevEvent
1997
- }, [
1998
- h('i', {
1999
- class: 'vxe-icon-caret-left'
2000
- })
2001
- ]),
2002
- h('span', {
2003
- class: 'vxe-date-picker--date-picker-btn vxe-date-picker--date-picker-current-btn',
2004
- onClick: dateTodayMonthEvent
2005
- }, [
2006
- h('i', {
2007
- class: 'vxe-icon-dot'
2008
- })
2009
- ]),
2010
- h('span', {
2011
- class: ['vxe-date-picker--date-picker-btn vxe-date-picker--date-picker-next-btn', {
2012
- 'is--disabled': isDisabledNextDateBtn
2013
- }],
2014
- onClick: dateNextEvent
2015
- }, [
2016
- h('i', {
2017
- class: 'vxe-icon-caret-right'
2018
- })
2019
- ]),
2020
- multiple && supportMultiples
2021
- ? h('span', {
2022
- class: 'vxe-date-picker--date-picker-btn vxe-date-picker--date-picker-confirm-btn'
2023
- }, [
2024
- h('button', {
2025
- class: 'vxe-date-picker--date-picker-confirm',
2026
- type: 'button',
2027
- onClick: dateConfirmEvent
2028
- }, getI18n('vxe.button.confirm'))
2029
- ])
2030
- : null
2031
- ])
2032
- ]),
2033
- h('div', {
2034
- class: 'vxe-date-picker--date-picker-body'
2035
- }, renderDateTable())
2036
- ]
2037
- }
2038
-
2039
- const renderTimePanel = () => {
2040
- const { datetimePanelValue } = reactData
2041
- const dateTimeLabel = computeDateTimeLabel.value
2042
- const hourList = computeHourList.value
2043
- const hasTimeMinute = computeHasTimeMinute.value
2044
- const minuteList = computeMinuteList.value
2045
- const hasTimeSecond = computeHasTimeSecond.value
2046
- const secondList = computeSecondList.value
2047
- return [
2048
- h('div', {
2049
- class: 'vxe-date-picker--time-picker-header'
2050
- }, [
2051
- hasTimeMinute
2052
- ? h('div', {
2053
- class: 'vxe-date-picker--time-picker-title'
2054
- }, dateTimeLabel)
2055
- : createCommentVNode(),
2056
- h('div', {
2057
- class: 'vxe-date-picker--time-picker-btn'
2058
- }, [
2059
- h('button', {
2060
- class: 'vxe-date-picker--time-picker-confirm',
2061
- type: 'button',
2062
- onClick: dateConfirmEvent
2063
- }, getI18n('vxe.button.confirm'))
2064
- ])
2065
- ]),
2066
- h('div', {
2067
- ref: refInputTimeBody,
2068
- class: 'vxe-date-picker--time-picker-body'
2069
- }, [
2070
- h('ul', {
2071
- class: 'vxe-date-picker--time-picker-hour-list'
2072
- }, hourList.map((item, index) => {
2073
- return h('li', {
2074
- key: index,
2075
- class: {
2076
- 'is--selected': datetimePanelValue && datetimePanelValue.getHours() === item.value
2077
- },
2078
- onClick: (evnt: MouseEvent) => dateHourEvent(evnt, item)
2079
- }, item.label)
2080
- })),
2081
- hasTimeMinute
2082
- ? h('ul', {
2083
- class: 'vxe-date-picker--time-picker-minute-list'
2084
- }, minuteList.map((item, index) => {
2085
- return h('li', {
2086
- key: index,
2087
- class: {
2088
- 'is--selected': datetimePanelValue && datetimePanelValue.getMinutes() === item.value
2089
- },
2090
- onClick: (evnt: MouseEvent) => dateMinuteEvent(evnt, item)
2091
- }, item.label)
2092
- }))
2093
- : createCommentVNode(),
2094
- hasTimeMinute && hasTimeSecond
2095
- ? h('ul', {
2096
- class: 'vxe-date-picker--time-picker-second-list'
2097
- }, secondList.map((item, index) => {
2098
- return h('li', {
2099
- key: index,
2100
- class: {
2101
- 'is--selected': datetimePanelValue && datetimePanelValue.getSeconds() === item.value
2102
- },
2103
- onClick: (evnt: MouseEvent) => dateSecondEvent(evnt, item)
2104
- }, item.label)
2105
- }))
2106
- : createCommentVNode()
2107
- ])
2108
- ]
2109
- }
2110
-
2111
709
  const renderShortcutBtn = (pos: 'top' | 'bottom' | 'left' | 'right' | 'header' | 'footer', isVertical?: boolean) => {
2112
710
  const shortcutOpts = computeShortcutOpts.value
2113
- const { options, position, align, mode } = shortcutOpts
2114
- if (isEnableConf(shortcutOpts) && options && options.length && (position || 'left') === pos) {
711
+ const { position, align, mode } = shortcutOpts
712
+ const shortcutList = computeShortcutList.value
713
+ if (isEnableConf(shortcutOpts) && shortcutList.length && (position || 'left') === pos) {
2115
714
  return h('div', {
2116
- class: `vxe-date-picker--panel-${pos}-wrapper`
715
+ class: `vxe-date-picker--layout-${pos}-wrapper`
2117
716
  }, [
2118
717
  h(VxeButtonGroupComponent, {
2119
- options,
718
+ options: shortcutList,
2120
719
  mode,
2121
720
  align,
2122
721
  vertical: isVertical,
@@ -2127,49 +726,25 @@ export default defineComponent({
2127
726
  return renderEmptyElement($xeDatePicker)
2128
727
  }
2129
728
 
2130
- const renderPickerPanel = () => {
2131
- const { type } = props
2132
- if (type === 'datetime') {
2133
- return h('div', {
2134
- key: type,
2135
- ref: refPanelWrapper,
2136
- class: 'vxe-date-picker--panel-datetime-layout-wrapper'
2137
- }, [
2138
- h('div', {
2139
- class: 'vxe-date-picker--panel-datetime-left-wrapper'
2140
- }, renderDatePanel()),
2141
- h('div', {
2142
- class: 'vxe-date-picker--panel-datetime-right-wrapper'
2143
- }, renderTimePanel())
2144
- ])
2145
- } else if (type === 'time') {
2146
- return h('div', {
2147
- key: type,
2148
- ref: refPanelWrapper,
2149
- class: 'vxe-date-picker--panel-wrapper'
2150
- }, renderTimePanel())
2151
- }
2152
- return h('div', {
2153
- key: type || 'default',
2154
- ref: refPanelWrapper,
2155
- class: 'vxe-date-picker--panel-wrapper'
2156
- }, renderDatePanel())
2157
- }
2158
-
2159
729
  const renderPanel = () => {
2160
- const { type } = props
2161
- const { initialized, isAniVisible, visiblePanel, panelPlacement, panelStyle } = reactData
730
+ const { type, multiple, showClearButton, showConfirmButton } = props
731
+ const { initialized, isAniVisible, visiblePanel, panelPlacement, panelStyle, inputValue } = reactData
2162
732
  const vSize = computeSize.value
2163
733
  const btnTransfer = computeBtnTransfer.value
2164
734
  const shortcutOpts = computeShortcutOpts.value
2165
- const { options, position } = shortcutOpts
735
+ const isClearable = computeIsClearable.value
736
+ const isDateTimeType = computeIsDateTimeType.value
737
+ const shortcutList = computeShortcutList.value
738
+ const { position } = shortcutOpts
2166
739
  const headerSlot = slots.header
2167
740
  const footerSlot = slots.footer
2168
741
  const topSlot = slots.top
2169
742
  const bottomSlot = slots.bottom
2170
743
  const leftSlot = slots.left
2171
744
  const rightSlot = slots.right
2172
- const hasShortcutBtn = options && options.length
745
+ const hasShortcutBtn = shortcutList.length > 0
746
+ const showConfirmBtn = (showConfirmButton === null ? (isDateTimeType || multiple) : showConfirmButton)
747
+ const showClearBtn = (showClearButton === null ? (isClearable && showConfirmBtn && type !== 'time') : showClearButton)
2173
748
  return h(Teleport, {
2174
749
  to: 'body',
2175
750
  disabled: btnTransfer ? !initialized : true
@@ -2191,49 +766,95 @@ export default defineComponent({
2191
766
  }, initialized && (visiblePanel || isAniVisible)
2192
767
  ? [
2193
768
  h('div', {
2194
- class: 'vxe-date-picker--panel-layout-wrapper'
769
+ ref: refPanelWrapper,
770
+ class: ['vxe-date-picker--layout-all-wrapper', `type--${type}`, {
771
+ [`size--${vSize}`]: vSize
772
+ }]
2195
773
  }, [
2196
774
  topSlot
2197
775
  ? h('div', {
2198
- class: 'vxe-date-picker--panel-top-wrapper'
776
+ class: 'vxe-date-picker--layout-top-wrapper'
2199
777
  }, topSlot({}))
2200
778
  : renderShortcutBtn('top'),
2201
779
  h('div', {
2202
- class: 'vxe-date-picker--panel-body-layout-wrapper'
780
+ class: 'vxe-date-picker--layout-body-layout-wrapper'
2203
781
  }, [
2204
782
  leftSlot
2205
783
  ? h('div', {
2206
- class: 'vxe-date-picker--panel-left-wrapper'
784
+ class: 'vxe-date-picker--layout-left-wrapper'
2207
785
  }, leftSlot({}))
2208
786
  : renderShortcutBtn('left', true),
2209
787
  h('div', {
2210
- class: 'vxe-date-picker--panel-body-content-wrapper'
788
+ class: 'vxe-date-picker--layout-body-content-wrapper'
2211
789
  }, [
2212
790
  headerSlot
2213
791
  ? h('div', {
2214
- class: 'vxe-date-picker--panel-header-wrapper'
792
+ class: 'vxe-date-picker--layout-header-wrapper'
2215
793
  }, headerSlot({}))
2216
794
  : renderShortcutBtn('header'),
2217
795
  h('div', {
2218
- class: 'vxe-date-picker--panel-body-wrapper'
796
+ class: 'vxe-date-picker--layout-body-wrapper'
2219
797
  }, [
2220
- renderPickerPanel()
798
+ h(VxeDatePanelComponent, {
799
+ ref: refDatePanel,
800
+ modelValue: reactData.inputValue,
801
+ type: props.type,
802
+ className: props.className,
803
+ multiple: props.multiple,
804
+ limitCount: props.limitCount,
805
+ startDate: props.startDate,
806
+ endDate: props.endDate,
807
+ minDate: props.minDate,
808
+ maxDate: props.maxDate,
809
+ startDay: props.startDay,
810
+ labelFormat: props.labelFormat,
811
+ valueFormat: props.valueFormat,
812
+ festivalMethod: props.festivalMethod,
813
+ disabledMethod: props.disabledMethod,
814
+ selectDay: props.selectDay,
815
+ onChange: panelChangeEvent,
816
+ onDateToday: hidePanel
817
+ })
2221
818
  ]),
2222
- footerSlot
2223
- ? h('div', {
2224
- class: 'vxe-date-picker--panel-footer-wrapper'
2225
- }, footerSlot({}))
2226
- : renderShortcutBtn('footer')
819
+ h('div', {
820
+ class: 'vxe-date-picker--layout-footer-wrapper'
821
+ }, [
822
+ h('div', {
823
+ class: 'vxe-date-picker--layout-footer-custom'
824
+ }, footerSlot ? footerSlot({}) : [renderShortcutBtn('footer')]),
825
+ showClearBtn || showConfirmBtn
826
+ ? h('div', {
827
+ class: 'vxe-date-picker--layout-footer-btns'
828
+ }, [
829
+ showClearBtn
830
+ ? h(VxeButtonComponent, {
831
+ size: 'mini',
832
+ disabled: inputValue === '' || XEUtils.eqNull(inputValue),
833
+ content: getI18n('vxe.button.clear'),
834
+ onClick: clearValueEvent
835
+ })
836
+ : renderEmptyElement($xeDatePicker),
837
+ showConfirmBtn
838
+ ? h(VxeButtonComponent, {
839
+ size: 'mini',
840
+ status: 'primary',
841
+ content: getI18n('vxe.button.confirm'),
842
+ onClick: confirmEvent
843
+ })
844
+ : renderEmptyElement($xeDatePicker)
845
+ ])
846
+ : renderEmptyElement($xeDatePicker)
847
+ ])
2227
848
  ]),
2228
849
  rightSlot
2229
850
  ? h('div', {
2230
- class: 'vxe-date-picker--panel-right-wrapper'
851
+ class: 'vxe-date-picker--layout-right-wrapper'
2231
852
  }, rightSlot({}))
2232
853
  : renderShortcutBtn('right', true)
2233
854
  ]),
2234
855
  bottomSlot
2235
856
  ? h('div', {
2236
- class: 'vxe-date-picker--panel-bottom-wrapper'
857
+ class: 'vxe-date-picker--layout-bottom-wrapper'
2237
858
  }, bottomSlot({}))
2238
859
  : renderShortcutBtn('bottom')
2239
860
  ])
@@ -2283,7 +904,7 @@ export default defineComponent({
2283
904
  class: getIcon().INPUT_CLEAR
2284
905
  })
2285
906
  ])
2286
- : createCommentVNode(),
907
+ : renderEmptyElement($xeDatePicker),
2287
908
  renderExtraSuffixIcon(),
2288
909
  suffixSlot || suffixIcon
2289
910
  ? h('div', {
@@ -2296,7 +917,7 @@ export default defineComponent({
2296
917
  class: suffixIcon
2297
918
  })
2298
919
  ])
2299
- : createCommentVNode()
920
+ : renderEmptyElement($xeDatePicker)
2300
921
  ])
2301
922
  }
2302
923
 
@@ -2312,19 +933,19 @@ export default defineComponent({
2312
933
  }
2313
934
 
2314
935
  const renderVN = () => {
2315
- const { className, type, align, name, autocomplete, autoComplete } = props
2316
- const { inputValue, visiblePanel, isActivated } = reactData
936
+ const { className, type, name, autoComplete } = props
937
+ const { inputValue, inputLabel, visiblePanel, isActivated } = reactData
2317
938
  const vSize = computeSize.value
2318
939
  const isDisabled = computeIsDisabled.value
2319
940
  const formReadonly = computeFormReadonly.value
941
+ const panelLabel = computePanelLabel.value
2320
942
  if (formReadonly) {
2321
943
  return h('div', {
2322
944
  ref: refElem,
2323
945
  class: ['vxe-date-picker--readonly', `type--${type}`, className]
2324
- }, inputValue)
946
+ }, panelLabel)
2325
947
  }
2326
948
  const inputReadonly = computeInputReadonly.value
2327
- const inputType = computeDatePickerType.value
2328
949
  const inpPlaceholder = computeInpPlaceholder.value
2329
950
  const isClearable = computeIsClearable.value
2330
951
  const prefix = renderPrefixIcon()
@@ -2333,7 +954,6 @@ export default defineComponent({
2333
954
  ref: refElem,
2334
955
  class: ['vxe-date-picker', `type--${type}`, className, {
2335
956
  [`size--${vSize}`]: vSize,
2336
- [`is--${align}`]: align,
2337
957
  'is--prefix': !!prefix,
2338
958
  'is--suffix': !!suffix,
2339
959
  'is--visible': visiblePanel,
@@ -2343,20 +963,20 @@ export default defineComponent({
2343
963
  }],
2344
964
  spellcheck: false
2345
965
  }, [
2346
- prefix || createCommentVNode(),
966
+ prefix || renderEmptyElement($xeDatePicker),
2347
967
  h('div', {
2348
968
  class: 'vxe-date-picker--wrapper'
2349
969
  }, [
2350
970
  h('input', {
2351
971
  ref: refInputTarget,
2352
972
  class: 'vxe-date-picker--inner',
2353
- value: inputValue,
973
+ value: inputLabel,
2354
974
  name,
2355
- type: inputType,
975
+ type: 'text',
2356
976
  placeholder: inpPlaceholder,
2357
977
  readonly: inputReadonly,
2358
978
  disabled: isDisabled,
2359
- autocomplete: autoComplete || autocomplete,
979
+ autocomplete: autoComplete,
2360
980
  onKeydown: keydownEvent,
2361
981
  onKeyup: keyupEvent,
2362
982
  onClick: clickEvent,
@@ -2366,54 +986,35 @@ export default defineComponent({
2366
986
  onBlur: blurEvent
2367
987
  })
2368
988
  ]),
2369
- suffix || createCommentVNode(),
989
+ suffix || renderEmptyElement($xeDatePicker),
2370
990
  // 下拉面板
2371
991
  renderPanel()
2372
992
  ])
2373
993
  }
2374
994
 
2375
- watch(() => props.modelValue, (val) => {
2376
- updateModelValue(val)
2377
- changeValue()
2378
- })
2379
-
2380
- watch(() => props.type, () => {
2381
- // 切换类型是重置内置变量
2382
- Object.assign(reactData, {
2383
- inputValue: '',
2384
- datetimePanelValue: null,
2385
- datePanelValue: null,
2386
- datePanelLabel: '',
2387
- datePanelType: 'day',
2388
- selectMonth: null,
2389
- currentDate: null
2390
- })
2391
- initValue()
995
+ watch(computePanelLabel, (val) => {
996
+ reactData.inputLabel = val
2392
997
  })
2393
998
 
2394
- watch(computeDateLabelFormat, () => {
2395
- const isDatePickerType = computeIsDatePickerType.value
2396
- if (isDatePickerType) {
2397
- dateParseValue(reactData.datePanelValue)
2398
- reactData.inputValue = props.multiple ? computeDateMultipleLabel.value : reactData.datePanelLabel
2399
- }
999
+ watch(() => props.modelValue, () => {
1000
+ updateModelValue()
2400
1001
  })
2401
1002
 
2402
1003
  nextTick(() => {
2403
1004
  globalEvents.on($xeDatePicker, 'mousewheel', handleGlobalMousewheelEvent)
2404
1005
  globalEvents.on($xeDatePicker, 'mousedown', handleGlobalMousedownEvent)
2405
- globalEvents.on($xeDatePicker, 'keydown', handleGlobalKeydownEvent)
2406
1006
  globalEvents.on($xeDatePicker, 'blur', handleGlobalBlurEvent)
2407
1007
  })
2408
1008
 
2409
1009
  onUnmounted(() => {
2410
1010
  globalEvents.off($xeDatePicker, 'mousewheel')
2411
1011
  globalEvents.off($xeDatePicker, 'mousedown')
2412
- globalEvents.off($xeDatePicker, 'keydown')
2413
1012
  globalEvents.off($xeDatePicker, 'blur')
2414
1013
  })
2415
1014
 
2416
- initValue()
1015
+ updateModelValue()
1016
+
1017
+ provide('$xeDatePicker', $xeDatePicker)
2417
1018
 
2418
1019
  $xeDatePicker.renderVN = renderVN
2419
1020