mirror of
https://github.com/node-red/node-red.git
synced 2023-10-10 13:36:53 +02:00
Avoid duplicating existing subflows on import
This commit is contained in:
parent
252040f03b
commit
a0f91aa814
@ -565,6 +565,45 @@ RED.nodes = (function() {
|
|||||||
return nns;
|
return nns;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function checkForMatchingSubflow(subflow,subflowNodes) {
|
||||||
|
var i;
|
||||||
|
var match = null;
|
||||||
|
try {
|
||||||
|
RED.nodes.eachSubflow(function(sf) {
|
||||||
|
if (sf.name != subflow.name ||
|
||||||
|
sf.info != subflow.info ||
|
||||||
|
sf.in.length != subflow.in.length ||
|
||||||
|
sf.out.length != subflow.out.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var sfNodes = RED.nodes.filterNodes({z:sf.id});
|
||||||
|
if (sfNodes.length != subflowNodes.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var subflowNodeSet = [subflow].concat(subflowNodes);
|
||||||
|
var sfNodeSet = [sf].concat(sfNodes);
|
||||||
|
|
||||||
|
var exportableSubflowNodes = JSON.stringify(subflowNodeSet);
|
||||||
|
var exportableSFNodes = JSON.stringify(createExportableNodeSet(sfNodeSet));
|
||||||
|
var nodeMap = {};
|
||||||
|
for (i=0;i<sfNodes.length;i++) {
|
||||||
|
exportableSubflowNodes = exportableSubflowNodes.replace(new RegExp("\""+subflowNodes[i].id+"\"","g"),'"'+sfNodes[i].id+'"');
|
||||||
|
}
|
||||||
|
exportableSubflowNodes = exportableSubflowNodes.replace(new RegExp("\""+subflow.id+"\"","g"),'"'+sf.id+'"');
|
||||||
|
|
||||||
|
if (exportableSubflowNodes !== exportableSFNodes) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
match = sf;
|
||||||
|
throw new Error();
|
||||||
|
});
|
||||||
|
} catch(err) {
|
||||||
|
console.log(err.stack);
|
||||||
|
}
|
||||||
|
return match;
|
||||||
|
}
|
||||||
function compareNodes(nodeA,nodeB,idMustMatch) {
|
function compareNodes(nodeA,nodeB,idMustMatch) {
|
||||||
if (idMustMatch && nodeA.id != nodeB.id) {
|
if (idMustMatch && nodeA.id != nodeB.id) {
|
||||||
return false;
|
return false;
|
||||||
@ -598,6 +637,7 @@ RED.nodes = (function() {
|
|||||||
var i;
|
var i;
|
||||||
var n;
|
var n;
|
||||||
var newNodes;
|
var newNodes;
|
||||||
|
var nodeZmap = {};
|
||||||
if (typeof newNodesObj === "string") {
|
if (typeof newNodesObj === "string") {
|
||||||
if (newNodesObj === "") {
|
if (newNodesObj === "") {
|
||||||
return;
|
return;
|
||||||
@ -628,6 +668,11 @@ RED.nodes = (function() {
|
|||||||
unknownTypes.indexOf(n.type)==-1) {
|
unknownTypes.indexOf(n.type)==-1) {
|
||||||
unknownTypes.push(n.type);
|
unknownTypes.push(n.type);
|
||||||
}
|
}
|
||||||
|
if (n.z) {
|
||||||
|
nodeZmap[n.z] = nodeZmap[n.z] || [];
|
||||||
|
nodeZmap[n.z].push(n);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
if (unknownTypes.length > 0) {
|
if (unknownTypes.length > 0) {
|
||||||
var typeList = "<ul><li>"+unknownTypes.join("</li><li>")+"</li></ul>";
|
var typeList = "<ul><li>"+unknownTypes.join("</li><li>")+"</li></ul>";
|
||||||
@ -662,6 +707,7 @@ RED.nodes = (function() {
|
|||||||
var workspace_map = {};
|
var workspace_map = {};
|
||||||
var new_subflows = [];
|
var new_subflows = [];
|
||||||
var subflow_map = {};
|
var subflow_map = {};
|
||||||
|
var subflow_blacklist = {};
|
||||||
var node_map = {};
|
var node_map = {};
|
||||||
var new_nodes = [];
|
var new_nodes = [];
|
||||||
var new_links = [];
|
var new_links = [];
|
||||||
@ -690,28 +736,33 @@ RED.nodes = (function() {
|
|||||||
RED.workspaces.add(n);
|
RED.workspaces.add(n);
|
||||||
new_workspaces.push(n);
|
new_workspaces.push(n);
|
||||||
} else if (n.type === "subflow") {
|
} else if (n.type === "subflow") {
|
||||||
subflow_map[n.id] = n;
|
var matchingSubflow = checkForMatchingSubflow(n,nodeZmap[n.id]);
|
||||||
if (createNewIds) {
|
if (matchingSubflow) {
|
||||||
nid = getID();
|
subflow_blacklist[n.id] = matchingSubflow;
|
||||||
n.id = nid;
|
} else {
|
||||||
|
subflow_map[n.id] = n;
|
||||||
|
if (createNewIds) {
|
||||||
|
nid = getID();
|
||||||
|
n.id = nid;
|
||||||
|
}
|
||||||
|
// TODO: handle createNewIds - map old to new subflow ids
|
||||||
|
n.in.forEach(function(input,i) {
|
||||||
|
input.type = "subflow";
|
||||||
|
input.direction = "in";
|
||||||
|
input.z = n.id;
|
||||||
|
input.i = i;
|
||||||
|
input.id = getID();
|
||||||
|
});
|
||||||
|
n.out.forEach(function(output,i) {
|
||||||
|
output.type = "subflow";
|
||||||
|
output.direction = "out";
|
||||||
|
output.z = n.id;
|
||||||
|
output.i = i;
|
||||||
|
output.id = getID();
|
||||||
|
});
|
||||||
|
new_subflows.push(n);
|
||||||
|
addSubflow(n,createNewIds);
|
||||||
}
|
}
|
||||||
// TODO: handle createNewIds - map old to new subflow ids
|
|
||||||
n.in.forEach(function(input,i) {
|
|
||||||
input.type = "subflow";
|
|
||||||
input.direction = "in";
|
|
||||||
input.z = n.id;
|
|
||||||
input.i = i;
|
|
||||||
input.id = getID();
|
|
||||||
});
|
|
||||||
n.out.forEach(function(output,i) {
|
|
||||||
output.type = "subflow";
|
|
||||||
output.direction = "out";
|
|
||||||
output.z = n.id;
|
|
||||||
output.i = i;
|
|
||||||
output.id = getID();
|
|
||||||
});
|
|
||||||
new_subflows.push(n);
|
|
||||||
addSubflow(n,createNewIds);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -732,7 +783,9 @@ RED.nodes = (function() {
|
|||||||
var existingConfigNode = null;
|
var existingConfigNode = null;
|
||||||
if (createNewIds) {
|
if (createNewIds) {
|
||||||
if (n.z) {
|
if (n.z) {
|
||||||
if (subflow_map[n.z]) {
|
if (subflow_blacklist[n.z]) {
|
||||||
|
continue;
|
||||||
|
} else if (subflow_map[n.z]) {
|
||||||
n.z = subflow_map[n.z].id;
|
n.z = subflow_map[n.z].id;
|
||||||
} else {
|
} else {
|
||||||
n.z = workspace_map[n.z];
|
n.z = workspace_map[n.z];
|
||||||
@ -796,7 +849,9 @@ RED.nodes = (function() {
|
|||||||
if (!def || def.category != "config") {
|
if (!def || def.category != "config") {
|
||||||
var node = {x:n.x,y:n.y,z:n.z,type:0,wires:n.wires,changed:false};
|
var node = {x:n.x,y:n.y,z:n.z,type:0,wires:n.wires,changed:false};
|
||||||
if (createNewIds) {
|
if (createNewIds) {
|
||||||
if (subflow_map[node.z]) {
|
if (subflow_blacklist[n.z]) {
|
||||||
|
continue;
|
||||||
|
} else if (subflow_map[node.z]) {
|
||||||
node.z = subflow_map[node.z].id;
|
node.z = subflow_map[node.z].id;
|
||||||
} else {
|
} else {
|
||||||
node.z = workspace_map[node.z];
|
node.z = workspace_map[node.z];
|
||||||
@ -831,7 +886,7 @@ RED.nodes = (function() {
|
|||||||
node._def = def;
|
node._def = def;
|
||||||
if (n.type.substring(0,7) === "subflow") {
|
if (n.type.substring(0,7) === "subflow") {
|
||||||
var parentId = n.type.split(":")[1];
|
var parentId = n.type.split(":")[1];
|
||||||
var subflow = subflow_map[parentId]||getSubflow(parentId);
|
var subflow = subflow_blacklist[parentId]||subflow_map[parentId]||getSubflow(parentId);
|
||||||
if (createNewIds) {
|
if (createNewIds) {
|
||||||
parentId = subflow.id;
|
parentId = subflow.id;
|
||||||
node.type = "subflow:"+parentId;
|
node.type = "subflow:"+parentId;
|
||||||
|
Loading…
Reference in New Issue
Block a user