diff --git a/editor/js/nodes.js b/editor/js/nodes.js index 240aecfff..6878a8cc2 100644 --- a/editor/js/nodes.js +++ b/editor/js/nodes.js @@ -210,6 +210,7 @@ RED.nodes = (function() { function removeNode(id) { var removedLinks = []; + var removedNodes = []; var node; if (id in configNodes) { node = configNodes[id]; @@ -231,8 +232,13 @@ RED.nodes = (function() { var configNode = configNodes[node[d]]; if (configNode) { updatedConfigNode = true; - var users = configNode.users; - users.splice(users.indexOf(node),1); + if (configNode._def.exclusive) { + removeNode(node[d]); + removedNodes.push(configNode); + } else { + var users = configNode.users; + users.splice(users.indexOf(node),1); + } } } } @@ -246,7 +252,7 @@ RED.nodes = (function() { if (node._def.onremove) { node._def.onremove.call(n); } - return removedLinks; + return {links:removedLinks,nodes:removedNodes}; } function removeLink(l) { @@ -539,6 +545,32 @@ RED.nodes = (function() { return nns; } + function compareNodes(nodeA,nodeB) { + if (nodeA.id != nodeB.id || nodeA.type != nodeB.type) { + return false; + } + var def = nodeA._def; + for (var d in def.defaults) { + if (def.defaults.hasOwnProperty(d)) { + var vA = nodeA[d]; + var vB = nodeB[d]; + if (typeof vA !== typeof vB) { + return false; + } + if (vA === null || typeof vA === "string" || typeof vA === "number") { + if (vA !== vB) { + return false; + } + } else { + if (JSON.stringify(vA) !== JSON.stringify(vB)) { + return false; + } + } + } + } + return true; + } + function importNodes(newNodesObj,createNewIds) { var i; var n; @@ -607,6 +639,9 @@ RED.nodes = (function() { var workspace_map = {}; var new_subflows = []; var subflow_map = {}; + var node_map = {}; + var new_nodes = []; + var new_links = []; var nid; var def; for (i=0;i