@@ -31,7 +31,7 @@ export class DateTimePicker extends React.Component {
3131 super ( props ) ;
3232 this . state = {
3333 positionLeft : 0 ,
34- selectedDay : props . value ? typeof props . value === 'string' ? new Date ( props . value ) : props . value : undefined ,
34+ selectedDay : this . createDate ( ) ,
3535 selectingMonth : false ,
3636 selectingYear : false ,
3737 isOpen : false ,
@@ -45,67 +45,69 @@ export class DateTimePicker extends React.Component {
4545 } ) ;
4646 }
4747
48+ createDate = ( ) => this . props . value ? typeof this . props . value === 'string' ? new Date ( this . props . value ) : this . props . value : undefined ;
49+
4850 handleOverlayToggle = isOpen => this . setState ( { isOpen } )
4951
50- handleDayChange = day => this . setState ( prevProps => ( {
51- selectedDay : new Date (
52+ handleDayChange = day => {
53+ const prevDate = this . createDate ( ) ;
54+ const newDate = new Date (
5255 day . getFullYear ( ) ,
5356 day . getMonth ( ) ,
5457 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 (
6370 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 ( ) ,
7483 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+ }
8090
8191 toggleSelectingMonth = selectingMonth => this . setState ( { selectingMonth } )
8292
8393 toggleSelectingYear = selectingYear => this . setState ( { selectingYear } )
8494
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 )
106108
107109 render ( ) {
108- const { isOpen, selectedDay , selectingYear, selectingMonth } = this . state ;
110+ const { isOpen, selectingYear, selectingMonth } = this . state ;
109111 const {
110112 placeholder,
111113 variant,
@@ -116,14 +118,15 @@ export class DateTimePicker extends React.Component {
116118 disabledDays,
117119 isClearable,
118120 } = this . props ;
121+ const value = this . createDate ( ) ;
119122 const inputPlaceholder = getPlaceholder ( variant , placeholder ) ;
120123 const cleanDisabledDays = createDisabledDays ( disabledDays ) ;
121124 return (
122125 < div style = { { position : 'relative' } } ref = { this . wrapperRef } >
123126 < PickerInput
124127 handleOverlayToggle = { this . handleOverlayToggle }
125128 placeholder = { inputPlaceholder }
126- selectedDay = { selectedDay }
129+ selectedDay = { value }
127130 variant = { variant }
128131 locale = { locale }
129132 isDisabled = { isDisabled }
@@ -140,7 +143,7 @@ export class DateTimePicker extends React.Component {
140143 >
141144 < PopoverRoot
142145 onDayClick = { this . handleDayChange }
143- selectedDay = { selectedDay }
146+ selectedDay = { value }
144147 toggleSelectingMonth = { this . toggleSelectingMonth }
145148 toggleSelectingYear = { this . toggleSelectingYear }
146149 selectingYear = { selectingYear }
@@ -173,6 +176,7 @@ DateTimePicker.propTypes = {
173176 closeOnDaySelect : PropTypes . bool ,
174177 onChange : PropTypes . func . isRequired ,
175178 isClearable : PropTypes . bool ,
179+ pristine : PropTypes . bool ,
176180} ;
177181
178182DateTimePicker . defaultProps = {
0 commit comments