@@ -2,6 +2,8 @@ import React, { Component } from 'react';
2
2
import PropTypes from 'prop-types' ;
3
3
import { Form } from 'semantic-ui-react' ;
4
4
import isEqual from 'date-fns/is_equal' ;
5
+ import isValid from 'date-fns/is_valid' ;
6
+ import parse from 'date-fns/parse' ;
5
7
import { formatDate } from '../utils' ;
6
8
import Calendar from '../components/calendar' ;
7
9
import Portal from '../components/portal' ;
@@ -23,14 +25,15 @@ class SimpleInput extends Component {
23
25
state = {
24
26
isCalendarVisible : false ,
25
27
selectedDate : null ,
28
+ selectedDateFormatted : '' ,
26
29
} ;
27
30
28
31
onDateSelected = ( { selectable, date } ) => {
29
32
if ( ! selectable ) {
30
33
return ;
31
34
}
32
35
33
- const { onDateSelected } = this . props ;
36
+ const { format , onDateSelected } = this . props ;
34
37
35
38
this . setState ( ( { selectedDate } ) => {
36
39
let newDate = date ;
@@ -39,15 +42,52 @@ class SimpleInput extends Component {
39
42
newDate = null ;
40
43
}
41
44
42
- onDateSelected ( date ) ;
45
+ onDateSelected ( newDate ) ;
43
46
44
47
return {
45
48
isCalendarVisible : false ,
46
49
selectedDate : newDate ,
50
+ selectedDateFormatted : formatDate ( newDate , format ) ,
47
51
} ;
48
52
} ) ;
49
53
} ;
50
54
55
+ handleBlur = ( ) => {
56
+ const { format } = this . props ;
57
+ const { selectedDateFormatted } = this . state ;
58
+ const newDate = parse ( selectedDateFormatted ) ;
59
+
60
+ if ( format . length !== selectedDateFormatted . length || ! isValid ( newDate ) ) {
61
+ this . setState ( {
62
+ selectedDateFormatted : '' ,
63
+ } ) ;
64
+ }
65
+ } ;
66
+
67
+ handleDateChange = ( evt , { value } ) => {
68
+ const { format, onDateSelected } = this . props ;
69
+
70
+ this . setState ( {
71
+ selectedDate : null ,
72
+ selectedDateFormatted : value ,
73
+ } ) ;
74
+
75
+ onDateSelected ( null ) ;
76
+
77
+ if ( value . length === format . length ) {
78
+ const newDate = parse ( value ) ;
79
+
80
+ if ( isValid ( newDate ) ) {
81
+ this . setState ( {
82
+ selectedDate : newDate ,
83
+ selectedDateFormatted : formatDate ( newDate , format ) ,
84
+ } ) ;
85
+
86
+ onDateSelected ( newDate ) ;
87
+ }
88
+ }
89
+ } ;
90
+
51
91
showCalendar = ( ) => {
52
92
this . setState ( ( { isCalendarVisible } ) => ( {
53
93
isCalendarVisible : ! isCalendarVisible ,
@@ -56,16 +96,21 @@ class SimpleInput extends Component {
56
96
57
97
render ( ) {
58
98
const { date, format, inputProps } = this . props ;
59
- const { isCalendarVisible, selectedDate } = this . state ;
99
+ const {
100
+ isCalendarVisible,
101
+ selectedDate,
102
+ selectedDateFormatted,
103
+ } = this . state ;
60
104
61
105
return (
62
106
< div id = "test" >
63
107
< Form . Input
64
108
icon = "calendar"
65
- onChange = { ( ) => { } }
109
+ onBlur = { this . handleBlur }
110
+ onChange = { this . handleDateChange }
66
111
onClick = { this . showCalendar }
67
112
placeholder = { format }
68
- value = { formatDate ( selectedDate , format ) }
113
+ value = { selectedDateFormatted }
69
114
{ ...inputProps }
70
115
/>
71
116
{ isCalendarVisible && (
0 commit comments