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