@@ -31,7 +31,7 @@ export class DateTimePicker extends React.Component {
31
31
super ( props ) ;
32
32
this . state = {
33
33
positionLeft : 0 ,
34
- selectedDay : props . value ? typeof props . value === 'string' ? new Date ( props . value ) : props . value : undefined ,
34
+ selectedDay : this . createDate ( ) ,
35
35
selectingMonth : false ,
36
36
selectingYear : false ,
37
37
isOpen : false ,
@@ -45,67 +45,69 @@ export class DateTimePicker extends React.Component {
45
45
} ) ;
46
46
}
47
47
48
+ createDate = ( ) => this . props . value ? typeof this . props . value === 'string' ? new Date ( this . props . value ) : this . props . value : undefined ;
49
+
48
50
handleOverlayToggle = isOpen => this . setState ( { isOpen } )
49
51
50
- handleDayChange = day => this . setState ( prevProps => ( {
51
- selectedDay : new Date (
52
+ handleDayChange = day => {
53
+ const prevDate = this . createDate ( ) ;
54
+ const newDate = new Date (
52
55
day . getFullYear ( ) ,
53
56
day . getMonth ( ) ,
54
57
day . getDate ( ) ,
55
- prevProps . selectedDay && prevProps . selectedDay . getHours ( ) || new Date ( ) . getHours ( ) ,
56
- prevProps . selectedDay && prevProps . selectedDay . getMinutes ( ) || new Date ( ) . getMinutes ( )
57
- ) ,
58
- isOpen : ! this . props . closeOnDaySelect ,
59
- } ) , ( ) => this . props . onChange ( this . state . selectedDay ) ) ;
60
-
61
- handleYearChange = year => this . setState ( ( { selectedDay = new Date ( ) } ) => ( {
62
- selectedDay : selectValidDate ( new Date (
58
+ prevDate && prevDate . getHours ( ) || new Date ( ) . getHours ( ) ,
59
+ prevDate && prevDate . getMinutes ( ) || new Date ( ) . getMinutes ( )
60
+ ) ;
61
+ this . setState ( {
62
+ isOpen : this . props . closeOnDaySelect ,
63
+ } ) ;
64
+ return this . props . onChange ( newDate ) ;
65
+ } ;
66
+
67
+ handleYearChange = year => {
68
+ const prevDate = this . createDate ( ) ;
69
+ const newDate = selectValidDate ( new Date (
63
70
year ,
64
- selectedDay . getMonth ( ) ,
65
- selectedDay . getDate ( ) ,
66
- selectedDay . getHours ( ) ,
67
- selectedDay . getMinutes ( )
68
- ) , this . props . disabledDays ) ,
69
- } ) , ( ) => this . props . onChange ( this . state . selectedDay ) )
70
-
71
- handleMonthChange = month => this . setState ( ( { selectedDay = new Date ( ) } ) => ( {
72
- selectedDay : selectValidDate ( new Date (
73
- selectedDay . getFullYear ( ) ,
71
+ prevDate . getMonth ( ) ,
72
+ prevDate . getDate ( ) ,
73
+ prevDate . getHours ( ) ,
74
+ prevDate . getMinutes ( )
75
+ ) , this . props . disabledDays ) ;
76
+ return this . props . onChange ( newDate ) ;
77
+ }
78
+
79
+ handleMonthChange = month => {
80
+ const prevDate = this . createDate ( ) ;
81
+ const newDate = selectValidDate ( new Date (
82
+ prevDate . getFullYear ( ) ,
74
83
month ,
75
- selectedDay . getDate ( ) ,
76
- selectedDay . getHours ( ) ,
77
- selectedDay . getMinutes ( )
78
- ) , this . props . disabledDays ) ,
79
- } ) , ( ) => this . props . onChange ( this . state . selectedDay ) ) ;
84
+ prevDate . getDate ( ) ,
85
+ prevDate . getHours ( ) ,
86
+ prevDate . getMinutes ( )
87
+ ) , this . props . disabledDays ) ;
88
+ return this . props . onChange ( newDate ) ;
89
+ }
80
90
81
91
toggleSelectingMonth = selectingMonth => this . setState ( { selectingMonth } )
82
92
83
93
toggleSelectingYear = selectingYear => this . setState ( { selectingYear } )
84
94
85
- handleChangeHours = hours => this . setState ( ( { selectedDay = new Date ( ) } ) => ( {
86
- selectedDay : new Date (
87
- selectedDay . getFullYear ( ) ,
88
- selectedDay . getMonth ( ) ,
89
- selectedDay . getDate ( ) ,
90
- hours ,
91
- selectedDay . getMinutes ( )
92
- ) ,
93
- } ) , ( ) => this . props . onChange ( this . state . selectedDay ) )
94
-
95
- handleChangeMinutes = minutes => this . setState ( ( { selectedDay = new Date ( ) } ) => ( {
96
- selectedDay : new Date (
97
- selectedDay . getFullYear ( ) ,
98
- selectedDay . getMonth ( ) ,
99
- selectedDay . getDate ( ) ,
100
- selectedDay . getHours ( ) ,
101
- minutes
102
- ) ,
103
- } ) , ( ) => this . props . onChange ( this . state . selectedDay ) )
104
-
105
- clearValue = ( ) => this . setState ( { selectedDay : undefined } )
95
+ handleChangeHours = hours => {
96
+ const prevDate = this . createDate ( ) || new Date ( ) ;
97
+ prevDate . setHours ( hours ) ;
98
+ return this . props . onChange ( new Date ( prevDate ) ) ;
99
+ }
100
+
101
+ handleChangeMinutes = minutes => {
102
+ const prevDate = this . createDate ( ) || new Date ( ) ;
103
+ prevDate . setMinutes ( minutes ) ;
104
+ return this . props . onChange ( new Date ( prevDate ) ) ;
105
+ }
106
+
107
+ clearValue = ( ) => this . props . onChange ( undefined )
106
108
107
109
render ( ) {
108
- const { isOpen, selectedDay , selectingYear, selectingMonth } = this . state ;
110
+ const { isOpen, selectingYear, selectingMonth } = this . state ;
109
111
const {
110
112
placeholder,
111
113
variant,
@@ -116,14 +118,15 @@ export class DateTimePicker extends React.Component {
116
118
disabledDays,
117
119
isClearable,
118
120
} = this . props ;
121
+ const value = this . createDate ( ) ;
119
122
const inputPlaceholder = getPlaceholder ( variant , placeholder ) ;
120
123
const cleanDisabledDays = createDisabledDays ( disabledDays ) ;
121
124
return (
122
125
< div style = { { position : 'relative' } } ref = { this . wrapperRef } >
123
126
< PickerInput
124
127
handleOverlayToggle = { this . handleOverlayToggle }
125
128
placeholder = { inputPlaceholder }
126
- selectedDay = { selectedDay }
129
+ selectedDay = { value }
127
130
variant = { variant }
128
131
locale = { locale }
129
132
isDisabled = { isDisabled }
@@ -140,7 +143,7 @@ export class DateTimePicker extends React.Component {
140
143
>
141
144
< PopoverRoot
142
145
onDayClick = { this . handleDayChange }
143
- selectedDay = { selectedDay }
146
+ selectedDay = { value }
144
147
toggleSelectingMonth = { this . toggleSelectingMonth }
145
148
toggleSelectingYear = { this . toggleSelectingYear }
146
149
selectingYear = { selectingYear }
@@ -173,6 +176,7 @@ DateTimePicker.propTypes = {
173
176
closeOnDaySelect : PropTypes . bool ,
174
177
onChange : PropTypes . func . isRequired ,
175
178
isClearable : PropTypes . bool ,
179
+ pristine : PropTypes . bool ,
176
180
} ;
177
181
178
182
DateTimePicker . defaultProps = {
0 commit comments