vxe-pc-ui 4.15.2 → 4.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 (127) hide show
  1. package/dist/all.esm.js +774 -211
  2. package/es/backtop/src/backtop.js +2 -1
  3. package/es/button/src/button.js +3 -2
  4. package/es/calendar/src/calendar.js +2 -1
  5. package/es/cascader/src/cascader.js +2 -1
  6. package/es/checkbox/src/group.js +5 -1
  7. package/es/date-panel/src/util.js +27 -16
  8. package/es/date-picker/src/date-picker.js +572 -74
  9. package/es/date-range-picker/src/date-range-picker.js +3 -2
  10. package/es/drawer/src/drawer.js +2 -0
  11. package/es/form/render/index.js +3 -2
  12. package/es/form/src/form.js +6 -5
  13. package/es/form/src/itemInfo.js +6 -5
  14. package/es/input/src/input.js +2 -1
  15. package/es/menu/src/menu.js +2 -1
  16. package/es/modal/src/modal.js +5 -2
  17. package/es/pager/src/pager.js +4 -3
  18. package/es/radio/src/group.js +5 -1
  19. package/es/select/src/select.js +25 -20
  20. package/es/splitter/src/splitter.js +7 -6
  21. package/es/table-select/src/table-select.js +21 -16
  22. package/es/tabs/src/tabs.js +4 -3
  23. package/es/textarea/src/textarea.js +2 -1
  24. package/es/tree/src/tree.js +3 -2
  25. package/es/tree-select/src/tree-select.js +2 -1
  26. package/es/ui/index.js +1 -1
  27. package/es/ui/src/log.js +7 -1
  28. package/es/upload/src/upload.js +12 -3
  29. package/lib/backtop/src/backtop.js +5 -2
  30. package/lib/backtop/src/backtop.min.js +1 -1
  31. package/lib/button/src/button.js +4 -1
  32. package/lib/button/src/button.min.js +1 -1
  33. package/lib/calendar/src/calendar.js +4 -1
  34. package/lib/calendar/src/calendar.min.js +1 -1
  35. package/lib/cascader/src/cascader.js +4 -1
  36. package/lib/cascader/src/cascader.min.js +1 -1
  37. package/lib/checkbox/src/group.js +5 -1
  38. package/lib/checkbox/src/group.min.js +1 -1
  39. package/lib/date-panel/src/util.js +37 -19
  40. package/lib/date-panel/src/util.min.js +1 -1
  41. package/lib/date-picker/src/date-picker.js +620 -77
  42. package/lib/date-picker/src/date-picker.min.js +1 -1
  43. package/lib/date-range-picker/src/date-range-picker.js +4 -1
  44. package/lib/date-range-picker/src/date-range-picker.min.js +1 -1
  45. package/lib/drawer/src/drawer.js +2 -0
  46. package/lib/drawer/src/drawer.min.js +1 -1
  47. package/lib/form/render/index.js +4 -1
  48. package/lib/form/render/index.min.js +1 -1
  49. package/lib/form/src/form.js +8 -4
  50. package/lib/form/src/form.min.js +1 -1
  51. package/lib/form/src/itemInfo.js +7 -4
  52. package/lib/form/src/itemInfo.min.js +1 -1
  53. package/lib/index.umd.js +847 -177
  54. package/lib/index.umd.min.js +1 -1
  55. package/lib/input/src/input.js +6 -3
  56. package/lib/input/src/input.min.js +1 -1
  57. package/lib/menu/src/menu.js +4 -1
  58. package/lib/menu/src/menu.min.js +1 -1
  59. package/lib/modal/src/modal.js +8 -2
  60. package/lib/modal/src/modal.min.js +1 -1
  61. package/lib/pager/src/pager.js +6 -2
  62. package/lib/pager/src/pager.min.js +1 -1
  63. package/lib/radio/src/group.js +5 -1
  64. package/lib/radio/src/group.min.js +1 -1
  65. package/lib/select/src/select.js +27 -20
  66. package/lib/select/src/select.min.js +1 -1
  67. package/lib/splitter/src/splitter.js +12 -8
  68. package/lib/splitter/src/splitter.min.js +1 -1
  69. package/lib/table-select/src/table-select.js +22 -15
  70. package/lib/table-select/src/table-select.min.js +1 -1
  71. package/lib/tabs/src/tabs.js +7 -3
  72. package/lib/tabs/src/tabs.min.js +1 -1
  73. package/lib/textarea/src/textarea.js +4 -1
  74. package/lib/textarea/src/textarea.min.js +1 -1
  75. package/lib/tree/src/tree.js +7 -4
  76. package/lib/tree/src/tree.min.js +1 -1
  77. package/lib/tree-select/src/tree-select.js +7 -3
  78. package/lib/tree-select/src/tree-select.min.js +1 -1
  79. package/lib/ui/index.js +1 -1
  80. package/lib/ui/index.min.js +1 -1
  81. package/lib/ui/src/log.js +8 -1
  82. package/lib/ui/src/log.min.js +1 -1
  83. package/lib/upload/src/upload.js +20 -3
  84. package/lib/upload/src/upload.min.js +1 -1
  85. package/package.json +1 -1
  86. package/packages/backtop/src/backtop.ts +3 -1
  87. package/packages/button/src/button.ts +4 -2
  88. package/packages/calendar/src/calendar.ts +3 -1
  89. package/packages/cascader/src/cascader.ts +3 -1
  90. package/packages/checkbox/src/group.ts +6 -2
  91. package/packages/date-panel/src/util.ts +28 -16
  92. package/packages/date-picker/src/date-picker.ts +583 -75
  93. package/packages/date-range-picker/src/date-range-picker.ts +4 -2
  94. package/packages/drawer/src/drawer.ts +2 -0
  95. package/packages/form/render/index.ts +4 -2
  96. package/packages/form/src/form.ts +7 -5
  97. package/packages/form/src/itemInfo.ts +7 -5
  98. package/packages/input/src/input.ts +3 -1
  99. package/packages/menu/src/menu.ts +3 -1
  100. package/packages/modal/src/modal.ts +6 -2
  101. package/packages/pager/src/pager.ts +5 -3
  102. package/packages/radio/src/group.ts +6 -2
  103. package/packages/select/src/select.ts +29 -22
  104. package/packages/splitter/src/splitter.ts +8 -6
  105. package/packages/table-select/src/table-select.ts +24 -17
  106. package/packages/tabs/src/tabs.ts +5 -3
  107. package/packages/textarea/src/textarea.ts +3 -1
  108. package/packages/tree/src/tree.ts +4 -2
  109. package/packages/tree-select/src/tree-select.ts +3 -1
  110. package/packages/ui/src/log.ts +7 -0
  111. package/packages/upload/src/upload.ts +14 -3
  112. package/types/components/date-picker.d.ts +14 -6
  113. package/types/components/drawer.d.ts +2 -0
  114. package/types/components/modal.d.ts +2 -0
  115. package/types/components/upload.d.ts +28 -1
  116. /package/es/icon/{iconfont.1781753592499.ttf → iconfont.1781852740683.ttf} +0 -0
  117. /package/es/icon/{iconfont.1781753592499.woff → iconfont.1781852740683.woff} +0 -0
  118. /package/es/icon/{iconfont.1781753592499.woff2 → iconfont.1781852740683.woff2} +0 -0
  119. /package/es/{iconfont.1781753592499.ttf → iconfont.1781852740683.ttf} +0 -0
  120. /package/es/{iconfont.1781753592499.woff → iconfont.1781852740683.woff} +0 -0
  121. /package/es/{iconfont.1781753592499.woff2 → iconfont.1781852740683.woff2} +0 -0
  122. /package/lib/icon/style/{iconfont.1781753592499.ttf → iconfont.1781852740683.ttf} +0 -0
  123. /package/lib/icon/style/{iconfont.1781753592499.woff → iconfont.1781852740683.woff} +0 -0
  124. /package/lib/icon/style/{iconfont.1781753592499.woff2 → iconfont.1781852740683.woff2} +0 -0
  125. /package/lib/{iconfont.1781753592499.ttf → iconfont.1781852740683.ttf} +0 -0
  126. /package/lib/{iconfont.1781753592499.woff → iconfont.1781852740683.woff} +0 -0
  127. /package/lib/{iconfont.1781753592499.woff2 → iconfont.1781852740683.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, useSize, 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, DatePickerMethods, VxeDatePanelDefines, VxeDatePickerPropTypes, DatePickerPrivateRef, VxeFormConstructor, VxeFormPrivateMethods, VxeFormDefines, ValueOf, VxeModalConstructor, VxeDrawerConstructor, VxeModalMethods, VxeDrawerMethods, VxeDatePickerDefines, VxeButtonGroupEvents, 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 defineVxeComponent({
18
49
  name: 'VxeDatePicker',
19
50
  props: {
@@ -77,7 +108,6 @@ export default defineVxeComponent({
77
108
  labelFormat: String as PropType<VxeDatePickerPropTypes.LabelFormat>,
78
109
  valueFormat: String as PropType<VxeDatePickerPropTypes.ValueFormat>,
79
110
  timeFormat: String as PropType<VxeDatePickerPropTypes.TimeFormat>,
80
- inputFormat: String as PropType<VxeDatePickerPropTypes.InputFormat>,
81
111
  editable: {
82
112
  type: Boolean as PropType<VxeDatePickerPropTypes.Editable>,
83
113
  default: true
@@ -108,7 +138,7 @@ export default defineVxeComponent({
108
138
  type: Boolean as PropType<VxeDatePickerPropTypes.AutoClose>,
109
139
  default: () => getConfig().datePicker.autoClose
110
140
  },
111
- controlConfig: Object as PropType<VxeDatePickerPropTypes.ControlConfig>,
141
+ maskedConfig: Object as PropType<VxeDatePickerPropTypes.MaskedConfig>,
112
142
 
113
143
  prefixIcon: String as PropType<VxeDatePickerPropTypes.PrefixIcon>,
114
144
  suffixIcon: String as PropType<VxeDatePickerPropTypes.SuffixIcon>,
@@ -156,22 +186,8 @@ export default defineVxeComponent({
156
186
 
157
187
  const { computeSize } = useSize(props)
158
188
 
159
- const reactData = reactive<DatePickerReactData>({
160
- initialized: false,
161
- panelIndex: 0,
162
- visiblePanel: false,
163
- isAniVisible: false,
164
- panelStyle: {},
165
- panelPlacement: '',
166
- isActivated: false,
167
- inputValue: '',
168
- inputLabel: ''
169
- })
170
-
171
- const internalData: DatePickerInternalData = {
172
- // hpTimeout: undefined,
173
- parseInputKayMaps: {}
174
- }
189
+ const reactData = reactive(createReactData())
190
+ const internalData = createInternalData()
175
191
 
176
192
  const refElem = ref() as Ref<HTMLDivElement>
177
193
  const refInputTarget = ref() as Ref<HTMLInputElement>
@@ -248,6 +264,49 @@ export default defineVxeComponent({
248
264
  return props.clearable
249
265
  })
250
266
 
267
+ const computeIsDatePanelType = computed(() => {
268
+ const isDateTimeType = computeIsDateTimeType.value
269
+ return isDateTimeType || ['date', 'week', 'month', 'quarter', 'year'].indexOf(props.type) > -1
270
+ })
271
+
272
+ const computeDateListValue = computed(() => {
273
+ const { modelValue, type, multiple } = props
274
+ const isDatePanelType = computeIsDatePanelType.value
275
+ const dateValueFormat = computeDateValueFormat.value
276
+ if (multiple && modelValue && isDatePanelType) {
277
+ return XEUtils.toValueString(modelValue).split(',').map(item => {
278
+ const date = parseDateValue(item, type, {
279
+ valueFormat: dateValueFormat
280
+ })
281
+ if (XEUtils.isValidDate(date)) {
282
+ return date
283
+ }
284
+ return date
285
+ })
286
+ }
287
+ return []
288
+ })
289
+
290
+ const computeLimitMaxCount = computed(() => {
291
+ return props.multiple ? XEUtils.toNumber(props.limitCount) : 0
292
+ })
293
+
294
+ const computeDateMultipleValue = computed(() => {
295
+ const dateListValue = computeDateListValue.value
296
+ const dateValueFormat = computeDateValueFormat.value
297
+ return dateListValue.map(date => XEUtils.toDateString(date, dateValueFormat))
298
+ })
299
+
300
+ const computeOverCount = computed(() => {
301
+ const { multiple } = props
302
+ const limitMaxCount = computeLimitMaxCount.value
303
+ const dateMultipleValue = computeDateMultipleValue.value
304
+ if (multiple && limitMaxCount) {
305
+ return dateMultipleValue.length >= limitMaxCount
306
+ }
307
+ return false
308
+ })
309
+
251
310
  const computeInputReadonly = computed(() => {
252
311
  const { type, editable, multiple } = props
253
312
  const formReadonly = computeFormReadonly.value
@@ -306,9 +365,9 @@ export default defineVxeComponent({
306
365
  return handleValueFormat(type, valueFormat)
307
366
  })
308
367
 
309
- const computeDateInputFormat = computed(() => {
310
- const { type, inputFormat } = props
311
- return handleInputFormat(type, inputFormat)
368
+ const computeDateMaskedFormat = computed(() => {
369
+ const dateLabelFormat = computeDateLabelFormat.value
370
+ return dateLabelFormat
312
371
  })
313
372
 
314
373
  const computeFirstDayOfWeek = computed(() => {
@@ -333,8 +392,14 @@ export default defineVxeComponent({
333
392
  }).join(', ')
334
393
  })
335
394
 
336
- const computeControlOpts = computed(() => {
337
- return Object.assign({}, getConfig().datePicker.controlConfig, props.controlConfig)
395
+ const computeMaskedOpts = computed(() => {
396
+ return Object.assign({}, getConfig().datePicker.maskedConfig, props.maskedConfig)
397
+ })
398
+
399
+ const computeMaskChar = computed(() => {
400
+ const maskedOpts = computeMaskedOpts.value
401
+ const { maskPlaceholder } = maskedOpts
402
+ return (maskPlaceholder ? ('' + maskPlaceholder)[0] : '') || '*'
338
403
  })
339
404
 
340
405
  const updateModelValue = () => {
@@ -350,6 +415,13 @@ export default defineVxeComponent({
350
415
  reactData.inputValue = val
351
416
  }
352
417
 
418
+ const handleInputLabel = (text: string, isUpdate?: boolean) => {
419
+ internalData.inputLabel = text
420
+ if (isUpdate) {
421
+ reactData.labelFlag++
422
+ }
423
+ }
424
+
353
425
  const triggerEvent = (evnt: Event & { type: 'input' | 'change' | 'keydown' | 'keyup' | 'click' | 'focus' | 'blur' }) => {
354
426
  const { inputValue } = reactData
355
427
  dispatchEvent(evnt.type, { value: inputValue }, evnt)
@@ -395,7 +467,7 @@ export default defineVxeComponent({
395
467
  const inputEvent = (evnt: Event & { type: 'input' }) => {
396
468
  const inputElem = evnt.target as HTMLInputElement
397
469
  const value = inputElem.value
398
- reactData.inputLabel = value
470
+ handleInputLabel(value, true)
399
471
  dispatchEvent('input', { value }, evnt)
400
472
  }
401
473
 
@@ -406,18 +478,6 @@ export default defineVxeComponent({
406
478
  }
407
479
  }
408
480
 
409
- const focusEvent = (evnt: Event & { type: 'focus' }) => {
410
- const popupOpts = computePopupOpts.value
411
- const { trigger } = popupOpts
412
- reactData.isActivated = true
413
- if (!trigger || trigger === 'default') {
414
- datePickerOpenEvent(evnt)
415
- } else if (trigger === 'icon') {
416
- hidePanel()
417
- }
418
- triggerEvent(evnt)
419
- }
420
-
421
481
  const clickPrefixEvent = (evnt: Event) => {
422
482
  const isDisabled = computeIsDisabled.value
423
483
  if (!isDisabled) {
@@ -436,6 +496,105 @@ export default defineVxeComponent({
436
496
  })
437
497
  }
438
498
 
499
+ const dateChange = (date: Date, isReload?: boolean) => {
500
+ const { modelValue, multiple } = props
501
+ const isDateTimeType = computeIsDateTimeType.value
502
+ const dateValueFormat = computeDateValueFormat.value
503
+ const firstDayOfWeek = computeFirstDayOfWeek.value
504
+ if (props.type === 'week') {
505
+ const sWeek = XEUtils.toNumber(props.selectDay) as VxeDatePickerPropTypes.SelectDay
506
+ date = XEUtils.getWhatWeek(date, 0, sWeek, firstDayOfWeek)
507
+ }
508
+ const inpVal = XEUtils.toDateString(date, dateValueFormat, { firstDay: firstDayOfWeek })
509
+ if (multiple) {
510
+ const overCount = computeOverCount.value
511
+ // 如果为多选
512
+ if (isDateTimeType) {
513
+ // 如果是datetime特殊类型
514
+ const dateListValue = isReload ? [] : [...computeDateListValue.value]
515
+ const datetimeRest: Date[] = []
516
+ const eqIndex = XEUtils.findIndexOf(dateListValue, val => XEUtils.isDateSame(date, val, 'yyyyMMdd'))
517
+ if (eqIndex === -1) {
518
+ if (overCount) {
519
+ // 如果超出最大多选数量
520
+ return
521
+ }
522
+ dateListValue.push(date)
523
+ } else {
524
+ dateListValue.splice(eqIndex, 1)
525
+ }
526
+ dateListValue.forEach(item => {
527
+ if (item) {
528
+ datetimeRest.push(item)
529
+ }
530
+ })
531
+ handleChange(datetimeRest.map(date => XEUtils.toDateString(date, dateValueFormat)).join(','), { type: 'update' })
532
+ } else {
533
+ const dateMultipleValue = isReload ? [] : computeDateMultipleValue.value
534
+ // 如果是日期类型
535
+ if (dateMultipleValue.some(val => XEUtils.isEqual(val, inpVal))) {
536
+ handleChange(dateMultipleValue.filter(val => !XEUtils.isEqual(val, inpVal)).join(','), { type: 'update' })
537
+ } else {
538
+ if (overCount) {
539
+ // 如果超出最大多选数量
540
+ return
541
+ }
542
+ handleChange(dateMultipleValue.concat([inpVal]).join(','), { type: 'update' })
543
+ }
544
+ }
545
+ } else {
546
+ // 如果为单选
547
+ if (!XEUtils.isEqual(modelValue, inpVal)) {
548
+ handleChange(inpVal, { type: 'update' })
549
+ }
550
+ }
551
+ }
552
+
553
+ const dateRevert = () => {
554
+ const panelLabel = computePanelLabel.value
555
+ handleInputLabel(panelLabel, true)
556
+ }
557
+
558
+ const afterCheckValue = (inpVal: string) => {
559
+ const { type } = props
560
+ const { inputLabel } = internalData
561
+ const dateLabelFormat = computeDateLabelFormat.value
562
+ if (!inpVal) {
563
+ handleChange('', { type: 'check' })
564
+ return
565
+ }
566
+ let inpDateVal: VxeDatePickerPropTypes.ModelValue = parseDateValue(inpVal, type, {
567
+ valueFormat: dateLabelFormat
568
+ })
569
+ if (!XEUtils.isValidDate(inpDateVal)) {
570
+ dateRevert()
571
+ return
572
+ }
573
+ if (type === 'time') {
574
+ inpDateVal = XEUtils.toDateString(inpDateVal, dateLabelFormat)
575
+ if (inputLabel !== inpDateVal) {
576
+ handleChange(inpDateVal, { type: 'check' })
577
+ }
578
+ handleInputLabel(inpDateVal, true)
579
+ return
580
+ }
581
+ let isChange = false
582
+ const firstDayOfWeek = computeFirstDayOfWeek.value
583
+ if (type === 'datetime') {
584
+ const dateValue = reactData.inputValue
585
+ if (inpVal !== XEUtils.toDateString(dateValue, dateLabelFormat) || inpVal !== XEUtils.toDateString(inpDateVal, dateLabelFormat)) {
586
+ isChange = true
587
+ }
588
+ } else {
589
+ isChange = true
590
+ }
591
+ const label = XEUtils.toDateString(inpDateVal, dateLabelFormat, { firstDay: firstDayOfWeek })
592
+ handleInputLabel(label, true)
593
+ if (isChange) {
594
+ dateChange(inpDateVal)
595
+ }
596
+ }
597
+
439
598
  const clearValueEvent = (evnt: Event, value: VxeDatePickerPropTypes.ModelValue) => {
440
599
  const isDatePickerType = computeIsDatePickerType.value
441
600
  if (isDatePickerType) {
@@ -453,29 +612,304 @@ export default defineVxeComponent({
453
612
  }
454
613
  }
455
614
 
456
- const handleArrowInputDate = (evnt: KeyboardEvent, isUpArrow: boolean) => {
615
+ const handleArrowInputDate = (evnt: KeyboardEvent, isUpArrow: boolean, isDwArrow: boolean, isLtArrow: boolean, isRtArrow: boolean) => {
616
+ const { type, multiple } = props
617
+ if (multiple) {
618
+ return
619
+ }
620
+ const targetElem = refInputTarget.value
621
+ if (!targetElem) {
622
+ return
623
+ }
624
+ const inpValue = targetElem.value
625
+ if (!inpValue) {
626
+ return
627
+ }
628
+ const dateMaskedFormat = computeDateMaskedFormat.value
629
+ const dateLabelFormat = computeDateLabelFormat.value
630
+ const firstDayOfWeek = computeFirstDayOfWeek.value
631
+ const maskChar = computeMaskChar.value
632
+ const selectionStart = targetElem.selectionStart || 0
633
+ let selectKey = dateMaskedFormat[selectionStart]
634
+ if (!parseInputKayMaps[selectKey]) {
635
+ selectKey = dateMaskedFormat[selectionStart - 1]
636
+ }
637
+ const skRest = dateMaskedFormat.match(new RegExp(selectKey + '+'))
638
+ if (!skRest) {
639
+ return
640
+ }
641
+ if (isUpArrow || isDwArrow) {
642
+ const chunkFormat = skRest[0] || ''
643
+ const chunkStartIndex = skRest.index || 0
644
+ const chunkEndIndex = chunkStartIndex + chunkFormat.length
645
+ const chunkValue = inpValue.slice(chunkStartIndex, chunkEndIndex)
646
+ if (parseInputKayMaps[selectKey]) {
647
+ const chunkNum = (isAllSameChar(chunkValue, maskChar) ? getChunkDefaultNum(selectKey) : XEUtils.toNumber(chunkValue)) + (isUpArrow ? 1 : -1)
648
+ const restValue = inpValue.slice(0, chunkStartIndex) + XEUtils.padStart(chunkNum, chunkFormat.length, '0') + inpValue.slice(chunkEndIndex)
649
+ evnt.preventDefault()
650
+ if (restValue.indexOf(maskChar) === -1) {
651
+ // 解析日期
652
+ const inpDateVal: VxeDatePickerPropTypes.ModelValue = parseDateValue(restValue, type, {
653
+ valueFormat: dateLabelFormat
654
+ })
655
+ if (XEUtils.isValidDate(inpDateVal)) {
656
+ const label = XEUtils.toDateString(inpDateVal, dateLabelFormat, { firstDay: firstDayOfWeek })
657
+ targetElem.value = label
658
+ handleInputLabel(label, false)
659
+ }
660
+ } else {
661
+ targetElem.value = restValue
662
+ handleInputLabel(restValue, false)
663
+ }
664
+ }
665
+ targetElem.setSelectionRange(chunkStartIndex, chunkEndIndex)
666
+ } else if (isLtArrow || isRtArrow) {
667
+ const currKeyIndex = inputMaskedKeys.indexOf(selectKey)
668
+ if (currKeyIndex > -1) {
669
+ const allMaskedKeys = XEUtils.map(dateMaskedFormat.match(new RegExp(`(${inputMaskedKeys.join('|')})+`, 'g')) || [], fullKey => fullKey[0])
670
+ const currIndex = XEUtils.findIndexOf(allMaskedKeys, key => selectKey === key[0])
671
+ const targetFormatKey = isLtArrow ? (allMaskedKeys[currIndex - 1] || allMaskedKeys[0]) : (allMaskedKeys[currIndex + 1] || allMaskedKeys[allMaskedKeys.length - 1])
672
+
673
+ const targetKey = targetFormatKey ? targetFormatKey[0] : ''
674
+ const sktRest = dateMaskedFormat.match(new RegExp(targetKey + '+'))
675
+ if (sktRest) {
676
+ evnt.preventDefault()
677
+ const mtStartIndex = sktRest.index || 0
678
+ const mtEndIndex = mtStartIndex + sktRest[0].length
679
+ targetElem.setSelectionRange(mtStartIndex, mtEndIndex)
680
+ }
681
+ }
682
+ }
683
+ internalData.isTriggerMasked = true
684
+ }
685
+
686
+ const handleMaskedInputDate = (evnt: KeyboardEvent) => {
457
687
  const { multiple } = props
458
688
  if (multiple) {
459
689
  return
460
690
  }
461
- const { inputValue } = reactData
462
- if (!inputValue) {
691
+ const targetElem = refInputTarget.value
692
+ if (!targetElem) {
693
+ return
694
+ }
695
+ const isControlKey = hasControlKey(evnt)
696
+ if (isControlKey) {
697
+ return
698
+ }
699
+ evnt.preventDefault()
700
+ const eKey = evnt.key
701
+ const isDeleleKey = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.DELETE)
702
+ const isBackspaceKey = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.BACKSPACE)
703
+ const isNumKey = eKey >= '0' && eKey <= '9'
704
+ const numKey = isNumKey ? evnt.key : ''
705
+ if (!(isDeleleKey || isBackspaceKey || isNumKey)) {
706
+ return
707
+ }
708
+ const { isTriggerMasked } = internalData
709
+ const dateMaskedFormat = computeDateMaskedFormat.value
710
+ const maskChar = computeMaskChar.value
711
+ let inpValue = targetElem.value || dateMaskedFormat
712
+ const selectionStart = targetElem.selectionStart || 0
713
+ const selectionEnd = targetElem.selectionEnd || 0
714
+ let selectKey = dateMaskedFormat[selectionStart]
715
+ if (!parseInputKayMaps[selectKey]) {
716
+ selectKey = dateMaskedFormat[selectionStart - 1]
717
+ }
718
+ const skRest = dateMaskedFormat.match(new RegExp(selectKey + '+'))
719
+ if (!skRest) {
720
+ return
721
+ }
722
+ const allMaskedKeys = XEUtils.map(dateMaskedFormat.match(new RegExp(`(${inputMaskedKeys.join('|')})+`, 'g')) || [], fullKey => fullKey[0])
723
+ const chunkFormat = skRest[0] || ''
724
+ const chunkStartIndex = skRest.index || 0
725
+ const chunkEndIndex = chunkStartIndex + chunkFormat.length
726
+ const currKeyIndex = allMaskedKeys.indexOf(selectKey)
727
+ // 全选 | 如果无效字符
728
+ const isAllSelected = !selectionStart && selectionEnd === inpValue.length
729
+ const isNotMasked = inpValue && inpValue.length !== dateMaskedFormat.length
730
+ if (isAllSelected || isNotMasked) {
731
+ inpValue = dateMaskedFormat
732
+ }
733
+ let chunkValue = isDeleleKey ? '' : inpValue.slice(chunkStartIndex, chunkEndIndex)
734
+ const chunkNums = (chunkValue.match(/\d/g) || [])
735
+ const chunkNumList: string[] = isTriggerMasked && !isBackspaceKey ? [] : chunkNums.slice(0)
736
+
737
+ if (isNumKey) {
738
+ chunkNumList.push(numKey)
739
+ } else if (isBackspaceKey) {
740
+ chunkNumList.pop()
741
+ }
742
+ chunkValue = chunkNumList.join('').padEnd(chunkFormat.length, maskChar)
743
+ let restValue = inpValue.slice(0, chunkStartIndex) + chunkValue + inpValue.slice(chunkEndIndex)
744
+ restValue = restValue.replace(new RegExp(`(${inputMaskedKeys.join('|')})`, 'g'), maskChar)
745
+
746
+ targetElem.value = restValue
747
+ handleInputLabel(restValue, false)
748
+
749
+ // 如果是全选/删除
750
+ if (isAllSelected) {
751
+ if (isBackspaceKey || isDeleleKey) {
752
+ const firstMaskedKeys = allMaskedKeys[0]
753
+ const firstSkRest = dateMaskedFormat.match(new RegExp(`${firstMaskedKeys}+`))
754
+ if (firstSkRest) {
755
+ const firstChunkFormat = firstSkRest[0]
756
+ targetElem.setSelectionRange(0, firstChunkFormat.length)
757
+ internalData.isTriggerMasked = true
758
+ return
759
+ }
760
+ }
761
+ } else {
762
+ if (isBackspaceKey && !chunkNums.length) {
763
+ // 回退到上一个数字块
764
+ for (let i = currKeyIndex - 1; i >= 0; i--) {
765
+ const prveChunkKey = allMaskedKeys[i]
766
+ const prveSkRest = dateMaskedFormat.match(new RegExp(`${prveChunkKey}+`))
767
+ if (prveSkRest) {
768
+ const prveChunkFormat = prveSkRest[0]
769
+ const prveChunkStartIndex = prveSkRest.index || 0
770
+ const prveChunkEndIndex = prveChunkStartIndex + prveChunkFormat.length
771
+ let prveChunkValue = restValue.slice(prveChunkStartIndex, prveChunkEndIndex)
772
+ const prveChunkNums = (prveChunkValue.match(/\d/g) || [])
773
+ if (prveChunkNums.length) {
774
+ prveChunkNums.pop()
775
+ prveChunkValue = prveChunkNums.join('').padEnd(prveChunkFormat.length, maskChar)
776
+ restValue = restValue.slice(0, prveChunkStartIndex) + prveChunkValue + restValue.slice(prveChunkEndIndex)
777
+
778
+ targetElem.value = restValue
779
+ handleInputLabel(restValue, false)
780
+ targetElem.setSelectionRange(prveChunkStartIndex, prveChunkEndIndex)
781
+ return
782
+ }
783
+ }
784
+ }
785
+ const firstMaskedKeys = allMaskedKeys[0]
786
+ const firstSkRest = dateMaskedFormat.match(new RegExp(`${firstMaskedKeys}+`))
787
+ if (firstSkRest) {
788
+ const firstChunkFormat = firstSkRest[0]
789
+ restValue = dateMaskedFormat.replace(new RegExp(`(${inputMaskedKeys.join('|')})`, 'g'), maskChar)
790
+ targetElem.value = restValue
791
+ handleInputLabel(restValue, false)
792
+ targetElem.setSelectionRange(0, firstChunkFormat.length)
793
+ internalData.isTriggerMasked = true
794
+ return
795
+ }
796
+ return
797
+ }
798
+ }
799
+
800
+ let maskStartIndex = skRest.index || 0
801
+ let maskEndIndex = maskStartIndex + skRest[0].length
802
+ // 如果输入完成,跳转下一个
803
+ if (chunkNumList.length >= chunkValue.length) {
804
+ const nextKeys = allMaskedKeys.slice(currKeyIndex + 1)
805
+ if (currKeyIndex > -1) {
806
+ const nextRest = nextKeys.length ? dateMaskedFormat.match(new RegExp(`(${nextKeys.join('|')})+`)) : null
807
+ // 如果当前数字块已输入,则跳转下一个数字块
808
+ if (nextRest) {
809
+ maskStartIndex = nextRest.index || 0
810
+ maskEndIndex = maskStartIndex + nextRest[0].length
811
+ targetElem.setSelectionRange(maskStartIndex, maskEndIndex)
812
+ } else {
813
+ targetElem.setSelectionRange(maskStartIndex, maskEndIndex)
814
+ }
815
+ }
816
+ internalData.isTriggerMasked = true
817
+ return
818
+ }
819
+ targetElem.setSelectionRange(maskStartIndex, maskEndIndex)
820
+ internalData.isTriggerMasked = false
821
+ }
822
+
823
+ const handleMaskedSelectedDate = (evnt: Event, isFocus?: boolean) => {
824
+ const { type, multiple, modelValue } = props
825
+ if (multiple) {
826
+ return
827
+ }
828
+ if (!maskedTypes.includes(type)) {
463
829
  return
464
830
  }
465
831
  const targetElem = refInputTarget.value
466
832
  if (!targetElem) {
467
833
  return
468
834
  }
469
- const { parseInputKayMaps } = internalData
470
- const inputFormat = computeDateInputFormat.value
835
+ const { laseFocusMasked } = internalData
836
+ if (laseFocusMasked && Date.now() - laseFocusMasked < 100) {
837
+ return
838
+ }
839
+ const dateMaskedFormat = computeDateMaskedFormat.value
840
+ const maskChar = computeMaskChar.value
471
841
  const selectionStart = targetElem.selectionStart || 0
472
- let selectKey = inputFormat[selectionStart]
842
+ const selectionEnd = targetElem.selectionEnd || 0
843
+ const inpValue = targetElem.value
844
+ const allMaskedKeys = XEUtils.map(dateMaskedFormat.match(new RegExp(`(${inputMaskedKeys.join('|')})+`, 'g')) || [], fullKey => fullKey[0])
845
+
846
+ // 如果为空
847
+ if (!inpValue) {
848
+ let restValue = dateMaskedFormat.replace(new RegExp(`(${inputMaskedKeys.join('|')})`, 'g'), maskChar)
849
+
850
+ // 还原值
851
+ if (isFocus && modelValue) {
852
+ const chunkNums = (('' + XEUtils.toNumber(modelValue)).match(/\d/g) || [])
853
+ let useNumIndex = 0
854
+ restValue = dateMaskedFormat.replace(new RegExp(`(${inputMaskedKeys.join('|')})`, 'g'), (txt) => chunkNums[useNumIndex++] || txt)
855
+ }
856
+
857
+ const firstMaskedKeys = allMaskedKeys[0]
858
+ const firstSkRest = dateMaskedFormat.match(new RegExp(`${firstMaskedKeys}+`))
859
+ if (firstSkRest) {
860
+ evnt.preventDefault()
861
+ const firstChunkFormat = firstSkRest[0]
862
+ targetElem.value = restValue
863
+ handleInputLabel(restValue, false)
864
+ targetElem.setSelectionRange(0, firstChunkFormat.length)
865
+ internalData.laseFocusMasked = Date.now()
866
+ return
867
+ }
868
+ }
869
+
870
+ // 全选 | 如果无效字符
871
+ const isAllSelected = !selectionStart && selectionEnd === inpValue.length
872
+ const isNotMasked = inpValue && inpValue.length !== dateMaskedFormat.length
873
+ if (isAllSelected || isNotMasked) {
874
+ let restValue = ''
875
+ // 还原值
876
+ if (isNotMasked && inpValue) {
877
+ const chunkNums = inpValue.match(/\d/g) || []
878
+ let useNumIndex = 0
879
+ restValue = dateMaskedFormat.replace(new RegExp(`(${inputMaskedKeys.join('|')})`, 'g'), () => chunkNums[useNumIndex++] || maskChar)
880
+ } else {
881
+ dateMaskedFormat.replace(new RegExp(`(${inputMaskedKeys.join('|')})`, 'g'), maskChar)
882
+ }
883
+
884
+ const firstMaskedKeys = allMaskedKeys[0]
885
+ const firstSkRest = dateMaskedFormat.match(new RegExp(`${firstMaskedKeys}+`))
886
+ if (firstSkRest) {
887
+ evnt.preventDefault()
888
+ const firstChunkFormat = firstSkRest[0]
889
+ targetElem.value = restValue
890
+ handleInputLabel(restValue, false)
891
+ targetElem.setSelectionRange(0, firstChunkFormat.length)
892
+ internalData.laseFocusMasked = Date.now()
893
+ return
894
+ }
895
+ }
896
+
897
+ // 是否选择数字块
898
+ let selectKey = dateMaskedFormat[selectionStart]
473
899
  if (!parseInputKayMaps[selectKey]) {
474
- selectKey = inputFormat[selectionStart - 1]
900
+ selectKey = dateMaskedFormat[selectionStart - 1]
475
901
  }
476
- const inputPaesrFn = parseInputKayMaps[selectKey]
477
- if (inputPaesrFn) {
478
- inputPaesrFn(evnt, targetElem, isUpArrow)
902
+ if (selectKey) {
903
+ evnt.preventDefault()
904
+ const skRest = dateMaskedFormat.match(new RegExp(selectKey + '+'))
905
+ if (skRest) {
906
+ const chunkFormat = skRest[0] || ''
907
+ const chunkStartIndex = skRest.index || 0
908
+ const chunkEndIndex = chunkStartIndex + chunkFormat.length
909
+ targetElem.setSelectionRange(chunkStartIndex, chunkEndIndex)
910
+ internalData.isTriggerMasked = true
911
+ internalData.laseFocusMasked = Date.now()
912
+ }
479
913
  }
480
914
  }
481
915
 
@@ -488,10 +922,13 @@ export default defineVxeComponent({
488
922
  handleChange(value, evnt)
489
923
  }
490
924
  if (!reactData.visiblePanel) {
925
+ const { inputLabel } = internalData
491
926
  reactData.isActivated = false
492
927
  // 未打开面板时才校验
493
928
  if ($datePanel) {
494
- $datePanel.checkValue(reactData.inputLabel)
929
+ $datePanel.checkValue(inputLabel)
930
+ } else {
931
+ afterCheckValue(inputLabel)
495
932
  }
496
933
  }
497
934
  dispatchEvent('blur', { value }, evnt)
@@ -501,13 +938,77 @@ export default defineVxeComponent({
501
938
  }
502
939
  }
503
940
 
941
+ const focusEvent = (evnt: KeyboardEvent & { type: 'focus' }) => {
942
+ const { multiple, editable, maskedConfig } = props
943
+ const maskedOpts = computeMaskedOpts.value
944
+ const popupOpts = computePopupOpts.value
945
+ const { trigger } = popupOpts
946
+ reactData.isActivated = true
947
+ if (!trigger || trigger === 'default') {
948
+ datePickerOpenEvent(evnt)
949
+ setTimeout(() => {
950
+ if (editable && !multiple && (isEnableConf(maskedConfig) || maskedOpts.enabled)) {
951
+ handleMaskedSelectedDate(evnt, true)
952
+ }
953
+ }, 15)
954
+ } else if (trigger === 'icon') {
955
+ hidePanel()
956
+ setTimeout(() => {
957
+ if (editable && !multiple && (isEnableConf(maskedConfig) || maskedOpts.enabled)) {
958
+ handleMaskedSelectedDate(evnt, true)
959
+ }
960
+ }, 15)
961
+ } else {
962
+ if (editable && !multiple && (isEnableConf(maskedConfig) || maskedOpts.enabled)) {
963
+ handleMaskedSelectedDate(evnt, true)
964
+ }
965
+ }
966
+ triggerEvent(evnt)
967
+ }
968
+
969
+ const clickEvent = (evnt: MouseEvent & { type: 'click' }) => {
970
+ const { editable, maskedConfig } = props
971
+ const maskedOpts = computeMaskedOpts.value
972
+ if (editable && (isEnableConf(maskedConfig) || maskedOpts.enabled)) {
973
+ handleMaskedSelectedDate(evnt)
974
+ }
975
+ triggerEvent(evnt)
976
+ }
977
+
504
978
  const keydownEvent = (evnt: KeyboardEvent & { type: 'keydown' }) => {
505
- const { controlConfig } = props
506
- const controlOpts = computeControlOpts.value
979
+ const { type, editable, maskedConfig } = props
980
+ const { visiblePanel } = reactData
981
+ const maskedOpts = computeMaskedOpts.value
507
982
  const isUpArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_UP)
508
983
  const isDwArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_DOWN)
509
- if ((isUpArrow || isDwArrow) && controlOpts.isArrow && (controlConfig || controlOpts.enabled)) {
510
- handleArrowInputDate(evnt, isUpArrow)
984
+ const isLtArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_LEFT)
985
+ const isRtArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_RIGHT)
986
+ const isEnter = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ENTER)
987
+ if (editable) {
988
+ if (isEnter) {
989
+ const $datePanel = refDatePanel.value
990
+ const { inputLabel } = internalData
991
+ const targetElem = refInputTarget.value
992
+ if (visiblePanel) {
993
+ hidePanel()
994
+ }
995
+ if ($datePanel) {
996
+ $datePanel.checkValue(inputLabel)
997
+ } else {
998
+ afterCheckValue(inputLabel)
999
+ }
1000
+ if (targetElem) {
1001
+ targetElem.blur()
1002
+ }
1003
+ } else if (maskedTypes.includes(type)) {
1004
+ if (isEnableConf(maskedConfig) || maskedOpts.enabled) {
1005
+ if (maskedOpts.isArrow && (isUpArrow || isDwArrow || isLtArrow || isRtArrow)) {
1006
+ handleArrowInputDate(evnt, isUpArrow, isDwArrow, isLtArrow, isRtArrow)
1007
+ } else if (maskedOpts.isMasked) {
1008
+ handleMaskedInputDate(evnt)
1009
+ }
1010
+ }
1011
+ }
511
1012
  }
512
1013
  triggerEvent(evnt)
513
1014
  }
@@ -541,7 +1042,7 @@ export default defineVxeComponent({
541
1042
  }
542
1043
 
543
1044
  const panelRevertEvent = (params: VxeDatePanelDefines.RevertEventParams) => {
544
- reactData.inputLabel = params.label
1045
+ handleInputLabel(params.label, true)
545
1046
  }
546
1047
 
547
1048
  // 全局事件
@@ -552,12 +1053,18 @@ export default defineVxeComponent({
552
1053
  const panelWrapperElem = refPanelWrapper.value
553
1054
  const isDisabled = computeIsDisabled.value
554
1055
  if (!isDisabled && isActivated) {
555
- reactData.isActivated = getEventTargetNode(evnt, el).flag || getEventTargetNode(evnt, panelWrapperElem).flag
556
- if (!reactData.isActivated) {
1056
+ const currActivated = getEventTargetNode(evnt, el).flag || getEventTargetNode(evnt, panelWrapperElem).flag
1057
+ if (currActivated !== isActivated) {
1058
+ reactData.isActivated = currActivated
1059
+ }
1060
+ if (!currActivated) {
557
1061
  if (visiblePanel) {
558
1062
  hidePanel()
1063
+ const { inputLabel } = internalData
559
1064
  if ($datePanel) {
560
- $datePanel.checkValue(reactData.inputLabel)
1065
+ $datePanel.checkValue(inputLabel)
1066
+ } else {
1067
+ afterCheckValue(inputLabel)
561
1068
  }
562
1069
  }
563
1070
  }
@@ -565,13 +1072,15 @@ export default defineVxeComponent({
565
1072
  }
566
1073
 
567
1074
  const handleGlobalKeydownEvent = (evnt: KeyboardEvent) => {
568
- const { visiblePanel } = reactData
1075
+ const { isActivated, visiblePanel } = reactData
569
1076
  const isDisabled = computeIsDisabled.value
570
1077
  if (!isDisabled) {
571
1078
  const isTab = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.TAB)
572
1079
  const isEsc = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ESCAPE)
573
1080
  if (isTab) {
574
- reactData.isActivated = false
1081
+ if (isActivated) {
1082
+ reactData.isActivated = false
1083
+ }
575
1084
  }
576
1085
  if (visiblePanel) {
577
1086
  if (isEsc || isTab) {
@@ -607,7 +1116,7 @@ export default defineVxeComponent({
607
1116
  }
608
1117
  if (visiblePanel || isActivated) {
609
1118
  if ($datePanel) {
610
- $datePanel.checkValue(reactData.inputLabel)
1119
+ $datePanel.checkValue(internalData.inputLabel)
611
1120
  }
612
1121
  const targetElem = refInputTarget.value
613
1122
  if (targetElem) {
@@ -704,10 +1213,6 @@ export default defineVxeComponent({
704
1213
  }
705
1214
  }
706
1215
 
707
- const clickEvent = (evnt: Event & { type: 'click' }) => {
708
- triggerEvent(evnt)
709
- }
710
-
711
1216
  const handleShortcutEvent: VxeButtonGroupEvents.Click = ({ option, $event }) => {
712
1217
  const { type } = props
713
1218
  const { inputValue } = reactData
@@ -745,7 +1250,7 @@ export default defineVxeComponent({
745
1250
  break
746
1251
  }
747
1252
  default:
748
- errLog('vxe.error.notCommands', [`[date-picker] ${code}`])
1253
+ errLog('vxe.error.notCommands', [code])
749
1254
  break
750
1255
  }
751
1256
  }
@@ -1039,7 +1544,8 @@ export default defineVxeComponent({
1039
1544
 
1040
1545
  const renderVN = () => {
1041
1546
  const { className, type, name, autoComplete } = props
1042
- const { inputValue, inputLabel, visiblePanel, isActivated } = reactData
1547
+ const { inputValue, visiblePanel, isActivated, labelFlag } = reactData
1548
+ const { inputLabel } = internalData
1043
1549
  const vSize = computeSize.value
1044
1550
  const isDisabled = computeIsDisabled.value
1045
1551
  const formReadonly = computeFormReadonly.value
@@ -1075,7 +1581,7 @@ export default defineVxeComponent({
1075
1581
  h('input', {
1076
1582
  ref: refInputTarget,
1077
1583
  class: 'vxe-date-picker--inner',
1078
- value: inputLabel,
1584
+ value: labelFlag ? inputLabel : '',
1079
1585
  name,
1080
1586
  type: 'text',
1081
1587
  placeholder: inpPlaceholder,
@@ -1098,7 +1604,7 @@ export default defineVxeComponent({
1098
1604
  }
1099
1605
 
1100
1606
  watch(computePanelLabel, (val) => {
1101
- reactData.inputLabel = val
1607
+ handleInputLabel(val, true)
1102
1608
  })
1103
1609
 
1104
1610
  watch(() => props.modelValue, () => {
@@ -1114,13 +1620,15 @@ export default defineVxeComponent({
1114
1620
  })
1115
1621
 
1116
1622
  onMounted(() => {
1117
- const { parseInputKayMaps } = internalData
1118
- const inputKeys = ['y', 'M', 'd', 'H', 'm', 'n']
1119
- inputKeys.forEach(key => {
1120
- parseInputKayMaps[key] = (evnt: KeyboardEvent) => {
1121
- evnt.preventDefault()
1623
+ const { type, multiple, maskedConfig } = props
1624
+ if (isEnableConf(maskedConfig)) {
1625
+ if (multiple) {
1626
+ errLog('vxe.error.notSupportProp', ['multiple', 'control-config.enabled=true', 'control-config.enabled=false'])
1122
1627
  }
1123
- })
1628
+ if (!maskedTypes.includes(type)) {
1629
+ warnLog('vxe.error.notSupportProp', ['control-config.enabled=true', `type=${type}`, `type=${maskedTypes.join('|')}`])
1630
+ }
1631
+ }
1124
1632
  })
1125
1633
 
1126
1634
  onUnmounted(() => {