vxe-pc-ui 3.15.23 → 3.15.25

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 (51) hide show
  1. package/es/date-panel/src/date-panel.js +96 -53
  2. package/es/date-panel/src/util.js +40 -3
  3. package/es/date-picker/src/date-picker.js +20 -13
  4. package/es/date-range-picker/src/date-range-picker.js +296 -132
  5. package/es/icon/style.css +1 -1
  6. package/es/style.css +1 -1
  7. package/es/style.min.css +1 -1
  8. package/es/tooltip/src/tooltip.js +34 -21
  9. package/es/ui/index.js +1 -1
  10. package/es/ui/src/log.js +1 -1
  11. package/lib/date-panel/src/date-panel.js +110 -54
  12. package/lib/date-panel/src/date-panel.min.js +1 -1
  13. package/lib/date-panel/src/util.js +43 -5
  14. package/lib/date-panel/src/util.min.js +1 -1
  15. package/lib/date-picker/src/date-picker.js +20 -13
  16. package/lib/date-picker/src/date-picker.min.js +1 -1
  17. package/lib/date-range-picker/src/date-range-picker.js +318 -139
  18. package/lib/date-range-picker/src/date-range-picker.min.js +1 -1
  19. package/lib/icon/style/style.css +1 -1
  20. package/lib/icon/style/style.min.css +1 -1
  21. package/lib/index.umd.js +538 -240
  22. package/lib/index.umd.min.js +1 -1
  23. package/lib/style.css +1 -1
  24. package/lib/style.min.css +1 -1
  25. package/lib/tooltip/src/tooltip.js +36 -21
  26. package/lib/tooltip/src/tooltip.min.js +1 -1
  27. package/lib/ui/index.js +1 -1
  28. package/lib/ui/index.min.js +1 -1
  29. package/lib/ui/src/log.js +1 -1
  30. package/lib/ui/src/log.min.js +1 -1
  31. package/package.json +1 -1
  32. package/packages/date-panel/src/date-panel.ts +102 -54
  33. package/packages/date-panel/src/util.ts +42 -3
  34. package/packages/date-picker/src/date-picker.ts +21 -13
  35. package/packages/date-range-picker/src/date-range-picker.ts +296 -131
  36. package/packages/tooltip/src/tooltip.ts +41 -20
  37. package/types/components/date-panel.d.ts +18 -3
  38. package/types/components/date-range-picker.d.ts +5 -3
  39. package/types/components/tooltip.d.ts +1 -1
  40. /package/es/icon/{iconfont.1783073807010.ttf → iconfont.1783247770465.ttf} +0 -0
  41. /package/es/icon/{iconfont.1783073807010.woff → iconfont.1783247770465.woff} +0 -0
  42. /package/es/icon/{iconfont.1783073807010.woff2 → iconfont.1783247770465.woff2} +0 -0
  43. /package/es/{iconfont.1783073807010.ttf → iconfont.1783247770465.ttf} +0 -0
  44. /package/es/{iconfont.1783073807010.woff → iconfont.1783247770465.woff} +0 -0
  45. /package/es/{iconfont.1783073807010.woff2 → iconfont.1783247770465.woff2} +0 -0
  46. /package/lib/icon/style/{iconfont.1783073807010.ttf → iconfont.1783247770465.ttf} +0 -0
  47. /package/lib/icon/style/{iconfont.1783073807010.woff → iconfont.1783247770465.woff} +0 -0
  48. /package/lib/icon/style/{iconfont.1783073807010.woff2 → iconfont.1783247770465.woff2} +0 -0
  49. /package/lib/{iconfont.1783073807010.ttf → iconfont.1783247770465.ttf} +0 -0
  50. /package/lib/{iconfont.1783073807010.woff → iconfont.1783247770465.woff} +0 -0
  51. /package/lib/{iconfont.1783073807010.woff2 → iconfont.1783247770465.woff2} +0 -0
@@ -3,13 +3,34 @@ import XEUtils from 'xe-utils';
3
3
  import { getConfig, getIcon, getI18n, commands, globalEvents, createEvent, GLOBAL_EVENT_KEYS, globalMixins, renderEmptyElement } from '../../ui';
4
4
  import { getFuncText, getLastZIndex, nextZIndex, isEnableConf } from '../../ui/src/utils';
5
5
  import { updatePanelPlacement, getEventTargetNode } from '../../ui/src/dom';
6
- import { parseDateString, parseDateObj, getRangeDateByCode, handleValueFormat, hasTimestampValueType, hasDateValueType, parseDateValue } from '../../date-panel/src/util';
6
+ import { parseDateString, parseDateObj, getRangeDateByCode, handleValueFormat, hasTimestampValueType, hasDateValueType, parseDateValue, getNextMonth, getPrevMonth, getNextYear, getPrevYear } from '../../date-panel/src/util';
7
7
  import { getSlotVNs } from '../../ui/src/vn';
8
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
12
  const { errLog } = createComponentLog('date-range-picker');
