@@ -3,14 +3,14 @@ import classNames from 'classnames';
3
3
import { withDefaultProps } from './' ;
4
4
import { sanitizeDate , withImmutableProps } from '../utils' ;
5
5
import isBefore from 'date-fns/is_before' ;
6
- import enhanceHeader from '../Header/withRange ' ;
6
+ import enhanceHeader from '../Header/withMultipleRanges ' ;
7
7
import format from 'date-fns/format' ;
8
8
import parse from 'date-fns/parse' ;
9
9
import styles from '../Day/Day.scss' ;
10
10
11
11
let isTouchDevice = false ;
12
12
13
- export const EVENT_TYPE = {
13
+ export const EVENT_TYPES = {
14
14
DELETE : 4 ,
15
15
END : 3 ,
16
16
HOVER : 2 ,
@@ -50,6 +50,7 @@ export const enhanceDay = withPropsOnChange(['selected'], ({date, selected, them
50
50
// Enhancer to handle selecting and displaying multiple dates
51
51
export const withMultipleRanges = compose (
52
52
withDefaultProps ,
53
+ withState ( 'displayIndex' , 'setDisplayIndex' , 0 ) ,
53
54
withState ( 'scrollDate' , 'setScrollDate' , getInitialDate ) ,
54
55
withState ( 'displayKey' , 'setDisplayKey' , getInitialDate ) ,
55
56
withState ( 'selectionStart' , 'setSelectionStart' , null ) ,
@@ -62,23 +63,25 @@ export const withMultipleRanges = compose(
62
63
DayComponent : enhanceDay ( DayComponent ) ,
63
64
HeaderComponent : enhanceHeader ( HeaderComponent ) ,
64
65
} ) ) ,
65
- withProps ( ( { displayKey, passThrough, selected, setDisplayKey, ...props } ) => ( {
66
+ withProps ( ( { displayKey, passThrough, selected, setDisplayKey, setDisplayIndex , displayIndex , ...props } ) => ( {
66
67
/* eslint-disable sort-keys */
67
68
passThrough : {
68
69
...passThrough ,
69
70
Day : {
70
- onClick : ( date ) => handleSelect ( date , { selected, ...props } ) ,
71
+ onClick : ( date ) => handleSelect ( date , { selected, setDisplayIndex , ...props } ) ,
71
72
handlers : {
72
73
onMouseOver : ! isTouchDevice && props . selectionStart
73
74
? ( e ) => handleMouseOver ( e , { selected, ...props } )
74
75
: null ,
75
76
} ,
76
77
} ,
77
78
Years : {
78
- selected : selected && selected [ displayKey ] ,
79
- onSelect : ( date ) => handleYearSelect ( date , { displayKey , selected , ... props } ) ,
79
+ selected : selected [ displayIndex ] && parse ( selected [ displayIndex ] [ displayKey ] ) ,
80
+ onSelect : ( date , e , callback ) => handleYearSelect ( date , callback ) ,
80
81
} ,
81
82
Header : {
83
+ setDisplayIndex,
84
+ displayIndex,
82
85
onYearClick : ( date , e , key ) => setDisplayKey ( key || 'start' ) ,
83
86
} ,
84
87
} ,
@@ -98,42 +101,40 @@ function getSortedSelection({start, end}) {
98
101
: { start : end , end : start } ;
99
102
}
100
103
101
- function handleSelect ( date , { onSelect, selected, selectionStart, setSelectionStart, selectionStartIdx, setSelectionStartIdx} ) {
104
+ function handleSelect ( date , { onSelect, selected, selectionStart, setSelectionStart, selectionStartIdx, setSelectionStartIdx, setDisplayIndex } ) {
102
105
const positionOfDate = determineIfDateAlreadySelected ( date , selected ) ;
106
+ const funcs = { onSelect, setSelectionStart, setSelectionStartIdx, setDisplayIndex} ;
103
107
104
108
if ( positionOfDate . value && ! selectionStart ) { //selecting an already defined range
105
109
const selectedDate = selected [ positionOfDate . index ] ; //not clone so modding this is modding selected
106
110
selectedDate . end = date ; //not possible to have start/end reversed when clicking on already set range
107
- selectedDate . eventType = EVENT_TYPE . START ;
108
111
109
- onSelect ( selected ) ;
110
- setSelectionStart ( selectedDate . start ) ;
111
- setSelectionStartIdx ( positionOfDate . index ) ; //grab index of selected and set in state
112
- } else if ( selectionStart ) { //ending new date range
112
+ updateSelectedState ( positionOfDate . index , selectedDate . start , positionOfDate . index , selected , funcs ) ; //grab index of selected and set in state
113
+ } else if ( selectionStart ) { //ending date range selection
113
114
if ( positionOfDate . value === PositionTypes . START && ! ( date < selectionStart ) ) { //if in process and selecting start, assume they want to cancel
114
- selected [ selectionStartIdx ] . eventType = EVENT_TYPE . DELETE
115
- onSelect ( selected ) ; //call twice to notify parent component something is about to be deleted
116
- onSelect ( [ ...selected . slice ( 0 , positionOfDate . index ) , ...selected . slice ( positionOfDate . index + 1 ) ] ) ;
115
+ const displayIdx = positionOfDate . index > 0 ? positionOfDate . index - 1 : 0 ;
116
+ updateSelectedState ( displayIdx , null , null , [ ...selected . slice ( 0 , positionOfDate . index ) , ...selected . slice ( positionOfDate . index + 1 ) ] , funcs ) ;
117
117
} else {
118
118
selected [ selectionStartIdx ] = { //modifying passed in object without clone due to immediate set state
119
- eventType : EVENT_TYPE . END ,
120
119
...getSortedSelection ( {
121
120
start : selectionStart ,
122
121
end : date ,
123
122
} ) ,
124
123
} ;
125
- onSelect ( selected ) ;
124
+ updateSelectedState ( positionOfDate . index , null , null , selected , funcs ) ;
126
125
}
127
- setSelectionStart ( null ) ;
128
- setSelectionStartIdx ( null ) ;
129
126
} else { //starting new date range
130
- onSelect ( selected . concat ( { eventType :EVENT_TYPE . START , start : date , end : date } ) ) ;
131
-
132
- setSelectionStart ( date ) ;
133
- setSelectionStartIdx ( selected . length ) ; //accounts for increase due to concat
127
+ updateSelectedState ( selected . length , date , selected . length , selected . concat ( { eventType :EVENT_TYPES . START , start : date , end : date } ) , funcs ) //length accounts for increase due to concat
134
128
}
135
129
}
136
130
131
+ function updateSelectedState ( displayIdx , selectStart , selectStartIdx , selected , { onSelect, setSelectionStart, setSelectionStartIdx, setDisplayIndex} ) {
132
+ onSelect ( selected ) ;
133
+ setDisplayIndex ( displayIdx ) ;
134
+ setSelectionStart ( selectStart ) ;
135
+ setSelectionStartIdx ( selectStartIdx ) ;
136
+ }
137
+
137
138
function handleMouseOver ( e , { onSelect, selectionStart, selectionStartIdx, selected} ) {
138
139
const dateStr = e . target . getAttribute ( 'data-date' ) ;
139
140
const date = dateStr && parse ( dateStr ) ;
@@ -142,7 +143,7 @@ function handleMouseOver(e, {onSelect, selectionStart, selectionStartIdx, select
142
143
if ( selectionStartIdx === null ) { return ; }
143
144
144
145
selected [ selectionStartIdx ] = {
145
- eventType : EVENT_TYPE . HOVER ,
146
+ eventType : EVENT_TYPES . HOVER ,
146
147
...getSortedSelection ( {
147
148
start : selectionStart ,
148
149
end : date ,
@@ -151,12 +152,8 @@ function handleMouseOver(e, {onSelect, selectionStart, selectionStartIdx, select
151
152
onSelect ( selected ) ;
152
153
}
153
154
154
- function handleYearSelect ( date , { displayKey, onSelect, selected, setScrollDate} ) {
155
-
156
- setScrollDate ( date ) ;
157
- onSelect ( getSortedSelection (
158
- Object . assign ( { } , selected , { [ displayKey ] : parse ( date ) } ) )
159
- ) ;
155
+ function handleYearSelect ( date , callback ) {
156
+ callback ( parse ( date ) ) ;
160
157
}
161
158
162
159
function getInitialDate ( { selected} ) { //add
0 commit comments