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.
- package/es/backtop/src/backtop.js +8 -7
- package/es/button/src/button.js +3 -2
- package/es/calendar/src/calendar.js +2 -1
- package/es/cascader/src/cascader.js +75 -35
- package/es/checkbox/src/group.js +16 -7
- package/es/context-menu/src/context-menu.js +2 -6
- package/es/date-panel/src/util.js +27 -16
- package/es/date-picker/src/date-picker.js +616 -88
- package/es/date-range-picker/src/date-range-picker.js +7 -4
- package/es/drawer/src/drawer.js +3 -0
- package/es/form/render/index.js +3 -2
- package/es/form/src/form.js +11 -12
- package/es/form/src/itemInfo.js +6 -5
- package/es/image/src/image.js +5 -6
- package/es/input/src/input.js +2 -1
- package/es/layout-body/src/layout-body.js +13 -6
- package/es/list/src/list.js +3 -6
- package/es/menu/src/menu.js +2 -1
- package/es/modal/src/modal.js +5 -1
- package/es/pager/src/pager.js +4 -3
- package/es/radio/src/group.js +11 -8
- package/es/select/src/select.js +34 -30
- package/es/splitter/src/splitter.js +6 -5
- package/es/table-select/src/table-select.js +27 -22
- package/es/tabs/src/tabs.js +4 -3
- package/es/textarea/src/textarea.js +2 -1
- package/es/tree/src/tree.js +6 -11
- package/es/tree-select/src/tree-select.js +27 -33
- package/es/ui/index.js +4 -1
- package/es/ui/src/log.js +14 -4
- package/es/upload/src/upload.js +11 -9
- package/lib/backtop/src/backtop.js +10 -6
- package/lib/backtop/src/backtop.min.js +1 -1
- package/lib/button/src/button.js +3 -1
- package/lib/button/src/button.min.js +1 -1
- package/lib/calendar/src/calendar.js +3 -1
- package/lib/calendar/src/calendar.min.js +1 -1
- package/lib/cascader/src/cascader.js +87 -34
- package/lib/cascader/src/cascader.min.js +1 -1
- package/lib/checkbox/src/group.js +18 -6
- package/lib/checkbox/src/group.min.js +1 -1
- package/lib/context-menu/src/context-menu.js +3 -4
- package/lib/context-menu/src/context-menu.min.js +1 -1
- package/lib/date-panel/src/util.js +37 -18
- package/lib/date-panel/src/util.min.js +1 -1
- package/lib/date-picker/src/date-picker.js +659 -86
- package/lib/date-picker/src/date-picker.min.js +1 -1
- package/lib/date-range-picker/src/date-range-picker.js +7 -3
- package/lib/date-range-picker/src/date-range-picker.min.js +1 -1
- package/lib/drawer/src/drawer.js +3 -0
- package/lib/drawer/src/drawer.min.js +1 -1
- package/lib/form/render/index.js +3 -1
- package/lib/form/render/index.min.js +1 -1
- package/lib/form/src/form.js +12 -8
- package/lib/form/src/form.min.js +1 -1
- package/lib/form/src/itemInfo.js +6 -4
- package/lib/form/src/itemInfo.min.js +1 -1
- package/lib/image/src/image.js +7 -5
- package/lib/image/src/image.min.js +1 -1
- package/lib/index.umd.js +1140 -287
- package/lib/index.umd.min.js +1 -1
- package/lib/input/src/input.js +5 -3
- package/lib/input/src/input.min.js +1 -1
- package/lib/layout-body/src/layout-body.js +13 -4
- package/lib/layout-body/src/layout-body.min.js +1 -1
- package/lib/list/src/list.js +4 -5
- package/lib/list/src/list.min.js +1 -1
- package/lib/menu/src/menu.js +3 -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 +5 -2
- package/lib/pager/src/pager.min.js +1 -1
- package/lib/radio/src/group.js +13 -6
- package/lib/radio/src/group.min.js +1 -1
- package/lib/select/src/select.js +36 -29
- package/lib/select/src/select.min.js +1 -1
- package/lib/splitter/src/splitter.js +9 -6
- package/lib/splitter/src/splitter.min.js +1 -1
- package/lib/table-select/src/table-select.js +27 -19
- package/lib/table-select/src/table-select.min.js +1 -1
- package/lib/tabs/src/tabs.js +6 -3
- package/lib/tabs/src/tabs.min.js +1 -1
- package/lib/textarea/src/textarea.js +3 -1
- package/lib/textarea/src/textarea.min.js +1 -1
- package/lib/tree/src/tree.js +9 -8
- package/lib/tree/src/tree.min.js +1 -1
- package/lib/tree-select/src/tree-select.js +17 -15
- package/lib/tree-select/src/tree-select.min.js +1 -1
- package/lib/ui/index.js +4 -1
- package/lib/ui/index.min.js +1 -1
- package/lib/ui/src/log.js +14 -3
- package/lib/ui/src/log.min.js +1 -1
- package/lib/upload/src/upload.js +22 -7
- package/lib/upload/src/upload.min.js +1 -1
- package/package.json +1 -1
- package/packages/backtop/src/backtop.ts +11 -3
- package/packages/button/src/button.ts +4 -2
- package/packages/calendar/src/calendar.ts +3 -1
- package/packages/cascader/src/cascader.ts +77 -32
- package/packages/checkbox/src/group.ts +22 -5
- package/packages/context-menu/src/context-menu.ts +5 -2
- package/packages/date-panel/src/util.ts +28 -16
- package/packages/date-picker/src/date-picker.ts +630 -89
- package/packages/date-range-picker/src/date-range-picker.ts +8 -4
- package/packages/drawer/src/drawer.ts +3 -0
- package/packages/form/render/index.ts +4 -2
- package/packages/form/src/form.ts +14 -7
- package/packages/form/src/itemInfo.ts +7 -5
- package/packages/image/src/image.ts +9 -3
- package/packages/input/src/input.ts +3 -1
- package/packages/layout-body/src/layout-body.ts +16 -2
- package/packages/list/src/list.ts +6 -3
- package/packages/menu/src/menu.ts +3 -1
- package/packages/modal/src/modal.ts +6 -1
- package/packages/pager/src/pager.ts +5 -3
- package/packages/radio/src/group.ts +16 -5
- package/packages/select/src/select.ts +41 -29
- package/packages/splitter/src/splitter.ts +7 -5
- package/packages/table-select/src/table-select.ts +31 -20
- package/packages/tabs/src/tabs.ts +5 -3
- package/packages/textarea/src/textarea.ts +3 -1
- package/packages/tree/src/tree.ts +9 -4
- package/packages/tree-select/src/tree-select.ts +31 -30
- package/packages/ui/index.ts +3 -0
- package/packages/ui/src/log.ts +16 -4
- package/packages/upload/src/upload.ts +16 -6
- package/types/components/cascader.d.ts +4 -0
- 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.1781753586592.ttf → iconfont.1781876590487.ttf} +0 -0
- /package/es/icon/{iconfont.1781753586592.woff → iconfont.1781876590487.woff} +0 -0
- /package/es/icon/{iconfont.1781753586592.woff2 → iconfont.1781876590487.woff2} +0 -0
- /package/es/{iconfont.1781753586592.ttf → iconfont.1781876590487.ttf} +0 -0
- /package/es/{iconfont.1781753586592.woff → iconfont.1781876590487.woff} +0 -0
- /package/es/{iconfont.1781753586592.woff2 → iconfont.1781876590487.woff2} +0 -0
- /package/lib/icon/style/{iconfont.1781753586592.ttf → iconfont.1781876590487.ttf} +0 -0
- /package/lib/icon/style/{iconfont.1781753586592.woff → iconfont.1781876590487.woff} +0 -0
- /package/lib/icon/style/{iconfont.1781753586592.woff2 → iconfont.1781876590487.woff2} +0 -0
- /package/lib/{iconfont.1781753586592.ttf → iconfont.1781876590487.ttf} +0 -0
- /package/lib/{iconfont.1781753586592.woff → iconfont.1781876590487.woff} +0 -0
- /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,
|
|
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, 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
|
-
|
|
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
|
-
|
|
409
|
+
computeDateMaskedFormat () {
|
|
343
410
|
const $xeDatePicker = this
|
|
344
|
-
const props = $xeDatePicker
|
|
345
411
|
|
|
346
|
-
const
|
|
347
|
-
return
|
|
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
|
-
|
|
442
|
+
computeMaskedOpts () {
|
|
377
443
|
const $xeDatePicker = this
|
|
378
444
|
const props = $xeDatePicker
|
|
379
445
|
|
|
380
|
-
return Object.assign({}, getConfig().datePicker.
|
|
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
|
-
|
|
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
|
|
552
|
-
if (!
|
|
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 {
|
|
560
|
-
|
|
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
|
-
|
|
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 =
|
|
1009
|
+
selectKey = dateMaskedFormat[selectionStart - 1]
|
|
565
1010
|
}
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
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(
|
|
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 {
|
|
602
|
-
const
|
|
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
|
-
|
|
606
|
-
|
|
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
|
-
|
|
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
|
-
|
|
661
|
-
if (
|
|
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(
|
|
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(
|
|
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
|
|
1326
|
+
if (!reactData.initialized) {
|
|
792
1327
|
reactData.initialized = true
|
|
793
|
-
|
|
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', [
|
|
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,
|
|
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
|
-
|
|
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
|
|
1830
|
+
const props = $xeDatePicker
|
|
1298
1831
|
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
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)
|