vxe-pc-ui 3.15.1 → 3.15.3

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 (148) hide show
  1. package/es/backtop/src/backtop.js +8 -7
  2. package/es/button/src/button.js +3 -2
  3. package/es/calendar/src/calendar.js +2 -1
  4. package/es/cascader/src/cascader.js +5 -7
  5. package/es/checkbox/src/group.js +16 -7
  6. package/es/context-menu/src/context-menu.js +2 -6
  7. package/es/date-panel/src/util.js +27 -4
  8. package/es/date-picker/src/date-picker.js +656 -57
  9. package/es/date-range-picker/src/date-range-picker.js +23 -8
  10. package/es/drawer/src/drawer.js +3 -0
  11. package/es/form/render/index.js +3 -2
  12. package/es/form/src/form.js +11 -12
  13. package/es/form/src/itemInfo.js +6 -5
  14. package/es/image/src/image.js +5 -6
  15. package/es/input/src/input.js +2 -1
  16. package/es/layout-body/src/layout-body.js +13 -6
  17. package/es/list/src/list.js +3 -6
  18. package/es/menu/src/menu.js +2 -1
  19. package/es/modal/src/modal.js +5 -1
  20. package/es/number-input/src/number-input.js +2 -3
  21. package/es/pager/src/pager.js +4 -3
  22. package/es/radio/src/group.js +11 -8
  23. package/es/select/src/select.js +34 -30
  24. package/es/splitter/src/splitter.js +12 -6
  25. package/es/table-select/src/table-select.js +27 -22
  26. package/es/tabs/src/tabs.js +4 -3
  27. package/es/textarea/src/textarea.js +2 -1
  28. package/es/tree/src/tree.js +6 -11
  29. package/es/tree-select/src/tree-select.js +5 -7
  30. package/es/ui/index.js +1 -1
  31. package/es/ui/src/log.js +7 -1
  32. package/es/upload/src/upload.js +11 -9
  33. package/lib/backtop/src/backtop.js +10 -6
  34. package/lib/backtop/src/backtop.min.js +1 -1
  35. package/lib/button/src/button.js +3 -1
  36. package/lib/button/src/button.min.js +1 -1
  37. package/lib/calendar/src/calendar.js +3 -1
  38. package/lib/calendar/src/calendar.min.js +1 -1
  39. package/lib/cascader/src/cascader.js +7 -6
  40. package/lib/cascader/src/cascader.min.js +1 -1
  41. package/lib/checkbox/src/group.js +18 -6
  42. package/lib/checkbox/src/group.min.js +1 -1
  43. package/lib/context-menu/src/context-menu.js +3 -4
  44. package/lib/context-menu/src/context-menu.min.js +1 -1
  45. package/lib/date-panel/src/util.js +37 -5
  46. package/lib/date-panel/src/util.min.js +1 -1
  47. package/lib/date-picker/src/date-picker.js +698 -55
  48. package/lib/date-picker/src/date-picker.min.js +1 -1
  49. package/lib/date-range-picker/src/date-range-picker.js +21 -7
  50. package/lib/date-range-picker/src/date-range-picker.min.js +1 -1
  51. package/lib/drawer/src/drawer.js +3 -0
  52. package/lib/drawer/src/drawer.min.js +1 -1
  53. package/lib/form/render/index.js +3 -1
  54. package/lib/form/render/index.min.js +1 -1
  55. package/lib/form/src/form.js +12 -8
  56. package/lib/form/src/form.min.js +1 -1
  57. package/lib/form/src/itemInfo.js +6 -4
  58. package/lib/form/src/itemInfo.min.js +1 -1
  59. package/lib/image/src/image.js +7 -5
  60. package/lib/image/src/image.min.js +1 -1
  61. package/lib/index.umd.js +1051 -217
  62. package/lib/index.umd.min.js +1 -1
  63. package/lib/input/src/input.js +5 -3
  64. package/lib/input/src/input.min.js +1 -1
  65. package/lib/layout-body/src/layout-body.js +13 -4
  66. package/lib/layout-body/src/layout-body.min.js +1 -1
  67. package/lib/list/src/list.js +4 -5
  68. package/lib/list/src/list.min.js +1 -1
  69. package/lib/menu/src/menu.js +3 -1
  70. package/lib/menu/src/menu.min.js +1 -1
  71. package/lib/modal/src/modal.js +8 -2
  72. package/lib/modal/src/modal.min.js +1 -1
  73. package/lib/number-input/src/number-input.js +2 -3
  74. package/lib/pager/src/pager.js +5 -2
  75. package/lib/pager/src/pager.min.js +1 -1
  76. package/lib/radio/src/group.js +13 -6
  77. package/lib/radio/src/group.min.js +1 -1
  78. package/lib/select/src/select.js +36 -29
  79. package/lib/select/src/select.min.js +1 -1
  80. package/lib/splitter/src/splitter.js +15 -7
  81. package/lib/splitter/src/splitter.min.js +1 -1
  82. package/lib/table-select/src/table-select.js +27 -19
  83. package/lib/table-select/src/table-select.min.js +1 -1
  84. package/lib/tabs/src/tabs.js +6 -3
  85. package/lib/tabs/src/tabs.min.js +1 -1
  86. package/lib/textarea/src/textarea.js +3 -1
  87. package/lib/textarea/src/textarea.min.js +1 -1
  88. package/lib/tree/src/tree.js +9 -8
  89. package/lib/tree/src/tree.min.js +1 -1
  90. package/lib/tree-select/src/tree-select.js +10 -8
  91. package/lib/tree-select/src/tree-select.min.js +1 -1
  92. package/lib/ui/index.js +1 -1
  93. package/lib/ui/index.min.js +1 -1
  94. package/lib/ui/src/log.js +8 -1
  95. package/lib/ui/src/log.min.js +1 -1
  96. package/lib/upload/src/upload.js +22 -7
  97. package/lib/upload/src/upload.min.js +1 -1
  98. package/package.json +1 -1
  99. package/packages/backtop/src/backtop.ts +11 -3
  100. package/packages/button/src/button.ts +4 -2
  101. package/packages/calendar/src/calendar.ts +3 -1
  102. package/packages/cascader/src/cascader.ts +9 -4
  103. package/packages/checkbox/src/group.ts +22 -5
  104. package/packages/context-menu/src/context-menu.ts +5 -2
  105. package/packages/date-panel/src/util.ts +28 -3
  106. package/packages/date-picker/src/date-picker.ts +673 -60
  107. package/packages/date-range-picker/src/date-range-picker.ts +22 -8
  108. package/packages/drawer/src/drawer.ts +3 -0
  109. package/packages/form/render/index.ts +4 -2
  110. package/packages/form/src/form.ts +14 -7
  111. package/packages/form/src/itemInfo.ts +7 -5
  112. package/packages/image/src/image.ts +9 -3
  113. package/packages/input/src/input.ts +3 -1
  114. package/packages/layout-body/src/layout-body.ts +16 -2
  115. package/packages/list/src/list.ts +6 -3
  116. package/packages/menu/src/menu.ts +3 -1
  117. package/packages/modal/src/modal.ts +6 -1
  118. package/packages/number-input/src/number-input.ts +2 -6
  119. package/packages/pager/src/pager.ts +5 -3
  120. package/packages/radio/src/group.ts +16 -5
  121. package/packages/select/src/select.ts +41 -29
  122. package/packages/splitter/src/splitter.ts +13 -6
  123. package/packages/table-select/src/table-select.ts +31 -20
  124. package/packages/tabs/src/tabs.ts +5 -3
  125. package/packages/textarea/src/textarea.ts +3 -1
  126. package/packages/tree/src/tree.ts +9 -4
  127. package/packages/tree-select/src/tree-select.ts +9 -4
  128. package/packages/ui/src/log.ts +7 -0
  129. package/packages/upload/src/upload.ts +16 -6
  130. package/types/components/date-picker.d.ts +27 -1
  131. package/types/components/date-range-picker.d.ts +4 -0
  132. package/types/components/drawer.d.ts +2 -0
  133. package/types/components/modal.d.ts +2 -0
  134. package/types/components/splitter.d.ts +1 -0
  135. package/types/components/table.d.ts +33 -4
  136. package/types/components/upload.d.ts +28 -1
  137. /package/es/icon/{iconfont.1781675403709.ttf → iconfont.1781852732213.ttf} +0 -0
  138. /package/es/icon/{iconfont.1781675403709.woff → iconfont.1781852732213.woff} +0 -0
  139. /package/es/icon/{iconfont.1781675403709.woff2 → iconfont.1781852732213.woff2} +0 -0
  140. /package/es/{iconfont.1781675403709.ttf → iconfont.1781852732213.ttf} +0 -0
  141. /package/es/{iconfont.1781675403709.woff → iconfont.1781852732213.woff} +0 -0
  142. /package/es/{iconfont.1781675403709.woff2 → iconfont.1781852732213.woff2} +0 -0
  143. /package/lib/icon/style/{iconfont.1781675403709.ttf → iconfont.1781852732213.ttf} +0 -0
  144. /package/lib/icon/style/{iconfont.1781675403709.woff → iconfont.1781852732213.woff} +0 -0
  145. /package/lib/icon/style/{iconfont.1781675403709.woff2 → iconfont.1781852732213.woff2} +0 -0
  146. /package/lib/{iconfont.1781675403709.ttf → iconfont.1781852732213.ttf} +0 -0
  147. /package/lib/{iconfont.1781675403709.woff → iconfont.1781852732213.woff} +0 -0
  148. /package/lib/{iconfont.1781675403709.woff2 → iconfont.1781852732213.woff2} +0 -0
