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.
Files changed (148) hide show
  1. package/es/backtop/src/backtop.js +8 -7
  2. package/es/button/src/button.js +3 -2
  3. package/es/calendar/src/calendar.js +2 -1
  4. package/es/cascader/src/cascader.js +5 -7
  5. package/es/checkbox/src/group.js +16 -7
  6. package/es/context-menu/src/context-menu.js +2 -6
  7. package/es/date-panel/src/util.js +27 -4
  8. package/es/date-picker/src/date-picker.js +656 -57
  9. package/es/date-range-picker/src/date-range-picker.js +23 -8
  10. package/es/drawer/src/drawer.js +3 -0
  11. package/es/form/render/index.js +3 -2
  12. package/es/form/src/form.js +11 -12
  13. package/es/form/src/itemInfo.js +6 -5
  14. package/es/image/src/image.js +5 -6
  15. package/es/input/src/input.js +2 -1
  16. package/es/layout-body/src/layout-body.js +13 -6
  17. package/es/list/src/list.js +3 -6
  18. package/es/menu/src/menu.js +2 -1
  19. package/es/modal/src/modal.js +5 -1
  20. package/es/number-input/src/number-input.js +2 -3
  21. package/es/pager/src/pager.js +4 -3
  22. package/es/radio/src/group.js +11 -8
  23. package/es/select/src/select.js +34 -30
  24. package/es/splitter/src/splitter.js +12 -6
  25. package/es/table-select/src/table-select.js +27 -22
  26. package/es/tabs/src/tabs.js +4 -3
  27. package/es/textarea/src/textarea.js +2 -1
  28. package/es/tree/src/tree.js +6 -11
  29. package/es/tree-select/src/tree-select.js +5 -7
  30. package/es/ui/index.js +1 -1
  31. package/es/ui/src/log.js +7 -1
  32. package/es/upload/src/upload.js +11 -9
  33. package/lib/backtop/src/backtop.js +10 -6
  34. package/lib/backtop/src/backtop.min.js +1 -1
  35. package/lib/button/src/button.js +3 -1
  36. package/lib/button/src/button.min.js +1 -1
  37. package/lib/calendar/src/calendar.js +3 -1
  38. package/lib/calendar/src/calendar.min.js +1 -1
  39. package/lib/cascader/src/cascader.js +7 -6
  40. package/lib/cascader/src/cascader.min.js +1 -1
  41. package/lib/checkbox/src/group.js +18 -6
  42. package/lib/checkbox/src/group.min.js +1 -1
  43. package/lib/context-menu/src/context-menu.js +3 -4
  44. package/lib/context-menu/src/context-menu.min.js +1 -1
  45. package/lib/date-panel/src/util.js +37 -5
  46. package/lib/date-panel/src/util.min.js +1 -1
  47. package/lib/date-picker/src/date-picker.js +698 -55
  48. package/lib/date-picker/src/date-picker.min.js +1 -1
  49. package/lib/date-range-picker/src/date-range-picker.js +21 -7
  50. package/lib/date-range-picker/src/date-range-picker.min.js +1 -1
  51. package/lib/drawer/src/drawer.js +3 -0
  52. package/lib/drawer/src/drawer.min.js +1 -1
  53. package/lib/form/render/index.js +3 -1
  54. package/lib/form/render/index.min.js +1 -1
  55. package/lib/form/src/form.js +12 -8
  56. package/lib/form/src/form.min.js +1 -1
  57. package/lib/form/src/itemInfo.js +6 -4
  58. package/lib/form/src/itemInfo.min.js +1 -1
  59. package/lib/image/src/image.js +7 -5
  60. package/lib/image/src/image.min.js +1 -1
  61. package/lib/index.umd.js +1051 -217
  62. package/lib/index.umd.min.js +1 -1
  63. package/lib/input/src/input.js +5 -3
  64. package/lib/input/src/input.min.js +1 -1
  65. package/lib/layout-body/src/layout-body.js +13 -4
  66. package/lib/layout-body/src/layout-body.min.js +1 -1
  67. package/lib/list/src/list.js +4 -5
  68. package/lib/list/src/list.min.js +1 -1
  69. package/lib/menu/src/menu.js +3 -1
  70. package/lib/menu/src/menu.min.js +1 -1
  71. package/lib/modal/src/modal.js +8 -2
  72. package/lib/modal/src/modal.min.js +1 -1
  73. package/lib/number-input/src/number-input.js +2 -3
  74. package/lib/pager/src/pager.js +5 -2
  75. package/lib/pager/src/pager.min.js +1 -1
  76. package/lib/radio/src/group.js +13 -6
  77. package/lib/radio/src/group.min.js +1 -1
  78. package/lib/select/src/select.js +36 -29
  79. package/lib/select/src/select.min.js +1 -1
  80. package/lib/splitter/src/splitter.js +15 -7
  81. package/lib/splitter/src/splitter.min.js +1 -1
  82. package/lib/table-select/src/table-select.js +27 -19
  83. package/lib/table-select/src/table-select.min.js +1 -1
  84. package/lib/tabs/src/tabs.js +6 -3
  85. package/lib/tabs/src/tabs.min.js +1 -1
  86. package/lib/textarea/src/textarea.js +3 -1
  87. package/lib/textarea/src/textarea.min.js +1 -1
  88. package/lib/tree/src/tree.js +9 -8
  89. package/lib/tree/src/tree.min.js +1 -1
  90. package/lib/tree-select/src/tree-select.js +10 -8
  91. package/lib/tree-select/src/tree-select.min.js +1 -1
  92. package/lib/ui/index.js +1 -1
  93. package/lib/ui/index.min.js +1 -1
  94. package/lib/ui/src/log.js +8 -1
  95. package/lib/ui/src/log.min.js +1 -1
  96. package/lib/upload/src/upload.js +22 -7
  97. package/lib/upload/src/upload.min.js +1 -1
  98. package/package.json +1 -1
  99. package/packages/backtop/src/backtop.ts +11 -3
  100. package/packages/button/src/button.ts +4 -2
  101. package/packages/calendar/src/calendar.ts +3 -1
  102. package/packages/cascader/src/cascader.ts +9 -4
  103. package/packages/checkbox/src/group.ts +22 -5
  104. package/packages/context-menu/src/context-menu.ts +5 -2
  105. package/packages/date-panel/src/util.ts +28 -3
  106. package/packages/date-picker/src/date-picker.ts +673 -60
  107. package/packages/date-range-picker/src/date-range-picker.ts +22 -8
  108. package/packages/drawer/src/drawer.ts +3 -0
  109. package/packages/form/render/index.ts +4 -2
  110. package/packages/form/src/form.ts +14 -7
  111. package/packages/form/src/itemInfo.ts +7 -5
  112. package/packages/image/src/image.ts +9 -3
  113. package/packages/input/src/input.ts +3 -1
  114. package/packages/layout-body/src/layout-body.ts +16 -2
  115. package/packages/list/src/list.ts +6 -3
  116. package/packages/menu/src/menu.ts +3 -1
  117. package/packages/modal/src/modal.ts +6 -1
  118. package/packages/number-input/src/number-input.ts +2 -6
  119. package/packages/pager/src/pager.ts +5 -3
  120. package/packages/radio/src/group.ts +16 -5
  121. package/packages/select/src/select.ts +41 -29
  122. package/packages/splitter/src/splitter.ts +13 -6
  123. package/packages/table-select/src/table-select.ts +31 -20
  124. package/packages/tabs/src/tabs.ts +5 -3
  125. package/packages/textarea/src/textarea.ts +3 -1
  126. package/packages/tree/src/tree.ts +9 -4
  127. package/packages/tree-select/src/tree-select.ts +9 -4
  128. package/packages/ui/src/log.ts +7 -0
  129. package/packages/upload/src/upload.ts +16 -6
  130. package/types/components/date-picker.d.ts +27 -1
  131. package/types/components/date-range-picker.d.ts +4 -0
  132. package/types/components/drawer.d.ts +2 -0
  133. package/types/components/modal.d.ts +2 -0
  134. package/types/components/splitter.d.ts +1 -0
  135. package/types/components/table.d.ts +33 -4
  136. package/types/components/upload.d.ts +28 -1
  137. /package/es/icon/{iconfont.1781675403709.ttf → iconfont.1781852732213.ttf} +0 -0
  138. /package/es/icon/{iconfont.1781675403709.woff → iconfont.1781852732213.woff} +0 -0
  139. /package/es/icon/{iconfont.1781675403709.woff2 → iconfont.1781852732213.woff2} +0 -0
  140. /package/es/{iconfont.1781675403709.ttf → iconfont.1781852732213.ttf} +0 -0
  141. /package/es/{iconfont.1781675403709.woff → iconfont.1781852732213.woff} +0 -0
  142. /package/es/{iconfont.1781675403709.woff2 → iconfont.1781852732213.woff2} +0 -0
  143. /package/lib/icon/style/{iconfont.1781675403709.ttf → iconfont.1781852732213.ttf} +0 -0
  144. /package/lib/icon/style/{iconfont.1781675403709.woff → iconfont.1781852732213.woff} +0 -0
  145. /package/lib/icon/style/{iconfont.1781675403709.woff2 → iconfont.1781852732213.woff2} +0 -0
  146. /package/lib/{iconfont.1781675403709.ttf → iconfont.1781852732213.ttf} +0 -0
  147. /package/lib/{iconfont.1781675403709.woff → iconfont.1781852732213.woff} +0 -0
  148. /package/lib/{iconfont.1781675403709.woff2 → iconfont.1781852732213.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, hasDateValueType, hasTimestampValueType } from '../../date-panel/src/util';
