class NetGraphElement extends HTMLElement {
static get observedAttributes() {
return ['G'];
}
constructor() {
super();
this.attachShadow({mode: 'open'});
this.content_div = document.createElement('div');
this.shadowRoot.appendChild(this.content_div);
this.slot_ele = document.createElement('slot');
this.shadowRoot.appendChild(this.slot_ele);
this.G = new jsnx.MultiDiGraph();
}
connectedCallback(){
let style = this.hasAttribute('style') ? this.getAttribute('style') : "";
let weighted = this.hasAttribute('weighted') ? JSON.parse(this.getAttribute('weighted')) : false;
let withLabels = this.hasAttribute('withLabels') ? JSON.parse(this.getAttribute('withLabels')) : true;
let label_color = this.hasAttribute('labelColor') ? this.getAttribute('labelColor') : "black";
this.content_div.style = style;
let that = this;
jsnx.draw(that.G, {
element: that.content_div,
weighted,
withLabels,
labelStyle: {fill: label_color},
edgeStyle: {
'stroke-width': 5,
fill: d => d.data[0].color
},
nodeStyle: {
fill: d => d.data.color
},
nodeAttr: {
r: d => d.data.radius | 10,
title: d => d.label
}
}, true); //true ensures redrawing
this.slot_ele.addEventListener('slotchange', e => {
let text = that.innerText.trim();
let{nodes, edges} = JSON.parse(text);
for(let[id, data] of nodes){
that.G.addNode(id, data);
}
for(let[a, b, data] of edges){
that.G.addEdge(a, b, data);
}
jsnx.draw(that.G, {
element: that.content_div,
weighted,
withLabels,
labelStyle: {fill: label_color},
edgeStyle: {
'stroke-width': 5,
fill: d => d.data[0].color
},
nodeStyle: {
fill: d => d.data.color
},
nodeAttr: {
r: d => d.data.radius | 10,
title: d => d.label
}
}, true); //true ensures redrawing
that.slot_ele.style.display = "none";
that.content_div.children[0].setAttribute("width", that.content_div.style.width);
that.content_div.children[0].setAttribute("height", that.content_div.style.height);
});
}
disconnectedCallback() {
}
}
customElements.define('net-graph', NetGraphElement);