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
|
@@ -2,13 +2,40 @@ import { defineVxeComponent } from '../../ui/src/comp';
|
|
|
2
2
|
import XEUtils from 'xe-utils';
|
|
3
3
|
import { getConfig, getIcon, getI18n, commands, createEvent, globalEvents, GLOBAL_EVENT_KEYS, globalMixins, renderEmptyElement } from '../../ui';
|
|
4
4
|
import { getFuncText, getLastZIndex, nextZIndex, isEnableConf } from '../../ui/src/utils';
|
|
5
|
-
import { updatePanelPlacement, getEventTargetNode } from '../../ui/src/dom';
|
|
5
|
+
import { updatePanelPlacement, getEventTargetNode, hasControlKey } from '../../ui/src/dom';
|
|
6
6
|
import { getSlotVNs } from '../../ui/src/vn';
|
|
7
|
-
import { parseDateObj, parseDateValue, getDateByCode, handleValueFormat,
|
|
8
|
-
import {
|
|
7
|
+
import { parseDateObj, parseDateValue, getDateByCode, handleValueFormat, hasDateValueType, hasTimestampValueType, isAllSameChar, getChunkDefaultNum } from '../../date-panel/src/util';
|
|
8
|
+
import { createComponentLog } from '../../ui/src/log';
|
|
9
9
|
import VxeDatePanelComponent from '../../date-panel/src/date-panel';
|
|
10
10
|
import VxeButtonComponent from '../../button/src/button';
|
|
11
11
|
import VxeButtonGroupComponent from '../../button/src/button-group';
|
|
12
|
+
const { warnLog, errLog } = createComponentLog('date-picker');
|
|
13
|
+
const maskedTypes = ['year', 'month', 'date', 'datetime', 'time'];
|
|
14
|
+
const inputMaskedKeys = ['y', 'M', 'd', 'H', 'm', 'n', 's'];
|
|
15
|
+
const parseInputKayMaps = {};
|
|
16
|
+
inputMaskedKeys.forEach(key => {
|
|
17
|
+
parseInputKayMaps[key] = true;
|
|
18
|
+
});
|
|
19
|
+
function createReactData() {
|
|
20
|
+
return {
|
|
21
|
+
initialized: false,
|
|
22
|
+
panelIndex: 0,
|
|
23
|
+
visiblePanel: false,
|
|
24
|
+
isAniVisible: false,
|
|
25
|
+
panelStyle: {},
|
|
26
|
+
panelPlacement: '',
|
|
27
|
+
isActivated: false,
|
|
28
|
+
inputValue: '',
|
|
29
|
+
labelFlag: 0
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function createInternalData() {
|
|
33
|
+
return {
|
|
34
|
+
// hpTimeout: undefined,
|
|
35
|
+
inputLabel: '',
|
|
36
|
+
laseFocusMasked: 0
|
|
37
|
+
};
|
|
38
|
+
}
|
|
12
39
|
export default {
|
|
13
40
|
name: 'VxeDatePicker',
|
|
14
41
|
mixins: [
|
|
@@ -78,7 +105,6 @@ export default {
|
|
|
78
105
|
labelFormat: String,
|
|
79
106
|
valueFormat: String,
|
|
80
107
|
timeFormat: String,
|
|
81
|
-
inputFormat: String,
|
|
82
108
|
editable: {
|
|
83
109
|
type: Boolean,
|
|
84
110
|
default: true
|
|
@@ -108,7 +134,7 @@ export default {
|
|
|
108
134
|
type: Boolean,
|
|
109
135
|
default: () => getConfig().datePicker.autoClose
|
|
110
136
|
},
|
|
111
|
-
|
|
137
|
+
maskedConfig: Object,
|
|
112
138
|
prefixIcon: String,
|
|
113
139
|
suffixIcon: String,
|
|
114
140
|
placement: String,
|
|
@@ -148,26 +174,9 @@ export default {
|
|
|
148
174
|
},
|
|
149
175
|
data() {
|
|
150
176
|
const xID = XEUtils.uniqueId();
|
|
151
|
-
const reactData =
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
visiblePanel: false,
|
|
155
|
-
isAniVisible: false,
|
|
156
|
-
panelStyle: {},
|
|
157
|
-
panelPlacement: '',
|
|
158
|
-
isActivated: false,
|
|
159
|
-
inputValue: '',
|
|
160
|
-
inputLabel: ''
|
|
161
|
-
};
|
|
162
|
-
const internalData = {
|
|
163
|
-
// hpTimeout: undefined,
|
|
164
|
-
parseInputKayMaps: {}
|
|
165
|
-
};
|
|
166
|
-
return {
|
|
167
|
-
xID,
|
|
168
|
-
reactData,
|
|
169
|
-
internalData
|
|
170
|
-
};
|
|
177
|
+
const reactData = createReactData();
|
|
178
|
+
return Object.assign(Object.assign({}, {}), { xID,
|
|
179
|
+
reactData });
|
|
171
180
|
},
|
|
172
181
|
computed: Object.assign(Object.assign({}, {}), { computeBtnTransfer() {
|
|
173
182
|
const $xeDatePicker = this;
|
|
@@ -235,6 +244,53 @@ export default {
|
|
|
235
244
|
const props = $xeDatePicker;
|
|
236
245
|
return props.clearable;
|
|
237
246
|
},
|
|
247
|
+
computeIsDatePanelType() {
|
|
248
|
+
const $xeDatePicker = this;
|
|
249
|
+
const props = $xeDatePicker;
|
|
250
|
+
const isDateTimeType = $xeDatePicker.computeIsDateTimeType;
|
|
251
|
+
return isDateTimeType || ['date', 'week', 'month', 'quarter', 'year'].indexOf(props.type) > -1;
|
|
252
|
+
},
|
|
253
|
+
computeDateListValue() {
|
|
254
|
+
const $xeDatePicker = this;
|
|
255
|
+
const props = $xeDatePicker;
|
|
256
|
+
const { value: modelValue, type, multiple } = props;
|
|
257
|
+
const isDatePanelType = $xeDatePicker.computeIsDatePanelType;
|
|
258
|
+
const dateValueFormat = $xeDatePicker.computeDateValueFormat;
|
|
259
|
+
if (multiple && modelValue && isDatePanelType) {
|
|
260
|
+
return XEUtils.toValueString(modelValue).split(',').map(item => {
|
|
261
|
+
const date = parseDateValue(item, type, {
|
|
262
|
+
valueFormat: dateValueFormat
|
|
263
|
+
});
|
|
264
|
+
if (XEUtils.isValidDate(date)) {
|
|
265
|
+
return date;
|
|
266
|
+
}
|
|
267
|
+
return date;
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
return [];
|
|
271
|
+
},
|
|
272
|
+
computeLimitMaxCount() {
|
|
273
|
+
const $xeDatePicker = this;
|
|
274
|
+
const props = $xeDatePicker;
|
|
275
|
+
return props.multiple ? XEUtils.toNumber(props.limitCount) : 0;
|
|
276
|
+
},
|
|
277
|
+
computeDateMultipleValue() {
|
|
278
|
+
const $xeDatePicker = this;
|
|
279
|
+
const dateListValue = $xeDatePicker.computeDateListValue;
|
|
280
|
+
const dateValueFormat = $xeDatePicker.computeDateValueFormat;
|
|
281
|
+
return dateListValue.map(date => XEUtils.toDateString(date, dateValueFormat));
|
|
282
|
+
},
|
|
283
|
+
computeOverCount() {
|
|
284
|
+
const $xeDatePicker = this;
|
|
285
|
+
const props = $xeDatePicker;
|
|
286
|
+
const { multiple } = props;
|
|
287
|
+
const limitMaxCount = $xeDatePicker.computeLimitMaxCount;
|
|
288
|
+
const dateMultipleValue = $xeDatePicker.computeDateMultipleValue;
|
|
289
|
+
if (multiple && limitMaxCount) {
|
|
290
|
+
return dateMultipleValue.length >= limitMaxCount;
|
|
291
|
+
}
|
|
292
|
+
return false;
|
|
293
|
+
},
|
|
238
294
|
computeInputReadonly() {
|
|
239
295
|
const $xeDatePicker = this;
|
|
240
296
|
const props = $xeDatePicker;
|
|
@@ -301,11 +357,10 @@ export default {
|
|
|
301
357
|
const { type, valueFormat } = props;
|
|
302
358
|
return handleValueFormat(type, valueFormat);
|
|
303
359
|
},
|
|
304
|
-
|
|
360
|
+
computeDateMaskedFormat() {
|
|
305
361
|
const $xeDatePicker = this;
|
|
306
|
-
const
|
|
307
|
-
|
|
308
|
-
return handleInputFormat(type, inputFormat);
|
|
362
|
+
const dateLabelFormat = $xeDatePicker.computeDateLabelFormat;
|
|
363
|
+
return dateLabelFormat;
|
|
309
364
|
},
|
|
310
365
|
computeFirstDayOfWeek() {
|
|
311
366
|
const $xeDatePicker = this;
|
|
@@ -332,10 +387,16 @@ export default {
|
|
|
332
387
|
return dateObj.label;
|
|
333
388
|
}).join(', ');
|
|
334
389
|
},
|
|
335
|
-
|
|
390
|
+
computeMaskedOpts() {
|
|
336
391
|
const $xeDatePicker = this;
|
|
337
392
|
const props = $xeDatePicker;
|
|
338
|
-
return Object.assign({}, getConfig().datePicker.
|
|
393
|
+
return Object.assign({}, getConfig().datePicker.maskedConfig, props.maskedConfig);
|
|
394
|
+
},
|
|
395
|
+
computeMaskChar() {
|
|
396
|
+
const $xeDatePicker = this;
|
|
397
|
+
const maskedOpts = $xeDatePicker.computeMaskedOpts;
|
|
398
|
+
const { maskPlaceholder } = maskedOpts;
|
|
399
|
+
return (maskPlaceholder ? ('' + maskPlaceholder)[0] : '') || '*';
|
|
339
400
|
} }),
|
|
340
401
|
methods: {
|
|
341
402
|
//
|
|
@@ -371,6 +432,15 @@ export default {
|
|
|
371
432
|
}
|
|
372
433
|
reactData.inputValue = val;
|
|
373
434
|
},
|
|
435
|
+
handleInputLabel(text, isUpdate) {
|
|
436
|
+
const $xeDatePicker = this;
|
|
437
|
+
const reactData = $xeDatePicker.reactData;
|
|
438
|
+
const internalData = $xeDatePicker.internalData;
|
|
439
|
+
internalData.inputLabel = text;
|
|
440
|
+
if (isUpdate) {
|
|
441
|
+
reactData.labelFlag++;
|
|
442
|
+
}
|
|
443
|
+
},
|
|
374
444
|
triggerEvent(evnt) {
|
|
375
445
|
const $xeDatePicker = this;
|
|
376
446
|
const reactData = $xeDatePicker.reactData;
|
|
@@ -422,10 +492,9 @@ export default {
|
|
|
422
492
|
},
|
|
423
493
|
inputEvent(evnt) {
|
|
424
494
|
const $xeDatePicker = this;
|
|
425
|
-
const reactData = $xeDatePicker.reactData;
|
|
426
495
|
const inputElem = evnt.target;
|
|
427
496
|
const value = inputElem.value;
|
|
428
|
-
|
|
497
|
+
$xeDatePicker.handleInputLabel(value, true);
|
|
429
498
|
$xeDatePicker.dispatchEvent('input', { value }, evnt);
|
|
430
499
|
},
|
|
431
500
|
changeEvent(evnt) {
|
|
@@ -435,20 +504,6 @@ export default {
|
|
|
435
504
|
$xeDatePicker.triggerEvent(evnt);
|
|
436
505
|
}
|
|
437
506
|
},
|
|
438
|
-
focusEvent(evnt) {
|
|
439
|
-
const $xeDatePicker = this;
|
|
440
|
-
const reactData = $xeDatePicker.reactData;
|
|
441
|
-
const popupOpts = $xeDatePicker.computePopupOpts;
|
|
442
|
-
const { trigger } = popupOpts;
|
|
443
|
-
reactData.isActivated = true;
|
|
444
|
-
if (!trigger || trigger === 'default') {
|
|
445
|
-
$xeDatePicker.datePickerOpenEvent(evnt);
|
|
446
|
-
}
|
|
447
|
-
else if (trigger === 'icon') {
|
|
448
|
-
$xeDatePicker.hidePanel();
|
|
449
|
-
}
|
|
450
|
-
$xeDatePicker.triggerEvent(evnt);
|
|
451
|
-
},
|
|
452
507
|
clickPrefixEvent(evnt) {
|
|
453
508
|
const $xeDatePicker = this;
|
|
454
509
|
const reactData = $xeDatePicker.reactData;
|
|
@@ -470,6 +525,114 @@ export default {
|
|
|
470
525
|
}, 350);
|
|
471
526
|
});
|
|
472
527
|
},
|
|
528
|
+
dateChange(date, isReload) {
|
|
529
|
+
const $xeDatePicker = this;
|
|
530
|
+
const props = $xeDatePicker;
|
|
531
|
+
const { value: modelValue, multiple } = props;
|
|
532
|
+
const isDateTimeType = $xeDatePicker.computeIsDateTimeType;
|
|
533
|
+
const dateValueFormat = $xeDatePicker.computeDateValueFormat;
|
|
534
|
+
const firstDayOfWeek = $xeDatePicker.computeFirstDayOfWeek;
|
|
535
|
+
if (props.type === 'week') {
|
|
536
|
+
const sWeek = XEUtils.toNumber(props.selectDay);
|
|
537
|
+
date = XEUtils.getWhatWeek(date, 0, sWeek, firstDayOfWeek);
|
|
538
|
+
}
|
|
539
|
+
const inpVal = XEUtils.toDateString(date, dateValueFormat, { firstDay: firstDayOfWeek });
|
|
540
|
+
if (multiple) {
|
|
541
|
+
const overCount = $xeDatePicker.computeOverCount;
|
|
542
|
+
// 如果为多选
|
|
543
|
+
if (isDateTimeType) {
|
|
544
|
+
// 如果是datetime特殊类型
|
|
545
|
+
const dateListValue = isReload ? [] : [...$xeDatePicker.computeDateListValue];
|
|
546
|
+
const datetimeRest = [];
|
|
547
|
+
const eqIndex = XEUtils.findIndexOf(dateListValue, val => XEUtils.isDateSame(date, val, 'yyyyMMdd'));
|
|
548
|
+
if (eqIndex === -1) {
|
|
549
|
+
if (overCount) {
|
|
550
|
+
// 如果超出最大多选数量
|
|
551
|
+
return;
|
|
552
|
+
}
|
|
553
|
+
dateListValue.push(date);
|
|
554
|
+
}
|
|
555
|
+
else {
|
|
556
|
+
dateListValue.splice(eqIndex, 1);
|
|
557
|
+
}
|
|
558
|
+
dateListValue.forEach(item => {
|
|
559
|
+
if (item) {
|
|
560
|
+
datetimeRest.push(item);
|
|
561
|
+
}
|
|
562
|
+
});
|
|
563
|
+
$xeDatePicker.handleChange(datetimeRest.map(date => XEUtils.toDateString(date, dateValueFormat)).join(','), { type: 'update' });
|
|
564
|
+
}
|
|
565
|
+
else {
|
|
566
|
+
const dateMultipleValue = isReload ? [] : $xeDatePicker.computeDateMultipleValue;
|
|
567
|
+
// 如果是日期类型
|
|
568
|
+
if (dateMultipleValue.some(val => XEUtils.isEqual(val, inpVal))) {
|
|
569
|
+
$xeDatePicker.handleChange(dateMultipleValue.filter(val => !XEUtils.isEqual(val, inpVal)).join(','), { type: 'update' });
|
|
570
|
+
}
|
|
571
|
+
else {
|
|
572
|
+
if (overCount) {
|
|
573
|
+
// 如果超出最大多选数量
|
|
574
|
+
return;
|
|
575
|
+
}
|
|
576
|
+
$xeDatePicker.handleChange(dateMultipleValue.concat([inpVal]).join(','), { type: 'update' });
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
else {
|
|
581
|
+
// 如果为单选
|
|
582
|
+
if (!XEUtils.isEqual(modelValue, inpVal)) {
|
|
583
|
+
$xeDatePicker.handleChange(inpVal, { type: 'update' });
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
},
|
|
587
|
+
dateRevert() {
|
|
588
|
+
const $xeDatePicker = this;
|
|
589
|
+
const panelLabel = $xeDatePicker.computePanelLabel;
|
|
590
|
+
$xeDatePicker.handleInputLabel(panelLabel, true);
|
|
591
|
+
},
|
|
592
|
+
afterCheckValue(inpVal) {
|
|
593
|
+
const $xeDatePicker = this;
|
|
594
|
+
const props = $xeDatePicker;
|
|
595
|
+
const reactData = $xeDatePicker.reactData;
|
|
596
|
+
const internalData = $xeDatePicker.internalData;
|
|
597
|
+
const { type } = props;
|
|
598
|
+
const { inputLabel } = internalData;
|
|
599
|
+
const dateLabelFormat = $xeDatePicker.computeDateLabelFormat;
|
|
600
|
+
if (!inpVal) {
|
|
601
|
+
$xeDatePicker.handleChange('', { type: 'check' });
|
|
602
|
+
return;
|
|
603
|
+
}
|
|
604
|
+
let inpDateVal = parseDateValue(inpVal, type, {
|
|
605
|
+
valueFormat: dateLabelFormat
|
|
606
|
+
});
|
|
607
|
+
if (!XEUtils.isValidDate(inpDateVal)) {
|
|
608
|
+
$xeDatePicker.dateRevert();
|
|
609
|
+
return;
|
|
610
|
+
}
|
|
611
|
+
if (type === 'time') {
|
|
612
|
+
inpDateVal = XEUtils.toDateString(inpDateVal, dateLabelFormat);
|
|
613
|
+
if (inputLabel !== inpDateVal) {
|
|
614
|
+
$xeDatePicker.handleChange(inpDateVal, { type: 'check' });
|
|
615
|
+
}
|
|
616
|
+
$xeDatePicker.handleInputLabel(inpDateVal, true);
|
|
617
|
+
return;
|
|
618
|
+
}
|
|
619
|
+
let isChange = false;
|
|
620
|
+
const firstDayOfWeek = $xeDatePicker.computeFirstDayOfWeek;
|
|
621
|
+
if (type === 'datetime') {
|
|
622
|
+
const dateValue = reactData.inputValue;
|
|
623
|
+
if (inpVal !== XEUtils.toDateString(dateValue, dateLabelFormat) || inpVal !== XEUtils.toDateString(inpDateVal, dateLabelFormat)) {
|
|
624
|
+
isChange = true;
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
else {
|
|
628
|
+
isChange = true;
|
|
629
|
+
}
|
|
630
|
+
const label = XEUtils.toDateString(inpDateVal, dateLabelFormat, { firstDay: firstDayOfWeek });
|
|
631
|
+
$xeDatePicker.handleInputLabel(label, true);
|
|
632
|
+
if (isChange) {
|
|
633
|
+
$xeDatePicker.dateChange(inpDateVal);
|
|
634
|
+
}
|
|
635
|
+
},
|
|
473
636
|
clearValueEvent(evnt, value) {
|
|
474
637
|
const $xeDatePicker = this;
|
|
475
638
|
const isDatePickerType = $xeDatePicker.computeIsDatePickerType;
|
|
@@ -488,38 +651,311 @@ export default {
|
|
|
488
651
|
$xeDatePicker.dispatchEvent('suffix-click', { value: inputValue }, evnt);
|
|
489
652
|
}
|
|
490
653
|
},
|
|
491
|
-
handleArrowInputDate(evnt, isUpArrow) {
|
|
654
|
+
handleArrowInputDate(evnt, isUpArrow, isDwArrow, isLtArrow, isRtArrow) {
|
|
655
|
+
const $xeDatePicker = this;
|
|
656
|
+
const props = $xeDatePicker;
|
|
657
|
+
const internalData = $xeDatePicker.internalData;
|
|
658
|
+
const { type, multiple } = props;
|
|
659
|
+
if (multiple) {
|
|
660
|
+
return;
|
|
661
|
+
}
|
|
662
|
+
const targetElem = $xeDatePicker.$refs.refInputTarget;
|
|
663
|
+
if (!targetElem) {
|
|
664
|
+
return;
|
|
665
|
+
}
|
|
666
|
+
const inpValue = targetElem.value;
|
|
667
|
+
if (!inpValue) {
|
|
668
|
+
return;
|
|
669
|
+
}
|
|
670
|
+
const dateMaskedFormat = $xeDatePicker.computeDateMaskedFormat;
|
|
671
|
+
const dateLabelFormat = $xeDatePicker.computeDateLabelFormat;
|
|
672
|
+
const firstDayOfWeek = $xeDatePicker.computeFirstDayOfWeek;
|
|
673
|
+
const maskChar = $xeDatePicker.computeMaskChar;
|
|
674
|
+
const selectionStart = targetElem.selectionStart || 0;
|
|
675
|
+
let selectKey = dateMaskedFormat[selectionStart];
|
|
676
|
+
if (!parseInputKayMaps[selectKey]) {
|
|
677
|
+
selectKey = dateMaskedFormat[selectionStart - 1];
|
|
678
|
+
}
|
|
679
|
+
const skRest = dateMaskedFormat.match(new RegExp(selectKey + '+'));
|
|
680
|
+
if (!skRest) {
|
|
681
|
+
return;
|
|
682
|
+
}
|
|
683
|
+
if (isUpArrow || isDwArrow) {
|
|
684
|
+
const chunkFormat = skRest[0] || '';
|
|
685
|
+
const chunkStartIndex = skRest.index || 0;
|
|
686
|
+
const chunkEndIndex = chunkStartIndex + chunkFormat.length;
|
|
687
|
+
const chunkValue = inpValue.slice(chunkStartIndex, chunkEndIndex);
|
|
688
|
+
if (parseInputKayMaps[selectKey]) {
|
|
689
|
+
const chunkNum = (isAllSameChar(chunkValue, maskChar) ? getChunkDefaultNum(selectKey) : XEUtils.toNumber(chunkValue)) + (isUpArrow ? 1 : -1);
|
|
690
|
+
const restValue = inpValue.slice(0, chunkStartIndex) + XEUtils.padStart(chunkNum, chunkFormat.length, '0') + inpValue.slice(chunkEndIndex);
|
|
691
|
+
evnt.preventDefault();
|
|
692
|
+
if (restValue.indexOf(maskChar) === -1) {
|
|
693
|
+
// 解析日期
|
|
694
|
+
const inpDateVal = parseDateValue(restValue, type, {
|
|
695
|
+
valueFormat: dateLabelFormat
|
|
696
|
+
});
|
|
697
|
+
if (XEUtils.isValidDate(inpDateVal)) {
|
|
698
|
+
const label = XEUtils.toDateString(inpDateVal, dateLabelFormat, { firstDay: firstDayOfWeek });
|
|
699
|
+
targetElem.value = label;
|
|
700
|
+
$xeDatePicker.handleInputLabel(label, false);
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
else {
|
|
704
|
+
targetElem.value = restValue;
|
|
705
|
+
$xeDatePicker.handleInputLabel(restValue, false);
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
targetElem.setSelectionRange(chunkStartIndex, chunkEndIndex);
|
|
709
|
+
}
|
|
710
|
+
else if (isLtArrow || isRtArrow) {
|
|
711
|
+
const currKeyIndex = inputMaskedKeys.indexOf(selectKey);
|
|
712
|
+
if (currKeyIndex > -1) {
|
|
713
|
+
const allMaskedKeys = XEUtils.map(dateMaskedFormat.match(new RegExp(`(${inputMaskedKeys.join('|')})+`, 'g')) || [], fullKey => fullKey[0]);
|
|
714
|
+
const currIndex = XEUtils.findIndexOf(allMaskedKeys, key => selectKey === key[0]);
|
|
715
|
+
const targetFormatKey = isLtArrow ? (allMaskedKeys[currIndex - 1] || allMaskedKeys[0]) : (allMaskedKeys[currIndex + 1] || allMaskedKeys[allMaskedKeys.length - 1]);
|
|
716
|
+
const targetKey = targetFormatKey ? targetFormatKey[0] : '';
|
|
717
|
+
const sktRest = dateMaskedFormat.match(new RegExp(targetKey + '+'));
|
|
718
|
+
if (sktRest) {
|
|
719
|
+
evnt.preventDefault();
|
|
720
|
+
const mtStartIndex = sktRest.index || 0;
|
|
721
|
+
const mtEndIndex = mtStartIndex + sktRest[0].length;
|
|
722
|
+
targetElem.setSelectionRange(mtStartIndex, mtEndIndex);
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
internalData.isTriggerMasked = true;
|
|
727
|
+
},
|
|
728
|
+
handleMaskedInputDate(evnt) {
|
|
492
729
|
const $xeDatePicker = this;
|
|
493
730
|
const props = $xeDatePicker;
|
|
494
|
-
const reactData = $xeDatePicker.reactData;
|
|
495
731
|
const internalData = $xeDatePicker.internalData;
|
|
496
732
|
const { multiple } = props;
|
|
497
733
|
if (multiple) {
|
|
498
734
|
return;
|
|
499
735
|
}
|
|
500
|
-
const
|
|
501
|
-
if (!
|
|
736
|
+
const targetElem = $xeDatePicker.$refs.refInputTarget;
|
|
737
|
+
if (!targetElem) {
|
|
738
|
+
return;
|
|
739
|
+
}
|
|
740
|
+
const isControlKey = hasControlKey(evnt);
|
|
741
|
+
if (isControlKey) {
|
|
742
|
+
return;
|
|
743
|
+
}
|
|
744
|
+
evnt.preventDefault();
|
|
745
|
+
const eKey = evnt.key;
|
|
746
|
+
const isDeleleKey = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.DELETE);
|
|
747
|
+
const isBackspaceKey = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.BACKSPACE);
|
|
748
|
+
const isNumKey = eKey >= '0' && eKey <= '9';
|
|
749
|
+
const numKey = isNumKey ? evnt.key : '';
|
|
750
|
+
if (!(isDeleleKey || isBackspaceKey || isNumKey)) {
|
|
751
|
+
return;
|
|
752
|
+
}
|
|
753
|
+
const { isTriggerMasked } = internalData;
|
|
754
|
+
const dateMaskedFormat = $xeDatePicker.computeDateMaskedFormat;
|
|
755
|
+
const maskChar = $xeDatePicker.computeMaskChar;
|
|
756
|
+
let inpValue = targetElem.value || dateMaskedFormat;
|
|
757
|
+
const selectionStart = targetElem.selectionStart || 0;
|
|
758
|
+
const selectionEnd = targetElem.selectionEnd || 0;
|
|
759
|
+
let selectKey = dateMaskedFormat[selectionStart];
|
|
760
|
+
if (!parseInputKayMaps[selectKey]) {
|
|
761
|
+
selectKey = dateMaskedFormat[selectionStart - 1];
|
|
762
|
+
}
|
|
763
|
+
const skRest = dateMaskedFormat.match(new RegExp(selectKey + '+'));
|
|
764
|
+
if (!skRest) {
|
|
765
|
+
return;
|
|
766
|
+
}
|
|
767
|
+
const allMaskedKeys = XEUtils.map(dateMaskedFormat.match(new RegExp(`(${inputMaskedKeys.join('|')})+`, 'g')) || [], fullKey => fullKey[0]);
|
|
768
|
+
const chunkFormat = skRest[0] || '';
|
|
769
|
+
const chunkStartIndex = skRest.index || 0;
|
|
770
|
+
const chunkEndIndex = chunkStartIndex + chunkFormat.length;
|
|
771
|
+
const currKeyIndex = allMaskedKeys.indexOf(selectKey);
|
|
772
|
+
// 全选 | 如果无效字符
|
|
773
|
+
const isAllSelected = !selectionStart && selectionEnd === inpValue.length;
|
|
774
|
+
const isNotMasked = inpValue && inpValue.length !== dateMaskedFormat.length;
|
|
775
|
+
if (isAllSelected || isNotMasked) {
|
|
776
|
+
inpValue = dateMaskedFormat;
|
|
777
|
+
}
|
|
778
|
+
let chunkValue = isDeleleKey ? '' : inpValue.slice(chunkStartIndex, chunkEndIndex);
|
|
779
|
+
const chunkNums = (chunkValue.match(/\d/g) || []);
|
|
780
|
+
const chunkNumList = isTriggerMasked && !isBackspaceKey ? [] : chunkNums.slice(0);
|
|
781
|
+
if (isNumKey) {
|
|
782
|
+
chunkNumList.push(numKey);
|
|
783
|
+
}
|
|
784
|
+
else if (isBackspaceKey) {
|
|
785
|
+
chunkNumList.pop();
|
|
786
|
+
}
|
|
787
|
+
chunkValue = chunkNumList.join('').padEnd(chunkFormat.length, maskChar);
|
|
788
|
+
let restValue = inpValue.slice(0, chunkStartIndex) + chunkValue + inpValue.slice(chunkEndIndex);
|
|
789
|
+
restValue = restValue.replace(new RegExp(`(${inputMaskedKeys.join('|')})`, 'g'), maskChar);
|
|
790
|
+
targetElem.value = restValue;
|
|
791
|
+
$xeDatePicker.handleInputLabel(restValue, false);
|
|
792
|
+
// 如果是全选/删除
|
|
793
|
+
if (isAllSelected) {
|
|
794
|
+
if (isBackspaceKey || isDeleleKey) {
|
|
795
|
+
const firstMaskedKeys = allMaskedKeys[0];
|
|
796
|
+
const firstSkRest = dateMaskedFormat.match(new RegExp(`${firstMaskedKeys}+`));
|
|
797
|
+
if (firstSkRest) {
|
|
798
|
+
const firstChunkFormat = firstSkRest[0];
|
|
799
|
+
targetElem.setSelectionRange(0, firstChunkFormat.length);
|
|
800
|
+
internalData.isTriggerMasked = true;
|
|
801
|
+
return;
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
else {
|
|
806
|
+
if (isBackspaceKey && !chunkNums.length) {
|
|
807
|
+
// 回退到上一个数字块
|
|
808
|
+
for (let i = currKeyIndex - 1; i >= 0; i--) {
|
|
809
|
+
const prveChunkKey = allMaskedKeys[i];
|
|
810
|
+
const prveSkRest = dateMaskedFormat.match(new RegExp(`${prveChunkKey}+`));
|
|
811
|
+
if (prveSkRest) {
|
|
812
|
+
const prveChunkFormat = prveSkRest[0];
|
|
813
|
+
const prveChunkStartIndex = prveSkRest.index || 0;
|
|
814
|
+
const prveChunkEndIndex = prveChunkStartIndex + prveChunkFormat.length;
|
|
815
|
+
let prveChunkValue = restValue.slice(prveChunkStartIndex, prveChunkEndIndex);
|
|
816
|
+
const prveChunkNums = (prveChunkValue.match(/\d/g) || []);
|
|
817
|
+
if (prveChunkNums.length) {
|
|
818
|
+
prveChunkNums.pop();
|
|
819
|
+
prveChunkValue = prveChunkNums.join('').padEnd(prveChunkFormat.length, maskChar);
|
|
820
|
+
restValue = restValue.slice(0, prveChunkStartIndex) + prveChunkValue + restValue.slice(prveChunkEndIndex);
|
|
821
|
+
targetElem.value = restValue;
|
|
822
|
+
$xeDatePicker.handleInputLabel(restValue, false);
|
|
823
|
+
targetElem.setSelectionRange(prveChunkStartIndex, prveChunkEndIndex);
|
|
824
|
+
return;
|
|
825
|
+
}
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
const firstMaskedKeys = allMaskedKeys[0];
|
|
829
|
+
const firstSkRest = dateMaskedFormat.match(new RegExp(`${firstMaskedKeys}+`));
|
|
830
|
+
if (firstSkRest) {
|
|
831
|
+
const firstChunkFormat = firstSkRest[0];
|
|
832
|
+
restValue = dateMaskedFormat.replace(new RegExp(`(${inputMaskedKeys.join('|')})`, 'g'), maskChar);
|
|
833
|
+
targetElem.value = restValue;
|
|
834
|
+
$xeDatePicker.handleInputLabel(restValue, false);
|
|
835
|
+
targetElem.setSelectionRange(0, firstChunkFormat.length);
|
|
836
|
+
internalData.isTriggerMasked = true;
|
|
837
|
+
return;
|
|
838
|
+
}
|
|
839
|
+
return;
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
let maskStartIndex = skRest.index || 0;
|
|
843
|
+
let maskEndIndex = maskStartIndex + skRest[0].length;
|
|
844
|
+
// 如果输入完成,跳转下一个
|
|
845
|
+
if (chunkNumList.length >= chunkValue.length) {
|
|
846
|
+
const nextKeys = allMaskedKeys.slice(currKeyIndex + 1);
|
|
847
|
+
if (currKeyIndex > -1) {
|
|
848
|
+
const nextRest = nextKeys.length ? dateMaskedFormat.match(new RegExp(`(${nextKeys.join('|')})+`)) : null;
|
|
849
|
+
// 如果当前数字块已输入,则跳转下一个数字块
|
|
850
|
+
if (nextRest) {
|
|
851
|
+
maskStartIndex = nextRest.index || 0;
|
|
852
|
+
maskEndIndex = maskStartIndex + nextRest[0].length;
|
|
853
|
+
targetElem.setSelectionRange(maskStartIndex, maskEndIndex);
|
|
854
|
+
}
|
|
855
|
+
else {
|
|
856
|
+
targetElem.setSelectionRange(maskStartIndex, maskEndIndex);
|
|
857
|
+
}
|
|
858
|
+
}
|
|
859
|
+
internalData.isTriggerMasked = true;
|
|
860
|
+
return;
|
|
861
|
+
}
|
|
862
|
+
targetElem.setSelectionRange(maskStartIndex, maskEndIndex);
|
|
863
|
+
internalData.isTriggerMasked = false;
|
|
864
|
+
},
|
|
865
|
+
handleMaskedSelectedDate(evnt, isFocus) {
|
|
866
|
+
const $xeDatePicker = this;
|
|
867
|
+
const props = $xeDatePicker;
|
|
868
|
+
const internalData = $xeDatePicker.internalData;
|
|
869
|
+
const { type, multiple, value: modelValue } = props;
|
|
870
|
+
if (multiple) {
|
|
871
|
+
return;
|
|
872
|
+
}
|
|
873
|
+
if (!maskedTypes.includes(type)) {
|
|
502
874
|
return;
|
|
503
875
|
}
|
|
504
876
|
const targetElem = $xeDatePicker.$refs.refInputTarget;
|
|
505
877
|
if (!targetElem) {
|
|
506
878
|
return;
|
|
507
879
|
}
|
|
508
|
-
const {
|
|
509
|
-
|
|
880
|
+
const { laseFocusMasked } = internalData;
|
|
881
|
+
if (laseFocusMasked && Date.now() - laseFocusMasked < 100) {
|
|
882
|
+
return;
|
|
883
|
+
}
|
|
884
|
+
const dateMaskedFormat = $xeDatePicker.computeDateMaskedFormat;
|
|
885
|
+
const maskChar = $xeDatePicker.computeMaskChar;
|
|
510
886
|
const selectionStart = targetElem.selectionStart || 0;
|
|
511
|
-
|
|
887
|
+
const selectionEnd = targetElem.selectionEnd || 0;
|
|
888
|
+
const inpValue = targetElem.value;
|
|
889
|
+
const allMaskedKeys = XEUtils.map(dateMaskedFormat.match(new RegExp(`(${inputMaskedKeys.join('|')})+`, 'g')) || [], fullKey => fullKey[0]);
|
|
890
|
+
// 如果为空
|
|
891
|
+
if (!inpValue) {
|
|
892
|
+
let restValue = dateMaskedFormat.replace(new RegExp(`(${inputMaskedKeys.join('|')})`, 'g'), maskChar);
|
|
893
|
+
// 还原值
|
|
894
|
+
if (isFocus && modelValue) {
|
|
895
|
+
const chunkNums = (('' + XEUtils.toNumber(modelValue)).match(/\d/g) || []);
|
|
896
|
+
let useNumIndex = 0;
|
|
897
|
+
restValue = dateMaskedFormat.replace(new RegExp(`(${inputMaskedKeys.join('|')})`, 'g'), (txt) => chunkNums[useNumIndex++] || txt);
|
|
898
|
+
}
|
|
899
|
+
const firstMaskedKeys = allMaskedKeys[0];
|
|
900
|
+
const firstSkRest = dateMaskedFormat.match(new RegExp(`${firstMaskedKeys}+`));
|
|
901
|
+
if (firstSkRest) {
|
|
902
|
+
evnt.preventDefault();
|
|
903
|
+
const firstChunkFormat = firstSkRest[0];
|
|
904
|
+
targetElem.value = restValue;
|
|
905
|
+
$xeDatePicker.handleInputLabel(restValue, false);
|
|
906
|
+
targetElem.setSelectionRange(0, firstChunkFormat.length);
|
|
907
|
+
internalData.laseFocusMasked = Date.now();
|
|
908
|
+
return;
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
// 全选 | 如果无效字符
|
|
912
|
+
const isAllSelected = !selectionStart && selectionEnd === inpValue.length;
|
|
913
|
+
const isNotMasked = inpValue && inpValue.length !== dateMaskedFormat.length;
|
|
914
|
+
if (isAllSelected || isNotMasked) {
|
|
915
|
+
let restValue = '';
|
|
916
|
+
// 还原值
|
|
917
|
+
if (isNotMasked && inpValue) {
|
|
918
|
+
const chunkNums = inpValue.match(/\d/g) || [];
|
|
919
|
+
let useNumIndex = 0;
|
|
920
|
+
restValue = dateMaskedFormat.replace(new RegExp(`(${inputMaskedKeys.join('|')})`, 'g'), () => chunkNums[useNumIndex++] || maskChar);
|
|
921
|
+
}
|
|
922
|
+
else {
|
|
923
|
+
dateMaskedFormat.replace(new RegExp(`(${inputMaskedKeys.join('|')})`, 'g'), maskChar);
|
|
924
|
+
}
|
|
925
|
+
const firstMaskedKeys = allMaskedKeys[0];
|
|
926
|
+
const firstSkRest = dateMaskedFormat.match(new RegExp(`${firstMaskedKeys}+`));
|
|
927
|
+
if (firstSkRest) {
|
|
928
|
+
evnt.preventDefault();
|
|
929
|
+
const firstChunkFormat = firstSkRest[0];
|
|
930
|
+
targetElem.value = restValue;
|
|
931
|
+
$xeDatePicker.handleInputLabel(restValue, false);
|
|
932
|
+
targetElem.setSelectionRange(0, firstChunkFormat.length);
|
|
933
|
+
internalData.laseFocusMasked = Date.now();
|
|
934
|
+
return;
|
|
935
|
+
}
|
|
936
|
+
}
|
|
937
|
+
// 是否选择数字块
|
|
938
|
+
let selectKey = dateMaskedFormat[selectionStart];
|
|
512
939
|
if (!parseInputKayMaps[selectKey]) {
|
|
513
|
-
selectKey =
|
|
940
|
+
selectKey = dateMaskedFormat[selectionStart - 1];
|
|
514
941
|
}
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
942
|
+
if (selectKey) {
|
|
943
|
+
evnt.preventDefault();
|
|
944
|
+
const skRest = dateMaskedFormat.match(new RegExp(selectKey + '+'));
|
|
945
|
+
if (skRest) {
|
|
946
|
+
const chunkFormat = skRest[0] || '';
|
|
947
|
+
const chunkStartIndex = skRest.index || 0;
|
|
948
|
+
const chunkEndIndex = chunkStartIndex + chunkFormat.length;
|
|
949
|
+
targetElem.setSelectionRange(chunkStartIndex, chunkEndIndex);
|
|
950
|
+
internalData.isTriggerMasked = true;
|
|
951
|
+
internalData.laseFocusMasked = Date.now();
|
|
952
|
+
}
|
|
518
953
|
}
|
|
519
954
|
},
|
|
520
955
|
blurEvent(evnt) {
|
|
521
956
|
const $xeDatePicker = this;
|
|
522
957
|
const reactData = $xeDatePicker.reactData;
|
|
958
|
+
const internalData = $xeDatePicker.internalData;
|
|
523
959
|
const $xeForm = $xeDatePicker.$xeForm;
|
|
524
960
|
const formItemInfo = $xeDatePicker.formItemInfo;
|
|
525
961
|
const $datePanel = $xeDatePicker.$refs.refDatePanel;
|
|
@@ -530,10 +966,14 @@ export default {
|
|
|
530
966
|
$xeDatePicker.handleChange(value, evnt);
|
|
531
967
|
}
|
|
532
968
|
if (!reactData.visiblePanel) {
|
|
969
|
+
const { inputLabel } = internalData;
|
|
533
970
|
reactData.isActivated = false;
|
|
534
971
|
// 未打开面板时才校验
|
|
535
972
|
if ($datePanel) {
|
|
536
|
-
$datePanel.checkValue(
|
|
973
|
+
$datePanel.checkValue(inputLabel);
|
|
974
|
+
}
|
|
975
|
+
else {
|
|
976
|
+
$xeDatePicker.afterCheckValue(inputLabel);
|
|
537
977
|
}
|
|
538
978
|
}
|
|
539
979
|
$xeDatePicker.dispatchEvent('blur', { value }, evnt);
|
|
@@ -542,15 +982,89 @@ export default {
|
|
|
542
982
|
$xeForm.triggerItemEvent(evnt, formItemInfo.itemConfig.field, value);
|
|
543
983
|
}
|
|
544
984
|
},
|
|
985
|
+
focusEvent(evnt) {
|
|
986
|
+
const $xeDatePicker = this;
|
|
987
|
+
const props = $xeDatePicker;
|
|
988
|
+
const reactData = $xeDatePicker.reactData;
|
|
989
|
+
const { multiple, editable, maskedConfig } = props;
|
|
990
|
+
const maskedOpts = $xeDatePicker.computeMaskedOpts;
|
|
991
|
+
const popupOpts = $xeDatePicker.computePopupOpts;
|
|
992
|
+
const { trigger } = popupOpts;
|
|
993
|
+
reactData.isActivated = true;
|
|
994
|
+
if (!trigger || trigger === 'default') {
|
|
995
|
+
$xeDatePicker.datePickerOpenEvent(evnt);
|
|
996
|
+
setTimeout(() => {
|
|
997
|
+
if (editable && !multiple && (isEnableConf(maskedConfig) || maskedOpts.enabled)) {
|
|
998
|
+
$xeDatePicker.handleMaskedSelectedDate(evnt, true);
|
|
999
|
+
}
|
|
1000
|
+
}, 15);
|
|
1001
|
+
}
|
|
1002
|
+
else if (trigger === 'icon') {
|
|
1003
|
+
$xeDatePicker.hidePanel();
|
|
1004
|
+
setTimeout(() => {
|
|
1005
|
+
if (editable && !multiple && (isEnableConf(maskedConfig) || maskedOpts.enabled)) {
|
|
1006
|
+
$xeDatePicker.handleMaskedSelectedDate(evnt, true);
|
|
1007
|
+
}
|
|
1008
|
+
}, 15);
|
|
1009
|
+
}
|
|
1010
|
+
else {
|
|
1011
|
+
if (editable && !multiple && (isEnableConf(maskedConfig) || maskedOpts.enabled)) {
|
|
1012
|
+
$xeDatePicker.handleMaskedSelectedDate(evnt, true);
|
|
1013
|
+
}
|
|
1014
|
+
}
|
|
1015
|
+
$xeDatePicker.triggerEvent(evnt);
|
|
1016
|
+
},
|
|
1017
|
+
clickEvent(evnt) {
|
|
1018
|
+
const $xeDatePicker = this;
|
|
1019
|
+
const props = $xeDatePicker;
|
|
1020
|
+
const { editable, maskedConfig } = props;
|
|
1021
|
+
const maskedOpts = $xeDatePicker.computeMaskedOpts;
|
|
1022
|
+
if (editable && (isEnableConf(maskedConfig) || maskedOpts.enabled)) {
|
|
1023
|
+
$xeDatePicker.handleMaskedSelectedDate(evnt);
|
|
1024
|
+
}
|
|
1025
|
+
$xeDatePicker.triggerEvent(evnt);
|
|
1026
|
+
},
|
|
545
1027
|
keydownEvent(evnt) {
|
|
546
1028
|
const $xeDatePicker = this;
|
|
547
1029
|
const props = $xeDatePicker;
|
|
548
|
-
const
|
|
549
|
-
const
|
|
1030
|
+
const reactData = $xeDatePicker.reactData;
|
|
1031
|
+
const internalData = $xeDatePicker.internalData;
|
|
1032
|
+
const { type, editable, maskedConfig } = props;
|
|
1033
|
+
const { visiblePanel } = reactData;
|
|
1034
|
+
const maskedOpts = $xeDatePicker.computeMaskedOpts;
|
|
550
1035
|
const isUpArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_UP);
|
|
551
1036
|
const isDwArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_DOWN);
|
|
552
|
-
|
|
553
|
-
|
|
1037
|
+
const isLtArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_LEFT);
|
|
1038
|
+
const isRtArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_RIGHT);
|
|
1039
|
+
const isEnter = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ENTER);
|
|
1040
|
+
if (editable) {
|
|
1041
|
+
if (isEnter) {
|
|
1042
|
+
const $datePanel = $xeDatePicker.$refs.refDatePanel;
|
|
1043
|
+
const { inputLabel } = internalData;
|
|
1044
|
+
const targetElem = $xeDatePicker.$refs.refInputTarget;
|
|
1045
|
+
if (visiblePanel) {
|
|
1046
|
+
$xeDatePicker.hidePanel();
|
|
1047
|
+
}
|
|
1048
|
+
if ($datePanel) {
|
|
1049
|
+
$datePanel.checkValue(inputLabel);
|
|
1050
|
+
}
|
|
1051
|
+
else {
|
|
1052
|
+
$xeDatePicker.afterCheckValue(inputLabel);
|
|
1053
|
+
}
|
|
1054
|
+
if (targetElem) {
|
|
1055
|
+
targetElem.blur();
|
|
1056
|
+
}
|
|
1057
|
+
}
|
|
1058
|
+
else if (maskedTypes.includes(type)) {
|
|
1059
|
+
if (isEnableConf(maskedConfig) || maskedOpts.enabled) {
|
|
1060
|
+
if (maskedOpts.isArrow && (isUpArrow || isDwArrow || isLtArrow || isRtArrow)) {
|
|
1061
|
+
$xeDatePicker.handleArrowInputDate(evnt, isUpArrow, isDwArrow, isLtArrow, isRtArrow);
|
|
1062
|
+
}
|
|
1063
|
+
else if (maskedOpts.isMasked) {
|
|
1064
|
+
$xeDatePicker.handleMaskedInputDate(evnt);
|
|
1065
|
+
}
|
|
1066
|
+
}
|
|
1067
|
+
}
|
|
554
1068
|
}
|
|
555
1069
|
$xeDatePicker.triggerEvent(evnt);
|
|
556
1070
|
},
|
|
@@ -585,25 +1099,32 @@ export default {
|
|
|
585
1099
|
},
|
|
586
1100
|
panelRevertEvent(params) {
|
|
587
1101
|
const $xeDatePicker = this;
|
|
588
|
-
|
|
589
|
-
reactData.inputLabel = params.label;
|
|
1102
|
+
$xeDatePicker.handleInputLabel(params.label, true);
|
|
590
1103
|
},
|
|
591
1104
|
// 全局事件
|
|
592
1105
|
handleGlobalMousedownEvent(evnt) {
|
|
593
1106
|
const $xeDatePicker = this;
|
|
594
1107
|
const reactData = $xeDatePicker.reactData;
|
|
1108
|
+
const internalData = $xeDatePicker.internalData;
|
|
595
1109
|
const $datePanel = $xeDatePicker.$refs.refDatePanel;
|
|
596
1110
|
const { visiblePanel, isActivated } = reactData;
|
|
597
1111
|
const el = $xeDatePicker.$refs.refElem;
|
|
598
1112
|
const panelWrapperElem = $xeDatePicker.$refs.refPanelWrapper;
|
|
599
1113
|
const isDisabled = $xeDatePicker.computeIsDisabled;
|
|
600
1114
|
if (!isDisabled && isActivated) {
|
|
601
|
-
|
|
602
|
-
if (
|
|
1115
|
+
const currActivated = getEventTargetNode(evnt, el).flag || getEventTargetNode(evnt, panelWrapperElem).flag;
|
|
1116
|
+
if (currActivated !== isActivated) {
|
|
1117
|
+
reactData.isActivated = currActivated;
|
|
1118
|
+
}
|
|
1119
|
+
if (!currActivated) {
|
|
603
1120
|
if (visiblePanel) {
|
|
604
1121
|
$xeDatePicker.hidePanel();
|
|
1122
|
+
const { inputLabel } = internalData;
|
|
605
1123
|
if ($datePanel) {
|
|
606
|
-
$datePanel.checkValue(
|
|
1124
|
+
$datePanel.checkValue(inputLabel);
|
|
1125
|
+
}
|
|
1126
|
+
else {
|
|
1127
|
+
$xeDatePicker.afterCheckValue(inputLabel);
|
|
607
1128
|
}
|
|
608
1129
|
}
|
|
609
1130
|
}
|
|
@@ -647,6 +1168,7 @@ export default {
|
|
|
647
1168
|
handleGlobalBlurEvent() {
|
|
648
1169
|
const $xeDatePicker = this;
|
|
649
1170
|
const reactData = $xeDatePicker.reactData;
|
|
1171
|
+
const internalData = $xeDatePicker.internalData;
|
|
650
1172
|
const $datePanel = $xeDatePicker.$refs.refDatePanel;
|
|
651
1173
|
const { isActivated, visiblePanel } = reactData;
|
|
652
1174
|
if (visiblePanel) {
|
|
@@ -657,7 +1179,7 @@ export default {
|
|
|
657
1179
|
}
|
|
658
1180
|
if (visiblePanel || isActivated) {
|
|
659
1181
|
if ($datePanel) {
|
|
660
|
-
$datePanel.checkValue(
|
|
1182
|
+
$datePanel.checkValue(internalData.inputLabel);
|
|
661
1183
|
}
|
|
662
1184
|
const targetElem = $xeDatePicker.$refs.refInputTarget;
|
|
663
1185
|
if (targetElem) {
|
|
@@ -724,9 +1246,11 @@ export default {
|
|
|
724
1246
|
const btnTransfer = $xeDatePicker.computeBtnTransfer;
|
|
725
1247
|
const panelElem = $xeDatePicker.$refs.refInputPanel;
|
|
726
1248
|
if (!isDisabled && !visiblePanel) {
|
|
727
|
-
if (!reactData.initialized
|
|
1249
|
+
if (!reactData.initialized) {
|
|
728
1250
|
reactData.initialized = true;
|
|
729
|
-
|
|
1251
|
+
if (btnTransfer && panelElem) {
|
|
1252
|
+
document.body.appendChild(panelElem);
|
|
1253
|
+
}
|
|
730
1254
|
}
|
|
731
1255
|
if (internalData.hpTimeout) {
|
|
732
1256
|
clearTimeout(internalData.hpTimeout);
|
|
@@ -766,10 +1290,6 @@ export default {
|
|
|
766
1290
|
}
|
|
767
1291
|
}
|
|
768
1292
|
},
|
|
769
|
-
clickEvent(evnt) {
|
|
770
|
-
const $xeDatePicker = this;
|
|
771
|
-
$xeDatePicker.triggerEvent(evnt);
|
|
772
|
-
},
|
|
773
1293
|
handleShortcutEvent({ option, $event }) {
|
|
774
1294
|
const $xeDatePicker = this;
|
|
775
1295
|
const props = $xeDatePicker;
|
|
@@ -811,7 +1331,7 @@ export default {
|
|
|
811
1331
|
break;
|
|
812
1332
|
}
|
|
813
1333
|
default:
|
|
814
|
-
errLog('vxe.error.notCommands', [
|
|
1334
|
+
errLog('vxe.error.notCommands', [code]);
|
|
815
1335
|
break;
|
|
816
1336
|
}
|
|
817
1337
|
}
|
|
@@ -1134,8 +1654,10 @@ export default {
|
|
|
1134
1654
|
const $xeDatePicker = this;
|
|
1135
1655
|
const props = $xeDatePicker;
|
|
1136
1656
|
const reactData = $xeDatePicker.reactData;
|
|
1657
|
+
const internalData = $xeDatePicker.internalData;
|
|
1137
1658
|
const { className, type, name, autoComplete } = props;
|
|
1138
|
-
const { inputValue,
|
|
1659
|
+
const { inputValue, visiblePanel, isActivated, labelFlag } = reactData;
|
|
1660
|
+
const { inputLabel } = internalData;
|
|
1139
1661
|
const vSize = $xeDatePicker.computeSize;
|
|
1140
1662
|
const isDisabled = $xeDatePicker.computeIsDisabled;
|
|
1141
1663
|
const formReadonly = $xeDatePicker.computeFormReadonly;
|
|
@@ -1174,7 +1696,7 @@ export default {
|
|
|
1174
1696
|
ref: 'refInputTarget',
|
|
1175
1697
|
class: 'vxe-date-picker--inner',
|
|
1176
1698
|
domProps: {
|
|
1177
|
-
value: inputLabel
|
|
1699
|
+
value: labelFlag ? inputLabel : ''
|
|
1178
1700
|
},
|
|
1179
1701
|
attrs: {
|
|
1180
1702
|
name,
|
|
@@ -1204,8 +1726,7 @@ export default {
|
|
|
1204
1726
|
watch: {
|
|
1205
1727
|
computePanelLabel(val) {
|
|
1206
1728
|
const $xeDatePicker = this;
|
|
1207
|
-
|
|
1208
|
-
reactData.inputLabel = val;
|
|
1729
|
+
$xeDatePicker.handleInputLabel(val, true);
|
|
1209
1730
|
},
|
|
1210
1731
|
value() {
|
|
1211
1732
|
const $xeDatePicker = this;
|
|
@@ -1214,14 +1735,17 @@ export default {
|
|
|
1214
1735
|
},
|
|
1215
1736
|
created() {
|
|
1216
1737
|
const $xeDatePicker = this;
|
|
1217
|
-
const
|
|
1218
|
-
|
|
1219
|
-
const
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
}
|
|
1224
|
-
|
|
1738
|
+
const props = $xeDatePicker;
|
|
1739
|
+
$xeDatePicker.internalData = createInternalData();
|
|
1740
|
+
const { type, multiple, maskedConfig } = props;
|
|
1741
|
+
if (isEnableConf(maskedConfig)) {
|
|
1742
|
+
if (multiple) {
|
|
1743
|
+
errLog('vxe.error.notSupportProp', ['multiple', 'control-config.enabled=true', 'control-config.enabled=false']);
|
|
1744
|
+
}
|
|
1745
|
+
if (!maskedTypes.includes(type)) {
|
|
1746
|
+
warnLog('vxe.error.notSupportProp', ['control-config.enabled=true', `type=${type}`, `type=${maskedTypes.join('|')}`]);
|
|
1747
|
+
}
|
|
1748
|
+
}
|
|
1225
1749
|
$xeDatePicker.updateModelValue();
|
|
1226
1750
|
globalEvents.on($xeDatePicker, 'mousewheel', $xeDatePicker.handleGlobalMousewheelEvent);
|
|
1227
1751
|
globalEvents.on($xeDatePicker, 'mousedown', $xeDatePicker.handleGlobalMousedownEvent);
|
|
@@ -1231,6 +1755,8 @@ export default {
|
|
|
1231
1755
|
},
|
|
1232
1756
|
beforeDestroy() {
|
|
1233
1757
|
const $xeDatePicker = this;
|
|
1758
|
+
const reactData = $xeDatePicker.reactData;
|
|
1759
|
+
const internalData = $xeDatePicker.internalData;
|
|
1234
1760
|
const panelElem = $xeDatePicker.$refs.refInputPanel;
|
|
1235
1761
|
if (panelElem && panelElem.parentNode) {
|
|
1236
1762
|
panelElem.parentNode.removeChild(panelElem);
|
|
@@ -1239,6 +1765,8 @@ export default {
|
|
|
1239
1765
|
globalEvents.off($xeDatePicker, 'mousedown');
|
|
1240
1766
|
globalEvents.off($xeDatePicker, 'blur');
|
|
1241
1767
|
globalEvents.off($xeDatePicker, 'resize');
|
|
1768
|
+
XEUtils.assign(reactData, createReactData());
|
|
1769
|
+
XEUtils.assign(internalData, createInternalData());
|
|
1242
1770
|
},
|
|
1243
1771
|
render(h) {
|
|
1244
1772
|
return this.renderVN(h);
|