@@ -3,10 +3,10 @@ import { defineVxeComponent } from '../../ui/src/comp'
3
3
  import XEUtils from 'xe-utils'
4
4
  import { getConfig, getIcon, getI18n, commands, createEvent, globalEvents, GLOBAL_EVENT_KEYS, globalMixins, renderEmptyElement } from '../../ui'
5
5
  import { getFuncText, getLastZIndex, nextZIndex, isEnableConf } from '../../ui/src/utils'
6
- import { updatePanelPlacement, getEventTargetNode } from '../../ui/src/dom'
6
+ import { updatePanelPlacement, getEventTargetNode, hasControlKey } from '../../ui/src/dom'
7
7
  import { getSlotVNs } from '../../ui/src/vn'
8
- import { parseDateObj, parseDateValue, getDateByCode, handleValueFormat, hasDateValueType, hasTimestampValueType } from '../../date-panel/src/util'
9
- import { errLog } from '../../ui/src/log'
8
+ import { parseDateObj, parseDateValue, getDateByCode, handleValueFormat, hasDateValueType, hasTimestampValueType, isAllSameChar, getChunkDefaultNum } from '../../date-panel/src/util'
9
+ import { createComponentLog } from '../../ui/src/log'
10
10
  import VxeDatePanelComponent from '../../date-panel/src/date-panel'
11
11
  import VxeButtonComponent from '../../button/src/button'
12
12
  import VxeButtonGroupComponent from '../../button/src/button-group'
@@ -14,6 +14,37 @@ import VxeButtonGroupComponent from '../../button/src/button-group'
14
14
  import type { VxeDatePickerConstructor, VxeDatePickerEmits, DatePickerInternalData, DatePickerReactData, VxeButtonGroupDefines, VxeComponentSizeType, VxeDatePanelDefines, VxeDatePickerPropTypes, VxeFormConstructor, VxeFormPrivateMethods, VxeFormDefines, ValueOf, VxeModalConstructor, VxeDrawerConstructor, VxeModalMethods, VxeDrawerMethods, VxeDatePickerDefines, VxeDatePanelConstructor } from '../../../types'
15
15
  import type { VxeTableConstructor, VxeTablePrivateMethods } from '../../../types/components/table'
16
16
 
