You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
wanijo/resources/public/js/vis.js

83 lines
2.3 KiB

document.addEventListener('DOMContentLoaded', function () {
const canvas = document.querySelector('.vis-canvas')
const nodes = new vis.DataSet([])
const edges = new vis.DataSet([])
const network = new vis.Network(canvas, {
nodes: nodes,
edges: edges
}, {
manipulation: true
})
const instanceLabel = (inst, schema) => `${inst.name}\n${schema.name}`
const addNode = (toAdd) => {
try {
nodes.add({
id: toAdd.uuid,
label: instanceLabel(toAdd, toAdd.schema)
})
} catch(e) {
console.debug(e)
}
}
const addOutEdges = (fromId, toAdd) => {
toAdd.forEach((inst) => {
try {
edges.add({
from: fromId,
to: inst.uuid,
label: inst['link-name'],
arrows: {
to: {enabled: true}
}
})
} catch (e) {
console.debug(e)
}
})
}
const addLinkedNodes = (toAdd) => {
toAdd.forEach((inst) => {
try {
console.debug(inst.name)
nodes.add({
id: inst.uuid,
label: instanceLabel(inst, inst.schema)
})
} catch (e) {
console.debug(e)
}
})
}
const addInstance = (instance) => {
addNode(instance)
addLinkedNodes(instance['links-out'])
addOutEdges(instance.uuid, instance['links-out'])
}
fetch(canvas.getAttribute('data-instance-url'))
.then((resp) => resp.json())
.then((json) => {
addInstance(json)
})
const searchForm = document.querySelector('.search')
const searchUrl = searchForm.getAttribute('action')
searchForm.addEventListener('submit', (event) => {
event.preventDefault()
const term = searchForm.querySelector('[name=term]').value
fetch(searchUrl + encodeURIComponent(term))
.then((resp) => resp.json())
.then((json) => {
console.debug(json)
json.forEach((inst) => {
addInstance(inst)
})
})
})
})