|
|
- /** Nodes in the vis js graph */
- var nodes;
-
- /** Edges used to make the Vis JS graph*/
- var edges;
-
- /** Used for the loading bar */
- var total = 1;
- var indexed = 0;
- var progressID;
-
- /** Github id of the user being indexed */
- var baseID;
-
- /**
- * Vis js graph options
- */
- var options = {
- nodes: {
- borderWidth:4,
- size:30,
- color: {
- border: '#222222',
- background: '#666666'
- },
- font:{color:'#eeeeee'}
- },
- edges: {
- color: 'lightgray'
- }
- };
-
-
- /**
- * Checks if a user is a node in the graph
- *
- * @param userID
- * @returns {boolean}
- */
- function alreadyInGraph(username)
- {
- for(var i = 0; i < nodes.length; i++)
- {
- if(nodes[i].id === username)
- {
- return true;
- }
- }
- return false;
- }
-
-
- /**
- * adds a person to the nodes list
- *
- * @param profileData
- */
- function addPersonToGraph(profileData)
- {
- addManualToGraph(profileData.id, profileData.avatar);
- for(var i = 0; i < profileData.friends.length; i++)
- {
- addManualToGraph(profileData.friends[i].id,
- profileData.friends[i].avatar);
- }
- }
-
- function addManualToGraph(id,avatar)
- {
- nodes.push(
- {
- id:id,
- shape: 'circularImage',
- image:avatar
- });
- }
-
-
- /**
- * Adds the followers/following of a person
- * to the graph
- *
- * @param username
- * @param apiPath
- * @returns {Promise<any>}
- */
- function addFriends(username)
- {
- updateProgress();
- return new Promise((resolve, reject)=>
- {
- getPersonAPI(username, (data)=>
- {
- for(var i = 0; i < data.length; i++)
- {
- if(!alreadyInGraph(data[i].login))
- {
- addPersonToGraph(data[i]);
- }
- }
- resolve();
- },
- (error)=>
- {
- reject(error);
- })
- });
- }
-
-
- /**
- * Greedy function which checks to see if a edge is in the graphs
- *
- * @param id1
- * @param id2
- * @returns {boolean}
- */
- function edgeInGraph(id1, id2)
- {
- for(var i = 0;i < edges.length; i++)
- {
- if((edges[i].to === id1 && edges[i].from === id2) ||
- (edges[i].from === id1 && edges[i].to === id2))
- {
- return true;
- }
- }
- return false;
- }
-
-
- /**
- * Adds a connection to the graph
- *
- * @param person1
- * @param person2
- */
- function addConnection(id1, id2)
- {
- if(id1 !== id2)
- {
- if(alreadyInGraph(id2) && !edgeInGraph(id1, id2))
- {
- network.body.data.edges.add([{
- from: id1,
- to: id2
- }]);
- }
- }
- }
-
-
- /**
- * Processes all the connections of a user and adds them to the graph
- *
- * @param user has .id and .name
- * @returns {Promise<any>}
- */
- function processUserConnections(node)
- {
-
- getPersonAPI(node.id,
- (data)=>
- {
- updateProgress();
- for(var i = 0; i < data.friends.length; i++)
- {
- addConnection(node.id, data.friends[i].id)
- }
- }, (error)=>
- {
- console.log(error);
- });
- }
-
-
- /**
- * Creates connections between all the nodes in
- * the graph.
- *
- * @returns {Promise<any>}
- */
- function createConnections()
- {
- var prom = [];
- for(var i = 0; i < nodes.length; i++)
- {
- processUserConnections(nodes[i]);
- }
- }
-
-
- /**
- * Updates progress bar for loading the JS graph
- */
- function updateProgress()
- {
- indexed++;
- if(indexed >= total)
- {
- $("#" + progressID).html("");
- }
- else
- {
- const percent = parseInt((indexed/total)*100);
- $("#" + progressID).html("<div class=\"progress\">\n" +
- " <div class=\"progress-bar progress-bar-striped progress-bar-animated\" role=\"progressbar\" style=\"width: " + percent + "%\" aria-valuenow=\"" + percent + "\" aria-valuemin=\"0\" aria-valuemax=\"100\"></div>\n" +
- "</div>");
- }
- }
-
- var selfData;
-
- /**
- * Adds the base person to the graph.
- *
- * @param username
- * @returns {Promise<any>}
- */
- function addSelfToGraph(id)
- {
- return new Promise((resolve, reject)=>
- {
- getPersonAPI(id, (data)=>
- {
- selfData = data;
- baseID = data.id;
- total = data.friends.length;
- addPersonToGraph(data);
- resolve();
- },
- (error)=>
- {
- reject(error);
- });
- });
- }
-
-
- /**
- * Used for the on graph click event
- *
- * @param github id
- */
- function bringUpProfileView(uname)
- {
- console.log(uname);
- if(uname === selfData.id)
- {
- profileGen(selfData, "profileGen");
- }
- else
- {
- for(var i = 0; i < selfData.friends.length; i++)
- {
- if(selfData.friends[i].id === uname)
- {
- profileGen(selfData.friends[i], "profileGen");
- }
- }
- }
- }
-
- var network;
-
- /**
- * Creates a graph
- * @param username
- * @param containerName
- * @param progressBarID
- */
- function createFriendsGraph(username, containerName, progressBarID)
- {
- progressID = progressBarID;
-
- nodes = [];
- edges = [];
- addSelfToGraph(username).then(()=>
- {
- $("#" + progressID).html("");
-
- var container = document.getElementById(containerName);
- var data =
- {
- nodes: nodes,
- edges: edges
- };
- network = new vis.Network(container, data, options);
- bringUpProfileView(selfData.id);
- network.on("click", function (params)
- {
- if(Number(this.getNodeAt(params.pointer.DOM)) !== NaN)
- {
- bringUpProfileView(this.getNodeAt(params.pointer.DOM));
- }
- });
- createConnections().then(()=>
- {
- // $("#" + progressID).html("");
- console.log("Finished");
- })
- }).catch((error)=>
- {
- //$("#" + graphsTitle).html("Error Fetching Data From API");
- alert("Invalid User");
- });
- }
|