8
- import { errLog } from '../../ui/src/log';
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: [
@@ -107,6 +134,7 @@ export default {
107
134
  type: Boolean,
108
135
  default: () => getConfig().datePicker.autoClose
109
136
  },
137
+ maskedConfig: Object,
110
138
  prefixIcon: String,
111
139
  suffixIcon: String,
112
140
  placement: String,
@@ -146,25 +174,9 @@ export default {
146
174
  },
147
175
  data() {
148
176
  const xID = XEUtils.uniqueId();
149
- const reactData = {
150
- initialized: false,
151
- panelIndex: 0,
152
- visiblePanel: false,
153
- isAniVisible: false,
154
- panelStyle: {},
155
- panelPlacement: '',
156
- isActivated: false,
157
- inputValue: '',
158
- inputLabel: ''
159
- };
160
- const internalData = {
161
- hpTimeout: undefined
162
- };
163
- return {
164
- xID,
165
- reactData,
166
- internalData
167
- };
177
+ const reactData = createReactData();
178
+ return Object.assign(Object.assign({}, {}), { xID,
179
+ reactData });
168
180
  },
169
181
  computed: Object.assign(Object.assign({}, {}), { computeBtnTransfer() {
170
182
  const $xeDatePicker = this;
@@ -232,6 +244,53 @@ export default {
232
244
  const props = $xeDatePicker;
233
245
  return props.clearable;
234
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
+ },
235
294
  computeInputReadonly() {
236
295
  const $xeDatePicker = this;
237
296
  const props = $xeDatePicker;
@@ -298,6 +357,11 @@ export default {
298
357
  const { type, valueFormat } = props;
299
358
  return handleValueFormat(type, valueFormat);
300
359
  },
360
+ computeDateMaskedFormat() {
361
+ const $xeDatePicker = this;
362
+ const dateLabelFormat = $xeDatePicker.computeDateLabelFormat;
363
+ return dateLabelFormat;
364
+ },
301
365
  computeFirstDayOfWeek() {
302
366
  const $xeDatePicker = this;
303
367
  const props = $xeDatePicker;
@@ -322,6 +386,17 @@ export default {
322
386
  });
323
387
  return dateObj.label;
324
388
  }).join(', ');
389
+ },
390
+ computeMaskedOpts() {
391
+ const $xeDatePicker = this;
392
+ const props = $xeDatePicker;
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] : '') || '*';
325
400
  } }),