17
+ const { warnLog, errLog } = createComponentLog('date-picker')
18
+
19
+ const maskedTypes = ['year', 'month', 'date', 'datetime', 'time']
20
+ const inputMaskedKeys = ['y', 'M', 'd', 'H', 'm', 'n', 's']
21
+ const parseInputKayMaps: Record<string, boolean> = {}
22
+ inputMaskedKeys.forEach(key => {
23
+ parseInputKayMaps[key] = true
24
+ })
25
+
26
+ function createReactData (): DatePickerReactData {
27
+ return {
28
+ initialized: false,
29
+ panelIndex: 0,
30
+ visiblePanel: false,
31
+ isAniVisible: false,
32
+ panelStyle: {},
33
+ panelPlacement: '',
34
+ isActivated: false,
35
+ inputValue: '',
36
+ labelFlag: 0
37
+ }
38
+ }
39
+
40
+ function createInternalData (): DatePickerInternalData {
41
+ return {
42
+ // hpTimeout: undefined,
43
+ inputLabel: '',
44
+ laseFocusMasked: 0
45
+ }
46
+ }
47
+
17
48
  export default /* define-vxe-component start */ defineVxeComponent({
18
49
  name: 'VxeDatePicker',
19
50
  mixins: [
@@ -114,6 +145,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
114
145
  type: Boolean as PropType<VxeDatePickerPropTypes.AutoClose>,
115
146
  default: () => getConfig().datePicker.autoClose
116
147
  },
148
+ maskedConfig: Object as PropType<VxeDatePickerPropTypes.MaskedConfig>,
117
149
 
118
150
  prefixIcon: String as PropType<VxeDatePickerPropTypes.PrefixIcon>,
119
151
  suffixIcon: String as PropType<VxeDatePickerPropTypes.SuffixIcon>,
@@ -157,27 +189,13 @@ export default /* define-vxe-component start */ defineVxeComponent({
157
189
  },
158
190
  data () {
159
191
  const xID = XEUtils.uniqueId()
160
-
161
- const reactData: DatePickerReactData = {
162
- initialized: false,
163
- panelIndex: 0,
164
- visiblePanel: false,
165
- isAniVisible: false,
166
- panelStyle: {},
167
- panelPlacement: '',
168
- isActivated: false,
169
- inputValue: '',
170
- inputLabel: ''
171
- }
172
-
173
- const internalData: DatePickerInternalData = {
174
- hpTimeout: undefined
175
- }
176
-
192
+ const reactData = createReactData()
177
193
  return {
194
+ ...({} as {
195
+ internalData: DatePickerInternalData
196
+ }),
178
197
  xID,
179
- reactData,
180
- internalData
198
+ reactData
181
199
  }
182
200
  },
183
201
  computed: {
@@ -261,6 +279,58 @@ export default /* define-vxe-component start */ defineVxeComponent({
261
279
 
262
280
  return props.clearable
263
281
  },
282
+ computeIsDatePanelType () {
283
+ const $xeDatePicker = this
284
+ const props = $xeDatePicker
285
+
286
+ const isDateTimeType = $xeDatePicker.computeIsDateTimeType
287
+ return isDateTimeType || ['date', 'week', 'month', 'quarter', 'year'].indexOf(props.type) > -1
288
+ },
289
+ computeDateListValue () {
290
+ const $xeDatePicker = this
291
+ const props = $xeDatePicker
292
+
293
+ const { value: modelValue, type, multiple } = props
294
+ const isDatePanelType = $xeDatePicker.computeIsDatePanelType
295
+ const dateValueFormat = $xeDatePicker.computeDateValueFormat as string
296
+ if (multiple && modelValue && isDatePanelType) {
297
+ return XEUtils.toValueString(modelValue).split(',').map(item => {
298
+ const date = parseDateValue(item, type, {
299
+ valueFormat: dateValueFormat
300
+ })
301
+ if (XEUtils.isValidDate(date)) {
302
+ return date
303
+ }
304
+ return date
305
+ })
306
+ }
307
+ return []
308
+ },
309
+ computeLimitMaxCount () {
310
+ const $xeDatePicker = this
311
+ const props = $xeDatePicker
312
+
313
+ return props.multiple ? XEUtils.toNumber(props.limitCount) : 0
314
+ },
315
+ computeDateMultipleValue () {
316
+ const $xeDatePicker = this
317
+
318
+ const dateListValue = $xeDatePicker.computeDateListValue as Date[]
319
+ const dateValueFormat = $xeDatePicker.computeDateValueFormat as string
320
+ return dateListValue.map(date => XEUtils.toDateString(date, dateValueFormat))
321
+ },
322
+ computeOverCount () {
323
+ const $xeDatePicker = this
324
+ const props = $xeDatePicker
325
+
326
+ const { multiple } = props
327
+ const limitMaxCount = $xeDatePicker.computeLimitMaxCount as number
328
+ const dateMultipleValue = $xeDatePicker.computeDateMultipleValue as string[]
329
+ if (multiple && limitMaxCount) {
330
+ return dateMultipleValue.length >= limitMaxCount
331
+ }
332
+ return false
333
+ },
264
334
  computeInputReadonly () {
265
335
  const $xeDatePicker = this
266
336
  const props = $xeDatePicker
@@ -336,6 +406,12 @@ export default /* define-vxe-component start */ defineVxeComponent({
336
406
  const { type, valueFormat } = props
337
407
  return handleValueFormat(type, valueFormat)
338
408
  },
409
+ computeDateMaskedFormat () {
410
+ const $xeDatePicker = this
411
+
412
+ const dateLabelFormat = $xeDatePicker.computeDateLabelFormat as string
413
+ return dateLabelFormat
414
+ },
339
415
  computeFirstDayOfWeek () {
340
416
  const $xeDatePicker = this
341
417
  const props = $xeDatePicker
@@ -362,6 +438,19 @@ export default /* define-vxe-component start */ defineVxeComponent({
362
438
  })
363
439
  return dateObj.label
364
440
  }).join(', ')
441
+ },
442
+ computeMaskedOpts () {
443
+ const $xeDatePicker = this
444
+ const props = $xeDatePicker
445
+
446
+ return Object.assign({}, getConfig().datePicker.maskedConfig, props.maskedConfig)
447
+ },
448
+ computeMaskChar () {
449
+ const $xeDatePicker = this
450
+
451
+ const maskedOpts = $xeDatePicker.computeMaskedOpts as VxeDatePickerPropTypes.MaskedConfig
452
+ const { maskPlaceholder } = maskedOpts
453
+ return (maskPlaceholder ? ('' + maskPlaceholder)[0] : '') || '*'
365
454
  }
366
455
  },
367
456
  methods: {
@@ -399,6 +488,16 @@ export default /* define-vxe-component start */ defineVxeComponent({
399
488
  }
400
489
  reactData.inputValue = val
401
490
  },
491
+ handleInputLabel (text: string, isUpdate?: boolean) {
492
+ const $xeDatePicker = this
493
+ const reactData = $xeDatePicker.reactData
494
+ const internalData = $xeDatePicker.internalData
495
+
496
+ internalData.inputLabel = text
497
+ if (isUpdate) {
498
+ reactData.labelFlag++
499
+ }
500
+ },
402
501
  triggerEvent (evnt: Event & { type: 'input' | 'change' | 'keydown' | 'keyup' | 'click' | 'focus' | 'blur' }) {
403
502
  const $xeDatePicker = this
404
503
  const reactData = $xeDatePicker.reactData
@@ -450,11 +549,10 @@ export default /* define-vxe-component start */ defineVxeComponent({
450
549
  },
451
550
  inputEvent (evnt: Event & { type: 'input' }) {
452
551
  const $xeDatePicker = this
453
- const reactData = $xeDatePicker.reactData
454
552
 
455
553
  const inputElem = evnt.target as HTMLInputElement
456
554
  const value = inputElem.value
457
- reactData.inputLabel = value
555
+ $xeDatePicker.handleInputLabel(value, true)
458
556
  $xeDatePicker.dispatchEvent('input', { value }, evnt)
459
557
  },
460
558
  changeEvent (evnt: Event & { type: 'change' }) {
@@ -465,18 +563,6 @@ export default /* define-vxe-component start */ defineVxeComponent({
465
563
  $xeDatePicker.triggerEvent(evnt)
466
564
  }
467
565
  },
468
- focusEvent (evnt: Event & { type: 'focus' }) {
469
- const $xeDatePicker = this
470
- const reactData = $xeDatePicker.reactData
471
-
472
- const popupOpts = $xeDatePicker.computePopupOpts
473
- const { trigger } = popupOpts
474
- reactData.isActivated = true
475
- if (!trigger || trigger === 'default') {
476
- $xeDatePicker.datePickerOpenEvent(evnt)
477
- }
478
- $xeDatePicker.triggerEvent(evnt)
479
- },
480
566
  clickPrefixEvent (evnt: Event) {
481
567
  const $xeDatePicker = this
482
568
  const reactData = $xeDatePicker.reactData
@@ -491,7 +577,6 @@ export default /* define-vxe-component start */ defineVxeComponent({
491
577
  const $xeDatePicker = this
492
578
  const reactData = $xeDatePicker.reactData
493
579
  const internalData = $xeDatePicker.internalData
494
-
495
580
  return new Promise<void>(resolve => {
496
581
  reactData.visiblePanel = false
497
582
  internalData.hpTimeout = setTimeout(() => {
@@ -500,6 +585,112 @@ export default /* define-vxe-component start */ defineVxeComponent({
500
585
  }, 350)
501
586
  })
502
587
  },
588
+ dateChange (date: Date, isReload?: boolean) {
589
+ const $xeDatePicker = this
590
+ const props = $xeDatePicker
591
+
592
+ const { value: modelValue, multiple } = props
593
+ const isDateTimeType = $xeDatePicker.computeIsDateTimeType
594
+ const dateValueFormat = $xeDatePicker.computeDateValueFormat
595
+ const firstDayOfWeek = $xeDatePicker.computeFirstDayOfWeek
596
+ if (props.type === 'week') {
597
+ const sWeek = XEUtils.toNumber(props.selectDay) as VxeDatePickerPropTypes.SelectDay
598
+ date = XEUtils.getWhatWeek(date, 0, sWeek, firstDayOfWeek)
599
+ }
600
+ const inpVal = XEUtils.toDateString(date, dateValueFormat, { firstDay: firstDayOfWeek })
601
+ if (multiple) {
602
+ const overCount = $xeDatePicker.computeOverCount
603
+ // 如果为多选
604
+ if (isDateTimeType) {
605
+ // 如果是datetime特殊类型
606
+ const dateListValue = isReload ? [] : [...$xeDatePicker.computeDateListValue]
607
+ const datetimeRest: Date[] = []
608
+ const eqIndex = XEUtils.findIndexOf(dateListValue, val => XEUtils.isDateSame(date, val, 'yyyyMMdd'))
609
+ if (eqIndex === -1) {
610
+ if (overCount) {
611
+ // 如果超出最大多选数量
612
+ return
613
+ }
614
+ dateListValue.push(date)
615
+ } else {
616
+ dateListValue.splice(eqIndex, 1)
617
+ }
618
+ dateListValue.forEach(item => {
619
+ if (item) {
620
+ datetimeRest.push(item)
621
+ }
622
+ })
623
+ $xeDatePicker.handleChange(datetimeRest.map(date => XEUtils.toDateString(date, dateValueFormat)).join(','), { type: 'update' })
624
+ } else {
625
+ const dateMultipleValue = isReload ? [] : $xeDatePicker.computeDateMultipleValue
626
+ // 如果是日期类型
627
+ if (dateMultipleValue.some(val => XEUtils.isEqual(val, inpVal))) {
628
+ $xeDatePicker.handleChange(dateMultipleValue.filter(val => !XEUtils.isEqual(val, inpVal)).join(','), { type: 'update' })
629
+ } else {
630
+ if (overCount) {
631
+ // 如果超出最大多选数量
632
+ return
633
+ }
634
+ $xeDatePicker.handleChange(dateMultipleValue.concat([inpVal]).join(','), { type: 'update' })
635
+ }
636
+ }
637
+ } else {
638
+ // 如果为单选
639
+ if (!XEUtils.isEqual(modelValue, inpVal)) {
640
+ $xeDatePicker.handleChange(inpVal, { type: 'update' })
641
+ }
642
+ }
643
+ },
644
+ dateRevert () {
645
+ const $xeDatePicker = this
646
+
647
+ const panelLabel = $xeDatePicker.computePanelLabel
648
+ $xeDatePicker.handleInputLabel(panelLabel, true)
649
+ },
650
+ afterCheckValue (inpVal: string) {
651
+ const $xeDatePicker = this
652
+ const props = $xeDatePicker
653
+ const reactData = $xeDatePicker.reactData
654
+ const internalData = $xeDatePicker.internalData
655
+
656
+ const { type } = props
657
+ const { inputLabel } = internalData
658
+ const dateLabelFormat = $xeDatePicker.computeDateLabelFormat
659
+ if (!inpVal) {
660
+ $xeDatePicker.handleChange('', { type: 'check' })
661
+ return
662
+ }
663
+ let inpDateVal: VxeDatePickerPropTypes.ModelValue = parseDateValue(inpVal, type, {
664
+ valueFormat: dateLabelFormat
665
+ })
666
+ if (!XEUtils.isValidDate(inpDateVal)) {
667
+ $xeDatePicker.dateRevert()
668
+ return
669
+ }
670
+ if (type === 'time') {
671
+ inpDateVal = XEUtils.toDateString(inpDateVal, dateLabelFormat)
672
+ if (inputLabel !== inpDateVal) {
673
+ $xeDatePicker.handleChange(inpDateVal, { type: 'check' })
674
+ }
675
+ $xeDatePicker.handleInputLabel(inpDateVal, true)
676
+ return
677
+ }
678
+ let isChange = false
679
+ const firstDayOfWeek = $xeDatePicker.computeFirstDayOfWeek
680
+ if (type === 'datetime') {
681
+ const dateValue = reactData.inputValue
682
+ if (inpVal !== XEUtils.toDateString(dateValue, dateLabelFormat) || inpVal !== XEUtils.toDateString(inpDateVal, dateLabelFormat)) {
683
+ isChange = true
684
+ }
685
+ } else {
686
+ isChange = true
687
+ }
688
+ const label = XEUtils.toDateString(inpDateVal, dateLabelFormat, { firstDay: firstDayOfWeek })
689
+ $xeDatePicker.handleInputLabel(label, true)
690
+ if (isChange) {
691
+ $xeDatePicker.dateChange(inpDateVal)
692
+ }
693
+ },
503
694
  clearValueEvent (evnt: Event, value: VxeDatePickerPropTypes.ModelValue) {
504
695
  const $xeDatePicker = this
505
696
 
@@ -520,9 +711,320 @@ export default /* define-vxe-component start */ defineVxeComponent({
520
711
  $xeDatePicker.dispatchEvent('suffix-click', { value: inputValue }, evnt)
521
712
  }
522
713
  },
714
+ handleArrowInputDate (evnt: KeyboardEvent, isUpArrow: boolean, isDwArrow: boolean, isLtArrow: boolean, isRtArrow: boolean) {
715
+ const $xeDatePicker = this
716
+ const props = $xeDatePicker
717
+ const internalData = $xeDatePicker.internalData
718
+
719
+ const { type, multiple } = props
720
+ if (multiple) {
721
+ return
722
+ }
723
+ const targetElem = $xeDatePicker.$refs.refInputTarget as HTMLInputElement
724
+ if (!targetElem) {
725
+ return
726
+ }
727
+ const inpValue = targetElem.value
728
+ if (!inpValue) {
729
+ return
730
+ }
731
+ const dateMaskedFormat = $xeDatePicker.computeDateMaskedFormat
732
+ const dateLabelFormat = $xeDatePicker.computeDateLabelFormat
733
+ const firstDayOfWeek = $xeDatePicker.computeFirstDayOfWeek
734
+ const maskChar = $xeDatePicker.computeMaskChar
735
+ const selectionStart = targetElem.selectionStart || 0
736
+ let selectKey = dateMaskedFormat[selectionStart]
737
+ if (!parseInputKayMaps[selectKey]) {
738
+ selectKey = dateMaskedFormat[selectionStart - 1]
739
+ }
740
+ const skRest = dateMaskedFormat.match(new RegExp(selectKey + '+'))
741
+ if (!skRest) {
742
+ return
743
+ }
744
+ if (isUpArrow || isDwArrow) {
745
+ const chunkFormat = skRest[0] || ''
746
+ const chunkStartIndex = skRest.index || 0
747
+ const chunkEndIndex = chunkStartIndex + chunkFormat.length
748
+ const chunkValue = inpValue.slice(chunkStartIndex, chunkEndIndex)
749
+ if (parseInputKayMaps[selectKey]) {
750
+ const chunkNum = (isAllSameChar(chunkValue, maskChar) ? getChunkDefaultNum(selectKey) : XEUtils.toNumber(chunkValue)) + (isUpArrow ? 1 : -1)
751
+ const restValue = inpValue.slice(0, chunkStartIndex) + XEUtils.padStart(chunkNum, chunkFormat.length, '0') + inpValue.slice(chunkEndIndex)
752
+ evnt.preventDefault()
753
+ if (restValue.indexOf(maskChar) === -1) {
754
+ // 解析日期
755
+ const inpDateVal: VxeDatePickerPropTypes.ModelValue = parseDateValue(restValue, type, {
756
+ valueFormat: dateLabelFormat
757
+ })
758
+ if (XEUtils.isValidDate(inpDateVal)) {
759
+ const label = XEUtils.toDateString(inpDateVal, dateLabelFormat, { firstDay: firstDayOfWeek })
760
+ targetElem.value = label
761
+ $xeDatePicker.handleInputLabel(label, false)
762
+ }
763
+ } else {
764
+ targetElem.value = restValue
765
+ $xeDatePicker.handleInputLabel(restValue, false)
766
+ }
767
+ }
768
+ targetElem.setSelectionRange(chunkStartIndex, chunkEndIndex)
769
+ } else if (isLtArrow || isRtArrow) {
770
+ const currKeyIndex = inputMaskedKeys.indexOf(selectKey)
771
+ if (currKeyIndex > -1) {
772
+ const allMaskedKeys = XEUtils.map(dateMaskedFormat.match(new RegExp(`(${inputMaskedKeys.join('|')})+`, 'g')) || [], fullKey => fullKey[0])
773
+ const currIndex = XEUtils.findIndexOf(allMaskedKeys, key => selectKey === key[0])
774
+ const targetFormatKey = isLtArrow ? (allMaskedKeys[currIndex - 1] || allMaskedKeys[0]) : (allMaskedKeys[currIndex + 1] || allMaskedKeys[allMaskedKeys.length - 1])
775
+
776
+ const targetKey = targetFormatKey ? targetFormatKey[0] : ''
777
+ const sktRest = dateMaskedFormat.match(new RegExp(targetKey + '+'))
778
+ if (sktRest) {
779
+ evnt.preventDefault()
780
+ const mtStartIndex = sktRest.index || 0
781
+ const mtEndIndex = mtStartIndex + sktRest[0].length
782
+ targetElem.setSelectionRange(mtStartIndex, mtEndIndex)
783
+ }
784
+ }
785
+ }
786
+ internalData.isTriggerMasked = true
787
+ },
788
+ handleMaskedInputDate (evnt: KeyboardEvent) {
789
+ const $xeDatePicker = this
790
+ const props = $xeDatePicker
791
+ const internalData = $xeDatePicker.internalData
792
+
793
+ const { multiple } = props
794
+ if (multiple) {
795
+ return
796
+ }
797
+ const targetElem = $xeDatePicker.$refs.refInputTarget as HTMLInputElement
798
+ if (!targetElem) {
799
+ return
800
+ }
801
+ const isControlKey = hasControlKey(evnt)
802
+ if (isControlKey) {
803
+ return
804
+ }
805
+ evnt.preventDefault()
806
+ const eKey = evnt.key
807
+ const isDeleleKey = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.DELETE)
808
+ const isBackspaceKey = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.BACKSPACE)
809
+ const isNumKey = eKey >= '0' && eKey <= '9'
810
+ const numKey = isNumKey ? evnt.key : ''
811
+ if (!(isDeleleKey || isBackspaceKey || isNumKey)) {
812
+ return
813
+ }
814
+ const { isTriggerMasked } = internalData
815
+ const dateMaskedFormat = $xeDatePicker.computeDateMaskedFormat
816
+ const maskChar = $xeDatePicker.computeMaskChar
817
+ let inpValue = targetElem.value || dateMaskedFormat
818
+ const selectionStart = targetElem.selectionStart || 0
819
+ const selectionEnd = targetElem.selectionEnd || 0
820
+ let selectKey = dateMaskedFormat[selectionStart]
821
+ if (!parseInputKayMaps[selectKey]) {
822
+ selectKey = dateMaskedFormat[selectionStart - 1]
823
+ }
824
+ const skRest = dateMaskedFormat.match(new RegExp(selectKey + '+'))
825
+ if (!skRest) {
826
+ return
827
+ }
828
+ const allMaskedKeys = XEUtils.map(dateMaskedFormat.match(new RegExp(`(${inputMaskedKeys.join('|')})+`, 'g')) || [], fullKey => fullKey[0])
829
+ const chunkFormat = skRest[0] || ''
830
+ const chunkStartIndex = skRest.index || 0
831
+ const chunkEndIndex = chunkStartIndex + chunkFormat.length
832
+ const currKeyIndex = allMaskedKeys.indexOf(selectKey)
833
+ // 全选 | 如果无效字符
834
+ const isAllSelected = !selectionStart && selectionEnd === inpValue.length
835
+ const isNotMasked = inpValue && inpValue.length !== dateMaskedFormat.length
836
+ if (isAllSelected || isNotMasked) {
837
+ inpValue = dateMaskedFormat
838
+ }
839
+ let chunkValue = isDeleleKey ? '' : inpValue.slice(chunkStartIndex, chunkEndIndex)
840
+ const chunkNums = (chunkValue.match(/\d/g) || [])
841
+ const chunkNumList: string[] = isTriggerMasked && !isBackspaceKey ? [] : chunkNums.slice(0)
842
+
843
+ if (isNumKey) {
844
+ chunkNumList.push(numKey)
845
+ } else if (isBackspaceKey) {
846
+ chunkNumList.pop()
847
+ }
848
+ chunkValue = chunkNumList.join('').padEnd(chunkFormat.length, maskChar)
849
+ let restValue = inpValue.slice(0, chunkStartIndex) + chunkValue + inpValue.slice(chunkEndIndex)
850
+ restValue = restValue.replace(new RegExp(`(${inputMaskedKeys.join('|')})`, 'g'), maskChar)
851
+
852
+ targetElem.value = restValue
853
+ $xeDatePicker.handleInputLabel(restValue, false)
854
+
855
+ // 如果是全选/删除
856
+ if (isAllSelected) {
857
+ if (isBackspaceKey || isDeleleKey) {
858
+ const firstMaskedKeys = allMaskedKeys[0]
859
+ const firstSkRest = dateMaskedFormat.match(new RegExp(`${firstMaskedKeys}+`))
860
+ if (firstSkRest) {
861
+ const firstChunkFormat = firstSkRest[0]
862
+ targetElem.setSelectionRange(0, firstChunkFormat.length)
863
+ internalData.isTriggerMasked = true
864
+ return
865
+ }
866
+ }
867
+ } else {
868
+ if (isBackspaceKey && !chunkNums.length) {
869
+ // 回退到上一个数字块
870
+ for (let i = currKeyIndex - 1; i >= 0; i--) {
871
+ const prveChunkKey = allMaskedKeys[i]
872
+ const prveSkRest = dateMaskedFormat.match(new RegExp(`${prveChunkKey}+`))
873
+ if (prveSkRest) {
874
+ const prveChunkFormat = prveSkRest[0]
875
+ const prveChunkStartIndex = prveSkRest.index || 0
876
+ const prveChunkEndIndex = prveChunkStartIndex + prveChunkFormat.length
877
+ let prveChunkValue = restValue.slice(prveChunkStartIndex, prveChunkEndIndex)
878
+ const prveChunkNums = (prveChunkValue.match(/\d/g) || [])
879
+ if (prveChunkNums.length) {
880
+ prveChunkNums.pop()
881
+ prveChunkValue = prveChunkNums.join('').padEnd(prveChunkFormat.length, maskChar)
882
+ restValue = restValue.slice(0, prveChunkStartIndex) + prveChunkValue + restValue.slice(prveChunkEndIndex)
883
+
884
+ targetElem.value = restValue
885
+ $xeDatePicker.handleInputLabel(restValue, false)
886
+ targetElem.setSelectionRange(prveChunkStartIndex, prveChunkEndIndex)
887
+ return
888
+ }
889
+ }
890
+ }
891
+ const firstMaskedKeys = allMaskedKeys[0]
892
+ const firstSkRest = dateMaskedFormat.match(new RegExp(`${firstMaskedKeys}+`))
893
+ if (firstSkRest) {
894
+ const firstChunkFormat = firstSkRest[0]
895
+ restValue = dateMaskedFormat.replace(new RegExp(`(${inputMaskedKeys.join('|')})`, 'g'), maskChar)
896
+ targetElem.value = restValue
897
+ $xeDatePicker.handleInputLabel(restValue, false)
898
+ targetElem.setSelectionRange(0, firstChunkFormat.length)
899
+ internalData.isTriggerMasked = true
900
+ return
901
+ }
902
+ return
903
+ }
904
+ }
905
+
906
+ let maskStartIndex = skRest.index || 0
907
+ let maskEndIndex = maskStartIndex + skRest[0].length
908
+ // 如果输入完成,跳转下一个
909
+ if (chunkNumList.length >= chunkValue.length) {
910
+ const nextKeys = allMaskedKeys.slice(currKeyIndex + 1)
911
+ if (currKeyIndex > -1) {
912
+ const nextRest = nextKeys.length ? dateMaskedFormat.match(new RegExp(`(${nextKeys.join('|')})+`)) : null
913
+ // 如果当前数字块已输入,则跳转下一个数字块
914
+ if (nextRest) {
915
+ maskStartIndex = nextRest.index || 0
916
+ maskEndIndex = maskStartIndex + nextRest[0].length
917
+ targetElem.setSelectionRange(maskStartIndex, maskEndIndex)
918
+ } else {
919
+ targetElem.setSelectionRange(maskStartIndex, maskEndIndex)
920
+ }
921
+ }
922
+ internalData.isTriggerMasked = true
923
+ return
924
+ }
925
+ targetElem.setSelectionRange(maskStartIndex, maskEndIndex)
926
+ internalData.isTriggerMasked = false
927
+ },
928
+ handleMaskedSelectedDate (evnt: Event, isFocus?: boolean) {
929
+ const $xeDatePicker = this
930
+ const props = $xeDatePicker
931
+ const internalData = $xeDatePicker.internalData
932
+
933
+ const { type, multiple, value: modelValue } = props
934
+ if (multiple) {
935
+ return
936
+ }
937
+ if (!maskedTypes.includes(type)) {
938
+ return
939
+ }
940
+ const targetElem = $xeDatePicker.$refs.refInputTarget as HTMLInputElement
941
+ if (!targetElem) {
942
+ return
943
+ }
944
+ const { laseFocusMasked } = internalData
945
+ if (laseFocusMasked && Date.now() - laseFocusMasked < 100) {
946
+ return
947
+ }
948
+ const dateMaskedFormat = $xeDatePicker.computeDateMaskedFormat
949
+ const maskChar = $xeDatePicker.computeMaskChar
950
+ const selectionStart = targetElem.selectionStart || 0
951
+ const selectionEnd = targetElem.selectionEnd || 0
952
+ const inpValue = targetElem.value
953
+ const allMaskedKeys = XEUtils.map(dateMaskedFormat.match(new RegExp(`(${inputMaskedKeys.join('|')})+`, 'g')) || [], fullKey => fullKey[0])
954
+
955
+ // 如果为空
956
+ if (!inpValue) {
957
+ let restValue = dateMaskedFormat.replace(new RegExp(`(${inputMaskedKeys.join('|')})`, 'g'), maskChar)
958
+
959
+ // 还原值
960
+ if (isFocus && modelValue) {
961
+ const chunkNums = (('' + XEUtils.toNumber(modelValue)).match(/\d/g) || [])
962
+ let useNumIndex = 0
963
+ restValue = dateMaskedFormat.replace(new RegExp(`(${inputMaskedKeys.join('|')})`, 'g'), (txt) => chunkNums[useNumIndex++] || txt)
964
+ }
965
+
966
+ const firstMaskedKeys = allMaskedKeys[0]
967
+ const firstSkRest = dateMaskedFormat.match(new RegExp(`${firstMaskedKeys}+`))
968
+ if (firstSkRest) {
969
+ evnt.preventDefault()
970
+ const firstChunkFormat = firstSkRest[0]
971
+ targetElem.value = restValue
972
+ $xeDatePicker.handleInputLabel(restValue, false)
973
+ targetElem.setSelectionRange(0, firstChunkFormat.length)
974
+ internalData.laseFocusMasked = Date.now()
975
+ return
976
+ }
977
+ }
978
+
979
+ // 全选 | 如果无效字符
980
+ const isAllSelected = !selectionStart && selectionEnd === inpValue.length
981
+ const isNotMasked = inpValue && inpValue.length !== dateMaskedFormat.length
982
+ if (isAllSelected || isNotMasked) {
983
+ let restValue = ''
984
+ // 还原值
985
+ if (isNotMasked && inpValue) {
986
+ const chunkNums = inpValue.match(/\d/g) || []
987
+ let useNumIndex = 0
988
+ restValue = dateMaskedFormat.replace(new RegExp(`(${inputMaskedKeys.join('|')})`, 'g'), () => chunkNums[useNumIndex++] || maskChar)
989
+ } else {
990
+ dateMaskedFormat.replace(new RegExp(`(${inputMaskedKeys.join('|')})`, 'g'), maskChar)
991
+ }
992
+
993
+ const firstMaskedKeys = allMaskedKeys[0]
994
+ const firstSkRest = dateMaskedFormat.match(new RegExp(`${firstMaskedKeys}+`))
995
+ if (firstSkRest) {
996
+ evnt.preventDefault()
997
+ const firstChunkFormat = firstSkRest[0]
998
+ targetElem.value = restValue
999
+ $xeDatePicker.handleInputLabel(restValue, false)
1000
+ targetElem.setSelectionRange(0, firstChunkFormat.length)
1001
+ internalData.laseFocusMasked = Date.now()
1002
+ return
1003
+ }
1004
+ }
1005
+
1006
+ // 是否选择数字块
1007
+ let selectKey = dateMaskedFormat[selectionStart]
1008
+ if (!parseInputKayMaps[selectKey]) {
1009
+ selectKey = dateMaskedFormat[selectionStart - 1]
1010
+ }
1011
+ if (selectKey) {
1012
+ evnt.preventDefault()
1013
+ const skRest = dateMaskedFormat.match(new RegExp(selectKey + '+'))
1014
+ if (skRest) {
1015
+ const chunkFormat = skRest[0] || ''
1016
+ const chunkStartIndex = skRest.index || 0
1017
+ const chunkEndIndex = chunkStartIndex + chunkFormat.length
1018
+ targetElem.setSelectionRange(chunkStartIndex, chunkEndIndex)
1019
+ internalData.isTriggerMasked = true
1020
+ internalData.laseFocusMasked = Date.now()
1021
+ }
1022
+ }
1023
+ },
523
1024
  blurEvent (evnt: Event & { type: 'blur' }) {
524
1025
  const $xeDatePicker = this
525
1026
  const reactData = $xeDatePicker.reactData
1027
+ const internalData = $xeDatePicker.internalData
526
1028
  const $xeForm = $xeDatePicker.$xeForm
527
1029
  const formItemInfo = $xeDatePicker.formItemInfo
528
1030
 
@@ -534,10 +1036,13 @@ export default /* define-vxe-component start */ defineVxeComponent({
534
1036
  $xeDatePicker.handleChange(value, evnt)
535
1037
  }
536
1038
  if (!reactData.visiblePanel) {
1039
+ const { inputLabel } = internalData
537
1040
  reactData.isActivated = false
538
1041
  // 未打开面板时才校验
539
1042
  if ($datePanel) {
540
- $datePanel.checkValue(reactData.inputLabel)
1043
+ $datePanel.checkValue(inputLabel)
1044
+ } else {
1045
+ $xeDatePicker.afterCheckValue(inputLabel)
541
1046
  }
542
1047
  }
543
1048
  $xeDatePicker.dispatchEvent('blur', { value }, evnt)
@@ -546,9 +1051,88 @@ export default /* define-vxe-component start */ defineVxeComponent({
546
1051
  $xeForm.triggerItemEvent(evnt, formItemInfo.itemConfig.field, value)
547
1052
  }
548
1053
  },
1054
+ focusEvent (evnt: KeyboardEvent & { type: 'focus' }) {
1055
+ const $xeDatePicker = this
1056
+ const props = $xeDatePicker
1057
+ const reactData = $xeDatePicker.reactData
1058
+
1059
+ const { multiple, editable, maskedConfig } = props
1060
+ const maskedOpts = $xeDatePicker.computeMaskedOpts
1061
+ const popupOpts = $xeDatePicker.computePopupOpts
1062
+ const { trigger } = popupOpts
1063
+ reactData.isActivated = true
1064
+ if (!trigger || trigger === 'default') {
1065
+ $xeDatePicker.datePickerOpenEvent(evnt)
1066
+ setTimeout(() => {
1067
+ if (editable && !multiple && (isEnableConf(maskedConfig) || maskedOpts.enabled)) {
1068
+ $xeDatePicker.handleMaskedSelectedDate(evnt, true)
1069
+ }
1070
+ }, 15)
1071
+ } else if (trigger === 'icon') {
1072
+ $xeDatePicker.hidePanel()
1073
+ setTimeout(() => {
1074
+ if (editable && !multiple && (isEnableConf(maskedConfig) || maskedOpts.enabled)) {
1075
+ $xeDatePicker.handleMaskedSelectedDate(evnt, true)
1076
+ }
1077
+ }, 15)
1078
+ } else {
1079
+ if (editable && !multiple && (isEnableConf(maskedConfig) || maskedOpts.enabled)) {
1080
+ $xeDatePicker.handleMaskedSelectedDate(evnt, true)
1081
+ }
1082
+ }
1083
+ $xeDatePicker.triggerEvent(evnt)
1084
+ },
1085
+ clickEvent (evnt: MouseEvent & { type: 'click' }) {
1086
+ const $xeDatePicker = this
1087
+ const props = $xeDatePicker
1088
+
1089
+ const { editable, maskedConfig } = props
1090
+ const maskedOpts = $xeDatePicker.computeMaskedOpts
1091
+ if (editable && (isEnableConf(maskedConfig) || maskedOpts.enabled)) {
1092
+ $xeDatePicker.handleMaskedSelectedDate(evnt)
1093
+ }
1094
+ $xeDatePicker.triggerEvent(evnt)
1095
+ },
549
1096
  keydownEvent (evnt: KeyboardEvent & { type: 'keydown' }) {
550
1097
  const $xeDatePicker = this
1098
+ const props = $xeDatePicker
1099
+ const reactData = $xeDatePicker.reactData
1100
+ const internalData = $xeDatePicker.internalData
551
1101
 
1102
+ const { type, editable, maskedConfig } = props
1103
+ const { visiblePanel } = reactData
1104
+ const maskedOpts = $xeDatePicker.computeMaskedOpts
1105
+ const isUpArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_UP)
1106
+ const isDwArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_DOWN)
1107
+ const isLtArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_LEFT)
1108
+ const isRtArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_RIGHT)
1109
+ const isEnter = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ENTER)
1110
+ if (editable) {
1111
+ if (isEnter) {
1112
+ const $datePanel = $xeDatePicker.$refs.refDatePanel as VxeDatePanelConstructor
1113
+ const { inputLabel } = internalData
1114
+ const targetElem = $xeDatePicker.$refs.refInputTarget as HTMLInputElement
1115
+ if (visiblePanel) {
1116
+ $xeDatePicker.hidePanel()
1117
+ }
1118
+ if ($datePanel) {
1119
+ $datePanel.checkValue(inputLabel)
1120
+ } else {
1121
+ $xeDatePicker.afterCheckValue(inputLabel)
1122
+ }
1123
+ if (targetElem) {
1124
+ targetElem.blur()
1125
+ }
1126
+ } else if (maskedTypes.includes(type)) {
1127
+ if (isEnableConf(maskedConfig) || maskedOpts.enabled) {
1128
+ if (maskedOpts.isArrow && (isUpArrow || isDwArrow || isLtArrow || isRtArrow)) {
1129
+ $xeDatePicker.handleArrowInputDate(evnt, isUpArrow, isDwArrow, isLtArrow, isRtArrow)
1130
+ } else if (maskedOpts.isMasked) {
1131
+ $xeDatePicker.handleMaskedInputDate(evnt)
1132
+ }
1133
+ }
1134
+ }
1135
+ }
552
1136
  $xeDatePicker.triggerEvent(evnt)
553
1137
  },
554
1138
  keyupEvent (evnt: KeyboardEvent & { type: 'keyup' }) {
@@ -586,14 +1170,14 @@ export default /* define-vxe-component start */ defineVxeComponent({
586
1170
  },
587
1171
  panelRevertEvent (params: VxeDatePanelDefines.RevertEventParams) {
588
1172
  const $xeDatePicker = this
589
- const reactData = $xeDatePicker.reactData
590
1173
 
591
- reactData.inputLabel = params.label
1174
+ $xeDatePicker.handleInputLabel(params.label, true)
592
1175
  },
593
1176
  // 全局事件
594
1177
  handleGlobalMousedownEvent (evnt: Event) {
595
1178
  const $xeDatePicker = this
596
1179
  const reactData = $xeDatePicker.reactData
1180
+ const internalData = $xeDatePicker.internalData
597
1181
 
598
1182
  const $datePanel = $xeDatePicker.$refs.refDatePanel as VxeDatePanelConstructor
599
1183
  const { visiblePanel, isActivated } = reactData
@@ -601,12 +1185,18 @@ export default /* define-vxe-component start */ defineVxeComponent({
601
1185
  const panelWrapperElem = $xeDatePicker.$refs.refPanelWrapper as HTMLDivElement
602
1186
  const isDisabled = $xeDatePicker.computeIsDisabled
603
1187
  if (!isDisabled && isActivated) {
604
- reactData.isActivated = getEventTargetNode(evnt, el).flag || getEventTargetNode(evnt, panelWrapperElem).flag
605
- if (!reactData.isActivated) {
1188
+ const currActivated = getEventTargetNode(evnt, el).flag || getEventTargetNode(evnt, panelWrapperElem).flag
1189
+ if (currActivated !== isActivated) {
1190
+ reactData.isActivated = currActivated
1191
+ }
1192
+ if (!currActivated) {
606
1193
  if (visiblePanel) {
607
1194
  $xeDatePicker.hidePanel()
1195
+ const { inputLabel } = internalData
608
1196
  if ($datePanel) {
609
- $datePanel.checkValue(reactData.inputLabel)
1197
+ $datePanel.checkValue(inputLabel)
1198
+ } else {
1199
+ $xeDatePicker.afterCheckValue(inputLabel)
610
1200
  }
611
1201
  }
612
1202
  }
@@ -651,6 +1241,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
651
1241
  handleGlobalBlurEvent () {
652
1242
  const $xeDatePicker = this
653
1243
  const reactData = $xeDatePicker.reactData
1244
+ const internalData = $xeDatePicker.internalData
654
1245
 
655
1246
  const $datePanel = $xeDatePicker.$refs.refDatePanel as VxeDatePanelConstructor
656
1247
  const { isActivated, visiblePanel } = reactData
@@ -662,7 +1253,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
662
1253
  }
663
1254
  if (visiblePanel || isActivated) {
664
1255
  if ($datePanel) {
665
- $datePanel.checkValue(reactData.inputLabel)
1256
+ $datePanel.checkValue(internalData.inputLabel)
666
1257
  }
667
1258
  const targetElem = $xeDatePicker.$refs.refInputTarget as HTMLInputElement
668
1259
  if (targetElem) {
@@ -702,6 +1293,9 @@ export default /* define-vxe-component start */ defineVxeComponent({
702
1293
  const { panelIndex } = reactData
703
1294
  const targetElem = $xeDatePicker.$refs.refInputTarget as HTMLInputElement
704
1295
  const panelElem = $xeDatePicker.$refs.refInputPanel as HTMLDivElement
1296
+ if (!panelElem) {
1297
+ return $xeDatePicker.$nextTick()
1298
+ }
705
1299
  const btnTransfer = $xeDatePicker.computeBtnTransfer
706
1300
  const popupOpts = $xeDatePicker.computePopupOpts
707
1301
  const handleStyle = () => {
@@ -731,10 +1325,8 @@ export default /* define-vxe-component start */ defineVxeComponent({
731
1325
  if (!isDisabled && !visiblePanel) {
732
1326
  if (!reactData.initialized) {
733
1327
  reactData.initialized = true
734
- if (btnTransfer) {
735
- if (panelElem) {
736
- document.body.appendChild(panelElem)
737
- }
1328
+ if (btnTransfer && panelElem) {
1329
+ document.body.appendChild(panelElem)
738
1330
  }
739
1331
  }
740
1332
  if (internalData.hpTimeout) {
@@ -763,18 +1355,19 @@ export default /* define-vxe-component start */ defineVxeComponent({
763
1355
  },
764
1356
  clickIconEvent (evnt: MouseEvent) {
765
1357
  const $xeDatePicker = this
1358
+ const reactData = $xeDatePicker.reactData
766
1359
 
1360
+ const { visiblePanel } = reactData
767
1361
  const popupOpts = $xeDatePicker.computePopupOpts
768
1362
  const { trigger } = popupOpts
769
1363
  if (!trigger || trigger === 'default' || trigger === 'icon') {
770
- $xeDatePicker.datePickerOpenEvent(evnt)
1364
+ if (visiblePanel) {
1365
+ $xeDatePicker.hidePanel()
1366
+ } else {
1367
+ $xeDatePicker.datePickerOpenEvent(evnt)
1368
+ }
771
1369
  }
772
1370
  },
773
- clickEvent (evnt: Event & { type: 'click' }) {
774
- const $xeDatePicker = this
775
-
776
- $xeDatePicker.triggerEvent(evnt)
777
- },
778
1371
  handleShortcutEvent ({ option, $event }: VxeButtonGroupDefines.ClickEventParams) {
779
1372
  const $xeDatePicker = this
780
1373
  const props = $xeDatePicker
@@ -816,7 +1409,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
816
1409
  break
817
1410
  }
818
1411
  default:
819
- errLog('vxe.error.notCommands', [`[date-picker] ${code}`])
1412
+ errLog('vxe.error.notCommands', [code])
820
1413
  break
821
1414
  }
822
1415
  }
@@ -906,6 +1499,10 @@ export default /* define-vxe-component start */ defineVxeComponent({
906
1499
  const slots = $xeDatePicker.$scopedSlots
907
1500
  const reactData = $xeDatePicker.reactData
908
1501
 
1502
+ const popupOpts = $xeDatePicker.computePopupOpts
1503
+ if (popupOpts.enabled === false) {
1504
+ return renderEmptyElement($xeDatePicker)
1505
+ }
909
1506
  const { type, multiple, showClearButton, showConfirmButton } = props
910
1507
  const { initialized, isAniVisible, visiblePanel, panelPlacement, panelStyle, inputValue } = reactData
911
1508
  const vSize = $xeDatePicker.computeSize
@@ -915,7 +1512,6 @@ export default /* define-vxe-component start */ defineVxeComponent({
915
1512
  const isDateTimeType = $xeDatePicker.computeIsDateTimeType
916
1513
  const shortcutList = $xeDatePicker.computeShortcutList
917
1514
  const timeOpts = $xeDatePicker.computeTimeOpts
918
- const popupOpts = $xeDatePicker.computePopupOpts
919
1515
  const { position } = shortcutOpts
920
1516
  const headerSlot = slots.header
921
1517
  const footerSlot = slots.footer
@@ -1147,9 +1743,11 @@ export default /* define-vxe-component start */ defineVxeComponent({
1147
1743
  const $xeDatePicker = this
1148
1744
  const props = $xeDatePicker
1149
1745
  const reactData = $xeDatePicker.reactData
1746
+ const internalData = $xeDatePicker.internalData
1150
1747
 
1151
1748
  const { className, type, name, autoComplete } = props
1152
- const { inputValue, inputLabel, visiblePanel, isActivated } = reactData
1749
+ const { inputValue, visiblePanel, isActivated, labelFlag } = reactData
1750
+ const { inputLabel } = internalData
1153
1751
  const vSize = $xeDatePicker.computeSize
1154
1752
  const isDisabled = $xeDatePicker.computeIsDisabled
1155
1753
  const formReadonly = $xeDatePicker.computeFormReadonly
@@ -1188,7 +1786,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
1188
1786
  ref: 'refInputTarget',
1189
1787
  class: 'vxe-date-picker--inner',
1190
1788
  domProps: {
1191
- value: inputLabel
1789
+ value: labelFlag ? inputLabel : ''
1192
1790
  },
1193
1791
  attrs: {
1194
1792
  name,
@@ -1218,9 +1816,8 @@ export default /* define-vxe-component start */ defineVxeComponent({
1218
1816
  watch: {
1219
1817
  computePanelLabel (val) {
1220
1818
  const $xeDatePicker = this
1221
- const reactData = $xeDatePicker.reactData
1222
1819
 
1223
- reactData.inputLabel = val
1820
+ $xeDatePicker.handleInputLabel(val, true)
1224
1821
  },
1225
1822
  value () {
1226
1823
  const $xeDatePicker = this
@@ -1230,7 +1827,19 @@ export default /* define-vxe-component start */ defineVxeComponent({
1230
1827
  },
1231
1828
  created () {
1232
1829
  const $xeDatePicker = this
1830
+ const props = $xeDatePicker
1831
+
1832
+ $xeDatePicker.internalData = createInternalData()
1233
1833
 
1834
+ const { type, multiple, maskedConfig } = props
1835
+ if (isEnableConf(maskedConfig)) {
1836
+ if (multiple) {
1837
+ errLog('vxe.error.notSupportProp', ['multiple', 'control-config.enabled=true', 'control-config.enabled=false'])
1838
+ }
1839
+ if (!maskedTypes.includes(type)) {
1840
+ warnLog('vxe.error.notSupportProp', ['control-config.enabled=true', `type=${type}`, `type=${maskedTypes.join('|')}`])
1841
+ }
1842
+ }
1234
1843
  $xeDatePicker.updateModelValue()
1235
1844
  globalEvents.on($xeDatePicker, 'mousewheel', $xeDatePicker.handleGlobalMousewheelEvent)
1236
1845
  globalEvents.on($xeDatePicker, 'mousedown', $xeDatePicker.handleGlobalMousedownEvent)
@@ -1240,6 +1849,8 @@ export default /* define-vxe-component start */ defineVxeComponent({
1240
1849
  },
1241
1850
  beforeDestroy () {
1242
1851
  const $xeDatePicker = this
1852
+ const reactData = $xeDatePicker.reactData
1853
+ const internalData = $xeDatePicker.internalData
1243
1854
 
1244
1855
  const panelElem = $xeDatePicker.$refs.refInputPanel as HTMLElement | undefined
1245
1856
  if (panelElem && panelElem.parentNode) {
@@ -1249,6 +1860,8 @@ export default /* define-vxe-component start */ defineVxeComponent({
1249
1860
  globalEvents.off($xeDatePicker, 'mousedown')
1250
1861
  globalEvents.off($xeDatePicker, 'blur')
1251
1862
  globalEvents.off($xeDatePicker, 'resize')
1863
+ XEUtils.assign(reactData, createReactData())
1864
+ XEUtils.assign(internalData, createInternalData())
1252
1865
  },
1253
1866
  render (this: any, h) {
1254
1867
  return this.renderVN(h)