Spaces:
Running
Running
| var sigInst, canvas, $GP | |
| //Load configuration file | |
| var config={}; | |
| var currentColorAttribute = "base_model_relation"; | |
| var currentAtlasFile = ""; | |
| //For debug allow a config=file.json parameter to specify the config | |
| function GetQueryStringParams(sParam,defaultVal) { | |
| var sPageURL = ""+window.location;//.search.substring(1);//This might be causing error in Safari? | |
| if (sPageURL.indexOf("?")==-1) return defaultVal; | |
| sPageURL=sPageURL.substr(sPageURL.indexOf("?")+1); | |
| var sURLVariables = sPageURL.split('&'); | |
| for (var i = 0; i < sURLVariables.length; i++) { | |
| var sParameterName = sURLVariables[i].split('='); | |
| if (sParameterName[0] == sParam) { | |
| return sParameterName[1]; | |
| } | |
| } | |
| return defaultVal; | |
| } | |
| jQuery.getJSON(GetQueryStringParams("config","config.json"), function(data, textStatus, jqXHR) { | |
| config=data; | |
| currentAtlasFile = config.data; | |
| if (config.type!="network") { | |
| //bad config | |
| alert("Invalid configuration settings.") | |
| return; | |
| } | |
| //As soon as page is ready (and data ready) set up it | |
| $(document).ready(setupGUI(config)); | |
| });//End JSON Config load | |
| // FUNCTION DECLARATIONS | |
| Object.size = function(obj) { | |
| var size = 0, key; | |
| for (key in obj) { | |
| if (obj.hasOwnProperty(key)) size++; | |
| } | |
| return size; | |
| }; | |
| function initSigma(config) { | |
| var data=config.data | |
| var drawProps, graphProps,mouseProps; | |
| if (config.sigma && config.sigma.drawingProperties) | |
| drawProps=config.sigma.drawingProperties; | |
| else | |
| drawProps={ | |
| defaultLabelColor: "#000", | |
| defaultLabelSize: 14, | |
| defaultLabelBGColor: "#ddd", | |
| defaultHoverLabelBGColor: "#002147", | |
| defaultLabelHoverColor: "#fff", | |
| labelThreshold: 10, | |
| defaultEdgeType: "curve", | |
| hoverFontStyle: "bold", | |
| fontStyle: "bold", | |
| activeFontStyle: "bold" | |
| }; | |
| if (config.sigma && config.sigma.graphProperties) | |
| graphProps=config.sigma.graphProperties; | |
| else | |
| graphProps={ | |
| minNodeSize: 1, | |
| maxNodeSize: 7, | |
| minEdgeSize: 0.2, | |
| maxEdgeSize: 0.5 | |
| }; | |
| if (config.sigma && config.sigma.mouseProperties) | |
| mouseProps=config.sigma.mouseProperties; | |
| else | |
| mouseProps={ | |
| minRatio: 0.75, // How far can we zoom out? | |
| maxRatio: 20, // How far can we zoom in? | |
| }; | |
| var a = sigma.init(document.getElementById("sigma-canvas")).drawingProperties(drawProps).graphProperties(graphProps).mouseProperties(mouseProps); | |
| sigInst = a; | |
| a.active = !1; | |
| a.neighbors = {}; | |
| a.detail = !1; | |
| dataReady = function() { | |
| a.clusters = {}; | |
| // Initialize node clusters based on current coloring | |
| a.iterNodes(function (b) { | |
| a.clusters[b.color] || (a.clusters[b.color] = []); | |
| a.clusters[b.color].push(b.id); | |
| // Make sure colors are properly copied from the JSON to node.attr | |
| if (!b.attr) b.attr = {}; | |
| if (b.colors && !b.attr.colors) { | |
| b.attr.colors = b.colors; | |
| } | |
| }); | |
| a.bind("upnodes", function (a) { | |
| nodeActive(a.content[0]); | |
| }); | |
| a.draw(); | |
| configSigmaElements(config); | |
| // Create the color legend | |
| updateColorLegend(); | |
| // Find available color attributes from nodes | |
| var colorAttributes = []; | |
| var colorAttrsFound = {}; | |
| a.iterNodes(function(node) { | |
| if (node.attr && node.attr.colors) { | |
| for (var attr in node.attr.colors) { | |
| if (!colorAttrsFound[attr]) { | |
| colorAttrsFound[attr] = true; | |
| colorAttributes.push('<div style="line-height:12px"><a href="#" style="color:black;" data-attr="' + attr + '">'+attr+'</a></div>'); | |
| } | |
| } | |
| } else if (node.colors) { | |
| // If colors are in the original structure, copy them to attr | |
| if (!node.attr) node.attr = {}; | |
| node.attr.colors = node.colors; | |
| for (var attr in node.colors) { | |
| if (!colorAttrsFound[attr]) { | |
| colorAttrsFound[attr] = true; | |
| colorAttributes.push('<div style="line-height:12px"><a href="#" style="color:black;" data-attr="' + attr + '">'+attr+'</a></div>'); | |
| } | |
| } | |
| } | |
| }); | |
| $GP.coloring.content(colorAttributes.join("")); | |
| $GP.coloring.select.text(currentColorAttribute); | |
| } | |
| if (data.indexOf("gexf")>0 || data.indexOf("xml")>0) | |
| a.parseGexf(data,dataReady); | |
| else | |
| a.parseJson(data,dataReady); | |
| gexf = sigmaInst = null; | |
| } | |
| function setupGUI(config) { | |
| // Initialise main interface elements | |
| var logo=""; // Logo elements | |
| if (config.logo.file) { | |
| logo = "<img src=\"" + config.logo.file +"\""; | |
| if (config.logo.text) logo+=" alt=\"" + config.logo.text + "\""; | |
| logo+=">"; | |
| } else if (config.logo.text) { | |
| logo="<h1>"+config.logo.text+"</h1>"; | |
| } | |
| if (config.logo.link) logo="<a href=\"" + config.logo.link + "\">"+logo+"</a>"; | |
| $("#maintitle").html(logo); | |
| // #title | |
| $("#title").html("<h2>"+config.text.title+"</h2>"); | |
| // #titletext | |
| $("#titletext").html(config.text.intro); | |
| // More information | |
| if (config.text.more) { | |
| $("#information").html(config.text.more); | |
| } else { | |
| //hide more information link | |
| $("#moreinformation").hide(); | |
| } | |
| // Legend | |
| // Node | |
| if (config.legend.nodeLabel) { | |
| $(".node").next().html(config.legend.nodeLabel); | |
| } else { | |
| //hide more information link | |
| $(".node").hide(); | |
| } | |
| // Edge | |
| if (config.legend.edgeLabel) { | |
| $(".edge").next().html(config.legend.edgeLabel); | |
| } else { | |
| //hide more information link | |
| $(".edge").hide(); | |
| } | |
| // Colours | |
| if (config.legend.nodeLabel) { | |
| $(".colours").next().html(config.legend.colorLabel); | |
| } else { | |
| //hide more information link | |
| $(".colours").hide(); | |
| } | |
| $GP = { | |
| calculating: !1, | |
| showgroup: !1 | |
| }; | |
| $GP.intro = $("#intro"); | |
| $GP.minifier = $GP.intro.find("#minifier"); | |
| $GP.mini = $("#minify"); | |
| $GP.info = $("#attributepane"); | |
| $GP.info_donnees = $GP.info.find(".nodeattributes"); | |
| $GP.info_name = $GP.info.find(".name"); | |
| $GP.info_link = $GP.info.find(".link"); | |
| $GP.info_data = $GP.info.find(".data"); | |
| $GP.info_close = $GP.info.find(".returntext"); | |
| $GP.info_close2 = $GP.info.find(".close"); | |
| $GP.info_p = $GP.info.find(".p"); | |
| $GP.info_close.click(nodeNormal); | |
| $GP.info_close2.click(nodeNormal); | |
| $GP.form = $("#mainpanel").find("form"); | |
| $GP.search = new Search($GP.form.find("#search")); | |
| if (!config.features.search) { | |
| $("#search").hide(); | |
| } | |
| if (!config.features.groupSelectorAttribute) { | |
| $("#attributeselect").hide(); | |
| } | |
| $GP.cluster = new Cluster($GP.form.find("#attributeselect")); | |
| $GP.coloring = new ColorSelector($GP.form.find("#coloringselect")); | |
| $GP.atlas = new AtlasSelector($GP.form.find("#atlasselect")); | |
| var atlases = getAvailableAtlases(); | |
| var atlasLinks = []; | |
| for (var i = 0; i < atlases.length; i++) { | |
| atlasLinks.push('<div style="line-height:12px"><a href="#" data-file="' + atlases[i].file + '" style="color:black;">' + atlases[i].name + '</a></div>'); | |
| } | |
| $GP.atlas.content(atlasLinks.join("")); | |
| $GP.atlas.select.text(atlases[0].name); // Set default atlas name | |
| config.GP=$GP; | |
| initSigma(config); | |
| } | |
| function configSigmaElements(config) { | |
| $GP=config.GP; | |
| // Node hover behaviour | |
| if (config.features.hoverBehavior == "dim") { | |
| var greyColor = '#ccc'; | |
| sigInst.bind('overnodes',function(event){ | |
| var nodes = event.content; | |
| var neighbors = {}; | |
| sigInst.iterEdges(function(e){ | |
| if(nodes.indexOf(e.source)<0 && nodes.indexOf(e.target)<0){ | |
| if(!e.attr['grey']){ | |
| e.attr['true_color'] = e.color; | |
| e.color = greyColor; | |
| e.attr['grey'] = 1; | |
| } | |
| }else{ | |
| e.color = e.attr['grey'] ? e.attr['true_color'] : e.color; | |
| e.attr['grey'] = 0; | |
| neighbors[e.source] = 1; | |
| neighbors[e.target] = 1; | |
| } | |
| }).iterNodes(function(n){ | |
| if(!neighbors[n.id]){ | |
| if(!n.attr['grey']){ | |
| n.attr['true_color'] = n.color; | |
| n.color = greyColor; | |
| n.attr['grey'] = 1; | |
| } | |
| }else{ | |
| n.color = n.attr['grey'] ? n.attr['true_color'] : n.color; | |
| n.attr['grey'] = 0; | |
| } | |
| }).draw(2,2,2); | |
| }).bind('outnodes',function(){ | |
| sigInst.iterEdges(function(e){ | |
| e.color = e.attr['grey'] ? e.attr['true_color'] : e.color; | |
| e.attr['grey'] = 0; | |
| }).iterNodes(function(n){ | |
| n.color = n.attr['grey'] ? n.attr['true_color'] : n.color; | |
| n.attr['grey'] = 0; | |
| }).draw(2,2,2); | |
| }); | |
| } else if (config.features.hoverBehavior == "hide") { | |
| sigInst.bind('overnodes',function(event){ | |
| var nodes = event.content; | |
| var neighbors = {}; | |
| sigInst.iterEdges(function(e){ | |
| if(nodes.indexOf(e.source)>=0 || nodes.indexOf(e.target)>=0){ | |
| neighbors[e.source] = 1; | |
| neighbors[e.target] = 1; | |
| } | |
| }).iterNodes(function(n){ | |
| if(!neighbors[n.id]){ | |
| n.hidden = 1; | |
| }else{ | |
| n.hidden = 0; | |
| } | |
| }).draw(2,2,2); | |
| }).bind('outnodes',function(){ | |
| sigInst.iterEdges(function(e){ | |
| e.hidden = 0; | |
| }).iterNodes(function(n){ | |
| n.hidden = 0; | |
| }).draw(2,2,2); | |
| }); | |
| } | |
| $GP.bg = $(sigInst._core.domElements.bg); | |
| $GP.bg2 = $(sigInst._core.domElements.bg2); | |
| var a = [], | |
| b,x=1; | |
| for (b in sigInst.clusters) a.push('<div style="line-height:12px"><a href="#' + b + '"><div style="width:40px;height:12px;border:1px solid #fff;background:' + b + ';display:inline-block"></div> Group ' + (x++) + ' (' + sigInst.clusters[b].length + ' members)</a></div>'); | |
| //a.sort(); | |
| $GP.cluster.content(a.join("")); | |
| b = { | |
| minWidth: 400, | |
| maxWidth: 800, | |
| maxHeight: 600 | |
| };// minHeight: 300, | |
| $("a.fb").fancybox(b); | |
| $("#zoom").find("div.z").each(function () { | |
| var a = $(this), | |
| b = a.attr("rel"); | |
| a.click(function () { | |
| if (b == "center") { | |
| sigInst.position(0,0,1).draw(); | |
| } else { | |
| var a = sigInst._core; | |
| sigInst.zoomTo(a.domElements.nodes.width / 2, a.domElements.nodes.height / 2, a.mousecaptor.ratio * ("in" == b ? 1.5 : 0.5)); | |
| } | |
| }) | |
| }); | |
| $GP.mini.click(function () { | |
| $GP.mini.hide(); | |
| $GP.intro.show(); | |
| $GP.minifier.show() | |
| }); | |
| $GP.minifier.click(function () { | |
| $GP.intro.hide(); | |
| $GP.minifier.hide(); | |
| $GP.mini.show() | |
| }); | |
| $GP.intro.find("#showGroups").click(function () { | |
| !0 == $GP.showgroup ? showGroups(!1) : showGroups(!0) | |
| }); | |
| a = window.location.hash.substr(1); | |
| if (0 < a.length) switch (a) { | |
| case "Groups": | |
| showGroups(!0); | |
| break; | |
| case "information": | |
| $.fancybox.open($("#information"), b); | |
| break; | |
| default: | |
| $GP.search.exactMatch = !0, $GP.search.search(a) | |
| $GP.search.clean(); | |
| } | |
| // $GP.coloring = new ColorSelector($GP.form.find("#coloringselect")); | |
| } | |
| function Search(a) { | |
| this.input = a.find("input[name=search]"); | |
| this.state = a.find(".state"); | |
| this.results = a.find(".results"); | |
| this.exactMatch = !1; | |
| this.lastSearch = ""; | |
| this.searching = !1; | |
| var b = this; | |
| this.input.focus(function () { | |
| var a = $(this); | |
| a.data("focus") || (a.data("focus", !0), a.removeClass("empty")); | |
| b.clean() | |
| }); | |
| this.input.keydown(function (a) { | |
| if (13 == a.which) return b.state.addClass("searching"), b.search(b.input.val()), !1 | |
| }); | |
| this.state.click(function () { | |
| var a = b.input.val(); | |
| b.searching && a == b.lastSearch ? b.close() : (b.state.addClass("searching"), b.search(a)) | |
| }); | |
| this.dom = a; | |
| this.close = function () { | |
| this.state.removeClass("searching"); | |
| this.results.hide(); | |
| this.searching = !1; | |
| this.input.val("");//SAH -- let's erase string when we close | |
| nodeNormal() | |
| }; | |
| this.clean = function () { | |
| this.results.empty().hide(); | |
| this.state.removeClass("searching"); | |
| this.input.val(""); | |
| }; | |
| this.search = function (a) { | |
| var b = !1, | |
| c = [], | |
| b = this.exactMatch ? ("^" + a + "$").toLowerCase() : a.toLowerCase(), | |
| g = RegExp(b); | |
| this.exactMatch = !1; | |
| this.searching = !0; | |
| this.lastSearch = a; | |
| this.results.empty(); | |
| if (2 >= a.length) this.results.html("<i>You must search for a name with a minimum of 3 letters.</i>"); | |
| else { | |
| sigInst.iterNodes(function (a) { | |
| g.test(a.label.toLowerCase()) && c.push({ | |
| id: a.id, | |
| name: a.label | |
| }) | |
| }); | |
| c.length ? (b = !0, nodeActive(c[0].id)) : b = showCluster(a); | |
| a = ["<b>Search Results: </b>"]; | |
| if (1 < c.length) for (var d = 0, h = c.length; d < h; d++) a.push('<a href="#' + c[d].name + '" onclick="nodeActive(\'' + c[d].id + "')\">" + c[d].name + "</a>"); | |
| 0 == c.length && !b && a.push("<i>No results found.</i>"); | |
| 1 < a.length && this.results.html(a.join("")); | |
| } | |
| if(c.length!=1) this.results.show(); | |
| if(c.length==1) this.results.hide(); | |
| } | |
| } | |
| function Cluster(a) { | |
| this.cluster = a; | |
| this.display = !1; | |
| this.list = this.cluster.find(".list"); | |
| this.list.empty(); | |
| this.select = this.cluster.find(".select"); | |
| this.select.click(function () { | |
| $GP.cluster.toggle() | |
| }); | |
| this.toggle = function () { | |
| this.display ? this.hide() : this.show() | |
| }; | |
| this.content = function (a) { | |
| this.list.html(a); | |
| this.list.find("a").click(function () { | |
| var a = $(this).attr("href").substr(1); | |
| showCluster(a) | |
| }) | |
| }; | |
| this.hide = function () { | |
| this.display = !1; | |
| this.list.hide(); | |
| this.select.removeClass("close") | |
| }; | |
| this.show = function () { | |
| this.display = !0; | |
| this.list.show(); | |
| this.select.addClass("close") | |
| } | |
| } | |
| // Add this after the Cluster constructor | |
| function ColorSelector(a) { | |
| this.coloring = a; | |
| this.display = false; | |
| this.list = this.coloring.find(".list"); | |
| this.list.empty(); | |
| this.select = this.coloring.find(".select"); | |
| this.select.click(function () { | |
| $GP.coloring.toggle(); | |
| }); | |
| this.toggle = function () { | |
| this.display ? this.hide() : this.show(); | |
| }; | |
| this.content = function (a) { | |
| this.list.html(a); | |
| this.list.find("a").click(function () { | |
| var a = $(this).attr("data-attr"); | |
| changeNodeColors(a); | |
| }); | |
| }; | |
| this.hide = function () { | |
| this.display = false; | |
| this.list.hide(); | |
| this.select.removeClass("close"); | |
| }; | |
| this.show = function () { | |
| this.display = true; | |
| this.list.show(); | |
| this.select.addClass("close"); | |
| }; | |
| } | |
| // Add this function to change node colors | |
| function changeNodeColors(attribute) { | |
| currentColorAttribute = attribute; | |
| $GP.coloring.select.text(attribute); | |
| $GP.coloring.hide(); | |
| // Reset clusters | |
| sigInst.clusters = {}; | |
| // Update node colors based on the selected attribute | |
| sigInst.iterNodes(function (n) { | |
| if (n.attr && n.attr.colors && n.attr.colors[attribute]) { | |
| n.color = n.attr.colors[attribute]; | |
| } | |
| // Update clusters | |
| sigInst.clusters[n.color] || (sigInst.clusters[n.color] = []); | |
| if (sigInst.clusters[n.color].indexOf(n.id) === -1) { | |
| sigInst.clusters[n.color].push(n.id); | |
| } | |
| }); | |
| // Update node colors based on the selected attribute | |
| sigInst.iterEdges(function (e) { | |
| if (e.attr && e.attr.colors && e.attr.colors[attribute]) { | |
| e.color = e.attr.colors[attribute]; | |
| } | |
| }); | |
| // Update color legend | |
| updateColorLegend(); | |
| // Redraw the graph | |
| sigInst.draw(2, 2, 2); | |
| } | |
| function updateColorLegend() { | |
| var legendColors = {}; | |
| var legendHtml = ""; | |
| // Collect unique colors and their values | |
| sigInst.iterNodes(function (n) { | |
| if (n.attr && n.attr.colors && n.attr.colors[currentColorAttribute]) { | |
| var color = n.attr.colors[currentColorAttribute]; | |
| var attrValue = ""; | |
| // Try to get the attribute value from node attributes | |
| if (n.attr.attributes && n.attr.attributes[currentColorAttribute]) { | |
| attrValue = n.attr.attributes[currentColorAttribute]; | |
| } else { | |
| // If not found in attributes, use a generic label | |
| attrValue = "Value " + Object.keys(legendColors).length; | |
| } | |
| if (!legendColors[color]) { | |
| legendColors[color] = attrValue; | |
| } | |
| } | |
| }); | |
| // Create legend HTML | |
| for (var color in legendColors) { | |
| legendHtml += '<li><div style="width:20px;height:12px;background:' + color + | |
| ';display:inline-block;margin-right:5px;border:1px solid #ccc;"></div>' + | |
| legendColors[color] + '</li>'; | |
| } | |
| legendHtml += "</ul>"; | |
| $("#colorLegend").html(legendHtml); | |
| } | |
| function showGroups(a) { | |
| a ? ($GP.intro.find("#showGroups").text("Hide groups"), $GP.bg.show(), $GP.bg2.hide(), $GP.showgroup = !0) : ($GP.intro.find("#showGroups").text("View Groups"), $GP.bg.hide(), $GP.bg2.show(), $GP.showgroup = !1) | |
| } | |
| function nodeNormal() { | |
| !0 != $GP.calculating && !1 != sigInst.detail && (showGroups(!1), $GP.calculating = !0, sigInst.detail = !0, $GP.info.delay(400).animate({width:'hide'},350),$GP.cluster.hide(), sigInst.iterEdges(function (a) { | |
| a.attr.color = !1; | |
| a.hidden = !1 | |
| }), sigInst.iterNodes(function (a) { | |
| a.hidden = !1; | |
| a.attr.color = !1; | |
| a.attr.lineWidth = !1; | |
| a.attr.size = !1 | |
| }), sigInst.draw(2, 2, 2, 2), sigInst.neighbors = {}, sigInst.active = !1, $GP.calculating = !1, window.location.hash = "") | |
| } | |
| function nodeActive(a) { | |
| var groupByDirection=false; | |
| if (config.informationPanel.groupByEdgeDirection && config.informationPanel.groupByEdgeDirection==true) groupByDirection=true; | |
| sigInst.neighbors = {}; | |
| sigInst.detail = !0; | |
| var b = sigInst._core.graph.nodesIndex[a]; | |
| showGroups(!1); | |
| var outgoing={},incoming={},mutual={};//SAH | |
| sigInst.iterEdges(function (b) { | |
| b.attr.lineWidth = !1; | |
| b.hidden = !0; | |
| n={ | |
| name: b.label, | |
| colour: b.color | |
| }; | |
| if (a==b.source) outgoing[b.target]=n; //SAH | |
| else if (a==b.target) incoming[b.source]=n; //SAH | |
| if (a == b.source || a == b.target) sigInst.neighbors[a == b.target ? b.source : b.target] = n; | |
| b.hidden = !1, b.attr.color = "rgba(0, 0, 0, 1)"; | |
| }); | |
| var f = []; | |
| sigInst.iterNodes(function (a) { | |
| a.hidden = !0; | |
| a.attr.lineWidth = !1; | |
| a.attr.color = a.color | |
| }); | |
| if (groupByDirection) { | |
| //SAH - Compute intersection for mutual and remove these from incoming/outgoing | |
| for (e in outgoing) { | |
| //name=outgoing[e]; | |
| if (e in incoming) { | |
| mutual[e]=outgoing[e]; | |
| delete incoming[e]; | |
| delete outgoing[e]; | |
| } | |
| } | |
| } | |
| var createList=function(c) { | |
| var f = []; | |
| var e = [], | |
| //c = sigInst.neighbors, | |
| g; | |
| for (g in c) { | |
| var d = sigInst._core.graph.nodesIndex[g]; | |
| d.hidden = !1; | |
| d.attr.lineWidth = !1; | |
| d.attr.color = c[g].colour; | |
| a != g && e.push({ | |
| id: g, | |
| name: d.label, | |
| group: (c[g].name)? c[g].name:"", | |
| colour: c[g].colour | |
| }) | |
| } | |
| e.sort(function (a, b) { | |
| var c = a.group.toLowerCase(), | |
| d = b.group.toLowerCase(), | |
| e = a.name.toLowerCase(), | |
| f = b.name.toLowerCase(); | |
| return c != d ? c < d ? -1 : c > d ? 1 : 0 : e < f ? -1 : e > f ? 1 : 0 | |
| }); | |
| d = ""; | |
| for (g in e) { | |
| c = e[g]; | |
| /*if (c.group != d) { | |
| d = c.group; | |
| f.push('<li class="cf" rel="' + c.color + '"><div class=""></div><div class="">' + d + "</div></li>"); | |
| }*/ | |
| f.push('<li class="membership"><a href="#' + c.name + '" onmouseover="sigInst._core.plotter.drawHoverNode(sigInst._core.graph.nodesIndex[\'' + c.id + '\'])\" onclick=\"nodeActive(\'' + c.id + '\')" onmouseout="sigInst.refresh()">' + c.name + "</a></li>"); | |
| } | |
| return f; | |
| } | |
| /*console.log("mutual:"); | |
| console.log(mutual); | |
| console.log("incoming:"); | |
| console.log(incoming); | |
| console.log("outgoing:"); | |
| console.log(outgoing);*/ | |
| var f=[]; | |
| //console.log("neighbors:"); | |
| //console.log(sigInst.neighbors); | |
| if (groupByDirection) { | |
| size=Object.size(mutual); | |
| f.push("<h2>Mututal (" + size + ")</h2>"); | |
| (size>0)? f=f.concat(createList(mutual)) : f.push("No mutual links<br>"); | |
| size=Object.size(incoming); | |
| f.push("<h2>Incoming (" + size + ")</h2>"); | |
| (size>0)? f=f.concat(createList(incoming)) : f.push("No incoming links<br>"); | |
| size=Object.size(outgoing); | |
| f.push("<h2>Outgoing (" + size + ")</h2>"); | |
| (size>0)? f=f.concat(createList(outgoing)) : f.push("No outgoing links<br>"); | |
| } else { | |
| f=f.concat(createList(sigInst.neighbors)); | |
| } | |
| //b is object of active node -- SAH | |
| b.hidden = !1; | |
| b.attr.color = b.color; | |
| b.attr.lineWidth = 6; | |
| b.attr.strokeStyle = "#000000"; | |
| sigInst.draw(2, 2, 2, 2); | |
| $GP.info_link.find("ul").html(f.join("")); | |
| $GP.info_link.find("li").each(function () { | |
| var a = $(this), | |
| b = a.attr("rel"); | |
| }); | |
| f = b.attr; | |
| if (f.attributes) { | |
| var image_attribute = false; | |
| if (config.informationPanel.imageAttribute) { | |
| image_attribute=config.informationPanel.imageAttribute; | |
| } | |
| e = []; | |
| e.push('<span><strong>Model page:</strong> <a href=\"https://huggingface.co/' + f.attributes['id'] + '\" target=\"_blank\">https://huggingface.co/' + f.attributes['id'] + '</a> </span><br/>') | |
| e.push('<span><strong>Update model information:</strong> <a href=\"https://huggingface.co/'+ f.attributes['id'] + '/edit/main/README.md\" target=\"_blank\">edit</a> </span><br/>') | |
| temp_array = []; | |
| g = 0; | |
| for (var attr in f.attributes) { | |
| var d = f.attributes[attr], | |
| h = ""; | |
| if (attr!=image_attribute) { | |
| h = '<span><strong>' + attr + ':</strong> ' + d + '</span><br/>' | |
| } | |
| //temp_array.push(f.attributes[g].attr); | |
| e.push(h) | |
| } | |
| if (image_attribute) { | |
| //image_index = jQuery.inArray(image_attribute, temp_array); | |
| $GP.info_name.html("<div><img src=" + f.attributes[image_attribute] + " style=\"vertical-align:middle\" /> <span onmouseover=\"sigInst._core.plotter.drawHoverNode(sigInst._core.graph.nodesIndex['" + b.id + '\'])" onmouseout="sigInst.refresh()">' + b.label + "</span></div>"); | |
| } else { | |
| $GP.info_name.html("<div><span onmouseover=\"sigInst._core.plotter.drawHoverNode(sigInst._core.graph.nodesIndex['" + b.id + '\'])" onmouseout="sigInst.refresh()">' + b.label + "</span></div>"); | |
| } | |
| // Image field for attribute pane | |
| $GP.info_data.html(e.join("<br/>")) | |
| } | |
| $GP.info_data.show(); | |
| $GP.info_p.html("Connections:"); | |
| $GP.info.animate({width:'show'},350); | |
| $GP.info_donnees.hide(); | |
| $GP.info_donnees.show(); | |
| sigInst.active = a; | |
| window.location.hash = b.label; | |
| } | |
| function showCluster(a) { | |
| var b = sigInst.clusters[a]; | |
| if (b && 0 < b.length) { | |
| showGroups(!1); | |
| sigInst.detail = !0; | |
| b.sort(); | |
| sigInst.iterEdges(function (a) { | |
| a.hidden = !1; | |
| a.attr.lineWidth = !1; | |
| a.attr.color = !1 | |
| }); | |
| sigInst.iterNodes(function (a) { | |
| a.hidden = !0 | |
| }); | |
| for (var f = [], e = [], c = 0, g = b.length; c < g; c++) { | |
| var d = sigInst._core.graph.nodesIndex[b[c]]; | |
| !0 == d.hidden && (e.push(b[c]), d.hidden = !1, d.attr.lineWidth = !1, d.attr.color = d.color, f.push('<li class="membership"><a href="#'+d.label+'" onmouseover="sigInst._core.plotter.drawHoverNode(sigInst._core.graph.nodesIndex[\'' + d.id + "'])\" onclick=\"nodeActive('" + d.id + '\')" onmouseout="sigInst.refresh()">' + d.label + "</a></li>")) | |
| } | |
| sigInst.clusters[a] = e; | |
| sigInst.draw(2, 2, 2, 2); | |
| $GP.info_name.html("<b>" + a + "</b>"); | |
| $GP.info_data.hide(); | |
| $GP.info_p.html("Group Members:"); | |
| $GP.info_link.find("ul").html(f.join("")); | |
| $GP.info.animate({width:'show'},350); | |
| $GP.search.clean(); | |
| $GP.cluster.hide(); | |
| return !0 | |
| } | |
| return !1 | |
| } | |
| function AtlasSelector(a) { | |
| this.atlas = a; | |
| this.display = false; | |
| this.list = this.atlas.find(".list"); | |
| this.list.empty(); | |
| this.select = this.atlas.find(".select"); | |
| this.select.click(function () { | |
| $GP.atlas.toggle(); | |
| }); | |
| this.toggle = function () { | |
| this.display ? this.hide() : this.show(); | |
| }; | |
| this.content = function (a) { | |
| this.list.html(a); | |
| this.list.find("a").click(function () { | |
| var dataFile = $(this).attr("data-file"); | |
| loadNewAtlas(dataFile); | |
| }); | |
| }; | |
| this.hide = function () { | |
| this.display = false; | |
| this.list.hide(); | |
| this.select.removeClass("close"); | |
| }; | |
| this.show = function () { | |
| this.display = true; | |
| this.list.show(); | |
| this.select.addClass("close"); | |
| }; | |
| } | |
| function getAvailableAtlases() { | |
| return [ | |
| { name: "Modalities Atlas", file: "modalities_data.json" }, | |
| { name: "Large NLP Atlas", file: "large_nlp_data.json" }, | |
| ]; | |
| } | |
| function loadNewAtlas(dataFile) { | |
| // Update the currently selected atlas in the dropdown | |
| $GP.atlas.select.text(getAtlasNameByFile(dataFile)); | |
| $GP.atlas.hide(); | |
| config.data = dataFile; | |
| reinitializeSigma(config); | |
| } | |
| function reinitializeSigma(config) { | |
| // Remove the old sigma instance | |
| if (sigInst) { | |
| sigInst.kill(); | |
| } | |
| // Recreate the sigma canvas | |
| $(".sigma-expand").empty(); | |
| // Initialize new sigma instance | |
| initSigma(config); | |
| } | |
| function getAtlasNameByFile(dataFile) { | |
| var atlases = getAvailableAtlases(); | |
| for (var i = 0; i < atlases.length; i++) { | |
| if (atlases[i].file === dataFile) { | |
| return atlases[i].name; | |
| } | |
| } | |
| return "Unknown Atlas"; | |
| } | |