@@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
33import Calendar from './Calendar.js' ;
44import { rangeShape } from './DayCell' ;
55import { findNextRangeIndex , generateStyles } from '../utils.js' ;
6- import { isBefore , differenceInCalendarDays , addDays , min } from 'date-fns' ;
6+ import { isBefore , differenceInCalendarDays , addDays , min , isWithinInterval , max } from 'date-fns' ;
77import classnames from 'classnames' ;
88import coreStyles from '../styles' ;
99
@@ -22,7 +22,7 @@ class DateRange extends Component {
2222 }
2323 calcNewSelection ( value , isSingleValue = true ) {
2424 const focusedRange = this . props . focusedRange || this . state . focusedRange ;
25- const { ranges, onChange, maxDate, moveRangeOnFirstSelection } = this . props ;
25+ const { ranges, onChange, maxDate, moveRangeOnFirstSelection, disabledDates } = this . props ;
2626 const focusedRangeIndex = focusedRange [ 0 ] ;
2727 const selectedRange = ranges [ focusedRangeIndex ] ;
2828 if ( ! selectedRange || ! onChange ) return { } ;
@@ -43,16 +43,35 @@ class DateRange extends Component {
4343 } else {
4444 endDate = value ;
4545 }
46+
4647 // reverse dates if startDate before endDate
48+ let isStartDateSelected = focusedRange [ 1 ] === 0 ;
4749 if ( isBefore ( endDate , startDate ) ) {
50+ isStartDateSelected = ! isStartDateSelected ;
4851 [ startDate , endDate ] = [ endDate , startDate ] ;
4952 }
5053
54+ const inValidDatesWithinRange = disabledDates . filter ( disabledDate =>
55+ isWithinInterval ( disabledDate , {
56+ start : startDate ,
57+ end : endDate ,
58+ } )
59+ ) ;
60+
61+ if ( inValidDatesWithinRange . length > 0 ) {
62+ if ( isStartDateSelected ) {
63+ startDate = addDays ( max ( inValidDatesWithinRange ) , 1 ) ;
64+ } else {
65+ endDate = addDays ( min ( inValidDatesWithinRange ) , - 1 ) ;
66+ }
67+ }
68+
5169 if ( ! nextFocusRange ) {
5270 const nextFocusRangeIndex = findNextRangeIndex ( this . props . ranges , focusedRange [ 0 ] ) ;
5371 nextFocusRange = [ nextFocusRangeIndex , 0 ] ;
5472 }
5573 return {
74+ wasValid : ! ( inValidDatesWithinRange . length > 0 ) ,
5675 range : { startDate, endDate } ,
5776 nextFocusRange : nextFocusRange ,
5877 } ;
@@ -88,7 +107,7 @@ class DateRange extends Component {
88107 const { rangeColors, ranges } = this . props ;
89108 const focusedRange = this . props . focusedRange || this . state . focusedRange ;
90109 const color = ranges [ focusedRange [ 0 ] ] . color || rangeColors [ focusedRange [ 0 ] ] || color ;
91- this . setState ( { preview : { ...val , color } } ) ;
110+ this . setState ( { preview : { ...val . range , color } } ) ;
92111 }
93112 render ( ) {
94113 return (
@@ -97,7 +116,7 @@ class DateRange extends Component {
97116 onRangeFocusChange = { this . handleRangeFocusChange }
98117 preview = { this . state . preview }
99118 onPreviewChange = { value => {
100- this . updatePreview ( value ? this . calcNewSelection ( value ) . range : null ) ;
119+ this . updatePreview ( value ? this . calcNewSelection ( value ) : null ) ;
101120 } }
102121 { ...this . props }
103122 displayMode = "dateRange"
@@ -117,6 +136,7 @@ DateRange.defaultProps = {
117136 ranges : [ ] ,
118137 moveRangeOnFirstSelection : false ,
119138 rangeColors : [ '#3d91ff' , '#3ecf8e' , '#fed14c' ] ,
139+ disabledDates : [ ] ,
120140} ;
121141
122142DateRange . propTypes = {
0 commit comments