13
+ function createReactData() {
14
+ return {
15
+ initialized: false,
16
+ panelIndex: 0,
17
+ visiblePanel: false,
18
+ isAniVisible: false,
19
+ panelStyle: {},
20
+ panelPlacement: '',
21
+ isActivated: false,
22
+ selectStValue: '',
23
+ selectEdValue: '',
24
+ paneStartVal: [],
25
+ paneEndVal: []
26
+ };
27
+ }
28
+ function createInternalData() {
29
+ return {
30
+ // selectStatus: false
31
+ // hpTimeout: undefined
32
+ };
33
+ }
13
34
  export default {
14
35
  name: 'VxeDateRangePicker',
15
36
  mixins: [
@@ -150,26 +171,9 @@ export default {
150
171
  },
151
172
  data() {
152
173
  const xID = XEUtils.uniqueId();
153
- const reactData = {
154
- initialized: false,
155
- panelIndex: 0,
156
- visiblePanel: false,
157
- isAniVisible: false,
158
- panelStyle: {},
159
- panelPlacement: '',
160
- isActivated: false,
161
- startValue: '',
162
- endValue: ''
163
- };
164
- const internalData = {
165
- // selectStatus: false
166
- // hpTimeout: undefined
167
- };
168
- return {
169
- xID,
170
- reactData,
171
- internalData
172
- };
174
+ const reactData = createReactData();
175
+ return Object.assign(Object.assign({}, {}), { xID,
176
+ reactData });
173
177
  },
174
178
  computed: Object.assign(Object.assign({}, {}), { computeBtnTransfer() {
175
179
  const $xeDateRangePicker = this;
@@ -256,11 +260,18 @@ export default {
256
260
  const { startValue, endValue } = props;
257
261
  return `${startValue || ''}${endValue || ''}`;
258
262
  },
259
- computeIsDateTimeType() {
263
+ computeIsTimeType() {
264
+ const $xeDateRangePicker = this;
265
+ const props = $xeDateRangePicker;
266
+ const { type } = props;
267
+ return type === 'time';
268
+ },
269
+ computeIsTimeOrDateTimeType() {
260
270
  const $xeDateRangePicker = this;
261
271
  const props = $xeDateRangePicker;
262
272
  const { type } = props;
263
- return type === 'time' || type === 'datetime';
273
+ const isTimeType = $xeDateRangePicker.computeIsTimeType;
274
+ return isTimeType || type === 'datetime';
264
275
  },
265
276
  computeIsDatePickerType() {
266
277
  const $xeDateRangePicker = this;
@@ -340,8 +351,8 @@ export default {
340
351
  computePanelLabelObj() {
341
352
  const $xeDateRangePicker = this;
342
353
  const reactData = $xeDateRangePicker.reactData;
343
- const { startValue, endValue } = reactData;
344
- const vals = startValue || endValue ? [startValue || '', endValue || ''] : [];
354
+ const { selectStValue, selectEdValue } = reactData;
355
+ const vals = selectStValue || selectEdValue ? [selectStValue || '', selectEdValue || ''] : [];
345
356
  return $xeDateRangePicker.formatRangeLabel(vals);
346
357
  },
347
358
  computeInputLabel() {
@@ -465,7 +476,7 @@ export default {
465
476
  const $xeDateRangePicker = this;
466
477
  const props = $xeDateRangePicker;
467
478
  const reactData = $xeDateRangePicker.reactData;
468
- const { value: modelValue, startValue, endValue } = props;
479
+ const { value: modelValue, startValue, endValue, valueFormat } = props;
469
480
  let restObj = {
470
481
  sValue: '',
471
482
  eValue: ''
@@ -486,15 +497,27 @@ export default {
486
497
  restObj = $xeDateRangePicker.paraeUpdateModel();
487
498
  }
488
499
  }
489
- reactData.startValue = restObj.sValue;
490
- reactData.endValue = restObj.eValue;
500
+ let startRest = restObj.sValue;
501
+ let endRest = restObj.eValue;
502
+ if (valueFormat === 'timestamp') {
503
+ if (XEUtils.isString(startRest) && /^\d+$/.test(startRest)) {
504
+ startRest = Number(startRest);
505
+ }
506
+ if (XEUtils.isString(endRest) && /^\d+$/.test(endRest)) {
507
+ endRest = Number(endRest);
508
+ }
509
+ }
510
+ reactData.selectStValue = startRest;
511
+ reactData.selectEdValue = endRest;
512
+ reactData.paneEndVal = [startRest, endRest];
513
+ reactData.paneStartVal = [startRest, endRest];
491
514
  },
492
515
  triggerEvent(evnt) {
493
516
  const $xeDateRangePicker = this;
494
517
  const reactData = $xeDateRangePicker.reactData;
495
- const { startValue, endValue } = reactData;
496
- const value = $xeDateRangePicker.getRangeValue(startValue, endValue);
497
- $xeDateRangePicker.dispatchEvent(evnt.type, { value, startValue, endValue }, evnt);
518
+ const { selectStValue, selectEdValue } = reactData;
519
+ const value = $xeDateRangePicker.getRangeValue(selectStValue, selectEdValue);
520
+ $xeDateRangePicker.dispatchEvent(evnt.type, { value, startValue: selectStValue, endValue: selectEdValue }, evnt);
498
521
  },
499
522
  handleChange(sValue, eValue, evnt) {
500
523
  const $xeDateRangePicker = this;
@@ -524,8 +547,8 @@ export default {
524
547
  endRest = parseDateValue(endRest, type, { valueFormat: dateValueFormat });
525
548
  }
526
549
  }
527
- reactData.startValue = startRest;
528
- reactData.endValue = endRest;
550
+ reactData.selectStValue = startRest;
551
+ reactData.selectEdValue = endRest;
529
552
  const value = $xeDateRangePicker.getRangeValue(startRest, endRest);
530
553
  const isFinish = (startRest && endRest) || (!startRest && !endRest);
531
554
  $xeDateRangePicker.$emit('update:modelValue', value);
@@ -565,9 +588,9 @@ export default {
565
588
  const reactData = $xeDateRangePicker.reactData;
566
589
  const isDisabled = $xeDateRangePicker.computeIsDisabled;
567
590
  if (!isDisabled) {
568
- const { startValue, endValue } = reactData;
569
- const value = $xeDateRangePicker.getRangeValue(startValue, endValue);
570
- $xeDateRangePicker.dispatchEvent('prefix-click', { value, startValue, endValue }, evnt);
591
+ const { selectStValue, selectEdValue } = reactData;
592
+ const value = $xeDateRangePicker.getRangeValue(selectStValue, selectEdValue);
593
+ $xeDateRangePicker.dispatchEvent('prefix-click', { value, startValue: selectStValue, endValue: selectEdValue }, evnt);
571
594
  }
572
595
  },
573
596
  hidePanel() {
@@ -608,8 +631,8 @@ export default {
608
631
  panelCellClassName({ date }) {
609
632
  const $xeDateRangePicker = this;
610
633
  const reactData = $xeDateRangePicker.reactData;
611
- const startValue = reactData.startValue;
612
- const endValue = reactData.endValue;
634
+ const startValue = reactData.selectStValue;
635
+ const endValue = reactData.selectEdValue;
613
636
  if (startValue && endValue) {
614
637
  const currTime = date.getTime();
615
638
  const startTime = XEUtils.toStringDate(startValue).getTime();
@@ -626,18 +649,18 @@ export default {
626
649
  const reactData = $xeDateRangePicker.reactData;
627
650
  const internalData = $xeDateRangePicker.internalData;
628
651
  const { autoClose } = props;
629
- const { startValue, endValue } = reactData;
652
+ const { selectStValue, selectEdValue } = reactData;
630
653
  const { selectStatus } = internalData;
631
654
  const isDatePickerType = $xeDateRangePicker.computeIsDatePickerType;
632
655
  if (autoClose) {
633
656
  if (selectStatus && isDatePickerType) {
634
- if (startValue && endValue) {
657
+ if (selectStValue && selectEdValue) {
635
658
  $xeDateRangePicker.hidePanel();
636
659
  }
637
660
  }
638
661
  }
639
662
  else {
640
- if (startValue && endValue) {
663
+ if (selectStValue && selectEdValue) {
641
664
  internalData.selectStatus = false;
642
665
  }
643
666
  }
@@ -647,9 +670,9 @@ export default {
647
670
  const reactData = $xeDateRangePicker.reactData;
648
671
  const isDisabled = $xeDateRangePicker.computeIsDisabled;
649
672
  if (!isDisabled) {
650
- const { startValue, endValue } = reactData;
651
- const value = $xeDateRangePicker.getRangeValue(startValue, endValue);
652
- $xeDateRangePicker.dispatchEvent('suffix-click', { value, startValue, endValue }, evnt);
673
+ const { selectStValue, selectEdValue } = reactData;
674
+ const value = $xeDateRangePicker.getRangeValue(selectStValue, selectEdValue);
675
+ $xeDateRangePicker.dispatchEvent('suffix-click', { value, startValue: selectStValue, endValue: selectEdValue }, evnt);
653
676
  }
654
677
  },
655
678
  blurEvent(evnt) {
@@ -657,16 +680,16 @@ export default {
657
680
  const reactData = $xeDateRangePicker.reactData;
658
681
  const $xeForm = $xeDateRangePicker.$xeForm;
659
682
  const formItemInfo = $xeDateRangePicker.formItemInfo;
660
- const { startValue, endValue } = reactData;
683
+ const { selectStValue, selectEdValue } = reactData;
661
684
  const inpImmediate = $xeDateRangePicker.computeInpImmediate;
662
685
  const value = '';
663
686
  if (!inpImmediate) {
664
- $xeDateRangePicker.handleChange(startValue, endValue, evnt);
687
+ $xeDateRangePicker.handleChange(selectStValue, selectEdValue, evnt);
665
688
  }
666
689
  if (!reactData.visiblePanel) {
667
690
  reactData.isActivated = false;
668
691
  }
669
- $xeDateRangePicker.dispatchEvent('blur', { value, startValue, endValue }, evnt);
692
+ $xeDateRangePicker.dispatchEvent('blur', { value, startValue: selectStValue, endValue: selectEdValue }, evnt);
670
693
  // 自动更新校验状态
671
694
  if ($xeForm && formItemInfo) {
672
695
  $xeForm.triggerItemEvent(evnt, formItemInfo.itemConfig.field, value);
@@ -682,12 +705,17 @@ export default {
682
705
  },
683
706
  confirmEvent(evnt) {
684
707
  const $xeDateRangePicker = this;
708
+ const isTimeType = $xeDateRangePicker.computeIsTimeType;
685
709
  const $startDatePanel = $xeDateRangePicker.$refs.refStartDatePanel;
686
710
  const $endDatePanel = $xeDateRangePicker.$refs.refEndDatePanel;
687
711
  if ($startDatePanel && $endDatePanel) {
688
712
  const startValue = $startDatePanel.getModelValue();
689
713
  const endValue = $endDatePanel.getModelValue();
690
- if ((startValue && !endValue) || (!startValue && endValue)) {
714
+ if (isTimeType) {
715
+ $startDatePanel.confirmByEvent(evnt);
716
+ $endDatePanel.confirmByEvent(evnt);
717
+ }
718
+ else if ((startValue && !endValue) || (!startValue && endValue)) {
691
719
  $xeDateRangePicker.handleChange('', '', evnt);
692
720
  }
693
721
  else {
@@ -704,22 +732,36 @@ export default {
704
732
  const reactData = $xeDateRangePicker.reactData;
705
733
  const internalData = $xeDateRangePicker.internalData;
706
734
  const { selectStatus } = internalData;
707
- const { value, $event } = params;
708
- const endValue = selectStatus ? reactData.endValue : '';
709
- $xeDateRangePicker.handleChange(value, endValue, $event);
735
+ const { value, currValue, $event } = params;
736
+ const paneVals = value ? (XEUtils.isString(value) ? value.split(',') : [value]) : [];
737
+ let startValue = '';
738
+ let endValue = '';
739
+ if (selectStatus) {
740
+ startValue = paneVals[0];
741
+ if (paneVals[1]) {
742
+ endValue = paneVals[1];
743
+ }
744
+ else {
745
+ endValue = reactData.selectEdValue;
746
+ }
747
+ }
748
+ else {
749
+ startValue = currValue || XEUtils.last(paneVals);
750
+ }
751
+ reactData.paneEndVal = [startValue, endValue];
752
+ reactData.paneStartVal = [startValue, endValue];
753
+ $xeDateRangePicker.handleChange(startValue, endValue, $event);
710
754
  $xeDateRangePicker.handleSelectClose();
711
- if (!selectStatus) {
755
+ if (selectStatus) {
756
+ if (startValue && endValue) {
757
+ internalData.selectStatus = false;
758
+ }
759
+ }
760
+ else {
712
761
  internalData.selectStatus = true;
713
762
  }
714
763
  $xeDateRangePicker.$nextTick(() => {
715
- const $startDatePanel = $xeDateRangePicker.$refs.refStartDatePanel;
716
- const $endDatePanel = $xeDateRangePicker.$refs.refEndDatePanel;
717
- if ($startDatePanel && $endDatePanel) {
718
- const startValue = $startDatePanel.getModelValue();
719
- if (!endValue && startValue) {
720
- $endDatePanel.setPanelDate(XEUtils.toStringDate(startValue));
721
- }
722
- }
764
+ $xeDateRangePicker.handleUpdateStartPanelDate();
723
765
  });
724
766
  },
725
767
  endPanelChangeEvent(params) {
@@ -727,91 +769,200 @@ export default {
727
769
  const reactData = $xeDateRangePicker.reactData;
728
770
  const internalData = $xeDateRangePicker.internalData;
729
771
  const { selectStatus } = internalData;
730
- const { value, $event } = params;
731
- const startValue = selectStatus ? reactData.startValue : '';
732
- $xeDateRangePicker.handleChange(startValue, value, $event);
772
+ const { value, currValue, $event } = params;
773
+ const paneVals = value ? (XEUtils.isString(value) ? value.split(',') : [value]) : [];
774
+ let startValue = '';
775
+ let endValue = '';
776
+ if (selectStatus) {
777
+ endValue = paneVals[0];
778
+ if (paneVals[1]) {
779
+ startValue = paneVals[0];
780
+ endValue = paneVals[1];
781
+ }
782
+ else {
783
+ startValue = reactData.selectStValue;
784
+ }
785
+ }
786
+ else {
787
+ endValue = currValue || XEUtils.last(paneVals);
788
+ }
789
+ reactData.paneEndVal = [startValue, endValue];
790
+ reactData.paneStartVal = [startValue, endValue];
791
+ $xeDateRangePicker.handleChange(startValue, endValue, $event);
733
792
  $xeDateRangePicker.handleSelectClose();
734
- if (!selectStatus) {
793
+ if (selectStatus) {
794
+ if (startValue && endValue) {
795
+ internalData.selectStatus = false;
796
+ }
797
+ }
798
+ else {
735
799
  internalData.selectStatus = true;
736
800
  }
737
801
  $xeDateRangePicker.$nextTick(() => {
738
- const $startDatePanel = $xeDateRangePicker.$refs.refStartDatePanel;
739
- const $endDatePanel = $xeDateRangePicker.$refs.refEndDatePanel;
740
- if ($startDatePanel && $endDatePanel) {
741
- const endValue = $endDatePanel.getModelValue();
742
- if (!startValue && endValue) {
743
- $startDatePanel.setPanelDate(XEUtils.toStringDate(endValue));
802
+ $xeDateRangePicker.handleUpdateEndPanelDate();
803
+ });
804
+ },
805
+ handleUpdateStartPanelDate() {
806
+ const $xeDateRangePicker = this;
807
+ const $startDatePanel = $xeDateRangePicker.$refs.refStartDatePanel;
808
+ const $endDatePanel = $xeDateRangePicker.$refs.refEndDatePanel;
809
+ if (!$startDatePanel || !$endDatePanel) {
810
+ return;
811
+ }
812
+ const startPanelDate = $startDatePanel.getPanelDate();
813
+ const endPanelDate = $endDatePanel.getPanelDate();
814
+ if (!startPanelDate || !endPanelDate) {
815
+ return;
816
+ }
817
+ const viewType = $startDatePanel.getViewType();
818
+ const startYear = startPanelDate.getFullYear();
819
+ const startMonth = startPanelDate.getMonth();
820
+ const endYear = endPanelDate.getFullYear();
821
+ const endMonth = endPanelDate.getMonth();
822
+ switch (viewType) {
823
+ case 'day':
824
+ case 'date':
825
+ case 'week': {
826
+ if (endYear <= startYear && endMonth <= startMonth) {
827
+ $endDatePanel.setPanelDate(getNextMonth(startPanelDate));
744
828
  }
829
+ break;
745
830
  }
746
- });
831
+ case 'month':
832
+ case 'quarter': {
833
+ if (endYear <= startYear) {
834
+ $endDatePanel.setPanelDate(getNextYear(startPanelDate));
835
+ }
836
+ break;
837
+ }
838
+ case 'year': {
839
+ const yearList = $startDatePanel.computeYearList;
840
+ if (yearList.some((item) => XEUtils.isDateSame(item.date, endPanelDate, 'yyyy'))) {
841
+ $endDatePanel.setPanelDate(getNextYear(startPanelDate, yearList.length));
842
+ }
843
+ break;
844
+ }
845
+ }
747
846
  },
748
- startPanelDateBtnChangeEvent(params) {
847
+ startPanelDateBtnChangeEvent() {
749
848
  const $xeDateRangePicker = this;
750
849
  const props = $xeDateRangePicker;
751
850
  const { linkedPanels } = props;
851
+ const $startDatePanel = $xeDateRangePicker.$refs.refStartDatePanel;
852
+ const $endDatePanel = $xeDateRangePicker.$refs.refEndDatePanel;
853
+ if (!$startDatePanel || !$endDatePanel) {
854
+ return;
855
+ }
856
+ const startPanelDate = $startDatePanel.getPanelDate();
857
+ const endPanelDate = $endDatePanel.getPanelDate();
858
+ if (!startPanelDate || !endPanelDate) {
859
+ return;
860
+ }
861
+ const viewType = $startDatePanel.getViewType();
752
862
  if (linkedPanels) {
753
- const { viewType } = params;
754
- const $startDatePanel = $xeDateRangePicker.$refs.refStartDatePanel;
755
- const $endDatePanel = $xeDateRangePicker.$refs.refEndDatePanel;
756
- if (!$startDatePanel || !$endDatePanel) {
757
- return;
758
- }
759
- const startPanelDate = $startDatePanel.getPanelDate();
760
- if (!startPanelDate) {
761
- return;
762
- }
763
- const endYear = startPanelDate.getFullYear();
764
- const endMonth = startPanelDate.getMonth();
765
863
  switch (viewType) {
766
864
  case 'day':
767
865
  case 'date':
768
866
  case 'week': {
769
- if (endMonth < 11) {
770
- startPanelDate.setMonth(endMonth + 1);
771
- }
772
- else {
773
- startPanelDate.setFullYear(endYear + 1);
774
- startPanelDate.setMonth(0);
775
- }
776
- $endDatePanel.setPanelDate(startPanelDate);
867
+ $endDatePanel.setPanelDate(getNextMonth(startPanelDate));
868
+ break;
869
+ }
870
+ case 'month':
871
+ case 'quarter': {
872
+ $endDatePanel.setPanelDate(getNextYear(startPanelDate));
873
+ break;
874
+ }
875
+ case 'year': {
876
+ const yearList = $startDatePanel.computeYearList;
877
+ $endDatePanel.setPanelDate(getNextYear(startPanelDate, yearList.length));
777
878
  break;
778
879
  }
779
880
  }
780
881
  }
882
+ else {
883
+ $xeDateRangePicker.handleUpdateStartPanelDate();
884
+ }
885
+ },
886
+ handleUpdateEndPanelDate() {
887
+ const $xeDateRangePicker = this;
888
+ const $startDatePanel = $xeDateRangePicker.$refs.refStartDatePanel;
889
+ const $endDatePanel = $xeDateRangePicker.$refs.refEndDatePanel;
890
+ if (!$startDatePanel || !$endDatePanel) {
891
+ return;
892
+ }
893
+ const startPanelDate = $startDatePanel.getPanelDate();
894
+ const endPanelDate = $endDatePanel.getPanelDate();
895
+ if (!startPanelDate || !endPanelDate) {
896
+ return;
897
+ }
898
+ const viewType = $endDatePanel.getViewType();
899
+ const startYear = startPanelDate.getFullYear();
900
+ const startMonth = startPanelDate.getMonth();
901
+ const endYear = endPanelDate.getFullYear();
902
+ const endMonth = endPanelDate.getMonth();
903
+ switch (viewType) {
904
+ case 'day':
905
+ case 'date':
906
+ case 'week': {
907
+ if (startYear >= endYear && startMonth >= endMonth) {
908
+ $startDatePanel.setPanelDate(getPrevMonth(endPanelDate));
909
+ }
910
+ break;
911
+ }
912
+ case 'month':
913
+ case 'quarter': {
914
+ if (startYear >= endYear) {
915
+ $startDatePanel.setPanelDate(getPrevYear(endPanelDate));
916
+ }
917
+ break;
918
+ }
919
+ case 'year': {
920
+ const yearList = $endDatePanel.computeYearList;
921
+ if (yearList.some((item) => XEUtils.isDateSame(item.date, startPanelDate, 'yyyy'))) {
922
+ $startDatePanel.setPanelDate(getPrevYear(endPanelDate, yearList.length));
923
+ }
924
+ break;
925
+ }
926
+ }
781
927
  },
782
- endPanelDateBtnChangeEvent(params) {
928
+ endPanelDateBtnChangeEvent() {
783
929
  const $xeDateRangePicker = this;
784
930
  const props = $xeDateRangePicker;
785
931
  const { linkedPanels } = props;
932
+ const $startDatePanel = $xeDateRangePicker.$refs.refStartDatePanel;
933
+ const $endDatePanel = $xeDateRangePicker.$refs.refEndDatePanel;
934
+ if (!$startDatePanel || !$endDatePanel) {
935
+ return;
936
+ }
937
+ const startPanelDate = $startDatePanel.getPanelDate();
938
+ const endPanelDate = $endDatePanel.getPanelDate();
939
+ if (!startPanelDate || !endPanelDate) {
940
+ return;
941
+ }
942
+ const viewType = $endDatePanel.getViewType();
786
943
  if (linkedPanels) {
787
- const { viewType } = params;
788
- const $startDatePanel = $xeDateRangePicker.$refs.refStartDatePanel;
789
- const $endDatePanel = $xeDateRangePicker.$refs.refEndDatePanel;
790
- if (!$startDatePanel || !$endDatePanel) {
791
- return;
792
- }
793
- const endPanelDate = $endDatePanel.getPanelDate();
794
- if (!endPanelDate) {
795
- return;
796
- }
797
- const endYear = endPanelDate.getFullYear();
798
- const endMonth = endPanelDate.getMonth();
799
944
  switch (viewType) {
800
945
  case 'day':
801
946
  case 'date':
802
947
  case 'week': {
803
- if (endMonth) {
804
- endPanelDate.setMonth(endMonth - 1);
805
- }
806
- else {
807
- endPanelDate.setFullYear(endYear - 1);
808
- endPanelDate.setMonth(11);
809
- }
810
- $startDatePanel.setPanelDate(endPanelDate);
948
+ $startDatePanel.setPanelDate(getPrevMonth(endPanelDate));
949
+ break;
950
+ }
951
+ case 'month':
952
+ case 'quarter': {
953
+ $startDatePanel.setPanelDate(getPrevYear(endPanelDate));
954
+ break;
955
+ }
956
+ case 'year': {
957
+ const yearList = $endDatePanel.computeYearList;
958
+ $startDatePanel.setPanelDate(getPrevYear(endPanelDate, yearList.length));
811
959
  break;
812
960
  }
813
961
  }
814
962
  }
963
+ else {
964
+ $xeDateRangePicker.handleUpdateEndPanelDate();
965
+ }
815
966
  },
816
967
  // 全局事件
817
968
  handleGlobalMousedownEvent(evnt) {
@@ -960,6 +1111,7 @@ export default {
960
1111
  reactData.isAniVisible = true;
961
1112
  setTimeout(() => {
962
1113
  reactData.visiblePanel = true;
1114
+ $xeDateRangePicker.handleUpdateStartPanelDate();
963
1115
  $xeDateRangePicker.updatePlacement();
964
1116
  }, 10);
965
1117
  $xeDateRangePicker.updateZindex();
@@ -1002,8 +1154,8 @@ export default {
1002
1154
  const shortcutOpts = $xeDateRangePicker.computeShortcutOpts;
1003
1155
  const { autoClose } = shortcutOpts;
1004
1156
  const { code, clickMethod } = option;
1005
- let startValue = reactData.startValue;
1006
- let endValue = reactData.endValue;
1157
+ let startValue = reactData.selectStValue;
1158
+ let endValue = reactData.selectEdValue;
1007
1159
  let value = $xeDateRangePicker.getRangeValue(startValue, endValue);
1008
1160
  const shortcutParams = {
1009
1161
  $dateRangePicker: $xeDateRangePicker,
@@ -1063,8 +1215,8 @@ export default {
1063
1215
  setModelValue(startValue, endValue) {
1064
1216
  const $xeDateRangePicker = this;
1065
1217
  const reactData = $xeDateRangePicker.reactData;
1066
- reactData.startValue = startValue || '';
1067
- reactData.endValue = endValue || '';
1218
+ reactData.selectStValue = startValue || '';
1219
+ reactData.selectEdValue = endValue || '';
1068
1220
  const value = $xeDateRangePicker.getRangeValue(startValue, endValue);
1069
1221
  $xeDateRangePicker.emitModel(value);
1070
1222
  },
@@ -1132,15 +1284,16 @@ export default {
1132
1284
  if (popupOpts.enabled === false) {
1133
1285
  return renderEmptyElement($xeDateRangePicker);
1134
1286
  }
1135
- const { type, separator, autoClose, showConfirmButton, showClearButton } = props;
1136
- const { initialized, isAniVisible, visiblePanel, panelPlacement, panelStyle, startValue, endValue } = reactData;
1287
+ const { type, separator, autoClose, valueFormat, showConfirmButton, showClearButton } = props;
1288
+ const { initialized, isAniVisible, visiblePanel, panelPlacement, panelStyle, selectStValue, selectEdValue, paneStartVal, paneEndVal } = reactData;
1137
1289
  const vSize = $xeDateRangePicker.computeSize;
1138
1290
  const btnTransfer = $xeDateRangePicker.computeBtnTransfer;
1139
1291
  const shortcutOpts = $xeDateRangePicker.computeShortcutOpts;
1140
1292
  const isClearable = $xeDateRangePicker.computeIsClearable;
1141
1293
  const panelLabelObj = $xeDateRangePicker.computePanelLabelObj;
1142
1294
  const shortcutList = $xeDateRangePicker.computeShortcutList;
1143
- const isDateTimeType = $xeDateRangePicker.computeIsDateTimeType;
1295
+ const isTimeType = $xeDateRangePicker.computeIsTimeType;
1296
+ const isTimeOrDateTimeType = $xeDateRangePicker.computeIsTimeOrDateTimeType;
1144
1297
  const defaultDates = $xeDateRangePicker.computeDefaultDates;
1145
1298
  const defaultTimes = $xeDateRangePicker.computeDefaultTimes;
1146
1299
  const timeOpts = $xeDateRangePicker.computeTimeOpts;
@@ -1156,7 +1309,7 @@ export default {
1156
1309
  const [sdDate, edDate] = defaultDates;
1157
1310
  const [sdTime, edTime] = defaultTimes;
1158
1311
  const hasShortcutBtn = shortcutList.length > 0;
1159
- const showConfirmBtn = (showConfirmButton === null ? (isDateTimeType || !autoClose) : showConfirmButton);
1312
+ const showConfirmBtn = (showConfirmButton === null ? (isTimeOrDateTimeType || !autoClose) : showConfirmButton);
1160
1313
  const showClearBtn = (showClearButton === null ? isClearable : showClearButton);
1161
1314
  return h('div', {
1162
1315
  ref: 'refInputPanel',
@@ -1209,15 +1362,18 @@ export default {
1209
1362
  h(VxeDatePanelComponent, {
1210
1363
  ref: 'refStartDatePanel',
1211
1364
  props: {
1212
- value: startValue,
1365
+ value: paneStartVal,
1366
+ multiple: !isTimeType,
1367
+ valueSort: true,
1368
+ limitCount: 3,
1369
+ defaultMode: 'first',
1213
1370
  type: props.type,
1214
1371
  className: props.className,
1215
1372
  minDate: props.minDate,
1216
1373
  maxDate: props.maxDate,
1217
- endDate: endValue,
1218
1374
  startDay: props.startDay,
1219
1375
  labelFormat: props.labelFormat,
1220
- valueFormat: props.valueFormat,
1376
+ valueFormat: valueFormat === 'date' || valueFormat === 'timestamp' ? '' : valueFormat,
1221
1377
  timeFormat: props.timeFormat,
1222
1378
  defaultDate: sdDate,
1223
1379
  defaultTime: sdTime,
@@ -1237,15 +1393,18 @@ export default {
1237
1393
  h(VxeDatePanelComponent, {
1238
1394
  ref: 'refEndDatePanel',
1239
1395
  props: {
1240
- value: endValue,
1396
+ value: paneEndVal,
1397
+ multiple: !isTimeType,
1398
+ valueSort: true,
1399
+ limitCount: 3,
1400
+ defaultMode: 'last',
1241
1401
  type: props.type,
1242
1402
  className: props.className,
1243
1403
  minDate: props.minDate,
1244
1404
  maxDate: props.maxDate,
1245
- startDate: startValue,
1246
1405
  startDay: props.startDay,
1247
1406
  labelFormat: props.labelFormat,
1248
- valueFormat: props.valueFormat,
1407
+ valueFormat: valueFormat === 'date' || valueFormat === 'timestamp' ? '' : valueFormat,
1249
1408
  timeFormat: props.timeFormat,
1250
1409
  defaultDate: edDate,
1251
1410
  defaultTime: edTime,
@@ -1285,7 +1444,7 @@ export default {
1285
1444
  ? h(VxeButtonComponent, {
1286
1445
  props: {
1287
1446
  size: 'mini',
1288
- disabled: !(startValue || endValue),
1447
+ disabled: !(selectStValue || selectEdValue),
1289
1448
  content: getI18n('vxe.button.clear')
1290
1449
  },
1291
1450
  on: {
@@ -1354,13 +1513,13 @@ export default {
1354
1513
  const slots = $xeDateRangePicker.$scopedSlots;
1355
1514
  const reactData = $xeDateRangePicker.reactData;
1356
1515
  const { suffixIcon } = props;
1357
- const { startValue, endValue } = reactData;
1516
+ const { selectStValue, selectEdValue } = reactData;
1358
1517
  const suffixSlot = slots.suffix;
1359
1518
  const isDisabled = $xeDateRangePicker.computeIsDisabled;
1360
1519
  const isClearable = $xeDateRangePicker.computeIsClearable;
1361
1520
  return h('div', {
1362
1521
  class: ['vxe-date-range-picker--suffix', {
1363
- 'is--clear': isClearable && !isDisabled && (startValue || endValue)
1522
+ 'is--clear': isClearable && !isDisabled && (selectStValue || selectEdValue)
1364
1523
  }]
1365
1524
  }, [
1366
1525
  isClearable
@@ -1410,7 +1569,7 @@ export default {
1410
1569
  const props = $xeDateRangePicker;
1411
1570
  const reactData = $xeDateRangePicker.reactData;
1412
1571
  const { className, type, name, autoComplete } = props;
1413
- const { startValue, endValue, visiblePanel, isActivated } = reactData;
1572
+ const { selectStValue, selectEdValue, visiblePanel, isActivated } = reactData;
1414
1573
  const vSize = $xeDateRangePicker.computeSize;
1415
1574
  const isDisabled = $xeDateRangePicker.computeIsDisabled;
1416
1575
  const formReadonly = $xeDateRangePicker.computeFormReadonly;
@@ -1434,7 +1593,7 @@ export default {
1434
1593
  'is--visible': visiblePanel,
1435
1594
  'is--disabled': isDisabled,
1436
1595
  'is--active': isActivated,
1437
- 'show--clear': isClearable && !isDisabled && (startValue || endValue)
1596
+ 'show--clear': isClearable && !isDisabled && (selectStValue || selectEdValue)
1438
1597
  }],
1439
1598
  attrs: {
1440
1599
  spellcheck: false
@@ -1486,6 +1645,7 @@ export default {
1486
1645
  },
1487
1646
  created() {
1488
1647
  const $xeDateRangePicker = this;
1648
+ $xeDateRangePicker.internalData = createInternalData();
1489
1649
  $xeDateRangePicker.updateModelValue(true);
1490
1650
  globalEvents.on($xeDateRangePicker, 'mousewheel', $xeDateRangePicker.handleGlobalMousewheelEvent);
1491
1651
  globalEvents.on($xeDateRangePicker, 'mousedown', $xeDateRangePicker.handleGlobalMousedownEvent);
@@ -1499,6 +1659,8 @@ export default {
1499
1659
  },
1500
1660
  beforeDestroy() {
1501
1661
  const $xeDateRangePicker = this;
1662
+ const reactData = $xeDateRangePicker.reactData;
1663
+ const internalData = $xeDateRangePicker.internalData;
1502
1664
  const panelElem = $xeDateRangePicker.$refs.refInputPanel;
1503
1665
  if (panelElem && panelElem.parentNode) {
1504
1666
  panelElem.parentNode.removeChild(panelElem);
@@ -1508,6 +1670,8 @@ export default {
1508
1670
  globalEvents.off($xeDateRangePicker, 'mousedown');
1509
1671
  globalEvents.off($xeDateRangePicker, 'blur');
1510
1672
  globalEvents.off($xeDateRangePicker, 'resize');
1673
+ XEUtils.assign(reactData, createReactData());
1674
+ XEUtils.assign(internalData, createInternalData());
1511
1675
  },
1512
1676
  render(h) {
1513
1677
  return this.renderVN(h);