@@ -18,16 +18,18 @@ export type DatetimePanelProps<DateType> = {
18
18
const ACTIVE_PANEL = tuple ( 'date' , 'time' ) ;
19
19
type ActivePanelType = ( typeof ACTIVE_PANEL ) [ number ] ;
20
20
21
- const findValidTime = ( disabledRange : number [ ] , maxValidTime : number ) => {
21
+ const findValidTime = ( refValue : number , disabledRange : number [ ] , maxValidTime : number ) => {
22
22
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
+ }
26
29
}
27
30
}
28
-
29
- return 0
30
- }
31
+ return refValue ;
32
+ } ;
31
33
32
34
function DatetimePanel < DateType > ( props : DatetimePanelProps < DateType > ) {
33
35
const {
@@ -104,33 +106,30 @@ function DatetimePanel<DateType>(props: DatetimePanelProps<DateType>) {
104
106
const onInternalSelect = ( date : DateType , source : 'date' | 'time' ) => {
105
107
let selectedDate = date ;
106
108
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 ,
112
115
) ;
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 ,
116
120
) ;
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 ,
120
125
) ;
126
+ selectedDate = generateConfig . setHour ( selectedDate , validHour ) ;
127
+ selectedDate = generateConfig . setMinute ( selectedDate , validMinute ) ;
128
+ selectedDate = generateConfig . setSecond ( selectedDate , validSeconds ) ;
121
129
} else if ( source === 'time' && ! value && defaultValue ) {
122
130
selectedDate = generateConfig . setYear ( selectedDate , generateConfig . getYear ( defaultValue ) ) ;
123
131
selectedDate = generateConfig . setMonth ( selectedDate , generateConfig . getMonth ( defaultValue ) ) ;
124
132
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 )
134
133
}
135
134
136
135
if ( onSelect ) {
0 commit comments