mirror of
https://github.com/zadam/trilium.git
synced 2025-03-01 14:22:32 +01:00
dynamic display of link map
This commit is contained in:
parent
412b0377e9
commit
4329675c60
@ -2104,14 +2104,9 @@
|
||||
sel = k.getSelection(),
|
||||
dPos = this.params.getPosition(dragEl);
|
||||
|
||||
if (sel.length > 0) {
|
||||
for (var i = 0; i < sel.length; i++) {
|
||||
var p = this.params.getPosition(sel[i].el);
|
||||
positions.push([ sel[i].el, { left: p[0], top: p[1] }, sel[i] ]);
|
||||
}
|
||||
}
|
||||
else {
|
||||
positions.push([ dragEl, {left:dPos[0], top:dPos[1]}, this ]);
|
||||
for (var i = 0; i < sel.length; i++) {
|
||||
var p = this.params.getPosition(sel[i].el);
|
||||
positions.push([ sel[i].el, { left: p[0], top: p[1] }, sel[i] ]);
|
||||
}
|
||||
|
||||
_dispatch("stop", {
|
||||
@ -3540,6 +3535,231 @@
|
||||
|
||||
}).call(typeof window !== 'undefined' ? window : this);
|
||||
|
||||
;(function() {
|
||||
|
||||
var DEFAULT_OPTIONS = {
|
||||
deriveAnchor:function(edge, index, ep, conn) {
|
||||
return {
|
||||
top:["TopRight", "TopLeft"],
|
||||
bottom:["BottomRight", "BottomLeft"]
|
||||
}[edge][index];
|
||||
}
|
||||
};
|
||||
|
||||
var root = this;
|
||||
|
||||
var ListManager = function(jsPlumbInstance) {
|
||||
|
||||
this.count = 0;
|
||||
this.instance = jsPlumbInstance;
|
||||
this.lists = {};
|
||||
|
||||
this.instance.addList = function(el, options) {
|
||||
return this.listManager.addList(el, options);
|
||||
};
|
||||
|
||||
this.instance.removeList = function(el) {
|
||||
this.listManager.removeList(el);
|
||||
};
|
||||
|
||||
this.instance.bind("manageElement", function(p) {
|
||||
|
||||
//look for [jtk-scrollable-list] elements and attach scroll listeners if necessary
|
||||
var scrollableLists = this.instance.getSelector(p.el, "[jtk-scrollable-list]");
|
||||
for (var i = 0; i < scrollableLists.length; i++) {
|
||||
this.addList(scrollableLists[i]);
|
||||
}
|
||||
|
||||
}.bind(this));
|
||||
|
||||
this.instance.bind("unmanageElement", function(p) {
|
||||
this.removeList(p.el);
|
||||
});
|
||||
|
||||
|
||||
this.instance.bind("connection", function(c, evt) {
|
||||
if (evt == null) {
|
||||
// not added by mouse. look for an ancestor of the source and/or target element that is a scrollable list, and run
|
||||
// its scroll method.
|
||||
this._maybeUpdateParentList(c.source);
|
||||
this._maybeUpdateParentList(c.target);
|
||||
}
|
||||
}.bind(this));
|
||||
};
|
||||
|
||||
root.jsPlumbListManager = ListManager;
|
||||
|
||||
ListManager.prototype = {
|
||||
|
||||
addList : function(el, options) {
|
||||
var dp = this.instance.extend({}, DEFAULT_OPTIONS);
|
||||
options = this.instance.extend(dp, options || {});
|
||||
var id = [this.instance.getInstanceIndex(), this.count++].join("_");
|
||||
this.lists[id] = new List(this.instance, el, options, id);
|
||||
},
|
||||
|
||||
removeList:function(el) {
|
||||
var list = this.lists[el._jsPlumbList];
|
||||
if (list) {
|
||||
list.destroy();
|
||||
delete this.lists[el._jsPlumbList];
|
||||
}
|
||||
},
|
||||
|
||||
_maybeUpdateParentList:function (el) {
|
||||
var parent = el.parentNode, container = this.instance.getContainer();
|
||||
while(parent != null && parent !== container) {
|
||||
if (parent._jsPlumbList != null && this.lists[parent._jsPlumbList] != null) {
|
||||
parent._jsPlumbScrollHandler();
|
||||
return
|
||||
}
|
||||
parent = parent.parentNode;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
var List = function(instance, el, options, id) {
|
||||
|
||||
el["_jsPlumbList"] = id;
|
||||
|
||||
//
|
||||
// Derive an anchor to use for the current situation. In contrast to the way we derive an endpoint, here we use `anchor` from the options, if present, as
|
||||
// our first choice, and then `deriveAnchor` as our next choice. There is a default `deriveAnchor` implementation that uses TopRight/TopLeft for top and
|
||||
// BottomRight/BottomLeft for bottom.
|
||||
//
|
||||
// edge - "top" or "bottom"
|
||||
// index - 0 when endpoint is connection source, 1 when endpoint is connection target
|
||||
// ep - the endpoint that is being proxied
|
||||
// conn - the connection that is being proxied
|
||||
//
|
||||
function deriveAnchor(edge, index, ep, conn) {
|
||||
return options.anchor ? options.anchor : options.deriveAnchor(edge, index, ep, conn);
|
||||
}
|
||||
|
||||
//
|
||||
// Derive an endpoint to use for the current situation. We'll use a `deriveEndpoint` function passed in to the options as our first choice,
|
||||
// followed by `endpoint` (an endpoint spec) from the options, and failing either of those we just use the `type` of the endpoint that is being proxied.
|
||||
//
|
||||
// edge - "top" or "bottom"
|
||||
// index - 0 when endpoint is connection source, 1 when endpoint is connection target
|
||||
// endpoint - the endpoint that is being proxied
|
||||
// connection - the connection that is being proxied
|
||||
//
|
||||
function deriveEndpoint(edge, index, ep, conn) {
|
||||
return options.deriveEndpoint ? options.deriveEndpoint(edge, index, ep, conn) : options.endpoint ? options.endpoint : ep.type;
|
||||
}
|
||||
|
||||
//
|
||||
// look for a parent of the given scrollable list that is draggable, and then update the child offsets for it. this should not
|
||||
// be necessary in the delegated drag stuff from the upcoming 3.0.0 release.
|
||||
//
|
||||
function _maybeUpdateDraggable(el) {
|
||||
var parent = el.parentNode, container = instance.getContainer();
|
||||
while(parent != null && parent !== container) {
|
||||
if (instance.hasClass(parent, "jtk-managed")) {
|
||||
instance.recalculateOffsets(parent);
|
||||
return
|
||||
}
|
||||
parent = parent.parentNode;
|
||||
}
|
||||
}
|
||||
|
||||
var scrollHandler = function(e) {
|
||||
|
||||
var children = instance.getSelector(el, ".jtk-managed");
|
||||
var elId = instance.getId(el);
|
||||
|
||||
for (var i = 0; i < children.length; i++) {
|
||||
|
||||
if (children[i].offsetTop < el.scrollTop) {
|
||||
if (!children[i]._jsPlumbProxies) {
|
||||
children[i]._jsPlumbProxies = children[i]._jsPlumbProxies || [];
|
||||
instance.select({source: children[i]}).each(function (c) {
|
||||
|
||||
|
||||
instance.proxyConnection(c, 0, el, elId, function () {
|
||||
return deriveEndpoint("top", 0, c.endpoints[0], c);
|
||||
}, function () {
|
||||
return deriveAnchor("top", 0, c.endpoints[0], c);
|
||||
});
|
||||
children[i]._jsPlumbProxies.push([c, 0]);
|
||||
});
|
||||
|
||||
instance.select({target: children[i]}).each(function (c) {
|
||||
instance.proxyConnection(c, 1, el, elId, function () {
|
||||
return deriveEndpoint("top", 1, c.endpoints[1], c);
|
||||
}, function () {
|
||||
return deriveAnchor("top", 1, c.endpoints[1], c);
|
||||
});
|
||||
children[i]._jsPlumbProxies.push([c, 1]);
|
||||
});
|
||||
}
|
||||
}
|
||||
//
|
||||
else if (children[i].offsetTop > el.scrollTop + el.offsetHeight) {
|
||||
if (!children[i]._jsPlumbProxies) {
|
||||
children[i]._jsPlumbProxies = children[i]._jsPlumbProxies || [];
|
||||
|
||||
instance.select({source: children[i]}).each(function (c) {
|
||||
instance.proxyConnection(c, 0, el, elId, function () {
|
||||
return deriveEndpoint("bottom", 0, c.endpoints[0], c);
|
||||
}, function () {
|
||||
return deriveAnchor("bottom", 0, c.endpoints[0], c);
|
||||
});
|
||||
children[i]._jsPlumbProxies.push([c, 0]);
|
||||
});
|
||||
|
||||
instance.select({target: children[i]}).each(function (c) {
|
||||
instance.proxyConnection(c, 1, el, elId, function () {
|
||||
return deriveEndpoint("bottom", 1, c.endpoints[1], c);
|
||||
}, function () {
|
||||
return deriveAnchor("bottom", 1, c.endpoints[1], c);
|
||||
});
|
||||
children[i]._jsPlumbProxies.push([c, 1]);
|
||||
});
|
||||
}
|
||||
} else if (children[i]._jsPlumbProxies) {
|
||||
for (var j = 0; j < children[i]._jsPlumbProxies.length; j++) {
|
||||
instance.unproxyConnection(children[i]._jsPlumbProxies[j][0], children[i]._jsPlumbProxies[j][1], elId);
|
||||
}
|
||||
|
||||
delete children[i]._jsPlumbProxies;
|
||||
}
|
||||
|
||||
instance.revalidate(children[i]);
|
||||
}
|
||||
|
||||
_maybeUpdateDraggable(el);
|
||||
};
|
||||
|
||||
instance.setAttribute(el, "jtk-scrollable-list", "true");
|
||||
el._jsPlumbScrollHandler = scrollHandler;
|
||||
instance.on(el, "scroll", scrollHandler);
|
||||
scrollHandler(); // run it once; there may be connections already.
|
||||
|
||||
this.destroy = function() {
|
||||
instance.off(el, "scroll", scrollHandler);
|
||||
delete el._jsPlumbScrollHandler;
|
||||
|
||||
var children = instance.getSelector(el, ".jtk-managed");
|
||||
var elId = instance.getId(el);
|
||||
|
||||
for (var i = 0; i < children.length; i++) {
|
||||
if (children[i]._jsPlumbProxies) {
|
||||
for (var j = 0; j < children[i]._jsPlumbProxies.length; j++) {
|
||||
instance.unproxyConnection(children[i]._jsPlumbProxies[j][0], children[i]._jsPlumbProxies[j][1], elId);
|
||||
}
|
||||
|
||||
delete children[i]._jsPlumbProxies;
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
}).call(typeof window !== 'undefined' ? window : this);
|
||||
/*
|
||||
* This file contains the core code.
|
||||
*
|
||||
@ -4006,7 +4226,7 @@
|
||||
|
||||
var jsPlumbInstance = root.jsPlumbInstance = function (_defaults) {
|
||||
|
||||
this.version = "2.9.3";
|
||||
this.version = "2.10.0";
|
||||
|
||||
this.Defaults = {
|
||||
Anchor: "Bottom",
|
||||
@ -5470,6 +5690,7 @@
|
||||
|
||||
managedElements[id].info = _updateOffset({ elId: id, timestamp: _suspendedAt });
|
||||
_currentInstance.addClass(element, "jtk-managed");
|
||||
|
||||
if (!_transient) {
|
||||
_currentInstance.fire("manageElement", { id:id, info:managedElements[id].info, el:element });
|
||||
}
|
||||
@ -5480,9 +5701,10 @@
|
||||
|
||||
var _unmanage = _currentInstance.unmanage = function(id) {
|
||||
if (managedElements[id]) {
|
||||
_currentInstance.removeClass(managedElements[id].el, "jtk-managed");
|
||||
var el = managedElements[id].el;
|
||||
_currentInstance.removeClass(el, "jtk-managed");
|
||||
delete managedElements[id];
|
||||
_currentInstance.fire("unmanageElement", id);
|
||||
_currentInstance.fire("unmanageElement", {id:id, el:el});
|
||||
}
|
||||
};
|
||||
|
||||
@ -6619,6 +6841,8 @@
|
||||
this.getFloatingConnectionFor = function(id) {
|
||||
return floatingConnections[id];
|
||||
};
|
||||
|
||||
this.listManager = new root.jsPlumbListManager(this);
|
||||
};
|
||||
|
||||
_ju.extend(root.jsPlumbInstance, _ju.EventGenerator, {
|
||||
@ -6709,6 +6933,86 @@
|
||||
floatingConnections: {},
|
||||
getFloatingAnchorIndex: function (jpc) {
|
||||
return jpc.endpoints[0].isFloating() ? 0 : jpc.endpoints[1].isFloating() ? 1 : -1;
|
||||
},
|
||||
proxyConnection :function(connection, index, proxyEl, proxyElId, endpointGenerator, anchorGenerator) {
|
||||
var proxyEp,
|
||||
originalElementId = connection.endpoints[index].elementId,
|
||||
originalEndpoint = connection.endpoints[index];
|
||||
|
||||
connection.proxies = connection.proxies || [];
|
||||
if(connection.proxies[index]) {
|
||||
proxyEp = connection.proxies[index].ep;
|
||||
}else {
|
||||
proxyEp = this.addEndpoint(proxyEl, {
|
||||
endpoint:endpointGenerator(connection, index),
|
||||
anchor:anchorGenerator(connection, index),
|
||||
parameters:{
|
||||
isProxyEndpoint:true
|
||||
}
|
||||
});
|
||||
}
|
||||
proxyEp.setDeleteOnEmpty(true);
|
||||
|
||||
// for this index, stash proxy info: the new EP, the original EP.
|
||||
connection.proxies[index] = { ep:proxyEp, originalEp: originalEndpoint };
|
||||
|
||||
// and advise the anchor manager
|
||||
if (index === 0) {
|
||||
// TODO why are there two differently named methods? Why is there not one method that says "some end of this
|
||||
// connection changed (you give the index), and here's the new element and element id."
|
||||
this.anchorManager.sourceChanged(originalElementId, proxyElId, connection, proxyEl);
|
||||
}
|
||||
else {
|
||||
this.anchorManager.updateOtherEndpoint(connection.endpoints[0].elementId, originalElementId, proxyElId, connection);
|
||||
connection.target = proxyEl;
|
||||
connection.targetId = proxyElId;
|
||||
}
|
||||
|
||||
// detach the original EP from the connection.
|
||||
originalEndpoint.detachFromConnection(connection, null, true);
|
||||
|
||||
// set the proxy as the new ep
|
||||
proxyEp.connections = [ connection ];
|
||||
connection.endpoints[index] = proxyEp;
|
||||
|
||||
originalEndpoint.setVisible(false);
|
||||
|
||||
connection.setVisible(true);
|
||||
|
||||
this.revalidate(proxyEl);
|
||||
},
|
||||
unproxyConnection : function(connection, index, proxyElId) {
|
||||
// if connection cleaned up, no proxies, or none for this end of the connection, abort.
|
||||
if (connection._jsPlumb == null || connection.proxies == null || connection.proxies[index] == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
var originalElement = connection.proxies[index].originalEp.element,
|
||||
originalElementId = connection.proxies[index].originalEp.elementId;
|
||||
|
||||
connection.endpoints[index] = connection.proxies[index].originalEp;
|
||||
// and advise the anchor manager
|
||||
if (index === 0) {
|
||||
// TODO why are there two differently named methods? Why is there not one method that says "some end of this
|
||||
// connection changed (you give the index), and here's the new element and element id."
|
||||
this.anchorManager.sourceChanged(proxyElId, originalElementId, connection, originalElement);
|
||||
}
|
||||
else {
|
||||
this.anchorManager.updateOtherEndpoint(connection.endpoints[0].elementId, proxyElId, originalElementId, connection);
|
||||
connection.target = originalElement;
|
||||
connection.targetId = originalElementId;
|
||||
}
|
||||
|
||||
// detach the proxy EP from the connection (which will cause it to be removed as we no longer need it)
|
||||
connection.proxies[index].ep.detachFromConnection(connection, null);
|
||||
|
||||
connection.proxies[index].originalEp.addConnection(connection);
|
||||
if(connection.isVisible()) {
|
||||
connection.proxies[index].originalEp.setVisible(true);
|
||||
}
|
||||
|
||||
// cleanup
|
||||
delete connection.proxies[index];
|
||||
}
|
||||
});
|
||||
|
||||
@ -10183,15 +10487,15 @@
|
||||
},
|
||||
_path = function (segments) {
|
||||
var anchorsPerFace = anchorCount / segments.length, a = [],
|
||||
_computeFace = function (x1, y1, x2, y2, fractionalLength) {
|
||||
_computeFace = function (x1, y1, x2, y2, fractionalLength, ox, oy) {
|
||||
anchorsPerFace = anchorCount * fractionalLength;
|
||||
var dx = (x2 - x1) / anchorsPerFace, dy = (y2 - y1) / anchorsPerFace;
|
||||
for (var i = 0; i < anchorsPerFace; i++) {
|
||||
a.push([
|
||||
x1 + (dx * i),
|
||||
y1 + (dy * i),
|
||||
0,
|
||||
0
|
||||
ox == null ? 0 : ox,
|
||||
oy == null ? 0 : oy
|
||||
]);
|
||||
}
|
||||
};
|
||||
@ -10205,16 +10509,16 @@
|
||||
_shape = function (faces) {
|
||||
var s = [];
|
||||
for (var i = 0; i < faces.length; i++) {
|
||||
s.push([faces[i][0], faces[i][1], faces[i][2], faces[i][3], 1 / faces.length]);
|
||||
s.push([faces[i][0], faces[i][1], faces[i][2], faces[i][3], 1 / faces.length, faces[i][4], faces[i][5]]);
|
||||
}
|
||||
return _path(s);
|
||||
},
|
||||
_rectangle = function () {
|
||||
return _shape([
|
||||
[ 0, 0, 1, 0 ],
|
||||
[ 1, 0, 1, 1 ],
|
||||
[ 1, 1, 0, 1 ],
|
||||
[ 0, 1, 0, 0 ]
|
||||
[ 0, 0, 1, 0, 0, -1 ],
|
||||
[ 1, 0, 1, 1, 1, 0 ],
|
||||
[ 1, 1, 0, 1, 0, 1 ],
|
||||
[ 0, 1, 0, 0, -1, 0 ]
|
||||
]);
|
||||
};
|
||||
|
||||
@ -12115,11 +12419,11 @@
|
||||
c.setVisible(false);
|
||||
if (c.endpoints[oidx].element._jsPlumbGroup === group) {
|
||||
c.endpoints[oidx].setVisible(false);
|
||||
self.expandConnection(c, oidx, group);
|
||||
_expandConnection(c, oidx, group);
|
||||
}
|
||||
else {
|
||||
c.endpoints[index].setVisible(false);
|
||||
self.collapseConnection(c, index, group);
|
||||
_collapseConnection(c, index, group);
|
||||
}
|
||||
});
|
||||
};
|
||||
@ -12203,54 +12507,16 @@
|
||||
}
|
||||
}
|
||||
|
||||
var _collapseConnection = this.collapseConnection = function(c, index, group) {
|
||||
|
||||
var proxyEp, groupEl = group.getEl(), groupElId = _jsPlumb.getId(groupEl),
|
||||
originalElementId = c.endpoints[index].elementId;
|
||||
var _collapseConnection = function(c, index, group) {
|
||||
|
||||
var otherEl = c.endpoints[index === 0 ? 1 : 0].element;
|
||||
if (otherEl[GROUP] && (!otherEl[GROUP].shouldProxy() && otherEl[GROUP].collapsed)) {
|
||||
return;
|
||||
}
|
||||
|
||||
c.proxies = c.proxies || [];
|
||||
if(c.proxies[index]) {
|
||||
proxyEp = c.proxies[index].ep;
|
||||
}else {
|
||||
proxyEp = _jsPlumb.addEndpoint(groupEl, {
|
||||
endpoint:group.getEndpoint(c, index),
|
||||
anchor:group.getAnchor(c, index),
|
||||
parameters:{
|
||||
isProxyEndpoint:true
|
||||
}
|
||||
});
|
||||
}
|
||||
proxyEp.setDeleteOnEmpty(true);
|
||||
var groupEl = group.getEl(), groupElId = _jsPlumb.getId(groupEl);
|
||||
|
||||
// for this index, stash proxy info: the new EP, the original EP.
|
||||
c.proxies[index] = { ep:proxyEp, originalEp: c.endpoints[index] };
|
||||
|
||||
// and advise the anchor manager
|
||||
if (index === 0) {
|
||||
// TODO why are there two differently named methods? Why is there not one method that says "some end of this
|
||||
// connection changed (you give the index), and here's the new element and element id."
|
||||
_jsPlumb.anchorManager.sourceChanged(originalElementId, groupElId, c, groupEl);
|
||||
}
|
||||
else {
|
||||
_jsPlumb.anchorManager.updateOtherEndpoint(c.endpoints[0].elementId, originalElementId, groupElId, c);
|
||||
c.target = groupEl;
|
||||
c.targetId = groupElId;
|
||||
}
|
||||
|
||||
|
||||
// detach the original EP from the connection.
|
||||
c.proxies[index].originalEp.detachFromConnection(c, null, true);
|
||||
|
||||
// set the proxy as the new ep
|
||||
proxyEp.connections = [ c ];
|
||||
c.endpoints[index] = proxyEp;
|
||||
|
||||
c.setVisible(true);
|
||||
_jsPlumb.proxyConnection(c, index, groupEl, groupElId, function(c, index) { return group.getEndpoint(c, index); }, function(c, index) { return group.getAnchor(c, index); });
|
||||
};
|
||||
|
||||
this.collapseGroup = function(group) {
|
||||
@ -12287,37 +12553,8 @@
|
||||
_jsPlumb.fire(EVT_COLLAPSE, { group:group });
|
||||
};
|
||||
|
||||
var _expandConnection = this.expandConnection = function(c, index, group) {
|
||||
|
||||
// if no proxies or none for this end of the connection, abort.
|
||||
if (c.proxies == null || c.proxies[index] == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
var groupElId = _jsPlumb.getId(group.getEl()),
|
||||
originalElement = c.proxies[index].originalEp.element,
|
||||
originalElementId = c.proxies[index].originalEp.elementId;
|
||||
|
||||
c.endpoints[index] = c.proxies[index].originalEp;
|
||||
// and advise the anchor manager
|
||||
if (index === 0) {
|
||||
// TODO why are there two differently named methods? Why is there not one method that says "some end of this
|
||||
// connection changed (you give the index), and here's the new element and element id."
|
||||
_jsPlumb.anchorManager.sourceChanged(groupElId, originalElementId, c, originalElement);
|
||||
}
|
||||
else {
|
||||
_jsPlumb.anchorManager.updateOtherEndpoint(c.endpoints[0].elementId, groupElId, originalElementId, c);
|
||||
c.target = originalElement;
|
||||
c.targetId = originalElementId;
|
||||
}
|
||||
|
||||
// detach the proxy EP from the connection (which will cause it to be removed as we no longer need it)
|
||||
c.proxies[index].ep.detachFromConnection(c, null);
|
||||
|
||||
c.proxies[index].originalEp.addConnection(c);
|
||||
|
||||
// cleanup
|
||||
delete c.proxies[index];
|
||||
var _expandConnection = function(c, index, group) {
|
||||
_jsPlumb.unproxyConnection(c, index, _jsPlumb.getId(group.getEl()));
|
||||
};
|
||||
|
||||
this.expandGroup = function(group, doNotFireEvent) {
|
||||
|
@ -101,34 +101,58 @@ async function loadNotesAndRelations() {
|
||||
0.5 // Damping
|
||||
);
|
||||
|
||||
function getNoteBox(noteId) {
|
||||
const noteBoxId = noteIdToId(noteId);
|
||||
const $existingNoteBox = $("#" + noteBoxId);
|
||||
|
||||
if ($existingNoteBox.length > 0) {
|
||||
return $existingNoteBox;
|
||||
}
|
||||
|
||||
const note = notes.find(n => n.noteId === noteId);
|
||||
|
||||
const $noteBox = $("<div>")
|
||||
.addClass("note-box")
|
||||
.prop("id", noteBoxId)
|
||||
.append($("<span>").addClass("title").append(note.title));
|
||||
|
||||
jsPlumbInstance.getContainer().appendChild($noteBox[0]);
|
||||
|
||||
return $noteBox;
|
||||
}
|
||||
|
||||
const renderer = new Springy.Renderer(
|
||||
layout,
|
||||
() => {},
|
||||
() => {}, //cleanup(),
|
||||
(edge, p1, p2) => {
|
||||
const connectionId = edge.source.id + '-' + edge.target.id;
|
||||
|
||||
if ($("#" + connectionId).length > 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
getNoteBox(edge.source.id);
|
||||
getNoteBox(edge.target.id);
|
||||
|
||||
const connection = jsPlumbInstance.connect({
|
||||
source: noteIdToId(edge.source.id),
|
||||
target: noteIdToId(edge.target.id),
|
||||
type: 'relation' // FIXME
|
||||
});
|
||||
|
||||
connection.canvas.id = connectionId;
|
||||
},
|
||||
(node, p) => {
|
||||
const $noteBox = getNoteBox(node.id);
|
||||
|
||||
$noteBox
|
||||
.css("left", (300 + p.x * 100) + "px")
|
||||
.css("top", (300 + p.y * 100) + "px");
|
||||
},
|
||||
() => {},
|
||||
() => {},
|
||||
() => {
|
||||
layout.eachNode((node, point) => {
|
||||
console.log(node, point.p);
|
||||
|
||||
const note = notes.find(n => n.noteId === node.id);
|
||||
|
||||
const $noteBox = $("<div>")
|
||||
.addClass("note-box")
|
||||
.prop("id", noteIdToId(node.id))
|
||||
.append($("<span>").addClass("title").append(note.title))
|
||||
.css("left", (300 + point.p.x * 100) + "px")
|
||||
.css("top", (300 + point.p.y * 100) + "px");
|
||||
|
||||
jsPlumbInstance.getContainer().appendChild($noteBox[0]);
|
||||
});
|
||||
|
||||
for (const link of links) {
|
||||
const connection = jsPlumbInstance.connect({
|
||||
source: noteIdToId(link.noteId),
|
||||
target: noteIdToId(link.targetNoteId),
|
||||
type: link.type
|
||||
});
|
||||
}
|
||||
jsPlumbInstance.repaintEverything();
|
||||
}
|
||||
);
|
||||
|
||||
@ -152,14 +176,18 @@ function initPanZoom() {
|
||||
});
|
||||
}
|
||||
|
||||
function cleanup() {
|
||||
// delete all endpoints and connections
|
||||
// this is done at this point (after async operations) to reduce flicker to the minimum
|
||||
jsPlumbInstance.deleteEveryEndpoint();
|
||||
|
||||
// without this we still end up with note boxes remaining in the canvas
|
||||
$linkMapContainer.empty();
|
||||
}
|
||||
|
||||
function initJsPlumbInstance() {
|
||||
if (jsPlumbInstance) {
|
||||
// delete all endpoints and connections
|
||||
// this is done at this point (after async operations) to reduce flicker to the minimum
|
||||
jsPlumbInstance.deleteEveryEndpoint();
|
||||
|
||||
// without this we still end up with note boxes remaining in the canvas
|
||||
$linkMapContainer.empty();
|
||||
cleanup();
|
||||
|
||||
return;
|
||||
}
|
||||
|
@ -8,7 +8,7 @@
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="modal-body" style="outline: none;">
|
||||
<div id="link-map-container"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
Loading…
x
Reference in New Issue
Block a user