diff --git a/src/js/familyTreeJS.js b/src/js/familyTreeJS.js index 7e6ef9826562d8f81c58c6f3a0b291f474b915b2..4f78035bb341eb070519ed791c6fb0a2984f26ba 100644 --- a/src/js/familyTreeJS.js +++ b/src/js/familyTreeJS.js @@ -111,9 +111,9 @@ window.renderFamilyTree = function(slaves, filterID) { .enter().append('g') .attr('class', 'node') .call(d3.drag() - .on('start', dragstarted) - .on('drag', dragged) - .on('end', dragended)); + .on('start', dragstarted) + .on('drag', dragged) + .on('end', dragended)); node.append('circle') .attr('r', function (d) { return d.r; }) @@ -509,118 +509,118 @@ window.updateFamilyTree = function(activeSlave = lastActiveSlave, slaves = lastS for(let i = 0; i < slaves.length; ++i) { if(slaves[i].ID === id) return slaves[i]; - } - return {"slaveName":"-", "ID":id, "genes":expectedGenes}; } + return {"slaveName":"-", "ID":id, "genes":expectedGenes}; + } function slaveInfo(slave, activeSlaveId, recursionProtectSlaveId = {}) { - numTreeNodes = 0; - treeDepth = 0; - if(recursionProtectSlaveId[slave.ID]) { - console.log("Recursion protection"); - return slaveInfo_(slave, activeSlaveId); - } - recursionProtectSlaveId[slave.ID] = true; + numTreeNodes = 0; + treeDepth = 0; + if(recursionProtectSlaveId[slave.ID]) { + console.log("Recursion protection"); + return slaveInfo_(slave, activeSlaveId); + } + recursionProtectSlaveId[slave.ID] = true; - if(typeof slave.father === "undefined" || typeof slave.mother === "undefined") - return slaveInfo_(slave, activeSlaveId); + if(typeof slave.father === "undefined" || typeof slave.mother === "undefined") + return slaveInfo_(slave, activeSlaveId); - if(slave.father === -1 || slave.mother === -1) { - return slaveInfo(getSlave(-1), activeSlaveId, recursionProtectSlaveId); - } - if(slave.father !== 0) { - return slaveInfo(getSlave(slave.father, "unknownXY"), activeSlaveId, recursionProtectSlaveId); - } + if(slave.father === -1 || slave.mother === -1) { + return slaveInfo(getSlave(-1), activeSlaveId, recursionProtectSlaveId); + } + if(slave.father !== 0) { + return slaveInfo(getSlave(slave.father, "unknownXY"), activeSlaveId, recursionProtectSlaveId); + } - if(slave.mother !== 0) { - return slaveInfo(getSlave(slave.mother, "unknownXX"), activeSlaveId, recursionProtectSlaveId); - } - return slaveInfo_(slave, activeSlaveId); + if(slave.mother !== 0) { + return slaveInfo(getSlave(slave.mother, "unknownXX"), activeSlaveId, recursionProtectSlaveId); + } + return slaveInfo_(slave, activeSlaveId); } function slaveInfo_(slave, activeSlaveId, slavesAdded={}, depth = 1) { - numTreeNodes += 1; - treeDepth = Math.max(treeDepth, depth); - var shouldAddChildren = false; - if(!slavesAdded[slave.ID]) { - shouldAddChildren = true; - slavesAdded[slave.ID] = true; - } - var data = { - "name": slave.slaveName + (slave.physicalAge?(" (" + slave.physicalAge + ")"):""), - "class" : slave.genes, - "textClass": (activeSlaveId === slave.ID)?"emphasis":"", - "marriages": [], - }; + numTreeNodes += 1; + treeDepth = Math.max(treeDepth, depth); + var shouldAddChildren = false; + if(!slavesAdded[slave.ID]) { + shouldAddChildren = true; + slavesAdded[slave.ID] = true; + } + var data = { + "name": slave.slaveName + (slave.physicalAge?(" (" + slave.physicalAge + ")"):""), + "class" : slave.genes, + "textClass": (activeSlaveId === slave.ID)?"emphasis":"", + "marriages": [], + }; - var spouseToChild = {}; + var spouseToChild = {}; - function maybeAddSpouseToChild(child) { - if(child.ID === slave.ID) - return; - if (child.father === slave.ID) { - if(!spouseToChild[child.mother]) { - spouseToChild[child.mother] = []; - } - spouseToChild[child.mother].push(child); - } else if (child.mother === slave.ID) { - if(!spouseToChild[child.father]) { - spouseToChild[child.father] = []; - } - spouseToChild[child.father].push(child); + function maybeAddSpouseToChild(child) { + if(child.ID === slave.ID) + return; + if (child.father === slave.ID) { + if(!spouseToChild[child.mother]) { + spouseToChild[child.mother] = []; + } + spouseToChild[child.mother].push(child); + } else if (child.mother === slave.ID) { + if(!spouseToChild[child.father]) { + spouseToChild[child.father] = []; + } + spouseToChild[child.father].push(child); + } } - } - if(activeSlave.ID !== PC.ID) - maybeAddSpouseToChild(activeSlave); + if(activeSlave.ID !== PC.ID) + maybeAddSpouseToChild(activeSlave); maybeAddSpouseToChild(getSlave(-1)); - for(let i = 0; i < slaves.length; ++i) { - var child = slaves[i]; - if(child.ID !== activeSlave.ID) - maybeAddSpouseToChild(child); - } - - for(let key in spouseToChild) { - if(spouseToChild.hasOwnProperty(key)) { - var children = shouldAddChildren?spouseToChild[key]:[]; - var spouse = getSlave(key, (slaves.genes === "XX")?"unknownXY":(slaves.genes === "XY")?"unknownXX":"unknown"); - var spouseName; - if (spouse.ID !== slave.ID){ - spouseName = spouse.slaveName + (spouse.physicalAge?(" (" + spouse.physicalAge + ")"):""); - } else { - spouseName = (spouse.ID === -1)?"(yourself)":"(themselves)"; - } - var marriage = { - "spouse": {"name": spouseName, "class": spouse.genes}, - "children": children.map(function (x) { return slaveInfo_(x, activeSlaveId, slavesAdded, depth + 1);} ), /** FIXME: Functions declared within loops referencing an outer scoped variable may lead to confusing semantics. (slaveInfo_, activeSlaveId, slavesAdded, depth) (W083)jshint(W083) */ - }; - data.marriages.push(marriage); + for(let i = 0; i < slaves.length; ++i) { + var child = slaves[i]; + if(child.ID !== activeSlave.ID) + maybeAddSpouseToChild(child); + } + + for(let key in spouseToChild) { + if(spouseToChild.hasOwnProperty(key)) { + var children = shouldAddChildren?spouseToChild[key]:[]; + var spouse = getSlave(key, (slaves.genes === "XX")?"unknownXY":(slaves.genes === "XY")?"unknownXX":"unknown"); + var spouseName; + if (spouse.ID !== slave.ID){ + spouseName = spouse.slaveName + (spouse.physicalAge?(" (" + spouse.physicalAge + ")"):""); + } else { + spouseName = (spouse.ID === -1)?"(yourself)":"(themselves)"; + } + var marriage = { + "spouse": {"name": spouseName, "class": spouse.genes}, + "children": children.map(function (x) { return slaveInfo_(x, activeSlaveId, slavesAdded, depth + 1);} ), /** FIXME: Functions declared within loops referencing an outer scoped variable may lead to confusing semantics. (slaveInfo_, activeSlaveId, slavesAdded, depth) (W083)jshint(W083) */ + }; + data.marriages.push(marriage); } } - return data; + return data; } if (activeSlave === PC || activeSlave === null) activeSlave = getSlave(-1); - const treeData = [slaveInfo(activeSlave, activeSlave.ID)]; - console.log("Family tree is", treeData, 'and has:', numTreeNodes); + const treeData = [slaveInfo(activeSlave, activeSlave.ID)]; + console.log("Family tree is", treeData, 'and has:', numTreeNodes); - var parentWidth = document.getElementById('editFamily').offsetWidth; + var parentWidth = document.getElementById('editFamily').offsetWidth; - console.log(parentWidth, document.getElementById('passages').offsetWidth); - if(!parentWidth) - parentWidth = document.body.offsetWidth - 483; + console.log(parentWidth, document.getElementById('passages').offsetWidth); + if(!parentWidth) + parentWidth = document.body.offsetWidth - 483; - console.log(parentWidth, Math.min(200 + 40*numTreeNodes,parentWidth-200) + 200); + console.log(parentWidth, Math.min(200 + 40*numTreeNodes,parentWidth-200) + 200); - dTree.init(treeData, { - target: "#graph", - debug: true, - height: 50 + 50*treeDepth, /* very rough heuristics */ - width: Math.min(200 + 40*numTreeNodes, - parentWidth-200) + 200, - callbacks: { - nodeClick: function(/*name, extra*/) { + dTree.init(treeData, { + target: "#graph", + debug: true, + height: 50 + 50*treeDepth, /* very rough heuristics */ + width: Math.min(200 + 40*numTreeNodes, + parentWidth-200) + 200, + callbacks: { + nodeClick: function(/*name, extra*/) { } } });