@@ -38,13 +38,14 @@ class ReactTooltip extends Component {
38
38
watchWindow : PropTypes . bool ,
39
39
isCapture : PropTypes . bool ,
40
40
globalEventOff : PropTypes . string ,
41
- getContent : PropTypes . any
41
+ getContent : PropTypes . any ,
42
+ countTransform : PropTypes . bool
42
43
}
43
44
44
45
constructor ( props ) {
45
46
super ( props )
46
47
this . state = {
47
- place : 'top ' , // Direction of tooltip
48
+ place : '' , // Direction of tooltip
48
49
type : 'dark' , // Color theme of tooltip
49
50
effect : 'float' , // float or fixed
50
51
show : false ,
@@ -61,12 +62,29 @@ class ReactTooltip extends Component {
61
62
currentTarget : null // Current target of mouse event
62
63
}
63
64
65
+ this . bind ( [
66
+ 'showTooltip' ,
67
+ 'updateTooltip' ,
68
+ 'hideTooltip' ,
69
+ 'globalRebuild' ,
70
+ 'onWindowResize'
71
+ ] )
72
+
64
73
this . mount = true
65
74
this . delayShowLoop = null
66
75
this . delayHideLoop = null
67
76
this . intervalUpdateContent = null
68
77
}
69
78
79
+ /**
80
+ * For unify the bind and unbind listener
81
+ */
82
+ bind ( methodArray ) {
83
+ methodArray . forEach ( method => {
84
+ this [ method ] = this [ method ] . bind ( this )
85
+ } )
86
+ }
87
+
70
88
componentDidMount ( ) {
71
89
this . setStyleHeader ( ) // Set the style to the <link>
72
90
this . bindListener ( ) // Bind listener for tooltip
@@ -115,27 +133,24 @@ class ReactTooltip extends Component {
115
133
if ( target . getAttribute ( 'currentItem' ) === null ) {
116
134
target . setAttribute ( 'currentItem' , 'false' )
117
135
}
136
+ this . unbindBasicListener ( target )
118
137
119
138
if ( this . isCustomEvent ( target ) ) {
120
139
this . customBindListener ( target )
121
140
return
122
141
}
123
142
124
- target . removeEventListener ( 'mouseenter' , this . showTooltip )
125
- target . addEventListener ( 'mouseenter' , ::this . showTooltip , isCaptureMode )
143
+ target . addEventListener ( 'mouseenter' , this . showTooltip , isCaptureMode )
126
144
if ( this . state . effect === 'float' ) {
127
- target . removeEventListener ( 'mousemove' , this . updateTooltip )
128
- target . addEventListener ( 'mousemove' , ::this . updateTooltip , isCaptureMode )
145
+ target . addEventListener ( 'mousemove' , this . updateTooltip , isCaptureMode )
129
146
}
130
-
131
- target . removeEventListener ( 'mouseleave' , this . hideTooltip )
132
- target . addEventListener ( 'mouseleave' , ::this . hideTooltip , isCaptureMode )
147
+ target . addEventListener ( 'mouseleave' , this . hideTooltip , isCaptureMode )
133
148
} )
134
149
135
150
// Global event to hide tooltip
136
151
if ( globalEventOff ) {
137
152
window . removeEventListener ( globalEventOff , this . hideTooltip )
138
- window . addEventListener ( globalEventOff , :: this . hideTooltip , false )
153
+ window . addEventListener ( globalEventOff , this . hideTooltip , false )
139
154
}
140
155
}
141
156
@@ -145,21 +160,25 @@ class ReactTooltip extends Component {
145
160
unbindListener ( ) {
146
161
const { id, globalEventOff} = this . props
147
162
const targetArray = this . getTargetArray ( id )
148
-
149
163
targetArray . forEach ( target => {
150
- if ( this . isCustomEvent ( target ) ) {
151
- this . customUnbindListener ( target )
152
- return
153
- }
154
-
155
- target . removeEventListener ( 'mouseenter' , this . showTooltip )
156
- target . removeEventListener ( 'mousemove' , this . updateTooltip )
157
- target . removeEventListener ( 'mouseleave' , this . hideTooltip )
164
+ this . unbindBasicListener ( target )
165
+ if ( this . isCustomEvent ( target ) ) this . customUnbindListener ( target )
158
166
} )
159
167
160
168
if ( globalEventOff ) window . removeEventListener ( globalEventOff , this . hideTooltip )
161
169
}
162
170
171
+ /**
172
+ * Invoke this before bind listener and ummount the compont
173
+ * it is necessary to invloke this even when binding custom event
174
+ * so that the tooltip can switch between custom and default listener
175
+ */
176
+ unbindBasicListener ( target ) {
177
+ target . removeEventListener ( 'mouseenter' , this . showTooltip )
178
+ target . removeEventListener ( 'mousemove' , this . updateTooltip )
179
+ target . removeEventListener ( 'mouseleave' , this . hideTooltip )
180
+ }
181
+
163
182
/**
164
183
* When mouse enter, show the tooltip
165
184
*/
@@ -170,6 +189,7 @@ class ReactTooltip extends Component {
170
189
const originTooltip = e . currentTarget . getAttribute ( 'data-tip' )
171
190
const isMultiline = e . currentTarget . getAttribute ( 'data-multiline' ) || multiline || false
172
191
192
+ // Generate tootlip content
173
193
let content = children
174
194
if ( getContent ) {
175
195
if ( Array . isArray ( getContent ) ) {
@@ -178,20 +198,29 @@ class ReactTooltip extends Component {
178
198
content = getContent ( )
179
199
}
180
200
}
181
-
182
201
const placeholder = getTipContent ( originTooltip , content , isMultiline )
183
202
203
+ // If it is focus event, switch to `solid` effect
204
+ const isFocus = e instanceof window . FocusEvent
205
+
184
206
this . setState ( {
185
207
placeholder,
186
208
place : e . currentTarget . getAttribute ( 'data-place' ) || this . props . place || 'top' ,
187
209
type : e . currentTarget . getAttribute ( 'data-type' ) || this . props . type || 'dark' ,
188
- effect : e . currentTarget . getAttribute ( 'data-effect' ) || this . props . effect || 'float' ,
210
+ effect : isFocus && 'solid' || e . currentTarget . getAttribute ( 'data-effect' ) || this . props . effect || 'float' ,
189
211
offset : e . currentTarget . getAttribute ( 'data-offset' ) || this . props . offset || { } ,
190
- html : e . currentTarget . getAttribute ( 'data-html' ) === 'true' || this . props . html || false ,
212
+ html : e . currentTarget . getAttribute ( 'data-html' )
213
+ ? e . currentTarget . getAttribute ( 'data-html' ) === 'true'
214
+ : ( this . props . html || false ) ,
191
215
delayShow : e . currentTarget . getAttribute ( 'data-delay-show' ) || this . props . delayShow || 0 ,
192
216
delayHide : e . currentTarget . getAttribute ( 'data-delay-hide' ) || this . props . delayHide || 0 ,
193
- border : e . currentTarget . getAttribute ( 'data-border' ) === 'true' || this . props . border || false ,
194
- extraClass : e . currentTarget . getAttribute ( 'data-class' ) || this . props . class || ''
217
+ border : e . currentTarget . getAttribute ( 'data-border' )
218
+ ? e . currentTarget . getAttribute ( 'data-border' ) === 'true'
219
+ : ( this . props . border || false ) ,
220
+ extraClass : e . currentTarget . getAttribute ( 'data-class' ) || this . props . class || '' ,
221
+ countTransform : e . currentTarget . getAttribute ( 'data-count-transform' )
222
+ ? e . currentTarget . getAttribute ( 'data-count-transform' ) === 'true'
223
+ : ( this . props . countTransform != null ? this . props . countTransform : true )
195
224
} , ( ) => {
196
225
this . addScrollListener ( e )
197
226
this . updateTooltip ( e )
@@ -243,7 +272,8 @@ class ReactTooltip extends Component {
243
272
this . clearTimer ( )
244
273
this . delayHideLoop = setTimeout ( ( ) => {
245
274
this . setState ( {
246
- show : false
275
+ show : false ,
276
+ place : ''
247
277
} )
248
278
this . removeScrollListener ( )
249
279
} , parseInt ( delayHide , 10 ) )
@@ -255,7 +285,7 @@ class ReactTooltip extends Component {
255
285
*/
256
286
addScrollListener ( e ) {
257
287
const isCaptureMode = this . isCapture ( e . currentTarget )
258
- window . addEventListener ( 'scroll' , :: this . hideTooltip , isCaptureMode )
288
+ window . addEventListener ( 'scroll' , this . hideTooltip , isCaptureMode )
259
289
}
260
290
261
291
removeScrollListener ( ) {
@@ -264,10 +294,10 @@ class ReactTooltip extends Component {
264
294
265
295
// Calculation the position
266
296
updatePosition ( ) {
267
- const { currentEvent, currentTarget, place, effect, offset} = this . state
297
+ const { currentEvent, currentTarget, place, effect, offset, countTransform } = this . state
268
298
const node = ReactDOM . findDOMNode ( this )
269
299
270
- const result = getPosition ( currentEvent , currentTarget , node , place , effect , offset )
300
+ const result = getPosition ( currentEvent , currentTarget , node , place , effect , offset , countTransform )
271
301
272
302
if ( result . isNewState ) {
273
303
// Switch to reverse placement
0 commit comments