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