@@ -69,7 +69,7 @@ export interface PickerPanelSharedProps<DateType> {
6969 onChange ?: ( value : DateType ) => void ;
7070 onPanelChange ?: OnPanelChange < DateType > ;
7171 onMouseDown ?: React . MouseEventHandler < HTMLDivElement > ;
72- onOk ?: ( ) => void ;
72+ onOk ?: ( date : DateType ) => void ;
7373
7474 /** @private This is internal usage. Do not use in your production env */
7575 hideHeader ?: boolean ;
@@ -78,7 +78,8 @@ export interface PickerPanelSharedProps<DateType> {
7878
7979 /** @private Internal usage. Do not use in your production env */
8080 components ?: {
81- button : React . ComponentType ;
81+ button ?: React . ComponentType | string ;
82+ rangeItem ?: React . ComponentType | string ;
8283 } ;
8384}
8485
@@ -142,9 +143,12 @@ function PickerPanel<DateType>(props: PickerPanelProps<DateType>) {
142143 onMouseDown,
143144 onPickerValueChange,
144145 onOk,
145- components,
146+ components = { } ,
146147 } = props as MergedPickerPanelProps < DateType > ;
147148
149+ const needConfirmButton : boolean =
150+ ( picker === 'date' && ! ! showTime ) || picker === 'time' ;
151+
148152 if ( process . env . NODE_ENV !== 'production' ) {
149153 warning (
150154 ! value || generateConfig . isValidate ( value ) ,
@@ -170,6 +174,7 @@ function PickerPanel<DateType>(props: PickerPanelProps<DateType>) {
170174 panelPosition,
171175 rangedValue,
172176 hoverRangedValue,
177+ rangeList = [ ] ,
173178 } = React . useContext ( RangeContext ) ;
174179 const panelRef = React . useRef < PanelRefProps > ( { } ) ;
175180
@@ -423,39 +428,75 @@ function PickerPanel<DateType>(props: PickerPanelProps<DateType>) {
423428 ? null
424429 : getExtraFooter ( prefixCls , mergedMode , renderExtraFooter ) ;
425430
426- let nowNode : React . ReactNode ;
431+ let rangesNode : React . ReactNode ;
427432 let todayNode : React . ReactNode ;
428433
429- if ( ( mergedMode === 'date' && showTime ) || mergedMode === 'time' ) {
430- const Button = components ? components . button : 'button' ;
434+ if ( rangeList . length || needConfirmButton ) {
435+ let presetNode : React . ReactNode ;
436+ let okNode : React . ReactNode ;
437+
438+ if ( rangeList . length ) {
439+ const Item = ( components . rangeItem || 'span' ) as any ;
440+
441+ presetNode = (
442+ < >
443+ { rangeList . map ( ( { label, onClick, onMouseEnter, onMouseLeave } ) => (
444+ < li key = { label } className = { `${ prefixCls } -range` } >
445+ < Item
446+ onClick = { onClick }
447+ onMouseEnter = { onMouseEnter }
448+ onMouseLeave = { onMouseLeave }
449+ >
450+ { label }
451+ </ Item >
452+ </ li >
453+ ) ) }
454+ </ >
455+ ) ;
456+ }
431457
432- nowNode = (
433- < div className = { `${ prefixCls } -now` } >
434- < a
435- className = { `${ prefixCls } -now-btn` }
436- onClick = { ( ) => {
437- triggerSelect ( generateConfig . getNow ( ) , 'submit' , true ) ;
438- } }
439- >
440- { locale . now }
441- </ a >
458+ if ( needConfirmButton ) {
459+ const Button = ( components . button || 'button' ) as any ;
460+
461+ if ( ! inRange && ! presetNode ) {
462+ presetNode = (
463+ < li className = { `${ prefixCls } -now` } >
464+ < a
465+ className = { `${ prefixCls } -now-btn` }
466+ onClick = { ( ) => {
467+ triggerSelect ( generateConfig . getNow ( ) , 'submit' , true ) ;
468+ } }
469+ >
470+ { locale . now }
471+ </ a >
472+ </ li >
473+ ) ;
474+ }
442475
443- < div className = { `${ prefixCls } -ok` } >
476+ okNode = (
477+ < li className = { `${ prefixCls } -ok` } >
444478 < Button
445479 disabled = { ! value }
446480 onClick = { ( ) => {
447481 if ( value ) {
448482 triggerSelect ( value , 'submit' , true ) ;
449483 if ( onOk ) {
450- onOk ( ) ;
484+ onOk ( value ) ;
451485 }
452486 }
453487 } }
454488 >
455489 { locale . ok }
456490 </ Button >
457- </ div >
458- </ div >
491+ </ li >
492+ ) ;
493+ }
494+
495+ rangesNode = (
496+ < ul className = { `${ prefixCls } -ranges` } >
497+ { presetNode }
498+ { okNode }
499+ </ ul >
459500 ) ;
460501 } else if ( showToday && mergedMode === 'date' && picker === 'date' ) {
461502 todayNode = (
@@ -495,10 +536,10 @@ function PickerPanel<DateType>(props: PickerPanelProps<DateType>) {
495536 ref = { panelDivRef }
496537 >
497538 { panelNode }
498- { extraFooter || nowNode || todayNode ? (
539+ { extraFooter || rangesNode || todayNode ? (
499540 < div className = { `${ prefixCls } -footer` } >
500541 { extraFooter }
501- { nowNode }
542+ { rangesNode }
502543 { todayNode }
503544 </ div >
504545 ) : null }
0 commit comments