vxe-pc-ui 4.5.36 → 4.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (306) hide show
  1. package/es/calendar/src/calendar.js +1 -1
  2. package/es/components.js +6 -0
  3. package/es/date-panel/index.js +12 -0
  4. package/es/date-panel/src/date-panel.js +1587 -0
  5. package/es/date-panel/src/util.js +191 -0
  6. package/es/date-panel/style.css +443 -0
  7. package/es/date-panel/style.min.css +1 -0
  8. package/es/date-picker/index.js +0 -1
  9. package/es/date-picker/src/date-picker.js +274 -1663
  10. package/es/date-picker/style.css +68 -810
  11. package/es/date-picker/style.min.css +1 -1
  12. package/es/date-range-picker/index.js +12 -0
  13. package/es/date-range-picker/src/date-range-picker.js +1121 -0
  14. package/es/date-range-picker/style.css +284 -0
  15. package/es/date-range-picker/style.min.css +1 -0
  16. package/es/form/render/index.js +21 -15
  17. package/es/icon/style.css +1 -1
  18. package/es/input/src/input.js +1 -1
  19. package/es/language/ar-EG.js +1 -1
  20. package/es/language/de-DE.js +1 -1
  21. package/es/language/en-US.js +1 -1
  22. package/es/language/es-ES.js +1 -1
  23. package/es/language/fr-FR.d.ts +2 -0
  24. package/es/language/fr-FR.js +1 -1
  25. package/es/language/hu-HU.js +1 -1
  26. package/es/language/hy-AM.d.ts +2 -0
  27. package/es/language/hy-AM.js +1 -1
  28. package/es/language/id-ID.d.ts +2 -0
  29. package/es/language/id-ID.js +1 -1
  30. package/es/language/it-IT.d.ts +2 -0
  31. package/es/language/it-IT.js +1 -1
  32. package/es/language/ja-JP.js +1 -1
  33. package/es/language/ko-KR.js +1 -1
  34. package/es/language/ms-MY.d.ts +2 -0
  35. package/es/language/ms-MY.js +708 -0
  36. package/es/language/nb-NO.d.ts +2 -0
  37. package/es/language/nb-NO.js +1 -1
  38. package/es/language/pt-BR.js +1 -1
  39. package/es/language/ru-RU.js +1 -1
  40. package/es/language/th-TH.d.ts +2 -0
  41. package/es/language/th-TH.js +1 -1
  42. package/es/language/ug-CN.d.ts +2 -0
  43. package/es/language/ug-CN.js +1 -1
  44. package/es/language/uk-UA.js +1 -1
  45. package/es/language/uz-UZ.d.ts +2 -0
  46. package/es/language/uz-UZ.js +708 -0
  47. package/es/language/vi-VN.d.ts +2 -0
  48. package/es/language/vi-VN.js +1 -1
  49. package/es/language/zh-CHT.d.ts +2 -0
  50. package/es/language/zh-CHT.js +1 -1
  51. package/es/language/zh-CN.js +1 -1
  52. package/es/print/src/print.js +4 -0
  53. package/es/print/src/util.js +46 -3
  54. package/es/pulldown/style.css +15 -0
  55. package/es/pulldown/style.min.css +1 -1
  56. package/es/select/style.css +15 -0
  57. package/es/select/style.min.css +1 -1
  58. package/es/style.css +1 -1
  59. package/es/style.min.css +1 -1
  60. package/es/table-select/style.css +15 -0
  61. package/es/table-select/style.min.css +1 -1
  62. package/es/tree-select/style.css +15 -0
  63. package/es/tree-select/style.min.css +1 -1
  64. package/es/ui/index.js +31 -6
  65. package/es/ui/src/log.js +1 -1
  66. package/es/vxe-date-panel/index.js +3 -0
  67. package/es/vxe-date-panel/style.css +443 -0
  68. package/es/vxe-date-panel/style.min.css +1 -0
  69. package/es/vxe-date-picker/style.css +68 -810
  70. package/es/vxe-date-picker/style.min.css +1 -1
  71. package/es/vxe-date-range-picker/index.js +3 -0
  72. package/es/vxe-date-range-picker/style.css +284 -0
  73. package/es/vxe-date-range-picker/style.min.css +1 -0
  74. package/es/vxe-pulldown/style.css +15 -0
  75. package/es/vxe-pulldown/style.min.css +1 -1
  76. package/es/vxe-select/style.css +15 -0
  77. package/es/vxe-select/style.min.css +1 -1
  78. package/es/vxe-table-select/style.css +15 -0
  79. package/es/vxe-table-select/style.min.css +1 -1
  80. package/es/vxe-tree-select/style.css +15 -0
  81. package/es/vxe-tree-select/style.min.css +1 -1
  82. package/lib/calendar/src/calendar.js +1 -1
  83. package/lib/calendar/src/calendar.min.js +1 -1
  84. package/lib/components.js +25 -1
  85. package/lib/components.min.js +1 -1
  86. package/lib/date-panel/index.js +19 -0
  87. package/lib/date-panel/index.min.js +1 -0
  88. package/lib/date-panel/src/date-panel.js +1667 -0
  89. package/lib/date-panel/src/date-panel.min.js +1 -0
  90. package/lib/date-panel/src/util.js +219 -0
  91. package/lib/date-panel/src/util.min.js +1 -0
  92. package/lib/date-panel/style/index.js +1 -0
  93. package/lib/date-panel/style/style.css +443 -0
  94. package/lib/date-panel/style/style.min.css +1 -0
  95. package/lib/date-picker/index.js +0 -1
  96. package/lib/date-picker/index.min.js +1 -1
  97. package/lib/date-picker/src/date-picker.js +288 -1717
  98. package/lib/date-picker/src/date-picker.min.js +1 -1
  99. package/lib/date-picker/style/style.css +68 -810
  100. package/lib/date-picker/style/style.min.css +1 -1
  101. package/lib/date-range-picker/index.js +19 -0
  102. package/lib/date-range-picker/index.min.js +1 -0
  103. package/lib/date-range-picker/src/date-range-picker.js +1194 -0
  104. package/lib/date-range-picker/src/date-range-picker.min.js +1 -0
  105. package/lib/date-range-picker/style/index.js +1 -0
  106. package/lib/date-range-picker/style/style.css +284 -0
  107. package/lib/date-range-picker/style/style.min.css +1 -0
  108. package/lib/form/render/index.js +21 -15
  109. package/lib/form/render/index.min.js +1 -1
  110. package/lib/icon/style/style.css +1 -1
  111. package/lib/icon/style/style.min.css +1 -1
  112. package/lib/index.umd.js +2954 -1252
  113. package/lib/index.umd.min.js +1 -1
  114. package/lib/input/src/input.js +1 -1
  115. package/lib/input/src/input.min.js +1 -1
  116. package/lib/language/ar-EG.d.ts +2 -0
  117. package/lib/language/ar-EG.js +1 -1
  118. package/lib/language/ar-EG.min.js +1 -1
  119. package/lib/language/ar-EG.umd.js +728 -0
  120. package/lib/language/de-DE.d.ts +2 -0
  121. package/lib/language/de-DE.js +1 -1
  122. package/lib/language/de-DE.min.js +1 -1
  123. package/lib/language/de-DE.umd.js +728 -0
  124. package/lib/language/en-US.js +1 -1
  125. package/lib/language/en-US.min.js +1 -1
  126. package/lib/language/en-US.umd.js +1 -1
  127. package/lib/language/es-ES.js +1 -1
  128. package/lib/language/es-ES.min.js +1 -1
  129. package/lib/language/es-ES.umd.js +1 -1
  130. package/lib/language/fr-FR.d.ts +2 -0
  131. package/lib/language/fr-FR.js +1 -1
  132. package/lib/language/fr-FR.min.js +1 -1
  133. package/lib/language/fr-FR.umd.js +728 -0
  134. package/lib/language/hu-HU.js +1 -1
  135. package/lib/language/hu-HU.min.js +1 -1
  136. package/lib/language/hu-HU.umd.js +1 -1
  137. package/lib/language/hy-AM.d.ts +2 -0
  138. package/lib/language/hy-AM.js +1 -1
  139. package/lib/language/hy-AM.min.js +1 -1
  140. package/lib/language/hy-AM.umd.js +728 -0
  141. package/lib/language/id-ID.d.ts +2 -0
  142. package/lib/language/id-ID.js +1 -1
  143. package/lib/language/id-ID.min.js +1 -1
  144. package/lib/language/id-ID.umd.js +728 -0
  145. package/lib/language/it-IT.d.ts +2 -0
  146. package/lib/language/it-IT.js +1 -1
  147. package/lib/language/it-IT.min.js +1 -1
  148. package/lib/language/it-IT.umd.js +728 -0
  149. package/lib/language/ja-JP.js +1 -1
  150. package/lib/language/ja-JP.min.js +1 -1
  151. package/lib/language/ja-JP.umd.js +1 -1
  152. package/lib/language/ko-KR.js +1 -1
  153. package/lib/language/ko-KR.min.js +1 -1
  154. package/lib/language/ko-KR.umd.js +1 -1
  155. package/lib/language/ms-MY.d.ts +2 -0
  156. package/lib/language/ms-MY.js +714 -0
  157. package/lib/language/ms-MY.min.js +1 -0
  158. package/lib/language/ms-MY.umd.js +728 -0
  159. package/lib/language/nb-NO.d.ts +2 -0
  160. package/lib/language/nb-NO.js +1 -1
  161. package/lib/language/nb-NO.min.js +1 -1
  162. package/lib/language/nb-NO.umd.js +728 -0
  163. package/lib/language/pt-BR.js +1 -1
  164. package/lib/language/pt-BR.min.js +1 -1
  165. package/lib/language/pt-BR.umd.js +1 -1
  166. package/lib/language/ru-RU.js +1 -1
  167. package/lib/language/ru-RU.min.js +1 -1
  168. package/lib/language/ru-RU.umd.js +1 -1
  169. package/lib/language/th-TH.d.ts +2 -0
  170. package/lib/language/th-TH.js +1 -1
  171. package/lib/language/th-TH.min.js +1 -1
  172. package/lib/language/th-TH.umd.js +728 -0
  173. package/lib/language/ug-CN.d.ts +2 -0
  174. package/lib/language/ug-CN.js +1 -1
  175. package/lib/language/ug-CN.min.js +1 -1
  176. package/lib/language/ug-CN.umd.js +728 -0
  177. package/lib/language/uk-UA.js +1 -1
  178. package/lib/language/uk-UA.min.js +1 -1
  179. package/lib/language/uk-UA.umd.js +1 -1
  180. package/lib/language/uz-UZ.d.ts +2 -0
  181. package/lib/language/uz-UZ.js +714 -0
  182. package/lib/language/uz-UZ.min.js +1 -0
  183. package/lib/language/uz-UZ.umd.js +728 -0
  184. package/lib/language/vi-VN.d.ts +2 -0
  185. package/lib/language/vi-VN.js +1 -1
  186. package/lib/language/vi-VN.min.js +1 -1
  187. package/lib/language/vi-VN.umd.js +728 -0
  188. package/lib/language/zh-CHT.d.ts +2 -0
  189. package/lib/language/zh-CHT.js +1 -1
  190. package/lib/language/zh-CHT.min.js +1 -1
  191. package/lib/language/zh-CHT.umd.js +728 -0
  192. package/lib/language/zh-CN.js +1 -1
  193. package/lib/language/zh-CN.min.js +1 -1
  194. package/lib/language/zh-CN.umd.js +1 -1
  195. package/lib/language/zh-TC.min.js +1 -1
  196. package/lib/print/src/print.js +4 -0
  197. package/lib/print/src/print.min.js +1 -1
  198. package/lib/print/src/util.js +45 -2
  199. package/lib/print/src/util.min.js +1 -1
  200. package/lib/pulldown/style/style.css +15 -0
  201. package/lib/pulldown/style/style.min.css +1 -1
  202. package/lib/select/style/style.css +15 -0
  203. package/lib/select/style/style.min.css +1 -1
  204. package/lib/style.css +1 -1
  205. package/lib/style.min.css +1 -1
  206. package/lib/table-select/style/style.css +15 -0
  207. package/lib/table-select/style/style.min.css +1 -1
  208. package/lib/tree-select/style/style.css +15 -0
  209. package/lib/tree-select/style/style.min.css +1 -1
  210. package/lib/ui/index.js +31 -6
  211. package/lib/ui/index.min.js +1 -1
  212. package/lib/ui/src/log.js +1 -1
  213. package/lib/ui/src/log.min.js +1 -1
  214. package/lib/vxe-date-panel/index.js +22 -0
  215. package/lib/vxe-date-panel/index.min.js +1 -0
  216. package/lib/vxe-date-panel/style/index.js +1 -0
  217. package/lib/vxe-date-panel/style/style.css +443 -0
  218. package/lib/vxe-date-panel/style/style.min.css +1 -0
  219. package/lib/vxe-date-picker/style/style.css +68 -810
  220. package/lib/vxe-date-picker/style/style.min.css +1 -1
  221. package/lib/vxe-date-range-picker/index.js +22 -0
  222. package/lib/vxe-date-range-picker/index.min.js +1 -0
  223. package/lib/vxe-date-range-picker/style/index.js +1 -0
  224. package/lib/vxe-date-range-picker/style/style.css +284 -0
  225. package/lib/vxe-date-range-picker/style/style.min.css +1 -0
  226. package/lib/vxe-pulldown/style/style.css +15 -0
  227. package/lib/vxe-pulldown/style/style.min.css +1 -1
  228. package/lib/vxe-select/style/style.css +15 -0
  229. package/lib/vxe-select/style/style.min.css +1 -1
  230. package/lib/vxe-table-select/style/style.css +15 -0
  231. package/lib/vxe-table-select/style/style.min.css +1 -1
  232. package/lib/vxe-tree-select/style/style.css +15 -0
  233. package/lib/vxe-tree-select/style/style.min.css +1 -1
  234. package/package.json +4 -5
  235. package/packages/calendar/src/calendar.ts +10 -10
  236. package/packages/components.ts +6 -0
  237. package/packages/date-panel/index.ts +16 -0
  238. package/packages/date-panel/src/date-panel.ts +1654 -0
  239. package/packages/date-panel/src/util.ts +212 -0
  240. package/packages/date-picker/index.ts +0 -1
  241. package/packages/date-picker/src/date-picker.ts +298 -1697
  242. package/packages/date-range-picker/index.ts +16 -0
  243. package/packages/date-range-picker/src/date-range-picker.ts +1196 -0
  244. package/packages/form/render/index.ts +21 -15
  245. package/packages/input/src/input.ts +15 -15
  246. package/packages/language/ar-EG.ts +1 -1
  247. package/packages/language/de-DE.ts +1 -1
  248. package/packages/language/en-US.ts +1 -1
  249. package/packages/language/es-ES.ts +1 -1
  250. package/packages/language/fr-FR.ts +1 -1
  251. package/packages/language/hu-HU.ts +1 -1
  252. package/packages/language/hy-AM.ts +1 -1
  253. package/packages/language/id-ID.ts +1 -1
  254. package/packages/language/it-IT.ts +1 -1
  255. package/packages/language/ja-JP.ts +1 -1
  256. package/packages/language/ko-KR.ts +1 -1
  257. package/packages/language/ms-MY.ts +708 -0
  258. package/packages/language/nb-NO.ts +1 -1
  259. package/packages/language/pt-BR.ts +1 -1
  260. package/packages/language/ru-RU.ts +1 -1
  261. package/packages/language/th-TH.ts +1 -1
  262. package/packages/language/ug-CN.ts +1 -1
  263. package/packages/language/uk-UA.ts +1 -1
  264. package/packages/language/uz-UZ.ts +708 -0
  265. package/packages/language/vi-VN.ts +1 -1
  266. package/packages/language/zh-CHT.ts +1 -1
  267. package/packages/language/zh-CN.ts +1 -1
  268. package/packages/print/src/print.ts +4 -0
  269. package/packages/print/src/util.ts +47 -4
  270. package/packages/ui/index.ts +30 -5
  271. package/styles/all.scss +2 -0
  272. package/styles/components/date-panel.scss +491 -0
  273. package/styles/components/date-picker.scss +62 -652
  274. package/styles/components/date-range-picker.scss +284 -0
  275. package/styles/components/pulldown.scss +10 -0
  276. package/styles/components/select.scss +8 -0
  277. package/styles/components/table-select.scss +8 -0
  278. package/styles/components/tree-select.scss +8 -0
  279. package/styles/helpers/baseMixin.scss +13 -0
  280. package/types/all.d.ts +6 -0
  281. package/types/components/button-group.d.ts +1 -1
  282. package/types/components/date-panel.d.ts +240 -0
  283. package/types/components/date-picker.d.ts +35 -142
  284. package/types/components/date-range-picker.d.ts +267 -0
  285. package/types/components/print.d.ts +8 -0
  286. package/types/ui/commands.d.ts +28 -2
  287. package/types/ui/global-config.d.ts +4 -0
  288. package/es/date-picker/src/util.js +0 -41
  289. package/lib/date-picker/src/util.js +0 -46
  290. package/lib/date-picker/src/util.min.js +0 -1
  291. package/lib/language/zh-TC.umd.js +0 -23
  292. package/packages/date-picker/src/util.ts +0 -42
  293. /package/es/icon/{iconfont.1746417522210.ttf → iconfont.1746782659171.ttf} +0 -0
  294. /package/es/icon/{iconfont.1746417522210.woff → iconfont.1746782659171.woff} +0 -0
  295. /package/es/icon/{iconfont.1746417522210.woff2 → iconfont.1746782659171.woff2} +0 -0
  296. /package/es/{iconfont.1746417522210.ttf → iconfont.1746782659171.ttf} +0 -0
  297. /package/es/{iconfont.1746417522210.woff → iconfont.1746782659171.woff} +0 -0
  298. /package/es/{iconfont.1746417522210.woff2 → iconfont.1746782659171.woff2} +0 -0
  299. /package/es/language/{zh-TC.d.ts → ar-EG.d.ts} +0 -0
  300. /package/{lib/language/zh-TC.d.ts → es/language/de-DE.d.ts} +0 -0
  301. /package/lib/icon/style/{iconfont.1746417522210.ttf → iconfont.1746782659171.ttf} +0 -0
  302. /package/lib/icon/style/{iconfont.1746417522210.woff → iconfont.1746782659171.woff} +0 -0
  303. /package/lib/icon/style/{iconfont.1746417522210.woff2 → iconfont.1746782659171.woff2} +0 -0
  304. /package/lib/{iconfont.1746417522210.ttf → iconfont.1746782659171.ttf} +0 -0
  305. /package/lib/{iconfont.1746417522210.woff → iconfont.1746782659171.woff} +0 -0
  306. /package/lib/{iconfont.1746417522210.woff2 → iconfont.1746782659171.woff2} +0 -0