326
401
  methods: {
327
402
  //
@@ -357,6 +432,15 @@ export default {
357
432
  }
358
433
  reactData.inputValue = val;
359
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
+ },
360
444
  triggerEvent(evnt) {
361
445
  const $xeDatePicker = this;
362
446
  const reactData = $xeDatePicker.reactData;
@@ -408,10 +492,9 @@ export default {
408
492
  },
409
493
  inputEvent(evnt) {
410
494
  const $xeDatePicker = this;
411
- const reactData = $xeDatePicker.reactData;
412
495
  const inputElem = evnt.target;
413
496
  const value = inputElem.value;
414
- reactData.inputLabel = value;
497
+ $xeDatePicker.handleInputLabel(value, true);
415
498
  $xeDatePicker.dispatchEvent('input', { value }, evnt);
416
499
  },
417
500
  changeEvent(evnt) {
@@ -421,17 +504,6 @@ export default {
421
504
  $xeDatePicker.triggerEvent(evnt);
422
505
  }
423
506
  },
424
- focusEvent(evnt) {
425
- const $xeDatePicker = this;
426
- const reactData = $xeDatePicker.reactData;
427
- const popupOpts = $xeDatePicker.computePopupOpts;
428
- const { trigger } = popupOpts;
429
- reactData.isActivated = true;
430
- if (!trigger || trigger === 'default') {
431
- $xeDatePicker.datePickerOpenEvent(evnt);
432
- }
433
- $xeDatePicker.triggerEvent(evnt);
434
- },
435
507
  clickPrefixEvent(evnt) {
436
508
  const $xeDatePicker = this;
437
509
  const reactData = $xeDatePicker.reactData;
@@ -453,6 +525,114 @@ export default {
453
525
  }, 350);
454
526
  });
