1- import React , { forwardRef , useState , useMemo } from 'react' ;
1+ import React , { forwardRef , useMemo , useState } from 'react' ;
22import dayjs from 'dayjs' ;
3- import { formatDate , getDefaultFormat , parseToDayjs } from '@tdesign/common-js/date-picker/format' ;
4- import { subtractMonth , addMonth , extractTimeObj } from '@tdesign/common-js/date-picker/utils' ;
3+ import { formatDate , formatTime , getDefaultFormat , parseToDayjs } from '@tdesign/common-js/date-picker/format' ;
4+ import { addMonth , extractTimeObj , subtractMonth } from '@tdesign/common-js/date-picker/utils' ;
55import log from '@tdesign/common-js/log/index' ;
6- import { StyledProps } from '../common' ;
7- import {
8- TdDateRangePickerPanelProps ,
9- DatePickerYearChangeTrigger ,
6+ import useDefaultProps from '../hooks/useDefaultProps' ;
7+ import useRangeValue from './hooks/useRangeValue' ;
8+ import RangePanel from './panel/RangePanel' ;
9+ import { dateCorrection } from './utils' ;
10+
11+ import type { StyledProps } from '../common' ;
12+ import type {
1013 DatePickerMonthChangeTrigger ,
1114 DatePickerTimeChangeTrigger ,
15+ DatePickerYearChangeTrigger ,
16+ DateRangeValue ,
1217 PresetDate ,
18+ TdDateRangePickerPanelProps ,
1319} from './type' ;
14- import RangePanel from './panel/RangePanel' ;
15- import useRangeValue from './hooks/useRangeValue' ;
16- import useDefaultProps from '../hooks/useDefaultProps' ;
17- import { dateCorrection } from './utils' ;
1820
1921export interface DateRangePickerPanelProps extends TdDateRangePickerPanelProps , StyledProps { }
2022
@@ -50,7 +52,7 @@ const DateRangePickerPanel = forwardRef<HTMLDivElement, DateRangePickerPanelProp
5052 setCacheValue,
5153 } = useRangeValue ( props ) ;
5254
53- const { format } = getDefaultFormat ( {
55+ const { format, timeFormat } = getDefaultFormat ( {
5456 mode,
5557 enableTimePicker,
5658 format : props . format ,
@@ -62,6 +64,18 @@ const DateRangePickerPanel = forwardRef<HTMLDivElement, DateRangePickerPanelProp
6264 const [ hoverValue , setHoverValue ] = useState ( [ ] ) ;
6365 const activeIndex = useMemo ( ( ) => ( isFirstValueSelected ? 1 : 0 ) , [ isFirstValueSelected ] ) ;
6466
67+ const handleSyncPanelValue = ( value : DateRangeValue ) => {
68+ // 同年同月时,确保右侧面板月份比左侧大,避免两侧面板月份一致
69+ const nextMonth = value . map ( ( v : string ) => parseToDayjs ( v , format ) . month ( ) ) ;
70+ const nextYear = value . map ( ( v : string ) => parseToDayjs ( v , format ) . year ( ) ) ;
71+ if ( nextYear [ 0 ] === nextYear [ 1 ] && nextMonth [ 0 ] === nextMonth [ 1 ] ) {
72+ nextMonth [ 0 ] === 11 ? ( nextMonth [ 0 ] -= 1 ) : ( nextMonth [ 1 ] += 1 ) ;
73+ }
74+ setMonth ( nextMonth ) ;
75+ setYear ( nextYear ) ;
76+ setTime ( formatTime ( value , format , timeFormat , props . defaultTime ) ) ;
77+ } ;
78+
6579 // 日期 hover
6680 function onCellMouseEnter ( date : Date ) {
6781 setIsHoverCell ( true ) ;
@@ -223,7 +237,12 @@ const DateRangePickerPanel = forwardRef<HTMLDivElement, DateRangePickerPanelProp
223237 if ( ! Array . isArray ( presetVal ) ) {
224238 log . error ( 'DateRangePickerPanel' , `preset: ${ presetValue } must be Array!` ) ;
225239 } else {
226- onChange ( formatDate ( presetVal , { format, autoSwap : true } ) , {
240+ const formattedPreset = formatDate ( presetVal , { format } ) ;
241+ setCacheValue ( formattedPreset ) ;
242+ setIsFirstValueSelected ( true ) ;
243+ setIsSelected ( true ) ;
244+ handleSyncPanelValue ( formattedPreset ) ;
245+ onChange ( formattedPreset , {
227246 dayjsValue : presetVal . map ( ( p ) => parseToDayjs ( p , format ) ) ,
228247 trigger : 'preset' ,
229248 } ) ;
0 commit comments