vxe-pc-ui 3.15.2 → 3.15.4

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 (144) 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 +75 -35
  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 -16
  8. package/es/date-picker/src/date-picker.js +616 -88
  9. package/es/date-range-picker/src/date-range-picker.js +7 -4
  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/pager/src/pager.js +4 -3
  21. package/es/radio/src/group.js +11 -8
  22. package/es/select/src/select.js +34 -30
  23. package/es/splitter/src/splitter.js +6 -5
  24. package/es/table-select/src/table-select.js +27 -22
  25. package/es/tabs/src/tabs.js +4 -3
  26. package/es/textarea/src/textarea.js +2 -1
  27. package/es/tree/src/tree.js +6 -11
  28. package/es/tree-select/src/tree-select.js +27 -33
  29. package/es/ui/index.js +4 -1
  30. package/es/ui/src/log.js +14 -4
  31. package/es/upload/src/upload.js +11 -9
  32. package/lib/backtop/src/backtop.js +10 -6
  33. package/lib/backtop/src/backtop.min.js +1 -1
  34. package/lib/button/src/button.js +3 -1
  35. package/lib/button/src/button.min.js +1 -1
  36. package/lib/calendar/src/calendar.js +3 -1
  37. package/lib/calendar/src/calendar.min.js +1 -1
  38. package/lib/cascader/src/cascader.js +87 -34
  39. package/lib/cascader/src/cascader.min.js +1 -1
  40. package/lib/checkbox/src/group.js +18 -6
  41. package/lib/checkbox/src/group.min.js +1 -1
  42. package/lib/context-menu/src/context-menu.js +3 -4
  43. package/lib/context-menu/src/context-menu.min.js +1 -1
  44. package/lib/date-panel/src/util.js +37 -18
  45. package/lib/date-panel/src/util.min.js +1 -1
  46. package/lib/date-picker/src/date-picker.js +659 -86
  47. package/lib/date-picker/src/date-picker.min.js +1 -1
  48. package/lib/date-range-picker/src/date-range-picker.js +7 -3
  49. package/lib/date-range-picker/src/date-range-picker.min.js +1 -1
  50. package/lib/drawer/src/drawer.js +3 -0
  51. package/lib/drawer/src/drawer.min.js +1 -1
  52. package/lib/form/render/index.js +3 -1
  53. package/lib/form/render/index.min.js +1 -1
  54. package/lib/form/src/form.js +12 -8
  55. package/lib/form/src/form.min.js +1 -1
  56. package/lib/form/src/itemInfo.js +6 -4
  57. package/lib/form/src/itemInfo.min.js +1 -1
  58. package/lib/image/src/image.js +7 -5
  59. package/lib/image/src/image.min.js +1 -1
  60. package/lib/index.umd.js +1140 -287
  61. package/lib/index.umd.min.js +1 -1
  62. package/lib/input/src/input.js +5 -3
  63. package/lib/input/src/input.min.js +1 -1
  64. package/lib/layout-body/src/layout-body.js +13 -4
  65. package/lib/layout-body/src/layout-body.min.js +1 -1
  66. package/lib/list/src/list.js +4 -5
  67. package/lib/list/src/list.min.js +1 -1
  68. package/lib/menu/src/menu.js +3 -1
  69. package/lib/menu/src/menu.min.js +1 -1
  70. package/lib/modal/src/modal.js +8 -2
  71. package/lib/modal/src/modal.min.js +1 -1
  72. package/lib/pager/src/pager.js +5 -2
  73. package/lib/pager/src/pager.min.js +1 -1
  74. package/lib/radio/src/group.js +13 -6
  75. package/lib/radio/src/group.min.js +1 -1
  76. package/lib/select/src/select.js +36 -29
  77. package/lib/select/src/select.min.js +1 -1
  78. package/lib/splitter/src/splitter.js +9 -6
  79. package/lib/splitter/src/splitter.min.js +1 -1
  80. package/lib/table-select/src/table-select.js +27 -19
  81. package/lib/table-select/src/table-select.min.js +1 -1
  82. package/lib/tabs/src/tabs.js +6 -3
  83. package/lib/tabs/src/tabs.min.js +1 -1
  84. package/lib/textarea/src/textarea.js +3 -1
  85. package/lib/textarea/src/textarea.min.js +1 -1
  86. package/lib/tree/src/tree.js +9 -8
  87. package/lib/tree/src/tree.min.js +1 -1
  88. package/lib/tree-select/src/tree-select.js +17 -15
  89. package/lib/tree-select/src/tree-select.min.js +1 -1
  90. package/lib/ui/index.js +4 -1
  91. package/lib/ui/index.min.js +1 -1
  92. package/lib/ui/src/log.js +14 -3
  93. package/lib/ui/src/log.min.js +1 -1
  94. package/lib/upload/src/upload.js +22 -7
  95. package/lib/upload/src/upload.min.js +1 -1
  96. package/package.json +1 -1
  97. package/packages/backtop/src/backtop.ts +11 -3
  98. package/packages/button/src/button.ts +4 -2
  99. package/packages/calendar/src/calendar.ts +3 -1
  100. package/packages/cascader/src/cascader.ts +77 -32
  101. package/packages/checkbox/src/group.ts +22 -5
  102. package/packages/context-menu/src/context-menu.ts +5 -2
  103. package/packages/date-panel/src/util.ts +28 -16
  104. package/packages/date-picker/src/date-picker.ts +630 -89
  105. package/packages/date-range-picker/src/date-range-picker.ts +8 -4
  106. package/packages/drawer/src/drawer.ts +3 -0
  107. package/packages/form/render/index.ts +4 -2
  108. package/packages/form/src/form.ts +14 -7
  109. package/packages/form/src/itemInfo.ts +7 -5
  110. package/packages/image/src/image.ts +9 -3
  111. package/packages/input/src/input.ts +3 -1
  112. package/packages/layout-body/src/layout-body.ts +16 -2
  113. package/packages/list/src/list.ts +6 -3
  114. package/packages/menu/src/menu.ts +3 -1
  115. package/packages/modal/src/modal.ts +6 -1
  116. package/packages/pager/src/pager.ts +5 -3
  117. package/packages/radio/src/group.ts +16 -5
  118. package/packages/select/src/select.ts +41 -29
  119. package/packages/splitter/src/splitter.ts +7 -5
  120. package/packages/table-select/src/table-select.ts +31 -20
  121. package/packages/tabs/src/tabs.ts +5 -3
  122. package/packages/textarea/src/textarea.ts +3 -1
  123. package/packages/tree/src/tree.ts +9 -4
  124. package/packages/tree-select/src/tree-select.ts +31 -30
  125. package/packages/ui/index.ts +3 -0
  126. package/packages/ui/src/log.ts +16 -4
  127. package/packages/upload/src/upload.ts +16 -6
  128. package/types/components/cascader.d.ts +4 -0
  129. package/types/components/date-picker.d.ts +14 -6
  130. package/types/components/drawer.d.ts +2 -0
  131. package/types/components/modal.d.ts +2 -0
  132. package/types/components/upload.d.ts +28 -1
  133. /package/es/icon/{iconfont.1781753586592.ttf → iconfont.1781876590487.ttf} +0 -0
  134. /package/es/icon/{iconfont.1781753586592.woff → iconfont.1781876590487.woff} +0 -0
  135. /package/es/icon/{iconfont.1781753586592.woff2 → iconfont.1781876590487.woff2} +0 -0
  136. /package/es/{iconfont.1781753586592.ttf → iconfont.1781876590487.ttf} +0 -0
  137. /package/es/{iconfont.1781753586592.woff → iconfont.1781876590487.woff} +0 -0
  138. /package/es/{iconfont.1781753586592.woff2 → iconfont.1781876590487.woff2} +0 -0
  139. /package/lib/icon/style/{iconfont.1781753586592.ttf → iconfont.1781876590487.ttf} +0 -0
  140. /package/lib/icon/style/{iconfont.1781753586592.woff → iconfont.1781876590487.woff} +0 -0
  141. /package/lib/icon/style/{iconfont.1781753586592.woff2 → iconfont.1781876590487.woff2} +0 -0
  142. /package/lib/{iconfont.1781753586592.ttf → iconfont.1781876590487.ttf} +0 -0
  143. /package/lib/{iconfont.1781753586592.woff → iconfont.1781876590487.woff} +0 -0
  144. /package/lib/{iconfont.1781753586592.woff2 → iconfont.1781876590487.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, handleInputFormat, 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: [
@@ -84,7 +115,6 @@ export default /* define-vxe-component start */ defineVxeComponent({
84
115
  labelFormat: String as PropType<VxeDatePickerPropTypes.LabelFormat>,
85
116
  valueFormat: String as PropType<VxeDatePickerPropTypes.ValueFormat>,
86
117
  timeFormat: String as PropType<VxeDatePickerPropTypes.TimeFormat>,
87
- inputFormat: String as PropType<VxeDatePickerPropTypes.InputFormat>,
88
118
  editable: {
89
119
  type: Boolean as PropType<VxeDatePickerPropTypes.Editable>,
90
120
  default: true
@@ -115,7 +145,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
115
145
  type: Boolean as PropType<VxeDatePickerPropTypes.AutoClose>,
116
146
  default: () => getConfig().datePicker.autoClose
117
147
  },
118
- controlConfig: Object as PropType<VxeDatePickerPropTypes.ControlConfig>,
148
+ maskedConfig: Object as PropType<VxeDatePickerPropTypes.MaskedConfig>,
119
149
 
120
150
  prefixIcon: String as PropType<VxeDatePickerPropTypes.PrefixIcon>,
121
151
  suffixIcon: String as PropType<VxeDatePickerPropTypes.SuffixIcon>,
@@ -159,28 +189,13 @@ export default /* define-vxe-component start */ defineVxeComponent({
159
189
  },
160
190
  data () {
161
191
  const xID = XEUtils.uniqueId()
162
-
163
- const reactData: DatePickerReactData = {
164
- initialized: false,
165
- panelIndex: 0,
166
- visiblePanel: false,
167
- isAniVisible: false,
168
- panelStyle: {},
169
- panelPlacement: '',
170
- isActivated: false,
171
- inputValue: '',
172
- inputLabel: ''
173
- }
174
-
175
- const internalData: DatePickerInternalData = {
176
- // hpTimeout: undefined,
177
- parseInputKayMaps: {}
178
- }
179
-
192
+ const reactData = createReactData()
180
193
  return {
194
+ ...({} as {
195
+ internalData: DatePickerInternalData
196
+ }),
181
197
  xID,
182
- reactData,
183
- internalData
198
+ reactData
184
199
  }
185
200
  },
186
201
  computed: {
@@ -264,6 +279,58 @@ export default /* define-vxe-component start */ defineVxeComponent({
264
279
 
265
280
  return props.clearable
266
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
+ },
267
334
  computeInputReadonly () {
268
335
  const $xeDatePicker = this
269
336
  const props = $xeDatePicker
@@ -339,12 +406,11 @@ export default /* define-vxe-component start */ defineVxeComponent({
339
406
  const { type, valueFormat } = props
340
407
  return handleValueFormat(type, valueFormat)
341
408
  },
342
- computeDateInputFormat () {
409
+ computeDateMaskedFormat () {
343
410
  const $xeDatePicker = this
344
- const props = $xeDatePicker
345
411
 
346
- const { type, inputFormat } = props
347
- return handleInputFormat(type, inputFormat)
412
+ const dateLabelFormat = $xeDatePicker.computeDateLabelFormat as string
413
+ return dateLabelFormat
348
414
  },
349
415
  computeFirstDayOfWeek () {
350
416
  const $xeDatePicker = this
@@ -373,11 +439,18 @@ export default /* define-vxe-component start */ defineVxeComponent({
373
439
  return dateObj.label
374
440
  }).join(', ')
375
441
  },
376
- computeControlOpts () {
442
+ computeMaskedOpts () {
377
443
  const $xeDatePicker = this
378
444
  const props = $xeDatePicker
379
445
 
380
- return Object.assign({}, getConfig().datePicker.controlConfig, props.controlConfig)
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] : '') || '*'
381
454
  }
382
455
  },
383
456
  methods: {
@@ -415,6 +488,16 @@ export default /* define-vxe-component start */ defineVxeComponent({
415
488
  }
416
489
  reactData.inputValue = val
417
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
+ },
418
501
  triggerEvent (evnt: Event & { type: 'input' | 'change' | 'keydown' | 'keyup' | 'click' | 'focus' | 'blur' }) {
419
502
  const $xeDatePicker = this
420
503
  const reactData = $xeDatePicker.reactData
@@ -466,11 +549,10 @@ export default /* define-vxe-component start */ defineVxeComponent({
466
549
  },
467
550
  inputEvent (evnt: Event & { type: 'input' }) {
468
551
  const $xeDatePicker = this
469
- const reactData = $xeDatePicker.reactData
470
552
 
471
553
  const inputElem = evnt.target as HTMLInputElement
472
554
  const value = inputElem.value
473
- reactData.inputLabel = value
555
+ $xeDatePicker.handleInputLabel(value, true)
474
556
  $xeDatePicker.dispatchEvent('input', { value }, evnt)
475
557
  },
476
558
  changeEvent (evnt: Event & { type: 'change' }) {
@@ -481,20 +563,6 @@ export default /* define-vxe-component start */ defineVxeComponent({
481
563
  $xeDatePicker.triggerEvent(evnt)
482
564
  }
483
565
  },
484
- focusEvent (evnt: Event & { type: 'focus' }) {
485
- const $xeDatePicker = this
486
- const reactData = $xeDatePicker.reactData
487
-
488
- const popupOpts = $xeDatePicker.computePopupOpts
489
- const { trigger } = popupOpts
490
- reactData.isActivated = true
491
- if (!trigger || trigger === 'default') {
492
- $xeDatePicker.datePickerOpenEvent(evnt)
493
- } else if (trigger === 'icon') {
494
- $xeDatePicker.hidePanel()
495
- }
496
- $xeDatePicker.triggerEvent(evnt)
497
- },
498
566
  clickPrefixEvent (evnt: Event) {
499
567
  const $xeDatePicker = this
500
568
  const reactData = $xeDatePicker.reactData
@@ -509,7 +577,6 @@ export default /* define-vxe-component start */ defineVxeComponent({
509
577
  const $xeDatePicker = this
510
578
  const reactData = $xeDatePicker.reactData
511
579
  const internalData = $xeDatePicker.internalData
512
-
513
580
  return new Promise<void>(resolve => {
514
581
  reactData.visiblePanel = false
515
582
  internalData.hpTimeout = setTimeout(() => {
@@ -518,6 +585,112 @@ export default /* define-vxe-component start */ defineVxeComponent({
518
585
  }, 350)
519
586
  })
520
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
+ },
521
694
  clearValueEvent (evnt: Event, value: VxeDatePickerPropTypes.ModelValue) {
522
695
  const $xeDatePicker = this
523
696
 
@@ -538,39 +711,320 @@ export default /* define-vxe-component start */ defineVxeComponent({
538
711
  $xeDatePicker.dispatchEvent('suffix-click', { value: inputValue }, evnt)
539
712
  }
540
713
  },
541
- handleArrowInputDate (evnt: KeyboardEvent, isUpArrow: boolean) {
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) {
542
789
  const $xeDatePicker = this
543
790
  const props = $xeDatePicker
544
- const reactData = $xeDatePicker.reactData
545
791
  const internalData = $xeDatePicker.internalData
546
792
 
547
793
  const { multiple } = props
548
794
  if (multiple) {
549
795
  return
550
796
  }
551
- const { inputValue } = reactData
552
- if (!inputValue) {
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)) {
553
938
  return
554
939
  }
555
940
  const targetElem = $xeDatePicker.$refs.refInputTarget as HTMLInputElement
556
941
  if (!targetElem) {
557
942
  return
558
943
  }
559
- const { parseInputKayMaps } = internalData
560
- const inputFormat = $xeDatePicker.computeDateInputFormat
944
+ const { laseFocusMasked } = internalData
945
+ if (laseFocusMasked && Date.now() - laseFocusMasked < 100) {
946
+ return
947
+ }
948
+ const dateMaskedFormat = $xeDatePicker.computeDateMaskedFormat
949
+ const maskChar = $xeDatePicker.computeMaskChar
561
950
  const selectionStart = targetElem.selectionStart || 0
562
- let selectKey = inputFormat[selectionStart]
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]
563
1008
  if (!parseInputKayMaps[selectKey]) {
564
- selectKey = inputFormat[selectionStart - 1]
1009
+ selectKey = dateMaskedFormat[selectionStart - 1]
565
1010
  }
566
- const inputPaesrFn = parseInputKayMaps[selectKey]
567
- if (inputPaesrFn) {
568
- inputPaesrFn(evnt, targetElem, isUpArrow)
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
+ }
569
1022
  }
570
1023
  },
571
1024
  blurEvent (evnt: Event & { type: 'blur' }) {
572
1025
  const $xeDatePicker = this
573
1026
  const reactData = $xeDatePicker.reactData
1027
+ const internalData = $xeDatePicker.internalData
574
1028
  const $xeForm = $xeDatePicker.$xeForm
575
1029
  const formItemInfo = $xeDatePicker.formItemInfo
576
1030
 
@@ -582,10 +1036,13 @@ export default /* define-vxe-component start */ defineVxeComponent({
582
1036
  $xeDatePicker.handleChange(value, evnt)
583
1037
  }
584
1038
  if (!reactData.visiblePanel) {
1039
+ const { inputLabel } = internalData
585
1040
  reactData.isActivated = false
586
1041
  // 未打开面板时才校验
587
1042
  if ($datePanel) {
588
- $datePanel.checkValue(reactData.inputLabel)
1043
+ $datePanel.checkValue(inputLabel)
1044
+ } else {
1045
+ $xeDatePicker.afterCheckValue(inputLabel)
589
1046
  }
590
1047
  }
591
1048
  $xeDatePicker.dispatchEvent('blur', { value }, evnt)
@@ -594,16 +1051,87 @@ export default /* define-vxe-component start */ defineVxeComponent({
594
1051
  $xeForm.triggerItemEvent(evnt, formItemInfo.itemConfig.field, value)
595
1052
  }
596
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
+ },
597
1096
  keydownEvent (evnt: KeyboardEvent & { type: 'keydown' }) {
598
1097
  const $xeDatePicker = this
599
1098
  const props = $xeDatePicker
1099
+ const reactData = $xeDatePicker.reactData
1100
+ const internalData = $xeDatePicker.internalData
600
1101
 
601
- const { controlConfig } = props
602
- const controlOpts = $xeDatePicker.computeControlOpts
1102
+ const { type, editable, maskedConfig } = props
1103
+ const { visiblePanel } = reactData
1104
+ const maskedOpts = $xeDatePicker.computeMaskedOpts
603
1105
  const isUpArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_UP)
604
1106
  const isDwArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_DOWN)
605
- if ((isUpArrow || isDwArrow) && controlOpts.isArrow && (controlConfig || controlOpts.enabled)) {
606
- $xeDatePicker.handleArrowInputDate(evnt, isUpArrow)
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
+ }
607
1135
  }
608
1136
  $xeDatePicker.triggerEvent(evnt)
609
1137
  },
@@ -642,14 +1170,14 @@ export default /* define-vxe-component start */ defineVxeComponent({
642
1170
  },
643
1171
  panelRevertEvent (params: VxeDatePanelDefines.RevertEventParams) {
644
1172
  const $xeDatePicker = this
645
- const reactData = $xeDatePicker.reactData
646
1173
 
647
- reactData.inputLabel = params.label
1174
+ $xeDatePicker.handleInputLabel(params.label, true)
648
1175
  },
649
1176
  // 全局事件
650
1177
  handleGlobalMousedownEvent (evnt: Event) {
651
1178
  const $xeDatePicker = this
652
1179
  const reactData = $xeDatePicker.reactData
1180
+ const internalData = $xeDatePicker.internalData
653
1181
 
654
1182
  const $datePanel = $xeDatePicker.$refs.refDatePanel as VxeDatePanelConstructor
655
1183
  const { visiblePanel, isActivated } = reactData
@@ -657,12 +1185,18 @@ export default /* define-vxe-component start */ defineVxeComponent({
657
1185
  const panelWrapperElem = $xeDatePicker.$refs.refPanelWrapper as HTMLDivElement
658
1186
  const isDisabled = $xeDatePicker.computeIsDisabled
659
1187
  if (!isDisabled && isActivated) {
660
- reactData.isActivated = getEventTargetNode(evnt, el).flag || getEventTargetNode(evnt, panelWrapperElem).flag
661
- 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) {
662
1193
  if (visiblePanel) {
663
1194
  $xeDatePicker.hidePanel()
1195
+ const { inputLabel } = internalData
664
1196
  if ($datePanel) {
665
- $datePanel.checkValue(reactData.inputLabel)
1197
+ $datePanel.checkValue(inputLabel)
1198
+ } else {
1199
+ $xeDatePicker.afterCheckValue(inputLabel)
666
1200
  }
667
1201
  }
668
1202
  }
@@ -707,6 +1241,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
707
1241
  handleGlobalBlurEvent () {
708
1242
  const $xeDatePicker = this
709
1243
  const reactData = $xeDatePicker.reactData
1244
+ const internalData = $xeDatePicker.internalData
710
1245
 
711
1246
  const $datePanel = $xeDatePicker.$refs.refDatePanel as VxeDatePanelConstructor
712
1247
  const { isActivated, visiblePanel } = reactData
@@ -718,7 +1253,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
718
1253
  }
719
1254
  if (visiblePanel || isActivated) {
720
1255
  if ($datePanel) {
721
- $datePanel.checkValue(reactData.inputLabel)
1256
+ $datePanel.checkValue(internalData.inputLabel)
722
1257
  }
723
1258
  const targetElem = $xeDatePicker.$refs.refInputTarget as HTMLInputElement
724
1259
  if (targetElem) {
@@ -788,9 +1323,11 @@ export default /* define-vxe-component start */ defineVxeComponent({
788
1323
  const btnTransfer = $xeDatePicker.computeBtnTransfer
789
1324
  const panelElem = $xeDatePicker.$refs.refInputPanel as HTMLElement
790
1325
  if (!isDisabled && !visiblePanel) {
791
- if (!reactData.initialized && btnTransfer && panelElem) {
1326
+ if (!reactData.initialized) {
792
1327
  reactData.initialized = true
793
- document.body.appendChild(panelElem)
1328
+ if (btnTransfer && panelElem) {
1329
+ document.body.appendChild(panelElem)
1330
+ }
794
1331
  }
795
1332
  if (internalData.hpTimeout) {
796
1333
  clearTimeout(internalData.hpTimeout)
@@ -831,11 +1368,6 @@ export default /* define-vxe-component start */ defineVxeComponent({
831
1368
  }
832
1369
  }
833
1370
  },
834
- clickEvent (evnt: Event & { type: 'click' }) {
835
- const $xeDatePicker = this
836
-
837
- $xeDatePicker.triggerEvent(evnt)
838
- },
839
1371
  handleShortcutEvent ({ option, $event }: VxeButtonGroupDefines.ClickEventParams) {
840
1372
  const $xeDatePicker = this
841
1373
  const props = $xeDatePicker
@@ -877,7 +1409,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
877
1409
  break
878
1410
  }
879
1411
  default:
880
- errLog('vxe.error.notCommands', [`[date-picker] ${code}`])
1412
+ errLog('vxe.error.notCommands', [code])
881
1413
  break
882
1414
  }
883
1415
  }
@@ -1211,9 +1743,11 @@ export default /* define-vxe-component start */ defineVxeComponent({
1211
1743
  const $xeDatePicker = this
1212
1744
  const props = $xeDatePicker
1213
1745
  const reactData = $xeDatePicker.reactData
1746
+ const internalData = $xeDatePicker.internalData
1214
1747
 
1215
1748
  const { className, type, name, autoComplete } = props
1216
- const { inputValue, inputLabel, visiblePanel, isActivated } = reactData
1749
+ const { inputValue, visiblePanel, isActivated, labelFlag } = reactData
1750
+ const { inputLabel } = internalData
1217
1751
  const vSize = $xeDatePicker.computeSize
1218
1752
  const isDisabled = $xeDatePicker.computeIsDisabled
1219
1753
  const formReadonly = $xeDatePicker.computeFormReadonly
@@ -1252,7 +1786,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
1252
1786
  ref: 'refInputTarget',
1253
1787
  class: 'vxe-date-picker--inner',
1254
1788
  domProps: {
1255
- value: inputLabel
1789
+ value: labelFlag ? inputLabel : ''
1256
1790
  },
1257
1791
  attrs: {
1258
1792
  name,
@@ -1282,9 +1816,8 @@ export default /* define-vxe-component start */ defineVxeComponent({
1282
1816
  watch: {
1283
1817
  computePanelLabel (val) {
1284
1818
  const $xeDatePicker = this
1285
- const reactData = $xeDatePicker.reactData
1286
1819
 
1287
- reactData.inputLabel = val
1820
+ $xeDatePicker.handleInputLabel(val, true)
1288
1821
  },
1289
1822
  value () {
1290
1823
  const $xeDatePicker = this
@@ -1294,15 +1827,19 @@ export default /* define-vxe-component start */ defineVxeComponent({
1294
1827
  },
1295
1828
  created () {
1296
1829
  const $xeDatePicker = this
1297
- const internalData = $xeDatePicker.internalData
1830
+ const props = $xeDatePicker
1298
1831
 
1299
- const { parseInputKayMaps } = internalData
1300
- const inputKeys = ['y', 'M', 'd', 'H', 'm', 'n']
1301
- inputKeys.forEach(key => {
1302
- parseInputKayMaps[key] = (evnt: KeyboardEvent) => {
1303
- evnt.preventDefault()
1832
+ $xeDatePicker.internalData = createInternalData()
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'])
1304
1838
  }
1305
- })
1839
+ if (!maskedTypes.includes(type)) {
1840
+ warnLog('vxe.error.notSupportProp', ['control-config.enabled=true', `type=${type}`, `type=${maskedTypes.join('|')}`])
1841
+ }
1842
+ }
1306
1843
  $xeDatePicker.updateModelValue()
1307
1844
  globalEvents.on($xeDatePicker, 'mousewheel', $xeDatePicker.handleGlobalMousewheelEvent)
1308
1845
  globalEvents.on($xeDatePicker, 'mousedown', $xeDatePicker.handleGlobalMousedownEvent)
@@ -1312,6 +1849,8 @@ export default /* define-vxe-component start */ defineVxeComponent({
1312
1849
  },
1313
1850
  beforeDestroy () {
1314
1851
  const $xeDatePicker = this
1852
+ const reactData = $xeDatePicker.reactData
1853
+ const internalData = $xeDatePicker.internalData
1315
1854
 
1316
1855
  const panelElem = $xeDatePicker.$refs.refInputPanel as HTMLElement | undefined
1317
1856
  if (panelElem && panelElem.parentNode) {
@@ -1321,6 +1860,8 @@ export default /* define-vxe-component start */ defineVxeComponent({
1321
1860
  globalEvents.off($xeDatePicker, 'mousedown')
1322
1861
  globalEvents.off($xeDatePicker, 'blur')
1323
1862
  globalEvents.off($xeDatePicker, 'resize')
1863
+ XEUtils.assign(reactData, createReactData())
1864
+ XEUtils.assign(internalData, createInternalData())
1324
1865
  },
1325
1866
  render (this: any, h) {
1326
1867
  return this.renderVN(h)