455
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
+ },
456
636
  clearValueEvent(evnt, value) {
457
637
  const $xeDatePicker = this;
458
638
  const isDatePickerType = $xeDatePicker.computeIsDatePickerType;
@@ -471,9 +651,311 @@ export default {
471
651
  $xeDatePicker.dispatchEvent('suffix-click', { value: inputValue }, evnt);
472
652
  }
473
653
  },
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) {
729
+ const $xeDatePicker = this;
730
+ const props = $xeDatePicker;
731
+ const internalData = $xeDatePicker.internalData;
732
+ const { multiple } = props;
733
+ if (multiple) {
734
+ return;
735
+ }
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)) {
874
+ return;
875
+ }
876
+ const targetElem = $xeDatePicker.$refs.refInputTarget;
877
+ if (!targetElem) {
878
+ return;
879
+ }
880
+ const { laseFocusMasked } = internalData;
881
+ if (laseFocusMasked && Date.now() - laseFocusMasked < 100) {
882
+ return;
883
+ }
884
+ const dateMaskedFormat = $xeDatePicker.computeDateMaskedFormat;
885
+ const maskChar = $xeDatePicker.computeMaskChar;
886
+ const selectionStart = targetElem.selectionStart || 0;
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];
939
+ if (!parseInputKayMaps[selectKey]) {
940
+ selectKey = dateMaskedFormat[selectionStart - 1];
941
+ }
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
+ }
953
+ }
954
+ },
474
955
  blurEvent(evnt) {
475
956
  const $xeDatePicker = this;
476
957
  const reactData = $xeDatePicker.reactData;
958
+ const internalData = $xeDatePicker.internalData;
477
959
  const $xeForm = $xeDatePicker.$xeForm;
478
960
  const formItemInfo = $xeDatePicker.formItemInfo;
479
961
  const $datePanel = $xeDatePicker.$refs.refDatePanel;
@@ -484,10 +966,14 @@ export default {
484
966
  $xeDatePicker.handleChange(value, evnt);
485
967
  }
486
968
  if (!reactData.visiblePanel) {
969
+ const { inputLabel } = internalData;
487
970
  reactData.isActivated = false;
488
971
  // 未打开面板时才校验
489
972
  if ($datePanel) {
490
- $datePanel.checkValue(reactData.inputLabel);
973
+ $datePanel.checkValue(inputLabel);
974
+ }
975
+ else {
976
+ $xeDatePicker.afterCheckValue(inputLabel);
491
977
  }
492
978
  }
493
979
  $xeDatePicker.dispatchEvent('blur', { value }, evnt);
@@ -496,8 +982,90 @@ export default {
496
982
  $xeForm.triggerItemEvent(evnt, formItemInfo.itemConfig.field, value);
497
983
  }
498
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
+ },
499
1027
  keydownEvent(evnt) {
500
1028
  const $xeDatePicker = this;
1029
+ const props = $xeDatePicker;
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;
1035
+ const isUpArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_UP);
1036
+ const isDwArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_DOWN);
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
+ }
1068
+ }
501
1069
  $xeDatePicker.triggerEvent(evnt);
502
1070
  },
