1+ "use strict" ;
2+
3+ Object . defineProperty ( exports , "__esModule" , {
4+ value : true
5+ } ) ;
6+ exports . default = void 0 ;
7+
8+ var _react = _interopRequireWildcard ( require ( "react" ) ) ;
9+
10+ var _propTypes = _interopRequireDefault ( require ( "prop-types" ) ) ;
11+
12+ var _Calendar = _interopRequireDefault ( require ( "../Calendar" ) ) ;
13+
14+ var _DayCell = require ( "../DayCell" ) ;
15+
16+ var _utils = require ( "../../utils" ) ;
17+
18+ var _dateFns = require ( "date-fns" ) ;
19+
20+ var _classnames = _interopRequireDefault ( require ( "classnames" ) ) ;
21+
22+ var _styles = _interopRequireDefault ( require ( "../../styles" ) ) ;
23+
24+ function _interopRequireDefault ( obj ) { return obj && obj . __esModule ? obj : { default : obj } ; }
25+
26+ function _getRequireWildcardCache ( ) { if ( typeof WeakMap !== "function" ) return null ; var cache = new WeakMap ( ) ; _getRequireWildcardCache = function ( ) { return cache ; } ; return cache ; }
27+
28+ function _interopRequireWildcard ( obj ) { if ( obj && obj . __esModule ) { return obj ; } if ( obj === null || typeof obj !== "object" && typeof obj !== "function" ) { return { default : obj } ; } var cache = _getRequireWildcardCache ( ) ; if ( cache && cache . has ( obj ) ) { return cache . get ( obj ) ; } var newObj = { } ; var hasPropertyDescriptor = Object . defineProperty && Object . getOwnPropertyDescriptor ; for ( var key in obj ) { if ( Object . prototype . hasOwnProperty . call ( obj , key ) ) { var desc = hasPropertyDescriptor ? Object . getOwnPropertyDescriptor ( obj , key ) : null ; if ( desc && ( desc . get || desc . set ) ) { Object . defineProperty ( newObj , key , desc ) ; } else { newObj [ key ] = obj [ key ] ; } } } newObj . default = obj ; if ( cache ) { cache . set ( obj , newObj ) ; } return newObj ; }
29+
30+ function _extends ( ) { _extends = Object . assign || function ( target ) { for ( var i = 1 ; i < arguments . length ; i ++ ) { var source = arguments [ i ] ; for ( var key in source ) { if ( Object . prototype . hasOwnProperty . call ( source , key ) ) { target [ key ] = source [ key ] ; } } } return target ; } ; return _extends . apply ( this , arguments ) ; }
31+
32+ class DateRange extends _react . Component {
33+ constructor ( props , context ) {
34+ super ( props , context ) ;
35+ this . setSelection = this . setSelection . bind ( this ) ;
36+ this . handleRangeFocusChange = this . handleRangeFocusChange . bind ( this ) ;
37+ this . updatePreview = this . updatePreview . bind ( this ) ;
38+ this . calcNewSelection = this . calcNewSelection . bind ( this ) ;
39+ this . state = {
40+ focusedRange : props . initialFocusedRange || [ ( 0 , _utils . findNextRangeIndex ) ( props . ranges ) , 0 ] ,
41+ preview : null
42+ } ;
43+ this . styles = ( 0 , _utils . generateStyles ) ( [ _styles . default , props . classNames ] ) ;
44+ }
45+
46+ calcNewSelection ( value , isSingleValue = true ) {
47+ const focusedRange = this . props . focusedRange || this . state . focusedRange ;
48+ const {
49+ ranges,
50+ onChange,
51+ maxDate,
52+ moveRangeOnFirstSelection,
53+ disabledDates
54+ } = this . props ;
55+ const focusedRangeIndex = focusedRange [ 0 ] ;
56+ const selectedRange = ranges [ focusedRangeIndex ] ;
57+ if ( ! selectedRange || ! onChange ) return { } ;
58+ let {
59+ startDate,
60+ endDate
61+ } = selectedRange ;
62+ if ( ! endDate ) endDate = new Date ( startDate ) ;
63+ let nextFocusRange ;
64+
65+ if ( ! isSingleValue ) {
66+ startDate = value . startDate ;
67+ endDate = value . endDate ;
68+ } else if ( focusedRange [ 1 ] === 0 ) {
69+ // startDate selection
70+ const dayOffset = ( 0 , _dateFns . differenceInCalendarDays ) ( endDate , startDate ) ;
71+ startDate = value ;
72+ endDate = moveRangeOnFirstSelection ? ( 0 , _dateFns . addDays ) ( value , dayOffset ) : value ;
73+ if ( maxDate ) endDate = ( 0 , _dateFns . min ) ( [ endDate , maxDate ] ) ;
74+ nextFocusRange = [ focusedRange [ 0 ] , 1 ] ;
75+ } else {
76+ endDate = value ;
77+ } // reverse dates if startDate before endDate
78+
79+
80+ let isStartDateSelected = focusedRange [ 1 ] === 0 ;
81+
82+ if ( ( 0 , _dateFns . isBefore ) ( endDate , startDate ) ) {
83+ isStartDateSelected = ! isStartDateSelected ;
84+ [ startDate , endDate ] = [ endDate , startDate ] ;
85+ }
86+
87+ const inValidDatesWithinRange = disabledDates . filter ( disabledDate => ( 0 , _dateFns . isWithinInterval ) ( disabledDate , {
88+ start : startDate ,
89+ end : endDate
90+ } ) ) ;
91+
92+ if ( inValidDatesWithinRange . length > 0 ) {
93+ if ( isStartDateSelected ) {
94+ startDate = ( 0 , _dateFns . addDays ) ( ( 0 , _dateFns . max ) ( inValidDatesWithinRange ) , 1 ) ;
95+ } else {
96+ endDate = ( 0 , _dateFns . addDays ) ( ( 0 , _dateFns . min ) ( inValidDatesWithinRange ) , - 1 ) ;
97+ }
98+ }
99+
100+ if ( ! nextFocusRange ) {
101+ const nextFocusRangeIndex = ( 0 , _utils . findNextRangeIndex ) ( this . props . ranges , focusedRange [ 0 ] ) ;
102+ nextFocusRange = [ nextFocusRangeIndex , 0 ] ;
103+ }
104+
105+ return {
106+ wasValid : ! ( inValidDatesWithinRange . length > 0 ) ,
107+ range : {
108+ startDate,
109+ endDate
110+ } ,
111+ nextFocusRange : nextFocusRange
112+ } ;
113+ }
114+
115+ setSelection ( value , isSingleValue ) {
116+ const {
117+ onChange,
118+ ranges,
119+ onRangeFocusChange
120+ } = this . props ;
121+ const focusedRange = this . props . focusedRange || this . state . focusedRange ;
122+ const focusedRangeIndex = focusedRange [ 0 ] ;
123+ const selectedRange = ranges [ focusedRangeIndex ] ;
124+ if ( ! selectedRange ) return ;
125+ const newSelection = this . calcNewSelection ( value , isSingleValue ) ;
126+ onChange ( {
127+ [ selectedRange . key || `range${ focusedRangeIndex + 1 } ` ] : { ...selectedRange ,
128+ ...newSelection . range
129+ }
130+ } ) ;
131+ this . setState ( {
132+ focusedRange : newSelection . nextFocusRange ,
133+ preview : null
134+ } ) ;
135+ onRangeFocusChange && onRangeFocusChange ( newSelection . nextFocusRange ) ;
136+ }
137+
138+ handleRangeFocusChange ( focusedRange ) {
139+ this . setState ( {
140+ focusedRange
141+ } ) ;
142+ this . props . onRangeFocusChange && this . props . onRangeFocusChange ( focusedRange ) ;
143+ }
144+
145+ updatePreview ( val ) {
146+ if ( ! val ) {
147+ this . setState ( {
148+ preview : null
149+ } ) ;
150+ return ;
151+ }
152+
153+ const {
154+ rangeColors,
155+ ranges
156+ } = this . props ;
157+ const focusedRange = this . props . focusedRange || this . state . focusedRange ;
158+ const color = ranges [ focusedRange [ 0 ] ] . color || rangeColors [ focusedRange [ 0 ] ] || color ;
159+ this . setState ( {
160+ preview : { ...val . range ,
161+ color
162+ }
163+ } ) ;
164+ }
165+
166+ render ( ) {
167+ return _react . default . createElement ( _Calendar . default , _extends ( {
168+ focusedRange : this . state . focusedRange ,
169+ onRangeFocusChange : this . handleRangeFocusChange ,
170+ preview : this . state . preview ,
171+ onPreviewChange : value => {
172+ this . updatePreview ( value ? this . calcNewSelection ( value ) : null ) ;
173+ }
174+ } , this . props , {
175+ displayMode : "dateRange" ,
176+ className : ( 0 , _classnames . default ) ( this . styles . dateRangeWrapper , this . props . className ) ,
177+ onChange : this . setSelection ,
178+ updateRange : val => this . setSelection ( val , false ) ,
179+ ref : target => {
180+ this . calendar = target ;
181+ }
182+ } ) ) ;
183+ }
184+
185+ }
186+
187+ DateRange . defaultProps = {
188+ classNames : { } ,
189+ ranges : [ ] ,
190+ moveRangeOnFirstSelection : false ,
191+ rangeColors : [ '#3d91ff' , '#3ecf8e' , '#fed14c' ] ,
192+ disabledDates : [ ]
193+ } ;
194+ DateRange . propTypes = { ..._Calendar . default . propTypes ,
195+ onChange : _propTypes . default . func ,
196+ onRangeFocusChange : _propTypes . default . func ,
197+ className : _propTypes . default . string ,
198+ ranges : _propTypes . default . arrayOf ( _DayCell . rangeShape ) ,
199+ moveRangeOnFirstSelection : _propTypes . default . bool
200+ } ;
201+ var _default = DateRange ;
202+ exports . default = _default ;
0 commit comments