1212import React , { Component } from 'react' ;
1313// import PropTypes from 'prop-types';
1414import * as d3 from 'd3' ;
15- import d3Tip from 'd3-tip' ;
15+ // import d3Tip from 'd3-tip';
1616
1717let root = { } ;
1818class Chart extends Component {
@@ -78,10 +78,10 @@ class Chart extends Component {
7878 const d3root = tree ( hierarchy ) ;
7979
8080 g . selectAll ( '.link' )
81- // root.links() gets an array of all the links,
82- // where each element is an object containing a
83- // source property, which represents the link's source node,
84- // and a target property, which represents the link's target node.
81+ // root.links() gets an array of all the links,
82+ // where each element is an object containing a
83+ // source property, which represents the link's source node,
84+ // and a target property, which represents the link's target node.
8585 . data ( d3root . links ( ) )
8686 . enter ( )
8787 . append ( 'path' )
@@ -104,21 +104,36 @@ class Chart extends Component {
104104 } ) ;
105105
106106 node . append ( 'circle' )
107- . attr ( 'r' , 10 ) ;
108-
109- // creating a d3.tip method where the html has a function that returns
110- // the data we passed into tip.show from line 120
111- const tip = d3Tip ( )
112- . attr ( 'class' , 'd3-tip' )
113- . html ( function ( d ) { return 'State: ' + d ; } ) ;
114-
115- // invoking tooltip for nodes
116- node . call ( tip ) ;
117-
107+ . attr ( 'r' , 10 )
108+ . on ( 'mouseover' , function ( d ) {
109+ d3 . select ( this )
110+ . transition ( 100 )
111+ . duration ( 20 )
112+ . attr ( 'r' , 20 ) ;
113+
114+ tooltipDiv . transition ( )
115+ . duration ( 200 )
116+ . style ( 'opacity' , 0.9 ) ;
117+
118+ tooltipDiv . html ( JSON . stringify ( d . data . stateSnapshot . children [ 0 ] . state ) , this )
119+ . style ( 'left' , ( d3 . event . pageX ) + 'px' )
120+ . style ( 'top' , ( d3 . event . pageY - 28 ) + 'px' ) ;
121+ } )
122+ // eslint-disable-next-line no-unused-vars
123+ . on ( 'mouseout' , function ( d ) {
124+ d3 . select ( this )
125+ . transition ( )
126+ . duration ( 200 )
127+ . attr ( 'r' , 12 ) ;
128+
129+ tooltipDiv . transition ( )
130+ . duration ( 500 )
131+ . style ( 'opacity' , 0 ) ;
132+ } ) ;
118133 node
119134 . append ( 'text' )
120135 // adjusts the y coordinates for the node text
121- . attr ( 'dy' , '0.35em ' )
136+ . attr ( 'dy' , '-1.5em ' )
122137 . attr ( 'x' , function ( d ) {
123138 // this positions how far the text is from leaf nodes (ones without children)
124139 // negative number before the colon moves the text of rightside nodes,
@@ -160,14 +175,12 @@ class Chart extends Component {
160175 g . attr ( 'transform' , d3 . event . transform ) ;
161176 }
162177
178+ // define the div for the tooltip
179+ const tooltipDiv = d3 . select ( 'body' ) . append ( 'div' )
180+ . attr ( 'class' , 'tooltip' )
181+ . style ( 'opacity' , 0 ) ;
182+
163183 // applying tooltip on mouseover and removes it when mouse cursor moves away
164- node
165- . on ( 'mouseover' , function ( d ) {
166- // without JSON.stringify, data will display as object Object
167- // console.log('d.data --> ', JSON.stringify(d.data))
168- tip . show ( JSON . stringify ( d . data . stateSnapshot . children [ 0 ] . state ) , this ) ;
169- } )
170- . on ( 'mouseout' , tip . hide ) ;
171184
172185 function reinfeldTidierAlgo ( x , y ) {
173186 return [ ( y = + y ) * Math . cos ( x -= Math . PI / 2 ) , y * Math . sin ( x ) ] ;
0 commit comments