503
1071
  keyupEvent(evnt) {
@@ -531,25 +1099,32 @@ export default {
531
1099
  },
532
1100
  panelRevertEvent(params) {
533
1101
  const $xeDatePicker = this;
534
- const reactData = $xeDatePicker.reactData;
535
- reactData.inputLabel = params.label;
1102
+ $xeDatePicker.handleInputLabel(params.label, true);
536
1103
  },
537
1104
  // 全局事件
538
1105
  handleGlobalMousedownEvent(evnt) {
539
1106
  const $xeDatePicker = this;
540
1107
  const reactData = $xeDatePicker.reactData;
1108
+ const internalData = $xeDatePicker.internalData;
541
1109
  const $datePanel = $xeDatePicker.$refs.refDatePanel;
542
1110
  const { visiblePanel, isActivated } = reactData;
543
1111
  const el = $xeDatePicker.$refs.refElem;
544
1112
  const panelWrapperElem = $xeDatePicker.$refs.refPanelWrapper;
545
1113
  const isDisabled = $xeDatePicker.computeIsDisabled;
546
1114
  if (!isDisabled && isActivated) {
547
- reactData.isActivated = getEventTargetNode(evnt, el).flag || getEventTargetNode(evnt, panelWrapperElem).flag;
548
- if (!reactData.isActivated) {
1115
+ const currActivated = getEventTargetNode(evnt, el).flag || getEventTargetNode(evnt, panelWrapperElem).flag;
1116
+ if (currActivated !== isActivated) {
1117
+ reactData.isActivated = currActivated;
1118
+ }
1119
+ if (!currActivated) {
549
1120
  if (visiblePanel) {
550
1121
  $xeDatePicker.hidePanel();
1122
+ const { inputLabel } = internalData;
551
1123
  if ($datePanel) {
552
- $datePanel.checkValue(reactData.inputLabel);
1124
+ $datePanel.checkValue(inputLabel);
1125
+ }
1126
+ else {
1127
+ $xeDatePicker.afterCheckValue(inputLabel);
553
1128
  }
554
1129
  }
555
1130
  }
@@ -593,6 +1168,7 @@ export default {
593
1168
  handleGlobalBlurEvent() {
594
1169
  const $xeDatePicker = this;
595
1170
  const reactData = $xeDatePicker.reactData;
1171
+ const internalData = $xeDatePicker.internalData;
596
1172
  const $datePanel = $xeDatePicker.$refs.refDatePanel;
597
1173
  const { isActivated, visiblePanel } = reactData;
598
1174
  if (visiblePanel) {
@@ -603,7 +1179,7 @@ export default {
603
1179
  }
604
1180
  if (visiblePanel || isActivated) {
605
1181
  if ($datePanel) {
606
- $datePanel.checkValue(reactData.inputLabel);
1182
+ $datePanel.checkValue(internalData.inputLabel);
607
1183
  }
608
1184
  const targetElem = $xeDatePicker.$refs.refInputTarget;
609
1185
  if (targetElem) {
@@ -641,6 +1217,9 @@ export default {
641
1217
  const { panelIndex } = reactData;
642
1218
  const targetElem = $xeDatePicker.$refs.refInputTarget;
643
1219
  const panelElem = $xeDatePicker.$refs.refInputPanel;
1220
+ if (!panelElem) {
1221
+ return $xeDatePicker.$nextTick();
1222
+ }
644
1223
  const btnTransfer = $xeDatePicker.computeBtnTransfer;
645
1224
  const popupOpts = $xeDatePicker.computePopupOpts;
646
1225
  const handleStyle = () => {
@@ -669,10 +1248,8 @@ export default {
669
1248
  if (!isDisabled && !visiblePanel) {
670
1249
  if (!reactData.initialized) {
671
1250
  reactData.initialized = true;
672
- if (btnTransfer) {
673
- if (panelElem) {
674
- document.body.appendChild(panelElem);
675
- }
1251
+ if (btnTransfer && panelElem) {
1252
+ document.body.appendChild(panelElem);
676
1253
  }
677
1254
  }
678
1255
  if (internalData.hpTimeout) {
@@ -700,16 +1277,19 @@ export default {
700
1277
  },
701
1278
  clickIconEvent(evnt) {
702
1279
  const $xeDatePicker = this;
1280
+ const reactData = $xeDatePicker.reactData;
1281
+ const { visiblePanel } = reactData;
703
1282
  const popupOpts = $xeDatePicker.computePopupOpts;
704
1283
  const { trigger } = popupOpts;
705
1284
  if (!trigger || trigger === 'default' || trigger === 'icon') {
706
- $xeDatePicker.datePickerOpenEvent(evnt);
1285
+ if (visiblePanel) {
1286
+ $xeDatePicker.hidePanel();
1287
+ }
1288
+ else {
1289
+ $xeDatePicker.datePickerOpenEvent(evnt);
1290
+ }
707
1291
  }
708
1292
  },
709
- clickEvent(evnt) {
710
- const $xeDatePicker = this;
711
- $xeDatePicker.triggerEvent(evnt);
712
- },
713
1293
  handleShortcutEvent({ option, $event }) {
714
1294
  const $xeDatePicker = this;
715
1295
  const props = $xeDatePicker;
@@ -751,7 +1331,7 @@ export default {
751
1331
  break;
752
1332
  }
753
1333
  default:
754
- errLog('vxe.error.notCommands', [`[date-picker] ${code}`]);
1334
+ errLog('vxe.error.notCommands', [code]);
755
1335
  break;
756
1336
  }
757
1337
  }
@@ -833,6 +1413,10 @@ export default {
833
1413
  const props = $xeDatePicker;
834
1414
  const slots = $xeDatePicker.$scopedSlots;
835
1415
  const reactData = $xeDatePicker.reactData;
1416
+ const popupOpts = $xeDatePicker.computePopupOpts;
1417
+ if (popupOpts.enabled === false) {
1418
+ return renderEmptyElement($xeDatePicker);
1419
+ }
836
1420
  const { type, multiple, showClearButton, showConfirmButton } = props;
837
1421
  const { initialized, isAniVisible, visiblePanel, panelPlacement, panelStyle, inputValue } = reactData;
838
1422
  const vSize = $xeDatePicker.computeSize;
@@ -842,7 +1426,6 @@ export default {
842
1426
  const isDateTimeType = $xeDatePicker.computeIsDateTimeType;
843
1427
  const shortcutList = $xeDatePicker.computeShortcutList;
844
1428
  const timeOpts = $xeDatePicker.computeTimeOpts;
845
- const popupOpts = $xeDatePicker.computePopupOpts;
846
1429
  const { position } = shortcutOpts;
847
1430
  const headerSlot = slots.header;
848
1431
  const footerSlot = slots.footer;
@@ -1071,8 +1654,10 @@ export default {
1071
1654
  const $xeDatePicker = this;
1072
1655
  const props = $xeDatePicker;
1073
1656
  const reactData = $xeDatePicker.reactData;
1657
+ const internalData = $xeDatePicker.internalData;
1074
1658
  const { className, type, name, autoComplete } = props;
1075
- const { inputValue, inputLabel, visiblePanel, isActivated } = reactData;
1659
+ const { inputValue, visiblePanel, isActivated, labelFlag } = reactData;
1660
+ const { inputLabel } = internalData;
1076
1661
  const vSize = $xeDatePicker.computeSize;
1077
1662
  const isDisabled = $xeDatePicker.computeIsDisabled;
1078
1663
  const formReadonly = $xeDatePicker.computeFormReadonly;
@@ -1111,7 +1696,7 @@ export default {
1111
1696
  ref: 'refInputTarget',
1112
1697
  class: 'vxe-date-picker--inner',
1113
1698
  domProps: {
1114
- value: inputLabel
1699
+ value: labelFlag ? inputLabel : ''
1115
1700
  },
1116
1701
  attrs: {
1117
1702
  name,
@@ -1141,8 +1726,7 @@ export default {
1141
1726
  watch: {
1142
1727
  computePanelLabel(val) {
1143
1728
  const $xeDatePicker = this;
1144
- const reactData = $xeDatePicker.reactData;
1145
- reactData.inputLabel = val;
1729
+ $xeDatePicker.handleInputLabel(val, true);
1146
1730
  },
1147
1731
  value() {
1148
1732
  const $xeDatePicker = this;
@@ -1151,6 +1735,17 @@ export default {
1151
1735
  },
1152
1736
  created() {
1153
1737
  const $xeDatePicker = this;
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
+ }
1154
1749
  $xeDatePicker.updateModelValue();
1155
1750
  globalEvents.on($xeDatePicker, 'mousewheel', $xeDatePicker.handleGlobalMousewheelEvent);
1156
1751
  globalEvents.on($xeDatePicker, 'mousedown', $xeDatePicker.handleGlobalMousedownEvent);
@@ -1160,6 +1755,8 @@ export default {
1160
1755
  },
1161
1756
  beforeDestroy() {
1162
1757
  const $xeDatePicker = this;
1758
+ const reactData = $xeDatePicker.reactData;
1759
+ const internalData = $xeDatePicker.internalData;
1163
1760
  const panelElem = $xeDatePicker.$refs.refInputPanel;
1164
1761
  if (panelElem && panelElem.parentNode) {
1165
1762
  panelElem.parentNode.removeChild(panelElem);
@@ -1168,6 +1765,8 @@ export default {
1168
1765
  globalEvents.off($xeDatePicker, 'mousedown');
1169
1766
  globalEvents.off($xeDatePicker, 'blur');
1170
1767
  globalEvents.off($xeDatePicker, 'resize');
1768
+ XEUtils.assign(reactData, createReactData());
1769
+ XEUtils.assign(internalData, createInternalData());
1171
1770
  },
1172
1771
  render(h) {
1173
1772
  return this.renderVN(h);