@@ -18,16 +18,18 @@ export type DatetimePanelProps<DateType> = {
1818const ACTIVE_PANEL = tuple ( 'date' , 'time' ) ;
1919type ActivePanelType = ( typeof ACTIVE_PANEL ) [ number ] ;
2020
21- const findValidTime = ( disabledRange : number [ ] , maxValidTime : number ) => {
21+ const findValidTime = ( refValue : number , disabledRange : number [ ] , maxValidTime : number ) => {
2222 const rangeSet = new Set ( disabledRange ) ;
23- for ( let i = 0 ; i <= maxValidTime ; i ++ ) {
24- if ( ! rangeSet . has ( i ) ) {
25- return i ;
23+ if ( rangeSet . has ( refValue ) ) {
24+ for ( let i = 0 ; i <= maxValidTime ; i ++ ) {
25+ if ( ! rangeSet . has ( i ) && i >= refValue ) {
26+ // first not disabled time
27+ return i ;
28+ }
2629 }
2730 }
28-
29- return 0
30- }
31+ return refValue ;
32+ } ;
3133
3234function DatetimePanel < DateType > ( props : DatetimePanelProps < DateType > ) {
3335 const {
@@ -104,33 +106,30 @@ function DatetimePanel<DateType>(props: DatetimePanelProps<DateType>) {
104106 const onInternalSelect = ( date : DateType , source : 'date' | 'time' ) => {
105107 let selectedDate = date ;
106108
107- if ( source === 'date' && ! value && timeProps . defaultValue ) {
108- // Date with time defaultValue
109- selectedDate = generateConfig . setHour (
110- selectedDate ,
111- generateConfig . getHour ( timeProps . defaultValue ) ,
109+ if ( source === 'date' ) {
110+ const disabledTimes = disabledTime ?.( value || timeProps . defaultValue ) || { } ;
111+ const validHour = findValidTime (
112+ generateConfig . getHour ( selectedDate ) ,
113+ disabledTimes . disabledHours ?.( ) || [ - 1 ] ,
114+ 23 ,
112115 ) ;
113- selectedDate = generateConfig . setMinute (
114- selectedDate ,
115- generateConfig . getMinute ( timeProps . defaultValue ) ,
116+ const validMinute = findValidTime (
117+ generateConfig . getMinute ( selectedDate ) ,
118+ disabledTimes . disabledMinutes ?.( validHour ) || [ - 1 ] ,
119+ 59 ,
116120 ) ;
117- selectedDate = generateConfig . setSecond (
118- selectedDate ,
119- generateConfig . getSecond ( timeProps . defaultValue ) ,
121+ const validSeconds = findValidTime (
122+ generateConfig . getSecond ( selectedDate ) ,
123+ disabledTimes . disabledSeconds ?.( validHour , validMinute ) || [ - 1 ] ,
124+ 59 ,
120125 ) ;
126+ selectedDate = generateConfig . setHour ( selectedDate , validHour ) ;
127+ selectedDate = generateConfig . setMinute ( selectedDate , validMinute ) ;
128+ selectedDate = generateConfig . setSecond ( selectedDate , validSeconds ) ;
121129 } else if ( source === 'time' && ! value && defaultValue ) {
122130 selectedDate = generateConfig . setYear ( selectedDate , generateConfig . getYear ( defaultValue ) ) ;
123131 selectedDate = generateConfig . setMonth ( selectedDate , generateConfig . getMonth ( defaultValue ) ) ;
124132 selectedDate = generateConfig . setDate ( selectedDate , generateConfig . getDate ( defaultValue ) ) ;
125- } else if ( source === 'date' && value && disabledTime ) {
126- const disabledTimes = disabledTime ( value )
127-
128- const validHour = findValidTime ( disabledTimes . disabledHours ?.( ) || [ - 1 ] , 23 )
129- const validMinute = findValidTime ( disabledTimes . disabledMinutes ?.( validHour ) || [ - 1 ] , 59 )
130- const validSeconds = findValidTime ( disabledTimes . disabledSeconds ?.( validHour , validMinute ) || [ - 1 ] , 59 )
131- selectedDate = generateConfig . setHour ( selectedDate , validHour )
132- selectedDate = generateConfig . setMinute ( selectedDate , validMinute )
133- selectedDate = generateConfig . setSecond ( selectedDate , validSeconds )
134133 }
135134
136135 if ( onSelect ) {
0 commit comments