Вы можете использовать BALKANGraph для достижения требуемой функциональности
1) См. Пример ниже:
2) и 3) работают без каких-либо модификаций
![enter image description here](https://i.stack.imgur.com/pMPml.png)
var chart = new OrgChart(document.getElementById("tree"), {
template: "ana",
nodeBinding: {
field_0: "name",
img_0: "img"
},
links: [
{ from: "2", to: "1" },
{ from: "3", to: "1" }
],
nodes: [
{ id: "1", name: "Plamen Peshev", img: "//balkangraph.com/js/img/empty-img-blue.svg" },
{ id: "2", name: "Ava Field", img: "//balkangraph.com/js/img/empty-img-blue.svg" },
{ id: "3", name: "Rhys Harper", img: "//balkangraph.com/js/img/empty-img-blue.svg" }
]
});
document.getElementById("changeTemplate").addEventListener("click", function () {
chart.config.nodes["1"].tags = ["ula-template"];
chart.config.tags["ula-template"] = { template: "ula" };
chart.draw(false);
});
html, body {
margin: 0px;
padding: 0px;
width: 100%;
height: 100%;
overflow: hidden;
font-family: Helvetica;
}
#tree {
width: 100%;
height: 100%;
}
#changeTemplate{
font-size: 24px;
}
<script src="https://balkangraph.com/js/latest/OrgChart.js"></script>
<button id="changeTemplate">Change the template of node 1</button>
<div id="tree"></div>