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.
- package/dist/all.esm.js +774 -211
- package/es/backtop/src/backtop.js +2 -1
- package/es/button/src/button.js +3 -2
- package/es/calendar/src/calendar.js +2 -1
- package/es/cascader/src/cascader.js +2 -1
- package/es/checkbox/src/group.js +5 -1
- package/es/date-panel/src/util.js +27 -16
- package/es/date-picker/src/date-picker.js +572 -74
- package/es/date-range-picker/src/date-range-picker.js +3 -2
- package/es/drawer/src/drawer.js +2 -0
- package/es/form/render/index.js +3 -2
- package/es/form/src/form.js +6 -5
- package/es/form/src/itemInfo.js +6 -5
- package/es/input/src/input.js +2 -1
- package/es/menu/src/menu.js +2 -1
- package/es/modal/src/modal.js +5 -2
- package/es/pager/src/pager.js +4 -3
- package/es/radio/src/group.js +5 -1
- package/es/select/src/select.js +25 -20
- package/es/splitter/src/splitter.js +7 -6
- package/es/table-select/src/table-select.js +21 -16
- package/es/tabs/src/tabs.js +4 -3
- package/es/textarea/src/textarea.js +2 -1
- package/es/tree/src/tree.js +3 -2
- package/es/tree-select/src/tree-select.js +2 -1
- package/es/ui/index.js +1 -1
- package/es/ui/src/log.js +7 -1
- package/es/upload/src/upload.js +12 -3
- package/lib/backtop/src/backtop.js +5 -2
- package/lib/backtop/src/backtop.min.js +1 -1
- package/lib/button/src/button.js +4 -1
- package/lib/button/src/button.min.js +1 -1
- package/lib/calendar/src/calendar.js +4 -1
- package/lib/calendar/src/calendar.min.js +1 -1
- package/lib/cascader/src/cascader.js +4 -1
- package/lib/cascader/src/cascader.min.js +1 -1
- package/lib/checkbox/src/group.js +5 -1
- package/lib/checkbox/src/group.min.js +1 -1
- package/lib/date-panel/src/util.js +37 -19
- package/lib/date-panel/src/util.min.js +1 -1
- package/lib/date-picker/src/date-picker.js +620 -77
- package/lib/date-picker/src/date-picker.min.js +1 -1
- package/lib/date-range-picker/src/date-range-picker.js +4 -1
- package/lib/date-range-picker/src/date-range-picker.min.js +1 -1
- package/lib/drawer/src/drawer.js +2 -0
- package/lib/drawer/src/drawer.min.js +1 -1
- package/lib/form/render/index.js +4 -1
- package/lib/form/render/index.min.js +1 -1
- package/lib/form/src/form.js +8 -4
- package/lib/form/src/form.min.js +1 -1
- package/lib/form/src/itemInfo.js +7 -4
- package/lib/form/src/itemInfo.min.js +1 -1
- package/lib/index.umd.js +847 -177
- package/lib/index.umd.min.js +1 -1
- package/lib/input/src/input.js +6 -3
- package/lib/input/src/input.min.js +1 -1
- package/lib/menu/src/menu.js +4 -1
- package/lib/menu/src/menu.min.js +1 -1
- package/lib/modal/src/modal.js +8 -2
- package/lib/modal/src/modal.min.js +1 -1
- package/lib/pager/src/pager.js +6 -2
- package/lib/pager/src/pager.min.js +1 -1
- package/lib/radio/src/group.js +5 -1
- package/lib/radio/src/group.min.js +1 -1
- package/lib/select/src/select.js +27 -20
- package/lib/select/src/select.min.js +1 -1
- package/lib/splitter/src/splitter.js +12 -8
- package/lib/splitter/src/splitter.min.js +1 -1
- package/lib/table-select/src/table-select.js +22 -15
- package/lib/table-select/src/table-select.min.js +1 -1
- package/lib/tabs/src/tabs.js +7 -3
- package/lib/tabs/src/tabs.min.js +1 -1
- package/lib/textarea/src/textarea.js +4 -1
- package/lib/textarea/src/textarea.min.js +1 -1
- package/lib/tree/src/tree.js +7 -4
- package/lib/tree/src/tree.min.js +1 -1
- package/lib/tree-select/src/tree-select.js +7 -3
- package/lib/tree-select/src/tree-select.min.js +1 -1
- package/lib/ui/index.js +1 -1
- package/lib/ui/index.min.js +1 -1
- package/lib/ui/src/log.js +8 -1
- package/lib/ui/src/log.min.js +1 -1
- package/lib/upload/src/upload.js +20 -3
- package/lib/upload/src/upload.min.js +1 -1
- package/package.json +1 -1
- package/packages/backtop/src/backtop.ts +3 -1
- package/packages/button/src/button.ts +4 -2
- package/packages/calendar/src/calendar.ts +3 -1
- package/packages/cascader/src/cascader.ts +3 -1
- package/packages/checkbox/src/group.ts +6 -2
- package/packages/date-panel/src/util.ts +28 -16
- package/packages/date-picker/src/date-picker.ts +583 -75
- package/packages/date-range-picker/src/date-range-picker.ts +4 -2
- package/packages/drawer/src/drawer.ts +2 -0
- package/packages/form/render/index.ts +4 -2
- package/packages/form/src/form.ts +7 -5
- package/packages/form/src/itemInfo.ts +7 -5
- package/packages/input/src/input.ts +3 -1
- package/packages/menu/src/menu.ts +3 -1
- package/packages/modal/src/modal.ts +6 -2
- package/packages/pager/src/pager.ts +5 -3
- package/packages/radio/src/group.ts +6 -2
- package/packages/select/src/select.ts +29 -22
- package/packages/splitter/src/splitter.ts +8 -6
- package/packages/table-select/src/table-select.ts +24 -17
- package/packages/tabs/src/tabs.ts +5 -3
- package/packages/textarea/src/textarea.ts +3 -1
- package/packages/tree/src/tree.ts +4 -2
- package/packages/tree-select/src/tree-select.ts +3 -1
- package/packages/ui/src/log.ts +7 -0
- package/packages/upload/src/upload.ts +14 -3
- package/types/components/date-picker.d.ts +14 -6
- package/types/components/drawer.d.ts +2 -0
- package/types/components/modal.d.ts +2 -0
- package/types/components/upload.d.ts +28 -1
- /package/es/icon/{iconfont.1781753592499.ttf → iconfont.1781852740683.ttf} +0 -0
- /package/es/icon/{iconfont.1781753592499.woff → iconfont.1781852740683.woff} +0 -0
- /package/es/icon/{iconfont.1781753592499.woff2 → iconfont.1781852740683.woff2} +0 -0
- /package/es/{iconfont.1781753592499.ttf → iconfont.1781852740683.ttf} +0 -0
- /package/es/{iconfont.1781753592499.woff → iconfont.1781852740683.woff} +0 -0
- /package/es/{iconfont.1781753592499.woff2 → iconfont.1781852740683.woff2} +0 -0
- /package/lib/icon/style/{iconfont.1781753592499.ttf → iconfont.1781852740683.ttf} +0 -0
- /package/lib/icon/style/{iconfont.1781753592499.woff → iconfont.1781852740683.woff} +0 -0
- /package/lib/icon/style/{iconfont.1781753592499.woff2 → iconfont.1781852740683.woff2} +0 -0
- /package/lib/{iconfont.1781753592499.ttf → iconfont.1781852740683.ttf} +0 -0
- /package/lib/{iconfont.1781753592499.woff → iconfont.1781852740683.woff} +0 -0
- /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,
|
|
9
|
-
import {
|
|
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
|
-
|
|
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
|
|
160
|
-
|
|
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
|
|
310
|
-
const
|
|
311
|
-
return
|
|
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
|
|
337
|
-
return Object.assign({}, getConfig().datePicker.
|
|
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
|
-
|
|
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
|
|
462
|
-
if (!
|
|
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 {
|
|
470
|
-
|
|
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
|
-
|
|
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 =
|
|
900
|
+
selectKey = dateMaskedFormat[selectionStart - 1]
|
|
475
901
|
}
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
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(
|
|
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 {
|
|
506
|
-
const
|
|
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
|
-
|
|
510
|
-
|
|
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
|
-
|
|
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
|
-
|
|
556
|
-
if (
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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', [
|
|
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,
|
|
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
|
-
|
|
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 {
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
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(() => {
|