1
- import sampleData from "./sampleData .json" ;
1
+ import sampleData from "./sample_output2 .json" ;
2
2
3
3
var graph = preprocess ( sampleData . graph ) ;
4
4
@@ -7,24 +7,51 @@ function preprocess (graph) {
7
7
return graph ;
8
8
}
9
9
10
+ function updateSelectedNodes ( ) {
11
+ let data = graph . nodes . filter ( node => ! ! node . selected ) ,
12
+ table = document . querySelector ( "#table table tbody" ) ;
13
+ table . textContent = "" ;
14
+ for ( let i = 0 ; i < data . length ; i ++ ) {
15
+ let row = table . insertRow ( i ) ,
16
+ node = data [ i ] ;
17
+ row . insertCell ( 0 ) . textContent = node . id ;
18
+ row . insertCell ( 1 ) . textContent = node . label ;
19
+ row . insertCell ( 2 ) . textContent = node . entities [ 0 ] . frequency ;
20
+ }
21
+ }
22
+
10
23
window . init = ( ) => {
11
24
12
- var zoom = d3 . zoom ( )
25
+ var shiftKey , ctrlKey ,
26
+ width = window . innerWidth ,
27
+ height = window . innerHeight ;
28
+
29
+ var zoomer = d3 . zoom ( )
13
30
. scaleExtent ( [ 1 / 4 , 40 ] )
14
31
. on ( "zoom" , ( ) => {
15
32
view . attr ( "transform" , d3 . event . transform ) ;
16
33
} ) ;
17
34
18
- var svg = d3
19
- . select ( "svg" )
20
- . call ( zoom ) ,
21
- width = window . innerWidth ,
22
- height = window . innerHeight ;
35
+ var dragger = d3 . drag ( )
36
+ . on ( "start" , dragstarted )
37
+ . on ( "drag" , dragged )
38
+ . on ( "end" , dragended ) ;
39
+
40
+ d3 . select ( window )
41
+ . on ( "keydown" , keyDown )
42
+ . on ( "keyup" , keyUp ) ;
43
+
44
+ var svg = d3 . select ( "#graph" )
45
+ . call ( zoomer ) ;
23
46
24
47
var view = svg
25
48
. append ( "g" )
26
49
. attr ( "class" , "view" ) ;
27
50
51
+ var brush = view . append ( "g" )
52
+ . datum ( ( ) => { return { selected : false , previouslySelected : false } ; } )
53
+ . attr ( "class" , "brush" ) ;
54
+
28
55
// var color = d3.scaleOrdinal(d3.schemeCategory20);
29
56
30
57
var simulation = d3 . forceSimulation ( )
@@ -44,18 +71,29 @@ window.init = () => {
44
71
. selectAll ( "line" )
45
72
. data ( graph . edges )
46
73
. enter ( ) . append ( "line" )
47
- . attr ( "stroke" , d => d . type === "similar" ? "#f70" : "#000" ) ;
74
+ . attr ( "class" , d => d . type === "similar"
75
+ ? "similar"
76
+ : d . type === "related"
77
+ ? "related"
78
+ : "other"
79
+ ) ;
48
80
49
81
var node = view . append ( "g" )
50
82
. attr ( "class" , "nodes" )
51
83
. selectAll ( ".node" )
52
84
. data ( graph . nodes )
53
85
. enter ( ) . append ( "g" )
54
86
. attr ( "class" , "node" )
55
- . call ( d3 . drag ( )
56
- . on ( "start" , dragstarted )
57
- . on ( "drag" , dragged )
58
- . on ( "end" , dragended ) ) ;
87
+ . call ( dragger )
88
+ . on ( "dblclick" , ( ) => d3 . event . stopPropagation ( ) )
89
+ . on ( "click" , function ( d ) {
90
+ if ( d3 . event . defaultPrevented ) return ;
91
+ if ( ! ctrlKey ) {
92
+ node . classed ( "selected" , ( p ) => p . selected = p . previouslySelected = false )
93
+ }
94
+ d3 . select ( this ) . classed ( "selected" , d . selected = ! d . previouslySelected ) ;
95
+ updateSelectedNodes ( ) ;
96
+ } ) ;
59
97
60
98
var circle = node . append ( "circle" )
61
99
. attr ( "r" , d => d . radius ) ;
@@ -72,6 +110,38 @@ window.init = () => {
72
110
simulation . force ( "link" )
73
111
. links ( graph . edges ) ;
74
112
113
+ var brusher = d3 . brush ( )
114
+ . extent ( [ [ - 9999999 , - 9999999 ] , [ 9999999 , 9999999 ] ] )
115
+ . on ( "start.brush" , ( ) => {
116
+ if ( ! d3 . event . sourceEvent ) return ;
117
+ node . each ( ( d ) => {
118
+ d . previouslySelected = ctrlKey && d . selected ;
119
+ } ) ;
120
+ } )
121
+ . on ( "brush.brush" , ( ) => {
122
+ if ( ! d3 . event . sourceEvent ) return ;
123
+ var extent = d3 . event . selection ;
124
+ if ( ! extent )
125
+ return ;
126
+ node . classed ( "selected" , ( d ) => {
127
+ return d . selected = d . previouslySelected ^
128
+ ( extent [ 0 ] [ 0 ] <= d . x && d . x < extent [ 1 ] [ 0 ]
129
+ && extent [ 0 ] [ 1 ] <= d . y && d . y < extent [ 1 ] [ 1 ] ) ;
130
+ } ) ;
131
+ } )
132
+ . on ( "end.brush" , ( ) => {
133
+ if ( ! d3 . event . sourceEvent ) return ;
134
+ setTimeout ( ( ) => {
135
+ brush . call ( brusher . move , null ) ;
136
+ updateSelectedNodes ( ) ;
137
+ } , 25 ) ;
138
+ } ) ;
139
+
140
+ brush . call ( brusher )
141
+ . on ( ".brush" , null ) ;
142
+
143
+ brush . select ( '.overlay' ) . style ( 'cursor' , 'auto' ) ;
144
+
75
145
for ( var i = 100 ; i > 0 ; -- i ) simulation . tick ( ) ;
76
146
77
147
function ticked ( ) {
@@ -101,4 +171,36 @@ window.init = () => {
101
171
d . fy = null ;
102
172
}
103
173
174
+ function keyDown ( ) {
175
+ shiftKey = d3 . event . shiftKey || d3 . event . metaKey ;
176
+ ctrlKey = d3 . event . ctrlKey ;
177
+
178
+ if ( d3 . event . keyCode == 67 ) { // the 'c' key
179
+ // do stuff
180
+ }
181
+
182
+ if ( ctrlKey ) {
183
+ brush . select ( '.overlay' ) . style ( 'cursor' , 'crosshair' ) ;
184
+ brush . call ( brusher ) ;
185
+ d3 . event . preventDefault ( ) ;
186
+ }
187
+ }
188
+
189
+ function keyUp ( ) {
190
+ shiftKey = d3 . event . shiftKey || d3 . event . metaKey ;
191
+ ctrlKey = d3 . event . ctrlKey ;
192
+
193
+ brush . call ( brusher )
194
+ . on ( ".brush" , null ) ;
195
+
196
+ brush . select ( '.overlay' ) . style ( 'cursor' , 'auto' ) ;
197
+ }
198
+
199
+ d3 . select ( "#tableToggle" )
200
+ . data ( [ { toggled : false } ] )
201
+ . on ( "click" , ( d ) => {
202
+ d . toggled = ! d . toggled ;
203
+ d3 . select ( "#table" ) . classed ( "active" , d . toggled ) ;
204
+ } ) ;
205
+
104
206
} ;
0 commit comments