@@ -0,0 +1,1196 @@
1
+ import { defineComponent, h, Teleport, ref, Ref, computed, provide, reactive, inject, nextTick, watch, PropType, onDeactivated, onUnmounted, onBeforeUnmount } from 'vue'
2
+ import XEUtils from 'xe-utils'
3
+ import { getConfig, getIcon, getI18n, commands, globalEvents, createEvent, useSize, renderEmptyElement } from '../../ui'
4
+ import { getFuncText, getLastZIndex, nextZIndex, isEnableConf } from '../../ui/src/utils'
5
+ import { getAbsolutePos, getEventTargetNode } from '../../ui/src/dom'
6
+ import { parseDateString, parseDateObj, getRangeDateByCode } from '../../date-panel/src/util'
7
+ import { getSlotVNs } from '../../ui/src/vn'
8
+ import { errLog } from '../../ui/src/log'
9
+ import VxeDatePanelComponent from '../../date-panel/src/date-panel'
10
+ import VxeButtonComponent from '../../button/src/button'
11
+ import VxeButtonGroupComponent from '../../button/src/button-group'
12
+
13
+ import type { VxeDateRangePickerConstructor, VxeDateRangePickerEmits, DateRangePickerInternalData, DateRangePickerReactData, VxeComponentStyleType, DateRangePickerMethods, VxeDateRangePickerPropTypes, DateRangePickerPrivateRef, VxeFormConstructor, VxeFormPrivateMethods, VxeFormDefines, ValueOf, VxeModalConstructor, VxeDrawerConstructor, VxeModalMethods, VxeDrawerMethods, VxeDateRangePickerDefines, VxeButtonGroupEvents, VxeDatePanelConstructor } from '../../../types'
14
+ import type { VxeTableConstructor, VxeTablePrivateMethods } from '../../../types/components/table'
15
+
16
+ export default defineComponent({
17
+ name: 'VxeDateRangePicker',
18
+ props: {
19
+ modelValue: [String, Number, Date, Array] as PropType<VxeDateRangePickerPropTypes.ModelValue>,
20
+ startValue: [String, Number, Date] as PropType<VxeDateRangePickerPropTypes.StartValue>,
21
+ endValue: [String, Number, Date] as PropType<VxeDateRangePickerPropTypes.EndValue>,
22
+ immediate: {
23
+ type: Boolean as PropType<VxeDateRangePickerPropTypes.Immediate>,
24
+ default: true
25
+ },
26
+ name: String as PropType<VxeDateRangePickerPropTypes.Name>,
27
+ type: {
28
+ type: String as PropType<VxeDateRangePickerPropTypes.Type>,
29
+ default: 'date'
30
+ },
31
+ clearable: {
32
+ type: Boolean as PropType<VxeDateRangePickerPropTypes.Clearable>,
33
+ default: () => getConfig().dateRangePicker.clearable
34
+ },
35
+ readonly: {
36
+ type: Boolean as PropType<VxeDateRangePickerPropTypes.Readonly>,
37
+ default: null
38
+ },
39
+ disabled: {
40
+ type: Boolean as PropType<VxeDateRangePickerPropTypes.Disabled>,
41
+ default: null
42
+ },
43
+ placeholder: String as PropType<VxeDateRangePickerPropTypes.Placeholder>,
44
+ autoComplete: {
45
+ type: String as PropType<VxeDateRangePickerPropTypes.AutoComplete>,
46
+ default: 'off'
47
+ },
48
+ form: String as PropType<VxeDateRangePickerPropTypes.Form>,
49
+ className: String as PropType<VxeDateRangePickerPropTypes.ClassName>,
50
+ size: {
51
+ type: String as PropType<VxeDateRangePickerPropTypes.Size>,
52
+ default: () => getConfig().dateRangePicker.size || getConfig().size
53
+ },
54
+
55
+ minDate: [String, Number, Date] as PropType<VxeDateRangePickerPropTypes.MinDate>,
56
+ maxDate: [String, Number, Date] as PropType<VxeDateRangePickerPropTypes.MaxDate>,
57
+ startDay: {
58
+ type: [String, Number] as PropType<VxeDateRangePickerPropTypes.StartDay>,
59
+ default: () => getConfig().dateRangePicker.startDay
60
+ },
61
+ labelFormat: String as PropType<VxeDateRangePickerPropTypes.LabelFormat>,
62
+ valueFormat: String as PropType<VxeDateRangePickerPropTypes.ValueFormat>,
63
+ editable: {
64
+ type: Boolean as PropType<VxeDateRangePickerPropTypes.Editable>,
65
+ default: true
66
+ },
67
+ festivalMethod: {
68
+ type: Function as PropType<VxeDateRangePickerPropTypes.FestivalMethod>,
69
+ default: () => getConfig().dateRangePicker.festivalMethod
70
+ },
71
+ disabledMethod: {
72
+ type: Function as PropType<VxeDateRangePickerPropTypes.DisabledMethod>,
73
+ default: () => getConfig().dateRangePicker.disabledMethod
74
+ },
75
+ separator: {
76
+ type: [String, Number] as PropType<VxeDateRangePickerPropTypes.Separator>,
77
+ default: () => getConfig().dateRangePicker.separator
78
+ },
79
+
80
+ // week
81
+ selectDay: {
82
+ type: [String, Number] as PropType<VxeDateRangePickerPropTypes.SelectDay>,
83
+ default: () => getConfig().dateRangePicker.selectDay
84
+ },
85
+ showClearButton: {
86
+ type: Boolean as PropType<VxeDateRangePickerPropTypes.ShowClearButton>,
87
+ default: () => getConfig().dateRangePicker.showClearButton
88
+ },
89
+ showConfirmButton: {
90
+ type: Boolean as PropType<VxeDateRangePickerPropTypes.ShowConfirmButton>,
91
+ default: () => getConfig().dateRangePicker.showConfirmButton
92
+ },
93
+ autoClose: {
94
+ type: Boolean as PropType<VxeDateRangePickerPropTypes.AutoClose>,
95
+ default: () => getConfig().dateRangePicker.autoClose
96
+ },
97
+
98
+ prefixIcon: String as PropType<VxeDateRangePickerPropTypes.PrefixIcon>,
99
+ suffixIcon: String as PropType<VxeDateRangePickerPropTypes.SuffixIcon>,
100
+ placement: String as PropType<VxeDateRangePickerPropTypes.Placement>,
101
+ transfer: {
102
+ type: Boolean as PropType<VxeDateRangePickerPropTypes.Transfer>,
103
+ default: null
104
+ },
105
+
106
+ shortcutConfig: Object as PropType<VxeDateRangePickerPropTypes.ShortcutConfig>
107
+ },
108
+ emits: [
109
+ 'update:modelValue',
110
+ 'update:startValue',
111
+ 'update:endValue',
112
+ 'input',
113
+ 'change',
114
+ 'keydown',
115
+ 'keyup',
116
+ 'click',
117
+ 'focus',
118
+ 'blur',
119
+ 'clear',
120
+ 'prefix-click',
121
+ 'suffix-click',
122
+ 'date-prev',
123
+ 'date-today',
124
+ 'date-next',
125
+ 'shortcut-click'
126
+ ] as VxeDateRangePickerEmits,
127
+ setup (props, context) {
128
+ const { slots, emit } = context
129
+
130
+ const $xeModal = inject<(VxeModalConstructor & VxeModalMethods) | null>('$xeModal', null)
131
+ const $xeDrawer = inject<(VxeDrawerConstructor & VxeDrawerMethods) | null>('$xeDrawer', null)
132
+ const $xeTable = inject<(VxeTableConstructor & VxeTablePrivateMethods) | null>('$xeTable', null)
133
+ const $xeForm = inject<(VxeFormConstructor & VxeFormPrivateMethods) | null>('$xeForm', null)
134
+ const formItemInfo = inject<VxeFormDefines.ProvideItemInfo | null>('xeFormItemInfo', null)
135
+
136
+ const xID = XEUtils.uniqueId()
137
+
138
+ const { computeSize } = useSize(props)
139
+
140
+ const reactData = reactive<DateRangePickerReactData>({
141
+ initialized: false,
142
+ panelIndex: 0,
143
+ visiblePanel: false,
144
+ isAniVisible: false,
145
+ panelStyle: {},
146
+ panelPlacement: '',
147
+ isActivated: false,
148
+ startValue: '',
149
+ endValue: ''
150
+ })
151
+
152
+ const internalData: DateRangePickerInternalData = {
153
+ // selectStatus: false
154
+ // hpTimeout: undefined
155
+ }
156
+
157
+ const refElem = ref() as Ref<HTMLDivElement>
158
+ const refInputTarget = ref() as Ref<HTMLInputElement>
159
+ const refInputPanel = ref<HTMLDivElement>()
160
+ const refPanelWrapper = ref<HTMLDivElement>()
161
+
162
+ const refStartDatePanel = ref<VxeDatePanelConstructor>()
163
+ const refEndDatePanel = ref<VxeDatePanelConstructor>()
164
+
165
+ const refMaps: DateRangePickerPrivateRef = {
166
+ refElem,
167
+ refInput: refInputTarget
168
+ }
169
+
170
+ const $xeDateRangePicker = {
171
+ xID,
172
+ props,
173
+ context,
174
+ reactData,
175
+ internalData,
176
+ getRefMaps: () => refMaps
177
+ } as unknown as VxeDateRangePickerConstructor
178
+
179
+ let dateRangePickerMethods = {} as DateRangePickerMethods
180
+
181
+ const computeBtnTransfer = computed(() => {
182
+ const { transfer } = props
183
+ if (transfer === null) {
184
+ const globalTransfer = getConfig().dateRangePicker.transfer
185
+ if (XEUtils.isBoolean(globalTransfer)) {
186
+ return globalTransfer
187
+ }
188
+ if ($xeTable || $xeModal || $xeDrawer || $xeForm) {
189
+ return true
190
+ }
191
+ }
192
+ return transfer
193
+ })
194
+
195
+ const computeFormReadonly = computed(() => {
196
+ const { readonly } = props
197
+ if (readonly === null) {
198
+ if ($xeForm) {
199
+ return $xeForm.props.readonly
200
+ }
201
+ return false
202
+ }
203
+ return readonly
204
+ })
205
+
206
+ const computeIsDisabled = computed(() => {
207
+ const { disabled } = props
208
+ if (disabled === null) {
209
+ if ($xeForm) {
210
+ return $xeForm.props.disabled
211
+ }
212
+ return false
213
+ }
214
+ return disabled
215
+ })
216
+
217
+ const computeMVal = computed(() => {
218
+ const { startValue, endValue } = props
219
+ return `${startValue || ''}${endValue || ''}`
220
+ })
221
+
222
+ const computeIsDateTimeType = computed(() => {
223
+ const { type } = props
224
+ return type === 'time' || type === 'datetime'
225
+ })
226
+
227
+ const computeIsDatePickerType = computed(() => {
228
+ return ['date', 'week', 'month', 'quarter', 'year'].indexOf(props.type) > -1
229
+ })
230
+
231
+ const computeIsClearable = computed(() => {
232
+ return props.clearable
233
+ })
234
+
235
+ const computeInpPlaceholder = computed(() => {
236
+ const { placeholder } = props
237
+ if (placeholder) {
238
+ return getFuncText(placeholder)
239
+ }
240
+ const globalPlaceholder = getConfig().dateRangePicker.placeholder
241
+ if (globalPlaceholder) {
242
+ return getFuncText(globalPlaceholder)
243
+ }
244
+ return getI18n('vxe.base.pleaseSelect')
245
+ })
246
+
247
+ const computeInpImmediate = computed(() => {
248
+ const { immediate } = props
249
+ return immediate
250
+ })
251
+
252
+ const computeShortcutOpts = computed(() => {
253
+ return Object.assign({}, getConfig().dateRangePicker.shortcutConfig, props.shortcutConfig)
254
+ })
255
+
256
+ const computeShortcutList = computed(() => {
257
+ const shortcutOpts = computeShortcutOpts.value
258
+ const { options } = shortcutOpts
259
+ if (options) {
260
+ return options.map((option, index) => {
261
+ return Object.assign({
262
+ name: `${option.name || option.code || index}`
263
+ }, option)
264
+ })
265
+ }
266
+ return []
267
+ })
268
+
269
+ const computeDateLabelFormat = computed(() => {
270
+ const { labelFormat } = props
271
+ return labelFormat || getI18n(`vxe.input.date.labelFormat.${props.type}`)
272
+ })
273
+
274
+ const computeDateValueFormat = computed(() => {
275
+ const { type, valueFormat } = props
276
+ if (valueFormat) {
277
+ return valueFormat
278
+ }
279
+ if (type === 'time') {
280
+ return 'HH:mm:ss'
281
+ }
282
+ if (type === 'datetime') {
283
+ return 'yyyy-MM-dd HH:mm:ss'
284
+ }
285
+ return 'yyyy-MM-dd'
286
+ })
287
+
288
+ const computeFirstDayOfWeek = computed(() => {
289
+ const { startDay } = props
290
+ return XEUtils.toNumber(startDay) as VxeDateRangePickerPropTypes.StartDay
291
+ })
292
+
293
+ const computePanelLabelObj = computed(() => {
294
+ const { startValue, endValue } = reactData
295
+ const vals: string[] = startValue || endValue ? [startValue || '', endValue || ''] : []
296
+ return formatRangeLabel(vals)
297
+ })
298
+
299
+ const computeInputLabel = computed(() => {
300
+ const panelLabelObj = computePanelLabelObj.value
301
+ return panelLabelObj.label
302
+ })
303
+
304
+ const formatRangeLabel = (vals: string[]) => {
305
+ const { type, separator } = props
306
+ const dateLabelFormat = computeDateLabelFormat.value
307
+ const dateValueFormat = computeDateValueFormat.value
308
+ const firstDayOfWeek = computeFirstDayOfWeek.value
309
+ const startRest = vals[0]
310
+ ? parseDateObj(vals[0], type, {
311
+ valueFormat: dateValueFormat,
312
+ labelFormat: dateLabelFormat,
313
+ firstDay: firstDayOfWeek
314
+ })
315
+ : null
316
+ const endRest = vals[1]
317
+ ? parseDateObj(vals[1], type, {
318
+ valueFormat: dateValueFormat,
319
+ labelFormat: dateLabelFormat,
320
+ firstDay: firstDayOfWeek
321
+ })
322
+ : null
323
+ const startLabel = startRest ? startRest.label : ''
324
+ const endLabel = endRest ? endRest.label : ''
325
+ return {
326
+ label: (startLabel || endLabel ? [startLabel, endLabel] : []).join(`${separator || ' ~ '}`),
327
+ startLabel,
328
+ endLabel
329
+ }
330
+ }
331
+
332
+ const getRangeValue = (sValue: string, eValue: string) => {
333
+ const { modelValue } = props
334
+ const isArr = XEUtils.isArray(modelValue)
335
+ if (sValue || eValue) {
336
+ const rest = [sValue || '', eValue || '']
337
+ if (isArr) {
338
+ return rest
339
+ }
340
+ return rest.join(',')
341
+ }
342
+ return isArr ? [] : ''
343
+ }
344
+
345
+ const paraeUpdateModel = () => {
346
+ const { type, modelValue } = props
347
+ const dateValueFormat = computeDateValueFormat.value
348
+ let sValue: string | Date | null = ''
349
+ let eValue: string | Date | null = ''
350
+ if (XEUtils.isArray(modelValue)) {
351
+ const date1 = parseDateString(modelValue[0], type, { valueFormat: dateValueFormat })
352
+ const date2 = parseDateString(modelValue[1], type, { valueFormat: dateValueFormat })
353
+ if (date1 || date2) {
354
+ sValue = date1 || ''
355
+ eValue = date2 || ''
356
+ }
357
+ } else if (XEUtils.isString(modelValue)) {
358
+ const strArr = modelValue.split(',')
359
+ if (strArr[0] || strArr[1]) {
360
+ sValue = strArr[0] || ''
361
+ eValue = strArr[1] || ''
362
+ }
363
+ }
364
+ return {
365
+ sValue,
366
+ eValue
367
+ }
368
+ }
369
+
370
+ const parseUpdateData = () => {
371
+ const { type, startValue, endValue } = props
372
+ const dateValueFormat = computeDateValueFormat.value
373
+ let sValue: string | Date | null = ''
374
+ let eValue: string | Date | null = ''
375
+ sValue = parseDateString(startValue, type, { valueFormat: dateValueFormat })
376
+ eValue = parseDateString(endValue, type, { valueFormat: dateValueFormat })
377
+ return {
378
+ sValue,
379
+ eValue
380
+ }
381
+ }
382
+
383
+ const updateModelValue = (isModel: boolean) => {
384
+ const { modelValue, startValue, endValue } = props
385
+ let restObj: {
386
+ sValue: string | Date | null
387
+ eValue: string | Date | null
388
+ } = {
389
+ sValue: '',
390
+ eValue: ''
391
+ }
392
+ if (isModel) {
393
+ if (modelValue) {
394
+ restObj = paraeUpdateModel()
395
+ } else {
396
+ restObj = parseUpdateData()
397
+ }
398
+ } else {
399
+ if (startValue || endValue) {
400
+ restObj = parseUpdateData()
401
+ } else {
402
+ restObj = paraeUpdateModel()
403
+ }
404
+ }
405
+ reactData.startValue = restObj.sValue
406
+ reactData.endValue = restObj.eValue
407
+ }
408
+
409
+ const triggerEvent = (evnt: Event & { type: 'input' | 'change' | 'keydown' | 'keyup' | 'click' | 'focus' | 'blur' }) => {
410
+ const { startValue, endValue } = reactData
411
+ const value = getRangeValue(startValue, endValue)
412
+ dispatchEvent(evnt.type, { value, startValue, endValue }, evnt)
413
+ }
414
+
415
+ const handleChange = (sValue: string, eValue: string, evnt: Event | { type: string }) => {
416
+ const { modelValue } = props
417
+ reactData.startValue = sValue
418
+ reactData.endValue = eValue
419
+ const value = getRangeValue(sValue, eValue)
420
+ emit('update:modelValue', value)
421
+ emit('update:startValue', sValue || '')
422
+ emit('update:endValue', eValue || '')
423
+ if (XEUtils.toValueString(modelValue) !== value) {
424
+ dispatchEvent('change', { value }, evnt as any)
425
+ // 自动更新校验状态
426
+ if ($xeForm && formItemInfo) {
427
+ $xeForm.triggerItemEvent(evnt, formItemInfo.itemConfig.field, value)
428
+ }
429
+ }
430
+ }
431
+
432
+ const changeEvent = (evnt: Event & { type: 'change' }) => {
433
+ const inpImmediate = computeInpImmediate.value
434
+ if (!inpImmediate) {
435
+ triggerEvent(evnt)
436
+ }
437
+ }
438
+
439
+ const focusEvent = (evnt: Event & { type: 'focus' }) => {
440
+ reactData.isActivated = true
441
+ dateRangePickerOpenEvent(evnt)
442
+ triggerEvent(evnt)
443
+ }
444
+
445
+ const clickPrefixEvent = (evnt: Event) => {
446
+ const isDisabled = computeIsDisabled.value
447
+ if (!isDisabled) {
448
+ const { startValue, endValue } = reactData
449
+ const value = getRangeValue(startValue, endValue)
450
+ dispatchEvent('prefix-click', { value, startValue, endValue }, evnt)
451
+ }
452
+ }
453
+
454
+ const hidePanel = () => {
455
+ return new Promise<void>(resolve => {
456
+ reactData.visiblePanel = false
457
+ internalData.hpTimeout = setTimeout(() => {
458
+ reactData.isAniVisible = false
459
+ resolve()
460
+ }, 350)
461
+ })
462
+ }
463
+
464
+ const clearValueEvent = (evnt: Event, value: VxeDateRangePickerPropTypes.ModelValue) => {
465
+ const isDatePickerType = computeIsDatePickerType.value
466
+ if (isDatePickerType) {
467
+ hidePanel()
468
+ }
469
+ handleChange('', '', evnt)
470
+ dispatchEvent('clear', { value }, evnt)
471
+ }
472
+
473
+ const checkValue = () => {
474
+ const $startDatePanel = refStartDatePanel.value
475
+ const $endDatePanel = refEndDatePanel.value
476
+ if ($startDatePanel && $endDatePanel) {
477
+ const startValue = $startDatePanel.getValue()
478
+ const endValue = $endDatePanel.getValue()
479
+ if (!startValue || !endValue) {
480
+ handleChange('', '', { type: 'check' })
481
+ }
482
+ }
483
+ }
484
+
485
+ const handleSelectClose = () => {
486
+ const { autoClose } = props
487
+ const { startValue, endValue } = reactData
488
+ const { selectStatus } = internalData
489
+ const isDatePickerType = computeIsDatePickerType.value
490
+ if (autoClose) {
491
+ if (selectStatus && isDatePickerType) {
492
+ if (startValue && endValue) {
493
+ hidePanel()
494
+ }
495
+ }
496
+ } else {
497
+ if (startValue && endValue) {
498
+ internalData.selectStatus = false
499
+ }
500
+ }
501
+ }
502
+
503
+ const clickSuffixEvent = (evnt: Event) => {
504
+ const isDisabled = computeIsDisabled.value
505
+ if (!isDisabled) {
506
+ const { startValue, endValue } = reactData
507
+ const value = getRangeValue(startValue, endValue)
508
+ dispatchEvent('suffix-click', { value, startValue, endValue }, evnt)
509
+ }
510
+ }
511
+
512
+ const blurEvent = (evnt: Event & { type: 'blur' }) => {
513
+ const { startValue, endValue } = reactData
514
+ const inpImmediate = computeInpImmediate.value
515
+ const value = ''
516
+ if (!inpImmediate) {
517
+ handleChange(startValue, endValue, evnt)
518
+ }
519
+ if (!reactData.visiblePanel) {
520
+ reactData.isActivated = false
521
+ }
522
+ dispatchEvent('blur', { value, startValue, endValue }, evnt)
523
+ // 自动更新校验状态
524
+ if ($xeForm && formItemInfo) {
525
+ $xeForm.triggerItemEvent(evnt, formItemInfo.itemConfig.field, value)
526
+ }
527
+ }
528
+
529
+ const keydownEvent = (evnt: KeyboardEvent & { type: 'keydown' }) => {
530
+ triggerEvent(evnt)
531
+ }
532
+
533
+ const keyupEvent = (evnt: KeyboardEvent & { type: 'keyup' }) => {
534
+ triggerEvent(evnt)
535
+ }
536
+
537
+ const confirmEvent = (evnt: MouseEvent) => {
538
+ const $startDatePanel = refStartDatePanel.value
539
+ const $endDatePanel = refEndDatePanel.value
540
+ if ($startDatePanel && $endDatePanel) {
541
+ const startValue = $startDatePanel.getValue()
542
+ const endValue = $endDatePanel.getValue()
543
+ if (startValue && endValue) {
544
+ $startDatePanel.confirmByEvent(evnt)
545
+ $endDatePanel.confirmByEvent(evnt)
546
+ } else {
547
+ handleChange('', '', evnt)
548
+ }
549
+ }
550
+ hidePanel()
551
+ }
552
+
553
+ const startPanelChangeEvent = (params: any) => {
554
+ const { selectStatus } = internalData
555
+ const { value, $event } = params
556
+ const endValue = selectStatus ? reactData.endValue : ''
557
+ handleChange(value, endValue, $event)
558
+ handleSelectClose()
559
+ if (!selectStatus) {
560
+ internalData.selectStatus = true
561
+ }
562
+ nextTick(() => {
563
+ const $startDatePanel = refStartDatePanel.value
564
+ const $endDatePanel = refEndDatePanel.value
565
+ if ($startDatePanel && $endDatePanel) {
566
+ const startValue = $startDatePanel.getValue()
567
+ if (!endValue && startValue) {
568
+ $endDatePanel.setPanelDate(XEUtils.toStringDate(startValue))
569
+ }
570
+ }
571
+ })
572
+ }
573
+
574
+ const endPanelChangeEvent = (params: any) => {
575
+ const { selectStatus } = internalData
576
+ const { value, $event } = params
577
+ const startValue = selectStatus ? reactData.startValue : ''
578
+ handleChange(startValue, value, $event)
579
+ handleSelectClose()
580
+ if (!selectStatus) {
581
+ internalData.selectStatus = true
582
+ }
583
+ nextTick(() => {
584
+ const $startDatePanel = refStartDatePanel.value
585
+ const $endDatePanel = refEndDatePanel.value
586
+ if ($startDatePanel && $endDatePanel) {
587
+ const endValue = $endDatePanel.getValue()
588
+ if (!startValue && endValue) {
589
+ $startDatePanel.setPanelDate(XEUtils.toStringDate(endValue))
590
+ }
591
+ }
592
+ })
593
+ }
594
+
595
+ // 全局事件
596
+ const handleGlobalMousedownEvent = (evnt: Event) => {
597
+ const { visiblePanel, isActivated } = reactData
598
+ const el = refElem.value
599
+ const panelWrapperElem = refPanelWrapper.value
600
+ const isDisabled = computeIsDisabled.value
601
+ if (!isDisabled && isActivated) {
602
+ reactData.isActivated = getEventTargetNode(evnt, el).flag || getEventTargetNode(evnt, panelWrapperElem).flag
603
+ if (!reactData.isActivated) {
604
+ if (visiblePanel) {
605
+ checkValue()
606
+ hidePanel()
607
+ }
608
+ }
609
+ }
610
+ }
611
+
612
+ const handleGlobalMousewheelEvent = (evnt: Event) => {
613
+ const { visiblePanel } = reactData
614
+ const isDisabled = computeIsDisabled.value
615
+ if (!isDisabled) {
616
+ if (visiblePanel) {
617
+ const panelWrapperElem = refPanelWrapper.value
618
+ if (getEventTargetNode(evnt, panelWrapperElem).flag) {
619
+ updatePlacement()
620
+ } else {
621
+ hidePanel()
622
+ }
623
+ }
624
+ }
625
+ }
626
+
627
+ const handleGlobalBlurEvent = () => {
628
+ const { visiblePanel } = reactData
629
+ if (visiblePanel) {
630
+ hidePanel()
631
+ }
632
+ }
633
+
634
+ // 弹出面板
635
+ const updateZindex = () => {
636
+ if (reactData.panelIndex < getLastZIndex()) {
637
+ reactData.panelIndex = nextZIndex()
638
+ }
639
+ }
640
+
641
+ const updatePlacement = () => {
642
+ return nextTick().then(() => {
643
+ const { placement } = props
644
+ const { panelIndex } = reactData
645
+ const targetElem = refInputTarget.value
646
+ const panelElem = refInputPanel.value
647
+ const btnTransfer = computeBtnTransfer.value
648
+ if (targetElem && panelElem) {
649
+ const targetHeight = targetElem.offsetHeight
650
+ const targetWidth = targetElem.offsetWidth
651
+ const panelHeight = panelElem.offsetHeight
652
+ const panelWidth = panelElem.offsetWidth
653
+ const marginSize = 5
654
+ const panelStyle: VxeComponentStyleType = {
655
+ zIndex: panelIndex
656
+ }
657
+ const { boundingTop, boundingLeft, visibleHeight, visibleWidth } = getAbsolutePos(targetElem)
658
+ let panelPlacement: VxeDateRangePickerPropTypes.Placement = 'bottom'
659
+ if (btnTransfer) {
660
+ let left = boundingLeft
661
+ let top = boundingTop + targetHeight
662
+ if (placement === 'top') {
663
+ panelPlacement = 'top'
664
+ top = boundingTop - panelHeight
665
+ } else if (!placement) {
666
+ // 如果下面不够放,则向上
667
+ if (top + panelHeight + marginSize > visibleHeight) {
668
+ panelPlacement = 'top'
669
+ top = boundingTop - panelHeight
670
+ }
671
+ // 如果上面不够放,则向下(优先)
672
+ if (top < marginSize) {
673
+ panelPlacement = 'bottom'
674
+ top = boundingTop + targetHeight
675
+ }
676
+ }
677
+ // 如果溢出右边
678
+ if (left + panelWidth + marginSize > visibleWidth) {
679
+ left -= left + panelWidth + marginSize - visibleWidth
680
+ }
681
+ // 如果溢出左边
682
+ if (left < marginSize) {
683
+ left = marginSize
684
+ }
685
+ Object.assign(panelStyle, {
686
+ left: `${left}px`,
687
+ top: `${top}px`,
688
+ minWidth: `${targetWidth}px`
689
+ })
690
+ } else {
691
+ if (placement === 'top') {
692
+ panelPlacement = 'top'
693
+ panelStyle.bottom = `${targetHeight}px`
694
+ } else if (!placement) {
695
+ // 如果下面不够放,则向上
696
+ panelStyle.top = `${targetHeight}px`
697
+ if (boundingTop + targetHeight + panelHeight > visibleHeight) {
698
+ // 如果上面不够放,则向下(优先)
699
+ if (boundingTop - targetHeight - panelHeight > marginSize) {
700
+ panelPlacement = 'top'
701
+ panelStyle.top = ''
702
+ panelStyle.bottom = `${targetHeight}px`
703
+ }
704
+ }
705
+ }
706
+ }
707
+ reactData.panelStyle = panelStyle
708
+ reactData.panelPlacement = panelPlacement
709
+ return nextTick()
710
+ }
711
+ })
712
+ }
713
+
714
+ const showPanel = () => {
715
+ const { visiblePanel } = reactData
716
+ const isDisabled = computeIsDisabled.value
717
+ if (!isDisabled && !visiblePanel) {
718
+ if (!reactData.initialized) {
719
+ reactData.initialized = true
720
+ }
721
+ if (internalData.hpTimeout) {
722
+ clearTimeout(internalData.hpTimeout)
723
+ internalData.hpTimeout = undefined
724
+ }
725
+ internalData.selectStatus = false
726
+ reactData.isActivated = true
727
+ reactData.isAniVisible = true
728
+ setTimeout(() => {
729
+ reactData.visiblePanel = true
730
+ }, 10)
731
+ updateZindex()
732
+ return updatePlacement()
733
+ }
734
+ return nextTick()
735
+ }
736
+
737
+ const dateRangePickerOpenEvent = (evnt: Event) => {
738
+ const formReadonly = computeFormReadonly.value
739
+ if (!formReadonly) {
740
+ evnt.preventDefault()
741
+ showPanel()
742
+ }
743
+ }
744
+
745
+ const clickEvent = (evnt: Event & { type: 'click' }) => {
746
+ triggerEvent(evnt)
747
+ }
748
+
749
+ const handleShortcutEvent: VxeButtonGroupEvents.Click = ({ option, $event }) => {
750
+ const { type } = props
751
+ const shortcutOpts = computeShortcutOpts.value
752
+ const { autoClose } = shortcutOpts
753
+ const { code, clickMethod } = option as VxeDateRangePickerDefines.ShortcutOption
754
+ let startValue = reactData.startValue
755
+ let endValue = reactData.endValue
756
+ let value = getRangeValue(startValue, endValue)
757
+ const shortcutParams = {
758
+ $dateRangePicker: $xeDateRangePicker,
759
+ option: option,
760
+ value,
761
+ startValue,
762
+ endValue,
763
+ code
764
+ }
765
+ if (!clickMethod && code) {
766
+ const gCommandOpts = commands.get(code)
767
+ const drpCommandMethod = gCommandOpts ? gCommandOpts.dateRangePickerCommandMethod : null
768
+ if (drpCommandMethod) {
769
+ drpCommandMethod(shortcutParams)
770
+ } else {
771
+ const dateValueFormat = computeDateValueFormat.value
772
+ const firstDayOfWeek = computeFirstDayOfWeek.value
773
+ switch (code) {
774
+ case 'last1':
775
+ case 'last3':
776
+ case 'last7':
777
+ case 'last30':
778
+ case 'last60':
779
+ case 'last90':
780
+ case 'last180': {
781
+ const restObj = getRangeDateByCode(code, value, type, {
782
+ valueFormat: dateValueFormat,
783
+ firstDay: firstDayOfWeek
784
+ })
785
+ startValue = restObj.startValue
786
+ endValue = restObj.endValue
787
+ value = getRangeValue(startValue, endValue)
788
+ shortcutParams.value = value
789
+ shortcutParams.startValue = startValue
790
+ shortcutParams.endValue = endValue
791
+ handleChange(startValue, endValue, $event)
792
+ break
793
+ }
794
+ default:
795
+ errLog('vxe.error.notCommands', [code])
796
+ break
797
+ }
798
+ }
799
+ } else {
800
+ const optClickMethod = clickMethod || shortcutOpts.clickMethod
801
+ if (optClickMethod) {
802
+ optClickMethod(shortcutParams)
803
+ }
804
+ }
805
+ if (autoClose) {
806
+ hidePanel()
807
+ }
808
+ dispatchEvent('shortcut-click', shortcutParams, $event)
809
+ }
810
+
811
+ const dispatchEvent = (type: ValueOf<VxeDateRangePickerEmits>, params: Record<string, any>, evnt: Event | null) => {
812
+ emit(type, createEvent(evnt, { $dateRangePicker: $xeDateRangePicker }, params))
813
+ }
814
+
815
+ dateRangePickerMethods = {
816
+ dispatchEvent,
817
+
818
+ setModelValue (startValue, endValue) {
819
+ reactData.startValue = startValue || ''
820
+ reactData.endValue = endValue || ''
821
+ const value = getRangeValue(startValue, endValue)
822
+ emit('update:modelValue', value)
823
+ },
824
+ setModelValueByEvent (evnt, startValue, endValue) {
825
+ handleChange(startValue || '', endValue || '', evnt)
826
+ },
827
+ focus () {
828
+ const inputElem = refInputTarget.value
829
+ reactData.isActivated = true
830
+ inputElem.focus()
831
+ return nextTick()
832
+ },
833
+ blur () {
834
+ const inputElem = refInputTarget.value
835
+ inputElem.blur()
836
+ reactData.isActivated = false
837
+ return nextTick()
838
+ },
839
+ select () {
840
+ const inputElem = refInputTarget.value
841
+ inputElem.select()
842
+ reactData.isActivated = false
843
+ return nextTick()
844
+ },
845
+ showPanel,
846
+ hidePanel,
847
+ updatePlacement
848
+ }
849
+
850
+ Object.assign($xeDateRangePicker, dateRangePickerMethods)
851
+
852
+ const renderShortcutBtn = (pos: 'top' | 'bottom' | 'left' | 'right' | 'header' | 'footer', isVertical?: boolean) => {
853
+ const shortcutOpts = computeShortcutOpts.value
854
+ const { position, align, mode } = shortcutOpts
855
+ const shortcutList = computeShortcutList.value
856
+ if (isEnableConf(shortcutOpts) && shortcutList.length && (position || 'left') === pos) {
857
+ return h('div', {
858
+ class: `vxe-date-range-picker--layout-${pos}-wrapper`
859
+ }, [
860
+ h(VxeButtonGroupComponent, {
861
+ options: shortcutList,
862
+ mode,
863
+ align,
864
+ vertical: isVertical,
865
+ onClick: handleShortcutEvent
866
+ })
867
+ ])
868
+ }
869
+ return renderEmptyElement($xeDateRangePicker)
870
+ }
871
+
872
+ const renderPanel = () => {
873
+ const { type, separator, autoClose, showConfirmButton, showClearButton } = props
874
+ const { initialized, isAniVisible, visiblePanel, panelPlacement, panelStyle, startValue, endValue } = reactData
875
+ const vSize = computeSize.value
876
+ const btnTransfer = computeBtnTransfer.value
877
+ const shortcutOpts = computeShortcutOpts.value
878
+ const isClearable = computeIsClearable.value
879
+ const panelLabelObj = computePanelLabelObj.value
880
+ const shortcutList = computeShortcutList.value
881
+ const isDateTimeType = computeIsDateTimeType.value
882
+ const { startLabel, endLabel } = panelLabelObj
883
+ const { position } = shortcutOpts
884
+ const headerSlot = slots.header
885
+ const footerSlot = slots.footer
886
+ const topSlot = slots.top
887
+ const bottomSlot = slots.bottom
888
+ const leftSlot = slots.left
889
+ const rightSlot = slots.right
890
+ const hasShortcutBtn = shortcutList.length > 0
891
+ const showConfirmBtn = (showConfirmButton === null ? (isDateTimeType || !autoClose) : showConfirmButton)
892
+ const showClearBtn = (showClearButton === null ? isClearable : showClearButton)
893
+ return h(Teleport, {
894
+ to: 'body',
895
+ disabled: btnTransfer ? !initialized : true
896
+ }, [
897
+ h('div', {
898
+ ref: refInputPanel,
899
+ class: ['vxe-table--ignore-clear vxe-date-range-picker--panel', `type--${type}`, {
900
+ [`size--${vSize}`]: vSize,
901
+ 'is--transfer': btnTransfer,
902
+ 'ani--leave': isAniVisible,
903
+ 'ani--enter': visiblePanel,
904
+ 'show--top': !!(topSlot || headerSlot || (hasShortcutBtn && (position === 'top' || position === 'header'))),
905
+ 'show--bottom': !!(bottomSlot || footerSlot || (hasShortcutBtn && (position === 'bottom' || position === 'footer'))),
906
+ 'show--left': !!(leftSlot || (hasShortcutBtn && position === 'left')),
907
+ 'show--right': !!(rightSlot || (hasShortcutBtn && position === 'right'))
908
+ }],
909
+ placement: panelPlacement,
910
+ style: panelStyle
911
+ }, initialized && (visiblePanel || isAniVisible)
912
+ ? [
913
+ h('div', {
914
+ ref: refPanelWrapper,
915
+ class: ['vxe-date-range-picker--layout-all-wrapper', `type--${type}`, {
916
+ [`size--${vSize}`]: vSize
917
+ }]
918
+ }, [
919
+ topSlot
920
+ ? h('div', {
921
+ class: 'vxe-date-range-picker--layout-top-wrapper'
922
+ }, topSlot({}))
923
+ : renderShortcutBtn('top'),
924
+ h('div', {
925
+ class: 'vxe-date-range-picker--layout-body-layout-wrapper'
926
+ }, [
927
+ leftSlot
928
+ ? h('div', {
929
+ class: 'vxe-date-range-picker--layout-left-wrapper'
930
+ }, leftSlot({}))
931
+ : renderShortcutBtn('left', true),
932
+ h('div', {
933
+ class: 'vxe-date-range-picker--layout-body-content-wrapper'
934
+ }, [
935
+ headerSlot
936
+ ? h('div', {
937
+ class: 'vxe-date-range-picker--layout-header-wrapper'
938
+ }, headerSlot({}))
939
+ : renderShortcutBtn('header'),
940
+ h('div', {
941
+ class: 'vxe-date-range-picker--layout-body-wrapper'
942
+ }, [
943
+ h(VxeDatePanelComponent, {
944
+ ref: refStartDatePanel,
945
+ modelValue: startValue,
946
+ type: props.type,
947
+ className: props.className,
948
+ minDate: props.minDate,
949
+ maxDate: props.maxDate,
950
+ startDay: props.startDay,
951
+ endDate: endValue,
952
+ labelFormat: props.labelFormat,
953
+ valueFormat: props.valueFormat,
954
+ festivalMethod: props.festivalMethod,
955
+ disabledMethod: props.disabledMethod,
956
+ selectDay: props.selectDay,
957
+ onChange: startPanelChangeEvent
958
+ }),
959
+ h(VxeDatePanelComponent, {
960
+ ref: refEndDatePanel,
961
+ modelValue: endValue,
962
+ type: props.type,
963
+ className: props.className,
964
+ minDate: props.minDate,
965
+ maxDate: props.maxDate,
966
+ startDay: props.startDay,
967
+ startDate: startValue,
968
+ labelFormat: props.labelFormat,
969
+ valueFormat: props.valueFormat,
970
+ festivalMethod: props.festivalMethod,
971
+ disabledMethod: props.disabledMethod,
972
+ selectDay: props.selectDay,
973
+ onChange: endPanelChangeEvent
974
+ })
975
+ ]),
976
+ h('div', {
977
+ class: 'vxe-date-range-picker--layout-footer-wrapper'
978
+ }, [
979
+ h('div', {
980
+ class: 'vxe-date-range-picker--layout-footer-label'
981
+ }, startLabel || endLabel
982
+ ? [
983
+ h('span', startLabel),
984
+ h('span', `${separator || ''}`),
985
+ h('span', endLabel)
986
+ ]
987
+ : []),
988
+ h('div', {
989
+ class: 'vxe-date-range-picker--layout-footer-custom'
990
+ }, footerSlot ? footerSlot({}) : [renderShortcutBtn('footer')]),
991
+ h('div', {
992
+ class: 'vxe-date-range-picker--layout-footer-btns'
993
+ }, [
994
+ showClearBtn
995
+ ? h(VxeButtonComponent, {
996
+ size: 'mini',
997
+ disabled: !(startValue || endValue),
998
+ content: getI18n('vxe.button.clear'),
999
+ onClick: clearValueEvent
1000
+ })
1001
+ : renderEmptyElement($xeDateRangePicker),
1002
+ showConfirmBtn
1003
+ ? h(VxeButtonComponent, {
1004
+ size: 'mini',
1005
+ status: 'primary',
1006
+ content: getI18n('vxe.button.confirm'),
1007
+ onClick: confirmEvent
1008
+ })
1009
+ : renderEmptyElement($xeDateRangePicker)
1010
+ ])
1011
+ ])
1012
+ ]),
1013
+ rightSlot
1014
+ ? h('div', {
1015
+ class: 'vxe-date-range-picker--layout-right-wrapper'
1016
+ }, rightSlot({}))
1017
+ : renderShortcutBtn('right', true)
1018
+ ]),
1019
+ bottomSlot
1020
+ ? h('div', {
1021
+ class: 'vxe-date-range-picker--layout-bottom-wrapper'
1022
+ }, bottomSlot({}))
1023
+ : renderShortcutBtn('bottom')
1024
+ ])
1025
+ ]
1026
+ : [])
1027
+ ])
1028
+ }
1029
+
1030
+ const renderPrefixIcon = () => {
1031
+ const { prefixIcon } = props
1032
+ const prefixSlot = slots.prefix
1033
+ return prefixSlot || prefixIcon
1034
+ ? h('div', {
1035
+ class: 'vxe-date-range-picker--prefix',
1036
+ onClick: clickPrefixEvent
1037
+ }, [
1038
+ h('div', {
1039
+ class: 'vxe-date-range-picker--prefix-icon'
1040
+ }, prefixSlot
1041
+ ? getSlotVNs(prefixSlot({}))
1042
+ : [
1043
+ h('i', {
1044
+ class: prefixIcon
1045
+ })
1046
+ ])
1047
+ ])
1048
+ : null
1049
+ }
1050
+
1051
+ const renderSuffixIcon = () => {
1052
+ const { suffixIcon } = props
1053
+ const { startValue, endValue } = reactData
1054
+ const suffixSlot = slots.suffix
1055
+ const isDisabled = computeIsDisabled.value
1056
+ const isClearable = computeIsClearable.value
1057
+ return h('div', {
1058
+ class: ['vxe-date-range-picker--suffix', {
1059
+ 'is--clear': isClearable && !isDisabled && (startValue || endValue)
1060
+ }]
1061
+ }, [
1062
+ isClearable
1063
+ ? h('div', {
1064
+ class: 'vxe-date-range-picker--clear-icon',
1065
+ onClick: clearValueEvent
1066
+ }, [
1067
+ h('i', {
1068
+ class: getIcon().INPUT_CLEAR
1069
+ })
1070
+ ])
1071
+ : renderEmptyElement($xeDateRangePicker),
1072
+ renderExtraSuffixIcon(),
1073
+ suffixSlot || suffixIcon
1074
+ ? h('div', {
1075
+ class: 'vxe-date-range-picker--suffix-icon',
1076
+ onClick: clickSuffixEvent
1077
+ }, suffixSlot
1078
+ ? getSlotVNs(suffixSlot({}))
1079
+ : [
1080
+ h('i', {
1081
+ class: suffixIcon
1082
+ })
1083
+ ])
1084
+ : renderEmptyElement($xeDateRangePicker)
1085
+ ])
1086
+ }
1087
+
1088
+ const renderExtraSuffixIcon = () => {
1089
+ return h('div', {
1090
+ class: 'vxe-date-range-picker--control-icon',
1091
+ onClick: dateRangePickerOpenEvent
1092
+ }, [
1093
+ h('i', {
1094
+ class: ['vxe-date-range-picker--date-picker-icon', getIcon().DATE_PICKER_DATE]
1095
+ })
1096
+ ])
1097
+ }
1098
+
1099
+ const renderVN = () => {
1100
+ const { className, type, name, autoComplete } = props
1101
+ const { startValue, endValue, visiblePanel, isActivated } = reactData
1102
+ const vSize = computeSize.value
1103
+ const isDisabled = computeIsDisabled.value
1104
+ const formReadonly = computeFormReadonly.value
1105
+ const inputLabel = computeInputLabel.value
1106
+ if (formReadonly) {
1107
+ return h('div', {
1108
+ ref: refElem,
1109
+ class: ['vxe-date-range-picker--readonly', `type--${type}`, className]
1110
+ }, inputLabel)
1111
+ }
1112
+ const inpPlaceholder = computeInpPlaceholder.value
1113
+ const isClearable = computeIsClearable.value
1114
+ const prefix = renderPrefixIcon()
1115
+ const suffix = renderSuffixIcon()
1116
+ return h('div', {
1117
+ ref: refElem,
1118
+ class: ['vxe-date-range-picker', `type--${type}`, className, {
1119
+ [`size--${vSize}`]: vSize,
1120
+ 'is--prefix': !!prefix,
1121
+ 'is--suffix': !!suffix,
1122
+ 'is--visible': visiblePanel,
1123
+ 'is--disabled': isDisabled,
1124
+ 'is--active': isActivated,
1125
+ 'show--clear': isClearable && !isDisabled && (startValue || endValue)
1126
+ }],
1127
+ spellcheck: false
1128
+ }, [
1129
+ prefix || renderEmptyElement($xeDateRangePicker),
1130
+ h('div', {
1131
+ class: 'vxe-date-range-picker--wrapper'
1132
+ }, [
1133
+ h('input', {
1134
+ ref: refInputTarget,
1135
+ class: 'vxe-date-range-picker--inner',
1136
+ value: inputLabel,
1137
+ name,
1138
+ type: 'text',
1139
+ placeholder: inpPlaceholder,
1140
+ readonly: true,
1141
+ disabled: isDisabled,
1142
+ autocomplete: autoComplete,
1143
+ onKeydown: keydownEvent,
1144
+ onKeyup: keyupEvent,
1145
+ onClick: clickEvent,
1146
+ onChange: changeEvent,
1147
+ onFocus: focusEvent,
1148
+ onBlur: blurEvent
1149
+ })
1150
+ ]),
1151
+ suffix || renderEmptyElement($xeDateRangePicker),
1152
+ // 下拉面板
1153
+ renderPanel()
1154
+ ])
1155
+ }
1156
+
1157
+ watch(() => props.modelValue, () => {
1158
+ updateModelValue(true)
1159
+ })
1160
+
1161
+ watch(computeMVal, () => {
1162
+ updateModelValue(false)
1163
+ })
1164
+
1165
+ updateModelValue(true)
1166
+
1167
+ nextTick(() => {
1168
+ globalEvents.on($xeDateRangePicker, 'mousewheel', handleGlobalMousewheelEvent)
1169
+ globalEvents.on($xeDateRangePicker, 'mousedown', handleGlobalMousedownEvent)
1170
+ globalEvents.on($xeDateRangePicker, 'blur', handleGlobalBlurEvent)
1171
+ })
1172
+
1173
+ onDeactivated(() => {
1174
+ checkValue()
1175
+ })
1176
+
1177
+ onUnmounted(() => {
1178
+ globalEvents.off($xeDateRangePicker, 'mousewheel')
1179
+ globalEvents.off($xeDateRangePicker, 'mousedown')
1180
+ globalEvents.off($xeDateRangePicker, 'blur')
1181
+ })
1182
+
1183
+ onBeforeUnmount(() => {
1184
+ checkValue()
1185
+ })
1186
+
1187
+ provide('$xeDateRangePicker', $xeDateRangePicker)
1188
+
1189
+ $xeDateRangePicker.renderVN = renderVN
1190
+
1191
+ return $xeDateRangePicker
1192
+ },
1193
+ render () {
1194
+ return this.renderVN()
1195
+ }
1196
+ })