File tree Expand file tree Collapse file tree 7 files changed +220
-19
lines changed Expand file tree Collapse file tree 7 files changed +220
-19
lines changed Original file line number Diff line number Diff line change 1+ import  React  from  'react' ; 
2+ import  moment ,  {  Moment  }  from  'moment' ; 
3+ import  Picker  from  '../src/Picker' ; 
4+ import  RangePicker  from  '../src/RangePicker' ; 
5+ import  momentGenerateConfig  from  '../src/generate/moment' ; 
6+ import  zhCN  from  '../src/locale/zh_CN' ; 
7+ import  '../assets/index.less' ; 
8+ import  './common.less' ; 
9+ 
10+ const  defaultStartValue  =  moment ( '2019-09-03 05:02:03' ) ; 
11+ const  defaultEndValue  =  moment ( '2019-11-28 01:02:03' ) ; 
12+ const  defaultValue : [ Moment ,  Moment ]  =  [ defaultStartValue ,  defaultEndValue ] ; 
13+ 
14+ export  default  ( )  =>  { 
15+   const  [ customizeNode ,  setCustomizeNode ]  =  React . useState ( false ) ; 
16+ 
17+   return  ( 
18+     < > 
19+       { String ( customizeNode ) } 
20+       < div  style = { {  display : 'flex' ,  flexWrap : 'wrap'  } } > 
21+         < div > 
22+           < h3 > Picker</ h3 > 
23+           < Picker < Moment > 
24+             generateConfig = { momentGenerateConfig } 
25+             locale = { zhCN } 
26+             allowClear 
27+             defaultValue = { defaultStartValue } 
28+             panelRender = { node  =>  ( 
29+               < > 
30+                 < button 
31+                   type = "button" 
32+                   style = { {  display : 'block'  } } 
33+                   onClick = { ( )  =>  { 
34+                     setCustomizeNode ( ! customizeNode ) ; 
35+                   } } 
36+                 > 
37+                   Change
38+                 </ button > 
39+ 
40+                 { customizeNode  ? < span > My Panel</ span >  : node } 
41+               </ > 
42+             ) } 
43+           /> 
44+         </ div > 
45+         < div > 
46+           < h3 > RangePicker</ h3 > 
47+           < RangePicker < Moment > 
48+             generateConfig = { momentGenerateConfig } 
49+             locale = { zhCN } 
50+             allowClear 
51+             defaultValue = { defaultValue } 
52+             panelRender = { node  =>  ( 
53+               < > 
54+                 < button 
55+                   type = "button" 
56+                   style = { {  display : 'block'  } } 
57+                   onClick = { ( )  =>  { 
58+                     setCustomizeNode ( ! customizeNode ) ; 
59+                   } } 
60+                 > 
61+                   Change
62+                 </ button > 
63+                 { customizeNode  ? < span > My Panel</ span >  : node } 
64+               </ > 
65+             ) } 
66+           /> 
67+         </ div > 
68+       </ div > 
69+     </ > 
70+   ) ; 
71+ } ; 
Original file line number Diff line number Diff line change @@ -63,6 +63,7 @@ export interface PickerSharedProps<DateType> extends React.AriaAttributes {
6363  superPrevIcon ?: React . ReactNode ; 
6464  superNextIcon ?: React . ReactNode ; 
6565  getPopupContainer ?: ( node : HTMLElement )  =>  HTMLElement ; 
66+   panelRender ?: ( originPanel : React . ReactNode )  =>  React . ReactNode ; 
6667
6768  // Events 
6869  onChange ?: ( value : DateType  |  null ,  dateString : string )  =>  void ; 
@@ -157,6 +158,7 @@ function InnerPicker<DateType>(props: PickerProps<DateType>) {
157158    placeholder, 
158159    getPopupContainer, 
159160    pickerRef, 
161+     panelRender, 
160162    onChange, 
161163    onOpenChange, 
162164    onFocus, 
@@ -359,25 +361,33 @@ function InnerPicker<DateType>(props: PickerProps<DateType>) {
359361    onPickerValueChange : undefined , 
360362  } ; 
361363
364+   let  panelNode : React . ReactNode  =  ( 
365+     < PickerPanel < DateType > 
366+       { ...panelProps } 
367+       generateConfig = { generateConfig } 
368+       className = { classNames ( { 
369+         [ `${ prefixCls }  ] : ! typing , 
370+       } ) } 
371+       value = { selectedValue } 
372+       locale = { locale } 
373+       tabIndex = { - 1 } 
374+       onChange = { setSelectedValue } 
375+       direction = { direction } 
376+     /> 
377+   ) ; 
378+ 
379+   if  ( panelRender )  { 
380+     panelNode  =  panelRender ( panelNode ) ; 
381+   } 
382+ 
362383  const  panel  =  ( 
363384    < div 
364385      className = { `${ prefixCls }  } 
365386      onMouseDown = { e  =>  { 
366387        e . preventDefault ( ) ; 
367388      } } 
368389    > 
369-       < PickerPanel < DateType > 
370-         { ...panelProps } 
371-         generateConfig = { generateConfig } 
372-         className = { classNames ( { 
373-           [ `${ prefixCls }  ] : ! typing , 
374-         } ) } 
375-         value = { selectedValue } 
376-         locale = { locale } 
377-         tabIndex = { - 1 } 
378-         onChange = { setSelectedValue } 
379-         direction = { direction } 
380-       /> 
390+       { panelNode } 
381391    </ div > 
382392  ) ; 
383393
Original file line number Diff line number Diff line change @@ -96,6 +96,7 @@ export interface RangePickerSharedProps<DateType> {
9696  /** @private  Internal control of active picker. Do not use since it's private usage */ 
9797  activePickerIndex ?: 0  |  1 ; 
9898  dateRender ?: RangeDateRender < DateType > ; 
99+   panelRender ?: ( originPanel : React . ReactNode )  =>  React . ReactNode ; 
99100} 
100101
101102type  OmitPickerProps < Props >  =  Omit < 
@@ -181,6 +182,7 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
181182    disabledDate, 
182183    disabledTime, 
183184    dateRender, 
185+     panelRender, 
184186    ranges, 
185187    allowEmpty, 
186188    allowClear, 
@@ -869,6 +871,22 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
869871      panels  =  renderPanel ( ) ; 
870872    } 
871873
874+     let  mergedNodes : React . ReactNode  =  ( 
875+       < > 
876+         < div  className = { `${ prefixCls }  } > { panels } </ div > 
877+         { ( extraNode  ||  rangesNode )  &&  ( 
878+           < div  className = { `${ prefixCls }  } > 
879+             { extraNode } 
880+             { rangesNode } 
881+           </ div > 
882+         ) } 
883+       </ > 
884+     ) ; 
885+ 
886+     if  ( panelRender )  { 
887+       mergedNodes  =  panelRender ( mergedNodes ) ; 
888+     } 
889+ 
872890    return  ( 
873891      < div 
874892        className = { `${ prefixCls }  } 
@@ -878,13 +896,7 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
878896          e . preventDefault ( ) ; 
879897        } } 
880898      > 
881-         < div  className = { `${ prefixCls }  } > { panels } </ div > 
882-         { ( extraNode  ||  rangesNode )  &&  ( 
883-           < div  className = { `${ prefixCls }  } > 
884-             { extraNode } 
885-             { rangesNode } 
886-           </ div > 
887-         ) } 
899+         { mergedNodes } 
888900      </ div > 
889901    ) ; 
890902  } 
Original file line number Diff line number Diff line change @@ -28,6 +28,40 @@ exports[`Picker.Basic icon 1`] = `
2828</div > 
2929` 
3030
31+ exports [` Picker.Basic panelRender 1` =  ` 
32+ Array [ 
33+   <div  
34+     class = " rc-picker"  
35+   > 
36+     <div  
37+       class = " rc-picker-input"  
38+     > 
39+       <input  
40+         autocomplete = " off"  
41+         readonly = " "  
42+         size = " 12"  
43+         title = " "  
44+         value = " "  
45+       /> 
46+     </div > 
47+   </div >, 
48+   <div > 
49+     <div  
50+       class = " rc-picker-dropdown"  
51+       style = " opacity: 0;"  
52+     > 
53+       <div  
54+         class = " rc-picker-panel-container"  
55+       > 
56+         <h1 > 
57+           Light 
58+         </h1 > 
59+       </div > 
60+     </div > 
61+   </div >, 
62+ ] 
63+ ` 
64+ 
3165exports [` Picker.Basic pass data- &  aria- &  role 1` =  ` 
3266<div  
3367  class = " rc-picker"  
Original file line number Diff line number Diff line change @@ -89,3 +89,67 @@ exports[`Picker.Range onPanelChange is array args should render correctly in rtl
8989  /> 
9090</div > 
9191` 
92+ 
93+ exports [` Picker.Range panelRender 1` =  ` 
94+ Array [ 
95+   <div  
96+     class = " rc-picker rc-picker-range"  
97+   > 
98+     <div  
99+       class = " rc-picker-input rc-picker-input-active"  
100+     > 
101+       <input  
102+         autocomplete = " off"  
103+         placeholder = " "  
104+         readonly = " "  
105+         size = " 12"  
106+         value = " "  
107+       /> 
108+     </div > 
109+     <div  
110+       class = " rc-picker-range-separator"  
111+     > 
112+       ~ 
113+     </div > 
114+     <div  
115+       class = " rc-picker-input"  
116+     > 
117+       <input  
118+         autocomplete = " off"  
119+         placeholder = " "  
120+         readonly = " "  
121+         size = " 12"  
122+         value = " "  
123+       /> 
124+     </div > 
125+     <div  
126+       class = " rc-picker-active-bar"  
127+       style = " left: 0px; width: 0px; position: absolute;"  
128+     /> 
129+   </div >, 
130+   <div > 
131+     <div  
132+       class = " rc-picker-dropdown rc-picker-dropdown-range"  
133+       style = " opacity: 0;"  
134+     > 
135+       <div  
136+         class = " rc-picker-range-wrapper rc-picker-date-range-wrapper"  
137+         style = " min-width: 0;"  
138+       > 
139+         <div  
140+           class = " rc-picker-range-arrow"  
141+           style = " left: 0px;"  
142+         /> 
143+         <div  
144+           class = " rc-picker-panel-container"  
145+           style = " margin-left: 0px;"  
146+         > 
147+           <h1 > 
148+             Light 
149+           </h1 > 
150+         </div > 
151+       </div > 
152+     </div > 
153+   </div >, 
154+ ] 
155+ ` 
Original file line number Diff line number Diff line change @@ -724,4 +724,9 @@ describe('Picker.Basic', () => {
724724    wrapper . closePicker ( ) ; 
725725    expect ( wrapper . find ( 'input' ) . prop ( 'value' ) ) . toEqual ( '20000101' ) ; 
726726  } ) ; 
727+ 
728+   it ( 'panelRender' ,  ( )  =>  { 
729+     const  wrapper  =  mount ( < MomentPicker  open  panelRender = { ( )  =>  < h1 > Light</ h1 > }  /> ) ; 
730+     expect ( wrapper . render ( ) ) . toMatchSnapshot ( ) ; 
731+   } ) ; 
727732} ) ; 
Original file line number Diff line number Diff line change @@ -1382,4 +1382,9 @@ describe('Picker.Range', () => {
13821382      jest . useRealTimers ( ) ; 
13831383    } ) ; 
13841384  } ) ; 
1385+ 
1386+   it ( 'panelRender' ,  ( )  =>  { 
1387+     const  wrapper  =  mount ( < MomentRangePicker  open  panelRender = { ( )  =>  < h1 > Light</ h1 > }  /> ) ; 
1388+     expect ( wrapper . render ( ) ) . toMatchSnapshot ( ) ; 
1389+   } ) ; 
13851390} ) ; 
 
 
   
 
     
   
   
          
    
    
     
    
      
     
     
    You can’t perform that action at this time.
  
 
    
  
    
      
        
     
       
      
     
   
 
    
    
  
 
  
 
     
    
0 commit comments