11import React , { PureComponent } from 'react' ;
22import PropTypes from 'prop-types' ;
33import DayCell , { rangeShape } from './DayCell.js' ;
4- import { calcFocusDate } from './utils' ;
5- import styles from './styles' ;
4+ import { calcFocusDate , generateStyles } from './utils' ;
65import classnames from 'classnames' ;
76import { addMonths , startOfDay , endOfDay , addYears , setYear , setMonth } from 'date-fns' ;
87import defaultLocale from 'date-fns/locale/en-US' ;
8+ import coreStyles from './styles' ;
99
1010import {
1111 format ,
@@ -27,9 +27,11 @@ class Calendar extends PureComponent {
2727 this . changeShownDate = this . changeShownDate . bind ( this ) ;
2828 this . renderDays = this . renderDays . bind ( this ) ;
2929 this . handleRangeFocusChange = this . handleRangeFocusChange . bind ( this ) ;
30+ this . renderDateDisplay = this . renderDateDisplay . bind ( this ) ;
3031 this . state = {
3132 focusedDate : calcFocusDate ( null , props ) ,
3233 } ;
34+ this . styles = generateStyles ( [ coreStyles , props . classNames ] ) ;
3335 }
3436 updateShownDate ( props ) {
3537 const newFocus = calcFocusDate ( this . state . focusedDate , props || this . props ) ;
@@ -61,23 +63,23 @@ class Calendar extends PureComponent {
6163 handleRangeFocusChange ( rangesIndex , rangeItemIndex ) {
6264 this . props . onRangeFocusChange && this . props . onRangeFocusChange ( [ rangesIndex , rangeItemIndex ] ) ;
6365 }
64- renderMonthAndYear ( classes , focusedDate ) {
66+ renderMonthAndYear ( focusedDate ) {
6567 const { showMonthArrow, locale, minDate, maxDate } = this . props ;
6668 const upLimit = maxDate ? maxDate . getFullYear ( ) : addYears ( new Date ( ) , 20 ) . getFullYear ( ) ;
6769 const downLimit = minDate ? minDate . getFullYear ( ) : addYears ( new Date ( ) , - 100 ) . getFullYear ( ) ;
68-
70+ const styles = this . styles ;
6971 return (
70- < div className = { classes . monthAndYearWrapper } >
72+ < div className = { styles . monthAndYearWrapper } >
7173 { showMonthArrow ? (
7274 < button
7375 type = "button"
74- className = { classnames ( classes . nextPrevButton , classes . prevButton ) }
76+ className = { classnames ( styles . nextPrevButton , styles . prevButton ) }
7577 onClick = { ( ) => this . changeShownDate ( 'monthOffset' , - 1 ) } >
7678 < i />
7779 </ button >
7880 ) : null }
79- < span className = { classes . monthAndYearPickers } >
80- < span className = { classes . monthPicker } >
81+ < span className = { styles . monthAndYearPickers } >
82+ < span className = { styles . monthPicker } >
8183 < select
8284 value = { focusedDate . getMonth ( ) }
8385 onChange = { e => this . changeShownDate ( 'setMonth' , e . target . value ) } >
@@ -88,8 +90,8 @@ class Calendar extends PureComponent {
8890 ) ) }
8991 </ select >
9092 </ span >
91- < span className = { classes . monthAndYearDivider } />
92- < span className = { classes . yearPicker } >
93+ < span className = { styles . monthAndYearDivider } />
94+ < span className = { styles . yearPicker } >
9395 < select
9496 value = { focusedDate . getFullYear ( ) }
9597 onChange = { e => this . changeShownDate ( 'setYear' , e . target . value ) } >
@@ -107,27 +109,64 @@ class Calendar extends PureComponent {
107109 { showMonthArrow ? (
108110 < button
109111 type = "button"
110- className = { classnames ( classes . nextPrevButton , classes . nextButton ) }
112+ className = { classnames ( styles . nextPrevButton , styles . nextButton ) }
111113 onClick = { ( ) => this . changeShownDate ( 'monthOffset' , + 1 ) } >
112114 < i />
113115 </ button >
114116 ) : null }
115117 </ div >
116118 ) ;
117119 }
118- renderWeekdays ( classes , dateOptions ) {
120+ renderWeekdays ( dateOptions ) {
119121 const now = new Date ( ) ;
120122 return eachDayOfInterval ( {
121123 start : startOfWeek ( now , dateOptions ) ,
122124 end : endOfWeek ( now , dateOptions ) ,
123125 } ) . map ( ( day , i ) => (
124- < span className = { classes . weekDay } key = { i } >
126+ < span className = { this . styles . weekDay } key = { i } >
125127 { format ( day , 'ddd' , dateOptions ) }
126128 </ span >
127129 ) ) ;
128130 }
129-
130- renderDays ( classes , dateOptions , focusedDate ) {
131+ renderDateDisplay ( dateOptions ) {
132+ const { focusedRange, color, ranges } = this . props ;
133+ const styles = this . styles ;
134+ return (
135+ < div className = { styles . dateDisplayWrapper } >
136+ { ranges . map ( ( range , i ) => {
137+ if ( range . showDateDisplay === false || ( range . disabled && ! range . showDateDisplay ) )
138+ return null ;
139+ return (
140+ < div className = { styles . dateDisplay } key = { i } style = { { color : range . color || color } } >
141+ < span
142+ className = { classnames ( styles . dateDisplayItem , {
143+ [ styles . dateDisplayItemActive ] : focusedRange [ 0 ] === i && focusedRange [ 1 ] === 0 ,
144+ } ) }
145+ onFocus = { ( ) => this . handleRangeFocusChange ( i , 0 ) } >
146+ < input
147+ disabled = { range . disabled }
148+ readOnly
149+ value = { this . formatDateDisplay ( range . startDate , dateOptions , '-' ) }
150+ />
151+ </ span >
152+ < span
153+ className = { classnames ( styles . dateDisplayItem , {
154+ [ styles . dateDisplayItemActive ] : focusedRange [ 0 ] === i && focusedRange [ 1 ] === 1 ,
155+ } ) }
156+ onFocus = { ( ) => this . handleRangeFocusChange ( i , 1 ) } >
157+ < input
158+ disabled = { range . disabled }
159+ readOnly
160+ value = { this . formatDateDisplay ( range . endDate , dateOptions , 'Continuous' ) }
161+ />
162+ </ span >
163+ </ div >
164+ ) ;
165+ } ) }
166+ </ div >
167+ ) ;
168+ }
169+ renderDays ( dateOptions , focusedDate ) {
131170 const now = new Date ( ) ;
132171 const { specialDays } = this . props ;
133172 const minDate = this . props . minDate && startOfDay ( this . props . minDate ) ;
@@ -161,61 +200,34 @@ class Calendar extends PureComponent {
161200 key = { index }
162201 disabled = { isOutsideMinMax }
163202 isPassive = { ! isWithinInterval ( day , { start : startDateOfMonth , end : endDateOfMonth } ) }
164- classNames = { classes }
203+ styles = { this . styles }
165204 />
166205 ) ;
167206 }
168207 ) ;
169208 }
170209
171- formatDateDisplay ( date , defaultText ) {
210+ formatDateDisplay ( date , dateOptions , defaultText ) {
172211 if ( ! date ) return defaultText ;
173- return format ( date , this . props . dateDisplayFormat ) ;
212+ return format ( date , this . props . dateDisplayFormat , dateOptions ) ;
174213 }
175214 render ( ) {
215+ const { showDateDisplay } = this . props ;
176216 const dateOptions = { locale : this . props . locale } ;
177- const { focusedRange, color } = this . props ;
178217 return (
179- < div className = { classnames ( styles . calendarWrapper , this . props . className ) } >
180- < div className = { styles . dateDisplayWrapper } >
181- { this . props . ranges . map ( ( range , i ) => (
182- < div className = { styles . dateDisplay } key = { i } style = { { color : range . color || color } } >
183- < span
184- className = { classnames ( styles . dateDisplayItem , {
185- [ styles . dateDisplayItemActive ] : focusedRange [ 0 ] === i && focusedRange [ 1 ] === 0 ,
186- } ) }
187- onFocus = { ( ) => this . handleRangeFocusChange ( i , 0 ) } >
188- < input
189- disabled = { range . disabled }
190- readOnly
191- value = { this . formatDateDisplay ( range . startDate , '-' ) }
192- />
193- </ span >
194- < span
195- className = { classnames ( styles . dateDisplayItem , {
196- [ styles . dateDisplayItemActive ] : focusedRange [ 0 ] === i && focusedRange [ 1 ] === 1 ,
197- } ) }
198- onFocus = { ( ) => this . handleRangeFocusChange ( i , 1 ) } >
199- < input
200- disabled = { range . disabled }
201- readOnly
202- value = { this . formatDateDisplay ( range . endDate , 'Continuous' ) }
203- />
204- </ span >
205- </ div >
206- ) ) }
207- </ div >
208- { this . renderMonthAndYear ( styles , this . state . focusedDate ) }
218+ < div className = { classnames ( this . styles . calendarWrapper , this . props . className ) } >
219+ { showDateDisplay && this . renderDateDisplay ( dateOptions ) }
220+ { this . renderMonthAndYear ( this . state . focusedDate ) }
209221 < div
210- className = { styles . months }
222+ className = { this . styles . months }
211223 onMouseLeave = { ( ) => {
212224 this . props . onPreviewChange && this . props . onPreviewChange ( ) ;
213225 } } >
214226 { new Array ( this . props . months ) . fill ( null ) . map ( ( _ , i ) => (
215- < div key = { i } className = { styles . month } >
216- < div className = { styles . weekDays } > { this . renderWeekdays ( styles , dateOptions ) } </ div >
217- < div className = { styles . days } >
218- { this . renderDays ( styles , dateOptions , addMonths ( this . state . focusedDate , i ) ) }
227+ < div key = { i } className = { this . styles . month } >
228+ < div className = { this . styles . weekDays } > { this . renderWeekdays ( dateOptions ) } </ div >
229+ < div className = { this . styles . days } >
230+ { this . renderDays ( dateOptions , addMonths ( this . state . focusedDate , i ) ) }
219231 </ div >
220232 </ div >
221233 ) ) }
@@ -233,6 +245,7 @@ Calendar.defaultProps = {
233245 ranges : [ ] ,
234246 focusedRange : [ 0 , 0 ] ,
235247 dateDisplayFormat : 'MMM D,YYYY' ,
248+ showDateDisplay : true ,
236249 showSelectionPreview : true ,
237250 displayMode : 'date' ,
238251 months : 1 ,
@@ -261,6 +274,7 @@ Calendar.propTypes = {
261274 focusedRange : PropTypes . arrayOf ( PropTypes . number ) ,
262275 months : PropTypes . number ,
263276 className : PropTypes . string ,
277+ showDateDisplay : PropTypes . bool ,
264278 showSelectionPreview : PropTypes . bool ,
265279 displayMode : PropTypes . oneOf ( [ 'dateRange' , 'date' ] ) ,
266280 color : PropTypes . string ,
0 commit comments