Commit 170197f1486d2122860c56c8ab849411df52f1c3

Authored by Renato De Donato
2 parents cae62033 1dd8eefe

Merge branch 'master' of http://service.routetopa.eu:7480/WebCompDev/COMPONENTS

datalets/graph-datalet/demo/demo-clustering.html
@@ -15,7 +15,7 @@ @@ -15,7 +15,7 @@
15 '\'></graph-with-clustering-extend-datalet>'; 15 '\'></graph-with-clustering-extend-datalet>';
16 } 16 }
17 }; 17 };
18 - xhttp.open("GET", "http://192.168.164.128/public_room/ajax/get-graph?id=1&type=comments", true); 18 + xhttp.open("GET", "http://192.168.164.128/public_room/ajax/get-graph?id=8&type=comments", true);
19 xhttp.send(); 19 xhttp.send();
20 } 20 }
21 21
datalets/graph-datalet/graph-datalet.html
@@ -96,18 +96,16 @@ Example: @@ -96,18 +96,16 @@ Example:
96 96
97 <script> 97 <script>
98 98
99 - gnodes = [];  
100 - glinks = [];  
101 -  
102 - width = undefined;  
103 - height = undefined;  
104 - svg = undefined;  
105 _this = null; 99 _this = null;
106 - prev_selected_node = null;  
107 100
108 Polymer({ 101 Polymer({
109 is : 'graph-datalet', 102 is : 'graph-datalet',
110 103
  104 + listeners: {
  105 + 'graph-datalet_on-node-hover' : '_onNodeHover',
  106 + 'graph-datalet_on-node-out' : '_onNodeOut'
  107 + },
  108 +
111 properties: { 109 properties: {
112 /** 110 /**
113 * It's the url for the preview 111 * It's the url for the preview
@@ -116,11 +114,21 @@ Example: @@ -116,11 +114,21 @@ Example:
116 * @type Strig 114 * @type Strig
117 * @default '' 115 * @default ''
118 */ 116 */
119 - data : { 117 + graph : {
120 type : Object, 118 type : Object,
121 value : undefined 119 value : undefined
122 }, 120 },
123 121
  122 + gnodes : {
  123 + type : Array,
  124 + value : []
  125 + },
  126 +
  127 + glinks : {
  128 + type : Array,
  129 + value : []
  130 + },
  131 +
124 width: { 132 width: {
125 type: Number, 133 type: Number,
126 value: undefined 134 value: undefined
@@ -128,7 +136,7 @@ Example: @@ -128,7 +136,7 @@ Example:
128 136
129 height : { 137 height : {
130 type : Number, 138 type : Number,
131 - type: undefined 139 + value: undefined
132 }, 140 },
133 141
134 svg: { 142 svg: {
@@ -138,6 +146,11 @@ Example: @@ -138,6 +146,11 @@ Example:
138 feelings:{ 146 feelings:{
139 type: Array, 147 type: Array,
140 values: ["Agree", "Neutral", "Not agree"] 148 values: ["Agree", "Neutral", "Not agree"]
  149 + },
  150 +
  151 + prev_selected_node : {
  152 + type : Object,
  153 + value : null
141 } 154 }
142 }, 155 },
143 156
@@ -148,9 +161,9 @@ Example: @@ -148,9 +161,9 @@ Example:
148 .append("g"); 161 .append("g");
149 162
150 //set initial zoom 163 //set initial zoom
151 - scale = (1.0); 164 + var scale = (1.0);
152 //translate = [(width-scale*width)/2, ((height-scale*height)/4)]; 165 //translate = [(width-scale*width)/2, ((height-scale*height)/4)];
153 - translate = [100, 100]; 166 + var translate = [100, 100];
154 this.svg.transition() 167 this.svg.transition()
155 .duration(750) 168 .duration(750)
156 .attr("transform", "translate(" + translate + ")scale(" + scale + ")") 169 .attr("transform", "translate(" + translate + ")scale(" + scale + ")")
@@ -163,8 +176,8 @@ Example: @@ -163,8 +176,8 @@ Example:
163 176
164 this.svg.append("rect") 177 this.svg.append("rect")
165 .attr("fill", "white") 178 .attr("fill", "white")
166 - .attr("width", width)  
167 - .attr("height", height); 179 + .attr("width", this.width)
  180 + .attr("height", this.height);
168 181
169 182
170 var graph = {}; 183 var graph = {};
@@ -174,15 +187,6 @@ Example: @@ -174,15 +187,6 @@ Example:
174 187
175 //pezzotto 188 //pezzotto
176 for(var i =0; i < graph.nodes.length; i++){ 189 for(var i =0; i < graph.nodes.length; i++){
177 - /*this.svg.append("filter")  
178 - .attr("id","filter_" + graph.nodes[i].id)  
179 - .attr("x","0%")  
180 - .attr("y","0%")  
181 - .attr("width","100%")  
182 - .attr("height","100%")  
183 - .append("feImage")  
184 - .attr("xlink:href", graph.nodes[i].image);*/  
185 -  
186 this.svg.append("defs") 190 this.svg.append("defs")
187 .append("pattern") 191 .append("pattern")
188 .attr("id","image_" + graph.nodes[i].id) 192 .attr("id","image_" + graph.nodes[i].id)
@@ -203,7 +207,7 @@ Example: @@ -203,7 +207,7 @@ Example:
203 return t.value ? t.value : 80 207 return t.value ? t.value : 80
204 }).on("tick", this.tick).start(); 208 }).on("tick", this.tick).start();
205 209
206 - glinks = this.svg.selectAll(".link").data(graph.links).enter().append("line").attr("class", "link"); 210 + this.glinks = this.svg.selectAll(".link").data(graph.links).enter().append("line").attr("class", "link");
207 211
208 this.svg.selectAll(".link") 212 this.svg.selectAll(".link")
209 .attr("style", function(t){ 213 .attr("style", function(t){
@@ -213,24 +217,18 @@ Example: @@ -213,24 +217,18 @@ Example:
213 return "stroke-width:" + (t.size ? t.size : 1.0) + "px"; 217 return "stroke-width:" + (t.size ? t.size : 1.0) + "px";
214 }); 218 });
215 219
216 - gnodes = this.svg.selectAll(".node").data(graph.nodes).enter().append("g").attr("class", function (t) {  
217 - return t.fixed ? "node fixed" : "node"  
218 - })  
219 - .attr("name", function (t) {  
220 - return t.name ? t.name.split(" ").join("_").toLowerCase() : ""  
221 - }).on("mouseover", this.mouseover)  
222 - .on("mouseout", this.mouseout)  
223 - .on("click", this.active) 220 + this.gnodes = this.svg.selectAll(".node").data(graph.nodes).enter().append("g")
  221 + .attr("class", function (t) { return t.fixed ? "node fixed" : "node"})
  222 + .attr("id", function (t) { return "g" + t.id;})
  223 + .attr("name", function (t) { return t.name ? t.name.split(" ").join("_").toLowerCase() : ""})
  224 + .on("mouseover", this.mouseover)
  225 + .on("mouseout", this.mouseout)
  226 + .on("click", this.active)
224 .append("circle") 227 .append("circle")
225 - .attr("id", function(t){  
226 - return t.id;  
227 - })  
228 - .attr("class", function (t) {  
229 - return t.fixed ? "" : "drag"  
230 - })  
231 - .attr("r", function (t) {  
232 - return t.r ? t.r : 15  
233 - }) 228 + .attr("id", function(t){ return t.id;})
  229 + .attr("originalId", function (t) { return t.originalId;})
  230 + .attr("class", function (t) { return t.fixed ? "" : "drag"})
  231 + .attr("r", function (t) {return t.r ? t.r : 15})
234 .attr("style", function (t) { 232 .attr("style", function (t) {
235 switch(parseInt(t.sentiment)){ 233 switch(parseInt(t.sentiment)){
236 case 1 : 234 case 1 :
@@ -248,19 +246,16 @@ Example: @@ -248,19 +246,16 @@ Example:
248 return "fill:" + t.color + "; stroke:white" 246 return "fill:" + t.color + "; stroke:white"
249 }); 247 });
250 248
251 - //d3.selectAll('circle').attr("filter", function(t){return t.image ? 'url(#filter_' + t.id +')' : ""});  
252 d3.selectAll('circle').attr("style", function(t){ 249 d3.selectAll('circle').attr("style", function(t){
253 - return "fill :" + (t.image ? 'url(#image_' + t.id +')' : t.color)}); 250 + return "fill :" + (t.image ? 'url(#image_' + t.id +')' : t.color)
  251 + });
254 252
255 - //d3.selectAll(".drag").call(force.drag), svg.selectAll("g.fixed").call(text);  
256 d3.selectAll(".drag").call(force.drag), this.svg.selectAll("g.node").call(this.text); 253 d3.selectAll(".drag").call(force.drag), this.svg.selectAll("g.node").call(this.text);
257 254
258 - svg = this.svg;  
259 -  
260 }, 255 },
261 256
262 zoom: function() { 257 zoom: function() {
263 - svg.attr("transform", "translate(" + d3.event.translate + ")scale(" + d3.event.scale + ")"); 258 + _this.svg.attr("transform", "translate(" + d3.event.translate + ")scale(" + d3.event.scale + ")");
264 }, 259 },
265 260
266 text: function (t) 261 text: function (t)
@@ -275,35 +270,37 @@ Example: @@ -275,35 +270,37 @@ Example:
275 }, 270 },
276 271
277 tick : function () { 272 tick : function () {
278 - // d3.select("svg").attr("style", "transform:translate(8%)");  
279 - d3.selectAll("g foreignObject").attr("x", function (t) {  
280 - return t.x + (t.r ? 0.8 * t.r : 15)  
281 - }).attr("y", function (t) {  
282 - return t.y - 20  
283 - }); 273 + if(_this.gnodes != undefined)
  274 + {
  275 + d3.selectAll("g foreignObject").attr("x", function (t) {
  276 + return t.x + (t.r ? 0.8 * t.r : 15)
  277 + }).attr("y", function (t) {
  278 + return t.y - 20
  279 + });
284 280
285 - d3.selectAll("#logo text").attr("x", function (t) {  
286 - return t.x + .7 * (t.r ? t.r : 15)  
287 - }).attr("y", function (t) {  
288 - return t.y  
289 - }); 281 + d3.selectAll("#logo text").attr("x", function (t) {
  282 + return t.x + .7 * (t.r ? t.r : 15)
  283 + }).attr("y", function (t) {
  284 + return t.y
  285 + });
290 286
291 287
292 - gnodes.attr("cx", function (t) {  
293 - return t.x = Math.max(25, Math.min(width - 50, t.x))  
294 - }).attr("cy", function (t) {  
295 - return t.y = Math.max(8, Math.min(600, t.y))  
296 - }); 288 + _this.gnodes.attr("cx", function (t) {
  289 + return t.x = Math.max(25, Math.min(_this.width - 50, t.x))
  290 + }).attr("cy", function (t) {
  291 + return t.y = Math.max(8, Math.min(600, t.y))
  292 + });
297 293
298 - glinks.attr("x1", function (t) {  
299 - return t.source.x  
300 - }).attr("y1", function (t) {  
301 - return t.source.y  
302 - }).attr("x2", function (t) {  
303 - return t.target.x  
304 - }).attr("y2", function (t) {  
305 - return t.target.y  
306 - }) 294 + _this.glinks.attr("x1", function (t) {
  295 + return t.source.x
  296 + }).attr("y1", function (t) {
  297 + return t.source.y
  298 + }).attr("x2", function (t) {
  299 + return t.target.x
  300 + }).attr("y2", function (t) {
  301 + return t.target.y
  302 + });
  303 + }
307 }, 304 },
308 mouseover : function (t) { 305 mouseover : function (t) {
309 d3.select(this).selectAll("circle").transition().duration(600).ease("elastic") 306 d3.select(this).selectAll("circle").transition().duration(600).ease("elastic")
@@ -332,14 +329,14 @@ Example: @@ -332,14 +329,14 @@ Example:
332 329
333 _this.fire('graph-datalet_node-clicked', {node : t}); 330 _this.fire('graph-datalet_node-clicked', {node : t});
334 331
335 - if(prev_selected_node != null){  
336 - prev_selected_node.style.fill = prev_selected_node.style.stroke;  
337 - prev_selected_node.style.stroke = "#FFFFFF"; 332 + if(_this.prev_selected_node != null){
  333 + _this.prev_selected_node.style.fill = _this.prev_selected_node.style.stroke;
  334 + _this.prev_selected_node.style.stroke = "#FFFFFF";
338 } 335 }
339 336
340 - prev_selected_node = document.getElementById("" + t.id);  
341 - prev_selected_node.style.fill = "#FFFFFF"  
342 - prev_selected_node.style.stroke = t.color; 337 + _this.prev_selected_node = document.getElementById("" + t.id);
  338 + _this. prev_selected_node.style.fill = "#FFFFFF"
  339 + _this.prev_selected_node.style.stroke = t.color;
343 340
344 /* _this.$.dialog.close(); 341 /* _this.$.dialog.close();
345 _this.$.dialog_title.innerHTML = t.name; 342 _this.$.dialog_title.innerHTML = t.name;
@@ -352,6 +349,30 @@ Example: @@ -352,6 +349,30 @@ Example:
352 //_this.$.dialog.close(); 349 //_this.$.dialog.close();
353 }, 350 },
354 351
  352 + _onNodeHover : function(e){
  353 + try {
  354 + var nodeId = $("[originalId=" + e.detail.id + "]")[0].id;
  355 + var gNode = $("#g" + nodeId)[0];
  356 + var node = this.graph.nodes[nodeId];
  357 +
  358 + d3.select(gNode).selectAll("circle").transition().duration(600).ease("elastic")
  359 + .attr("r", function (t) {
  360 + return (!t.image) ? 1 == t.fixed ? 1.4 * t.r : t.r + 10 : t.r;
  361 + });
  362 +
  363 + _this.$.dialog.close();
  364 + _this.$.dialog_title.innerHTML = node.name;
  365 + _this.$.dialog_content.innerHTML = node.content;
  366 +
  367 + _this.$.dialog.open();
  368 + }catch(e){}
  369 +
  370 + },
  371 +
  372 + _onNodeOut : function(e){
  373 + this.mouseout();
  374 + },
  375 +
355 /** 376 /**
356 * It is called after the elementโ€™s template has been stamped and all elements inside the elementโ€™s local 377 * It is called after the elementโ€™s template has been stamped and all elements inside the elementโ€™s local
357 * DOM have been configured (with values bound from parents, deserialized attributes, or else default values) 378 * DOM have been configured (with values bound from parents, deserialized attributes, or else default values)
@@ -366,26 +387,16 @@ Example: @@ -366,26 +387,16 @@ Example:
366 387
367 _this = this; 388 _this = this;
368 389
369 - //this.height = 9 * this.width / 16;  
370 - //this.height = this.width;  
371 -  
372 - width = this.width;  
373 - height = this.height;  
374 -  
375 - //this.$.graph_content.style.height = height + "px";  
376 390
377 this.svg = d3.select("svg#sbiricuda").attr("class", "svg").attr({ 391 this.svg = d3.select("svg#sbiricuda").attr("class", "svg").attr({
378 width: "100%", 392 width: "100%",
379 height: "100%" 393 height: "100%"
380 - }).attr("viewBox", "0 0 " + this.width + " " + this.height).attr("pointer-events", "all").style("position", "absolute").attr("style", "transform:translate(0px)");  
381 -  
382 - /*var g = JSON.parse(this.data);  
383 - g.nodes[0].x = this.width / 2;  
384 - g.nodes[0].y = this.height / 2;  
385 - this.buildGraph(g);*/ 394 + }).attr("viewBox", "0 0 " + this.width + " " + this.height)
  395 + .attr("pointer-events", "all")
  396 + .attr("style", "transform:translate(0px)")
  397 + .style("position", "absolute");
386 398
387 - var json = JSON.stringify(this.data);  
388 - var g = this.data; 399 + var g = this.graph;
389 g.nodes[0].x = this.width / 2; 400 g.nodes[0].x = this.width / 2;
390 g.nodes[0].y = this.height / 8; 401 g.nodes[0].y = this.height / 8;
391 this.buildGraph(g); 402 this.buildGraph(g);
datalets/graph-datalet/graph-with-clustering-datalet.html
@@ -97,6 +97,11 @@ Example: @@ -97,6 +97,11 @@ Example:
97 Polymer({ 97 Polymer({
98 is : 'graph-with-clustering-datalet', 98 is : 'graph-with-clustering-datalet',
99 99
  100 + listeners: {
  101 + 'graph-datalet_on-node-select' : '_onNodeSelect',
  102 + 'graph-datalet_on-node-out' : '_onNodeOut'
  103 + },
  104 +
100 properties: { 105 properties: {
101 /** 106 /**
102 * It's the url for the preview 107 * It's the url for the preview
@@ -138,6 +143,7 @@ Example: @@ -138,6 +143,7 @@ Example:
138 type: Array, 143 type: Array,
139 values: ["Agree", "Neutral", "Not agree"] 144 values: ["Agree", "Neutral", "Not agree"]
140 }, 145 },
  146 +
141 prev_selected_node : { 147 prev_selected_node : {
142 type : Object, 148 type : Object,
143 value : null 149 value : null
@@ -200,11 +206,11 @@ Example: @@ -200,11 +206,11 @@ Example:
200 return fill(d);*/ 206 return fill(d);*/
201 switch((d % 3)){ 207 switch((d % 3)){
202 case 0 : 208 case 0 :
203 - return "#1F77B4"; 209 + return "transparent";//"#1F77B4";//neutral
204 case 1 : 210 case 1 :
205 - return "#2CA02C"; 211 + return "#2CA02C";//agree
206 case 2: 212 case 2:
207 - return "#FF1E1E"; 213 + return "transparent";//"#FF1E1E";//disagree
208 } 214 }
209 }, 215 },
210 216
@@ -277,7 +283,6 @@ Example: @@ -277,7 +283,6 @@ Example:
277 283
278 for(var n=0; n < this.groups[g][s].values.length;n++) 284 for(var n=0; n < this.groups[g][s].values.length;n++)
279 nodesMap[this.groups[g][s].values[n].id] = node; 285 nodesMap[this.groups[g][s].values[n].id] = node;
280 -  
281 } 286 }
282 } 287 }
283 } 288 }
@@ -322,7 +327,6 @@ Example: @@ -322,7 +327,6 @@ Example:
322 .style("fill", "#60df20") 327 .style("fill", "#60df20")
323 .style("opacity", .2) 328 .style("opacity", .2)
324 .on("click", function(d) { 329 .on("click", function(d) {
325 - alert(d.id);  
326 }); 330 });
327 331
328 332
@@ -340,9 +344,11 @@ Example: @@ -340,9 +344,11 @@ Example:
340 .on("mouseout", this.mouseout) 344 .on("mouseout", this.mouseout)
341 .attr("class", function (t) { return t.fixed ? "node fixed" : "node"}) 345 .attr("class", function (t) { return t.fixed ? "node fixed" : "node"})
342 .attr("name", function (t) { return t.name ? t.name.split(" ").join("_").toLowerCase() : ""}) 346 .attr("name", function (t) { return t.name ? t.name.split(" ").join("_").toLowerCase() : ""})
  347 + .attr("id", function (t) { return "g" + t.id;})
343 .append("circle") 348 .append("circle")
344 .on("click", this.active) 349 .on("click", this.active)
345 .attr("id", function(t){ return t.id }) 350 .attr("id", function(t){ return t.id })
  351 + .attr("originalId", function (t) { return t.originalId;})
346 .attr("class", function (t) { return t.fixed ? "" : "drag"}) 352 .attr("class", function (t) { return t.fixed ? "" : "drag"})
347 .attr("r", function (t){ return t.r ? t.r : 15 }) 353 .attr("r", function (t){ return t.r ? t.r : 15 })
348 .attr("style", function (t) { 354 .attr("style", function (t) {
@@ -517,6 +523,29 @@ Example: @@ -517,6 +523,29 @@ Example:
517 //_this.$.dialog.close(); 523 //_this.$.dialog.close();
518 }, 524 },
519 525
  526 + _onNodeSelect : function(e){
  527 + try {
  528 + var nodeId = $("[originalId=" + e.detail.id + "]")[0].id;
  529 + var gNode = $("#g" + nodeId)[0];
  530 + var node = this.graph.nodes[nodeId];
  531 +
  532 + d3.select(gNode).selectAll("circle").transition().duration(600).ease("elastic")
  533 + .attr("r", function (t) {
  534 + return (!t.image) ? 1 == t.fixed ? 1.4 * t.r : t.r + 10 : t.r;
  535 + });
  536 +
  537 + _this.$.dialog.close();
  538 + _this.$.dialog_title.innerHTML = node.name;
  539 + _this.$.dialog_content.innerHTML = node.content;
  540 +
  541 + _this.$.dialog.open();
  542 + }catch(e){}
  543 + },
  544 +
  545 + _onNodeOut : function(e){
  546 + this.mouseout();
  547 + },
  548 +
520 /** 549 /**
521 * It is called after the elementโ€™s template has been stamped and all elements inside the elementโ€™s local 550 * It is called after the elementโ€™s template has been stamped and all elements inside the elementโ€™s local
522 * DOM have been configured (with values bound from parents, deserialized attributes, or else default values) 551 * DOM have been configured (with values bound from parents, deserialized attributes, or else default values)
datalets/graph-datalet/graph-with-clustering-extend-datalet.html
@@ -171,6 +171,11 @@ Example: @@ -171,6 +171,11 @@ Example:
171 offset :{ 171 offset :{
172 type : Number, 172 type : Number,
173 value : 15 173 value : 15
  174 + },
  175 +
  176 + prevNetwork : {
  177 + type : Object,
  178 + value : undefined
174 } 179 }
175 180
176 /*end test*/ 181 /*end test*/
@@ -178,19 +183,6 @@ Example: @@ -178,19 +183,6 @@ Example:
178 183
179 convexHulls : function() { 184 convexHulls : function() {
180 var hullset = []; 185 var hullset = [];
181 - /*for(var i in _this.groups){  
182 - for(var j=0; j < _this.groups[i].length && _this.groups[i].extend;j++){  
183 - var vertices = [];  
184 - for(var v=0;v < _this.groups[i][j].values.length; v++){  
185 - vertices.push([_this.groups[i][j].values[v].x - _this.offset, _this.groups[i][j].values[v].y - _this.offset]);  
186 - vertices.push([_this.groups[i][j].values[v].x - _this.offset, _this.groups[i][j].values[v].y + _this.offset]);  
187 - vertices.push([_this.groups[i][j].values[v].x + _this.offset, _this.groups[i][j].values[v].y - _this.offset]);  
188 - vertices.push([_this.groups[i][j].values[v].x + _this.offset, _this.groups[i][j].values[v].y + _this.offset]);  
189 - }  
190 -  
191 - hullset.push({id : parseInt(i) + 3, sentiment: j , path: d3.geom.hull(vertices), extend : _this.groups[i][j].extend});  
192 - }  
193 - }*/  
194 for(var n in _this.hulls){ 186 for(var n in _this.hulls){
195 var vertices = []; 187 var vertices = [];
196 for(var v in _this.hulls[n]){ 188 for(var v in _this.hulls[n]){
@@ -199,7 +191,7 @@ Example: @@ -199,7 +191,7 @@ Example:
199 vertices.push([_this.hulls[n][v].x + _this.offset, _this.hulls[n][v].y - _this.offset]); 191 vertices.push([_this.hulls[n][v].x + _this.offset, _this.hulls[n][v].y - _this.offset]);
200 vertices.push([_this.hulls[n][v].x + _this.offset, _this.hulls[n][v].y + _this.offset]); 192 vertices.push([_this.hulls[n][v].x + _this.offset, _this.hulls[n][v].y + _this.offset]);
201 } 193 }
202 - hullset.push({/*id : parseInt(i) + 3,*/ sentiment: _this.hulls[n][v].sentiment , path: d3.geom.hull(vertices), extend : true}); 194 + hullset.push({id : n, sentiment: _this.hulls[n][v].sentiment , path: d3.geom.hull(vertices)});
203 } 195 }
204 return hullset; 196 return hullset;
205 }, 197 },
@@ -243,7 +235,7 @@ Example: @@ -243,7 +235,7 @@ Example:
243 this.groups[f.id][parseInt(this.graph.nodes[i].sentiment) - 1].values.push(this.graph.nodes[i]); 235 this.groups[f.id][parseInt(this.graph.nodes[i].sentiment) - 1].values.push(this.graph.nodes[i]);
244 236
245 }else{ 237 }else{
246 - this.graph.nodes[i].group = -1; 238 + this.graph.nodes[i].group = 0;
247 } 239 }
248 } 240 }
249 }, 241 },
@@ -255,37 +247,44 @@ Example: @@ -255,37 +247,44 @@ Example:
255 //Associate the root to first node 247 //Associate the root to first node
256 var root = ({ 248 var root = ({
257 id: 0, 249 id: 0,
258 - group: -1,  
259 - r: 30, 250 + group: 0,
  251 + name : this.graph.nodes[0].name,
  252 + content : this.graph.nodes[0].content,
  253 + r: this.graph.nodes[0].r,
260 }); 254 });
261 nodes.push(root); 255 nodes.push(root);
262 - nodesMap[-1] = root;  
263 nodesMap[0] = root; 256 nodesMap[0] = root;
264 257
265 this.hulls = []; 258 this.hulls = [];
266 for(var g in this.groups){ 259 for(var g in this.groups){
267 for(var s in this.groups[g]) { 260 for(var s in this.groups[g]) {
268 if(this.groups[g][s].values.length > 0) { 261 if(this.groups[g][s].values.length > 0) {
269 - if(this.groups[g][s].extend){ 262 + if(this.groups[g][s].extend || this.groups[g][s].values.length == 1 ){
270 this.hulls[g + "-" + s] = []; 263 this.hulls[g + "-" + s] = [];
271 for(var n=0; n < this.groups[g][s].values.length;n++) { 264 for(var n=0; n < this.groups[g][s].values.length;n++) {
272 var node = ({ 265 var node = ({
273 id: g + "-" + s + "-" + n, 266 id: g + "-" + s + "-" + n,
274 group: g + "-" + s, 267 group: g + "-" + s,
275 sentiment: parseInt(s) + 1, 268 sentiment: parseInt(s) + 1,
276 - r: 3, 269 + r: this.groups[g][s].values[n].r,
  270 + name : this.groups[g][s].values[n].name,
  271 + content : this.groups[g][s].values[n].content
277 }); 272 });
278 nodes.push(node); 273 nodes.push(node);
279 nodesMap[this.groups[g][s].values[n].id] = node; 274 nodesMap[this.groups[g][s].values[n].id] = node;
280 this.hulls[g + "-" + s].push(node); 275 this.hulls[g + "-" + s].push(node);
281 } 276 }
282 }else{ 277 }else{
  278 + var r = 0;
  279 + for(var n=0; n < this.groups[g][s].values.length;n++) r+= Math.sqrt(this.groups[g][s].values[n].r);
  280 +
283 var node = ({ 281 var node = ({
284 id : g + "-"+ s, 282 id : g + "-"+ s,
285 group: g, 283 group: g,
286 sentiment: parseInt(s) + 1, 284 sentiment: parseInt(s) + 1,
287 nodes: this.groups[g][s].values, 285 nodes: this.groups[g][s].values,
288 - r: this.groups[g][s].values.length * 3, 286 + r: (r < 4) ? 4 : r,
  287 + content : "This node contains " + this.groups[g][s].values.length + " nodes",
289 extend: false 288 extend: false
290 }); 289 });
291 290
@@ -294,8 +293,6 @@ Example: @@ -294,8 +293,6 @@ Example:
294 for(var n=0; n < this.groups[g][s].values.length;n++) 293 for(var n=0; n < this.groups[g][s].values.length;n++)
295 nodesMap[this.groups[g][s].values[n].id] = node; 294 nodesMap[this.groups[g][s].values[n].id] = node;
296 } 295 }
297 -  
298 - //root.r +=(this.groups[g][s].values.length * 3);  
299 } 296 }
300 } 297 }
301 } 298 }
@@ -311,15 +308,12 @@ Example: @@ -311,15 +308,12 @@ Example:
311 id: id, 308 id: id,
312 source: nodesMap[this.graph.links[e].source.id], 309 source: nodesMap[this.graph.links[e].source.id],
313 target: nodesMap[this.graph.links[e].target.id], 310 target: nodesMap[this.graph.links[e].target.id],
314 - value: 120,  
315 size : 1 311 size : 1
316 }); 312 });
317 }else{ 313 }else{
318 links.push({ 314 links.push({
319 - id: id,  
320 - source: nodesMap[this.graph.links[e].source.father.id], 315 + source: nodesMap[this.graph.links[e].source.id],
321 target: nodesMap[this.graph.links[e].target.id], 316 target: nodesMap[this.graph.links[e].target.id],
322 - value: 120,  
323 size : 1 317 size : 1
324 }); 318 });
325 } 319 }
@@ -335,8 +329,6 @@ Example: @@ -335,8 +329,6 @@ Example:
335 if(links[i].id == id) return links[i]; 329 if(links[i].id == id) return links[i];
336 } 330 }
337 return null; 331 return null;
338 -  
339 -  
340 }, 332 },
341 333
342 init : function(){ 334 init : function(){
@@ -362,18 +354,21 @@ Example: @@ -362,18 +354,21 @@ Example:
362 .style("fill", "#60df20") 354 .style("fill", "#60df20")
363 .style("opacity", .2) 355 .style("opacity", .2)
364 .on("click", function(d) { 356 .on("click", function(d) {
365 - alert(d.id); 357 + var gids = d.id.split("-");
  358 + _this.groups[parseInt(gids[0])][parseInt(gids[1])].extend = false;
  359 + _this.init();
366 }); 360 });
367 361
368 362
369 - this.svg.selectAll(".link").data(net.links).remove();  
370 - this.svgLinks = this.svg.selectAll(".link").data(net.links).enter() 363 + this.svg.selectAll(".link").data((this.prevNetwork != undefined) ? this.prevNetwork.links : net.links).remove();
  364 + this.svgLinks = this.svg.selectAll(".link").data(net.links);
  365 + this.svgLinks.enter()
371 .append("line") 366 .append("line")
372 .attr("class", "link") 367 .attr("class", "link")
373 - .attr("style", function(t){ return "stroke:#333"; /*+ t.color*/ }) 368 + .attr("style", function(t){ return "stroke:#999999"; /*+ t.color*/ })
374 .style("stroke-width", function(d) { return d.size || 0.3; }); 369 .style("stroke-width", function(d) { return d.size || 0.3; });
375 370
376 - this.svg.selectAll(".node").data(net.nodes).remove(); 371 + this.svg.selectAll(".node").data((this.prevNetwork != undefined) ? this.prevNetwork.nodes : net.nodes).remove();
377 this.svgNodes = this.svg.selectAll(".node").data(net.nodes).enter() 372 this.svgNodes = this.svg.selectAll(".node").data(net.nodes).enter()
378 .append("g") 373 .append("g")
379 .on("mouseover", this.mouseover) 374 .on("mouseover", this.mouseover)
@@ -410,6 +405,8 @@ Example: @@ -410,6 +405,8 @@ Example:
410 .style("opacity", 1); 405 .style("opacity", 1);
411 406
412 d3.selectAll(".drag").call(force.drag), this.svg.selectAll("g.node").call(this.text); 407 d3.selectAll(".drag").call(force.drag), this.svg.selectAll("g.node").call(this.text);
  408 +
  409 + this.prevNetwork = net;
413 }, 410 },
414 411
415 buildGraph: function (){ 412 buildGraph: function (){
@@ -447,7 +444,7 @@ Example: @@ -447,7 +444,7 @@ Example:
447 .attr("xlink:href","http://icons.iconarchive.com/icons/hopstarter/soft-scraps/256/User-Executive-Green-icon.png"); 444 .attr("xlink:href","http://icons.iconarchive.com/icons/hopstarter/soft-scraps/256/User-Executive-Green-icon.png");
448 445
449 for (var i = 0; i < this.graph.links.length; ++i) { 446 for (var i = 0; i < this.graph.links.length; ++i) {
450 - o = this.graph.links[i]; 447 + var o = this.graph.links[i];
451 o.source = this.graph.nodes[o.source]; 448 o.source = this.graph.nodes[o.source];
452 o.target = this.graph.nodes[o.target]; 449 o.target = this.graph.nodes[o.target];
453 } 450 }
@@ -515,21 +512,30 @@ Example: @@ -515,21 +512,30 @@ Example:
515 }, 512 },
516 513
517 mouseover : function (t) { 514 mouseover : function (t) {
518 - d3.select(this).selectAll("circle").transition().duration(600).ease("elastic").attr("r", function (t) {  
519 - return 1 == t.fixed ? 1.4 * t.r : t.r + 10;  
520 - }); 515 + d3.select(this).selectAll("circle").transition().duration(600).ease("elastic")
  516 + .attr("r", function (t) {
  517 + return (t.extend == undefined) ? t.r + 1 : t.r + 10;
  518 + })
  519 + /*.attr("style", function(t){
  520 + return (t.extend == undefined) ? "fill:#FFFFFF; stroke:" + t.color : "fill:" + t.color + "; stroke:#FFFFFF";
  521 + })*/;
  522 +
521 523
522 _this.$.dialog.close(); 524 _this.$.dialog.close();
523 - _this.$.dialog_title.innerHTML = t.name;  
524 - _this.$.dialog_content.innerHTML = t.nodes ? t.nodes.length : 1; 525 + _this.$.dialog_title.innerHTML = (t.name) ? t.name : "Cluster";
  526 + _this.$.dialog_content.innerHTML = t.content;
525 527
526 _this.$.dialog.open(); 528 _this.$.dialog.open();
527 }, 529 },
528 530
529 mouseout : function () { 531 mouseout : function () {
530 - d3.select(this).selectAll("text").style("visibility", "hidden"), d3.select(this).selectAll("circle").transition().duration(400).attr("r", function (t) {  
531 - return t.r ? t.r : 15  
532 - }); 532 + d3.select(this).selectAll("text").style("visibility", "hidden"), d3.select(this).selectAll("circle").transition().duration(400)
  533 + .attr("r", function (t) {
  534 + return t.r ? t.r : 15
  535 + })
  536 + /*.attr("style", function(t){
  537 + return (t.extend == undefined) ? "stroke:#FFFFFF; fill:" + t.color : "stroke:#FFFFFF; fill:" + t.color;
  538 + })*/;
533 _this.$.dialog.close(); 539 _this.$.dialog.close();
534 }, 540 },
535 541
@@ -541,15 +547,15 @@ Example: @@ -541,15 +547,15 @@ Example:
541 _this.fire('graph-datalet_node-clicked', {node : t}); 547 _this.fire('graph-datalet_node-clicked', {node : t});
542 548
543 if(_this.prev_selected_node != null){ 549 if(_this.prev_selected_node != null){
544 - _this.prev_selected_node.style.fill = _this.prev_selected_node.style.stroke; 550 + _this.prev_selected_node.style.fill = _this.prev_selected_node.color;
545 _this.prev_selected_node.style.stroke = "#FFFFFF"; 551 _this.prev_selected_node.style.stroke = "#FFFFFF";
546 } 552 }
547 553
548 _this.prev_selected_node = document.getElementById("" + t.id); 554 _this.prev_selected_node = document.getElementById("" + t.id);
549 - _this.prev_selected_node.style.fill = "#FFFFFF" 555 + _this.prev_selected_node.style.fill = "#FFFFFF";
550 _this.prev_selected_node.style.stroke = t.color; 556 _this.prev_selected_node.style.stroke = t.color;
551 }else{ 557 }else{
552 - var gids = t.id.split("-"); 558 + var gids = t.id.split("-");
553 _this.groups[gids[0]][gids[1]].extend = true; 559 _this.groups[gids[0]][gids[1]].extend = true;
554 _this.init(); 560 _this.init();
555 } 561 }