@@ -71,6 +71,8 @@ interface InputViewProps {
71
71
onMount : ( e : HTMLElement ) => void ;
72
72
/** Called after input field value has changed. */
73
73
onChange : ( e : React . SyntheticEvent < HTMLElement > , data : any ) => void ;
74
+ /** Called when component looses focus. */
75
+ onBlur ?: ( e : React . SyntheticEvent < HTMLElement > ) => void ;
74
76
closePopup : ( ) => void ;
75
77
openPopup : ( ) => void ;
76
78
/** Called on input focus. */
@@ -141,6 +143,48 @@ class InputView extends React.Component<InputViewProps, any> {
141
143
private popupNode : HTMLElement | undefined ;
142
144
private mouseLeaveTimeout : number | null ;
143
145
146
+ public onBlur = ( e , ...args ) => {
147
+ const {
148
+ closePopup,
149
+ } = this . props ;
150
+
151
+ if (
152
+ e . relatedTarget !== this . popupNode
153
+ && e . relatedTarget !== this . inputNode
154
+ && ! checkIE ( )
155
+ ) {
156
+ invoke ( this . props , 'onBlur' , e , ...args ) ;
157
+ closePopup ( ) ;
158
+ }
159
+ }
160
+
161
+ public onMouseLeave = ( e , ...args ) => {
162
+ const { closeOnMouseLeave, closePopup } = this . props ;
163
+
164
+ if ( e . relatedTarget !== this . popupNode && e . relatedTarget !== this . inputNode ) {
165
+ if ( closeOnMouseLeave ) {
166
+ invoke ( this . props , 'onMouseLeave' , e , ...args ) ;
167
+ this . mouseLeaveTimeout = window . setTimeout ( ( ) => {
168
+ if ( this . mouseLeaveTimeout ) {
169
+ closePopup ( ) ;
170
+ }
171
+ } , 500 ) ;
172
+ }
173
+ }
174
+ }
175
+
176
+ public onMouseEnter = ( e , ...args ) => {
177
+ const { closeOnMouseLeave } = this . props ;
178
+
179
+ invoke ( this . props , 'onMouseEnter' , e , ...args ) ;
180
+ if ( e . currentTarget === this . popupNode || e . currentTarget === this . inputNode ) {
181
+ if ( closeOnMouseLeave ) {
182
+ clearTimeout ( this . mouseLeaveTimeout ) ;
183
+ this . mouseLeaveTimeout = null ;
184
+ }
185
+ }
186
+ }
187
+
144
188
public render ( ) {
145
189
const {
146
190
renderPicker,
@@ -169,33 +213,6 @@ class InputView extends React.Component<InputViewProps, any> {
169
213
...rest
170
214
} = this . props ;
171
215
172
- const onBlur = ( e ) => {
173
- if ( e . relatedTarget !== this . popupNode && e . relatedTarget !== this . inputNode && ! checkIE ( ) ) {
174
- closePopup ( ) ;
175
- }
176
- } ;
177
-
178
- const onMouseLeave = ( e ) => {
179
- if ( e . relatedTarget !== this . popupNode && e . relatedTarget !== this . inputNode ) {
180
- if ( closeOnMouseLeave ) {
181
- this . mouseLeaveTimeout = window . setTimeout ( ( ) => {
182
- if ( this . mouseLeaveTimeout ) {
183
- closePopup ( ) ;
184
- }
185
- } , 500 ) ;
186
- }
187
- }
188
- } ;
189
-
190
- const onMouseEnter = ( e ) => {
191
- if ( e . currentTarget === this . popupNode || e . currentTarget === this . inputNode ) {
192
- if ( closeOnMouseLeave ) {
193
- clearTimeout ( this . mouseLeaveTimeout ) ;
194
- this . mouseLeaveTimeout = null ;
195
- }
196
- }
197
- } ;
198
-
199
216
const inputElement = (
200
217
< FormInputWithRef
201
218
{ ...rest }
@@ -212,8 +229,8 @@ class InputView extends React.Component<InputViewProps, any> {
212
229
invoke ( this . props , 'onFocus' , e , this . props ) ;
213
230
openPopup ( ) ;
214
231
} }
215
- onBlur = { onBlur }
216
- onMouseEnter = { onMouseEnter }
232
+ onBlur = { this . onBlur }
233
+ onMouseEnter = { this . onMouseEnter }
217
234
onChange = { onChange } />
218
235
) ;
219
236
@@ -255,9 +272,9 @@ class InputView extends React.Component<InputViewProps, any> {
255
272
mountNode = { mountNode }
256
273
>
257
274
< div
258
- onBlur = { onBlur }
259
- onMouseLeave = { onMouseLeave }
260
- onMouseEnter = { onMouseEnter }
275
+ onBlur = { this . onBlur }
276
+ onMouseLeave = { this . onMouseLeave }
277
+ onMouseEnter = { this . onMouseEnter }
261
278
style = { { outline : 'none' } }
262
279
tabIndex = { 0 }
263
280
ref = { ( ref ) => this . popupNode = ref }
0 commit comments