@@ -77,6 +77,14 @@ function reorderValues<DateType>(
77
77
return values ;
78
78
}
79
79
80
+ function canValueTrigger < DateType > (
81
+ value : EventValue < DateType > ,
82
+ index : number ,
83
+ allowEmpty ?: [ boolean , boolean ] | null ,
84
+ ) : boolean {
85
+ return ! ! ( value || ( allowEmpty && allowEmpty [ index ] ) ) ;
86
+ }
87
+
80
88
export interface RangePickerSharedProps < DateType > {
81
89
value ?: RangeValue < DateType > ;
82
90
defaultValue ?: RangeValue < DateType > ;
@@ -175,6 +183,7 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
175
183
locale,
176
184
placeholder,
177
185
autoFocus,
186
+ allowEmpty,
178
187
disabled,
179
188
format,
180
189
picker = 'date' ,
@@ -325,36 +334,70 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
325
334
} , [ mergedOpen ] ) ;
326
335
327
336
// ============================ Trigger ============================
328
- const triggerChange = ( newValue : RangeValue < DateType > ) => {
337
+ let triggerOpen : (
338
+ newOpen : boolean ,
339
+ index : 0 | 1 ,
340
+ preventChangeEvent ?: boolean ,
341
+ ) => void ;
342
+
343
+ const triggerChange = (
344
+ newValue : RangeValue < DateType > ,
345
+ forceInput : boolean = true ,
346
+ ) => {
329
347
const values = reorderValues ( newValue , generateConfig ) ;
330
348
331
349
setSelectedValue ( values ) ;
332
- setInnerValue ( values ) ;
333
350
334
351
const startValue = getIndexValue ( values , 0 ) ;
335
352
const endValue = getIndexValue ( values , 1 ) ;
336
353
337
- if (
338
- onChange &&
339
- ( ! isEqual ( generateConfig , getIndexValue ( mergedValue , 0 ) , startValue ) ||
340
- ! isEqual ( generateConfig , getIndexValue ( mergedValue , 1 ) , endValue ) )
341
- ) {
342
- onChange ( values , [
343
- startValue
344
- ? generateConfig . locale . format (
345
- locale . locale ,
346
- startValue ,
347
- formatList [ 0 ] ,
348
- )
349
- : '' ,
350
- endValue
351
- ? generateConfig . locale . format ( locale . locale , endValue , formatList [ 0 ] )
352
- : '' ,
353
- ] ) ;
354
+ const canStartValueTrigger = canValueTrigger ( startValue , 0 , allowEmpty ) ;
355
+ const canEndValueTrigger = canValueTrigger ( endValue , 1 , allowEmpty ) ;
356
+
357
+ const canTrigger =
358
+ values === null || ( canStartValueTrigger && canEndValueTrigger ) ;
359
+
360
+ if ( canTrigger ) {
361
+ // Trigger onChange only when value is validate
362
+ setInnerValue ( values ) ;
363
+
364
+ if (
365
+ onChange &&
366
+ ( ! isEqual ( generateConfig , getIndexValue ( mergedValue , 0 ) , startValue ) ||
367
+ ! isEqual ( generateConfig , getIndexValue ( mergedValue , 1 ) , endValue ) )
368
+ ) {
369
+ onChange ( values , [
370
+ startValue
371
+ ? generateConfig . locale . format (
372
+ locale . locale ,
373
+ startValue ,
374
+ formatList [ 0 ] ,
375
+ )
376
+ : '' ,
377
+ endValue
378
+ ? generateConfig . locale . format (
379
+ locale . locale ,
380
+ endValue ,
381
+ formatList [ 0 ] ,
382
+ )
383
+ : '' ,
384
+ ] ) ;
385
+ }
386
+ } else if ( forceInput ) {
387
+ // Open miss value panel to force user input
388
+ const missingValueIndex = canStartValueTrigger ? 1 : 0 ;
389
+ triggerOpen ( true , missingValueIndex ) ;
390
+
391
+ // Delay to focus to avoid input blur trigger expired selectedValues
392
+ setTimeout ( ( ) => {
393
+ if ( endInputRef . current ) {
394
+ endInputRef . current . focus ( ) ;
395
+ }
396
+ } , 0 ) ;
354
397
}
355
398
} ;
356
399
357
- const triggerOpen = (
400
+ triggerOpen = (
358
401
newOpen : boolean ,
359
402
index : 0 | 1 ,
360
403
preventChangeEvent : boolean = false ,
@@ -536,7 +579,8 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
536
579
e . preventDefault ( ) ;
537
580
} }
538
581
onSelect = { date => {
539
- setSelectedValue (
582
+ // triggerChange will also update selected values
583
+ triggerChange (
540
584
updateRangeValue ( selectedValue , date , activePickerIndex ) ,
541
585
) ;
542
586
} }
0 commit comments