@@ -154,6 +154,11 @@ function initCoattendanceNetwork() {
154154 const nodes = new vis . DataSet ( scaledNodes ) ;
155155 const edges = new vis . DataSet ( scaledEdges ) ;
156156
157+ // Store references to all nodes and edges for filtering
158+ const allNodeIds = new Set ( scaledNodes . map ( n => n . id ) ) ;
159+ const allEdgeIds = new Set ( scaledEdges . map ( e => `${ e . from } -${ e . to } ` ) ) ;
160+ let currentlySelectedNodeId = null ;
161+
157162 const data = {
158163 nodes : nodes ,
159164 edges : edges
@@ -261,14 +266,70 @@ function initCoattendanceNetwork() {
261266 }
262267 } , 3000 ) ;
263268
269+ // Function to filter visualization to show only selected node and its connections
270+ function filterToNode ( nodeId ) {
271+ if ( ! nodeId ) {
272+ // Reset: show all nodes and edges
273+ const allNodeIdsArray = Array . from ( allNodeIds ) ;
274+ allNodeIdsArray . forEach ( id => {
275+ nodes . update ( { id : id , hidden : false } ) ;
276+ } ) ;
277+
278+ // Remove all edges and re-add them
279+ edges . clear ( ) ;
280+ edges . add ( scaledEdges ) ;
281+
282+ currentlySelectedNodeId = null ;
283+ console . log ( 'Reset to full view' ) ;
284+ return ;
285+ }
286+
287+ currentlySelectedNodeId = nodeId ;
288+
289+ // Find all edges connected to this node
290+ const connectedEdges = scaledEdges . filter ( e =>
291+ e . from === nodeId || e . to === nodeId
292+ ) ;
293+
294+ // Get all connected node IDs (the selected node + its neighbors)
295+ const connectedNodeIds = new Set ( [ nodeId ] ) ;
296+ connectedEdges . forEach ( e => {
297+ connectedNodeIds . add ( e . from ) ;
298+ connectedNodeIds . add ( e . to ) ;
299+ } ) ;
300+
301+ // Hide all nodes except connected ones
302+ allNodeIds . forEach ( id => {
303+ nodes . update ( {
304+ id : id ,
305+ hidden : ! connectedNodeIds . has ( id )
306+ } ) ;
307+ } ) ;
308+
309+ // Replace edges with only connected ones
310+ edges . clear ( ) ;
311+ edges . add ( connectedEdges ) ;
312+
313+ console . log ( `Filtered to node: ${ nodeId } (showing ${ connectedNodeIds . size } nodes, ${ connectedEdges . length } edges)` ) ;
314+ }
315+
264316 // Add event listeners for better interactivity
265317 coattendanceNetwork . on ( 'click' , function ( params ) {
266318 if ( params . nodes . length > 0 ) {
267319 const nodeId = params . nodes [ 0 ] ;
268320 const node = coattendanceGraphData . nodes . find ( n => n . id === nodeId ) ;
269- if ( node ) {
270- console . log ( 'Selected node:' , node ) ;
321+
322+ // If clicking the same node again, reset to full view
323+ if ( currentlySelectedNodeId === nodeId ) {
324+ filterToNode ( null ) ; // Reset view
325+ return ;
271326 }
327+
328+ // Filter to show only this node and its connections
329+ filterToNode ( nodeId ) ;
330+ } else if ( params . nodes . length === 0 && currentlySelectedNodeId ) {
331+ // Clicking on background: reset to full view
332+ filterToNode ( null ) ;
272333 }
273334 } ) ;
274335
0 commit comments