mirror of
https://github.com/node-red/node-red.git
synced 2023-10-10 13:36:53 +02:00
[groups] Support undo of convert to subflow from inside group
This commit is contained in:
parent
a8bc753720
commit
9b2e9ec41a
@ -279,7 +279,7 @@ RED.history = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ev.addToGroup) {
|
if (ev.addToGroup) {
|
||||||
RED.group.removeFromGroup(ev.addToGroup,ev.nodes.map(function(n) { return n.n }));
|
RED.group.removeFromGroup(ev.addToGroup,ev.nodes.map(function(n) { return n.n }),true);
|
||||||
inverseEv.removeFromGroup = ev.addToGroup;
|
inverseEv.removeFromGroup = ev.addToGroup;
|
||||||
} else if (ev.removeFromGroup) {
|
} else if (ev.removeFromGroup) {
|
||||||
RED.group.addToGroup(ev.removeFromGroup,ev.nodes.map(function(n) { return n.n }));
|
RED.group.addToGroup(ev.removeFromGroup,ev.nodes.map(function(n) { return n.n }));
|
||||||
@ -438,6 +438,9 @@ RED.history = (function() {
|
|||||||
if (ev.subflow) {
|
if (ev.subflow) {
|
||||||
RED.nodes.addSubflow(ev.subflow.subflow);
|
RED.nodes.addSubflow(ev.subflow.subflow);
|
||||||
inverseEv.subflow = ev.subflow;
|
inverseEv.subflow = ev.subflow;
|
||||||
|
if (ev.subflow.subflow.g) {
|
||||||
|
RED.group.addToGroup(RED.nodes.group(ev.subflow.subflow.g),ev.subflow.subflow);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (ev.subflows) {
|
if (ev.subflows) {
|
||||||
inverseEv.nodes = [];
|
inverseEv.nodes = [];
|
||||||
@ -465,7 +468,7 @@ RED.history = (function() {
|
|||||||
RED.nodes.addLink(ev.links[i]);
|
RED.nodes.addLink(ev.links[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ev.createdLinks) {
|
if (ev.createdLinks) {
|
||||||
inverseEv.removedLinks = [];
|
inverseEv.removedLinks = [];
|
||||||
for (i=0;i<ev.createdLinks.length;i++) {
|
for (i=0;i<ev.createdLinks.length;i++) {
|
||||||
inverseEv.removedLinks.push(ev.createdLinks[i]);
|
inverseEv.removedLinks.push(ev.createdLinks[i]);
|
||||||
@ -512,17 +515,19 @@ RED.history = (function() {
|
|||||||
t: "removeFromGroup",
|
t: "removeFromGroup",
|
||||||
dirty: RED.nodes.dirty(),
|
dirty: RED.nodes.dirty(),
|
||||||
group: ev.group,
|
group: ev.group,
|
||||||
nodes: ev.nodes
|
nodes: ev.nodes,
|
||||||
|
reparent: ev.reparent
|
||||||
}
|
}
|
||||||
if (ev.nodes) {
|
if (ev.nodes) {
|
||||||
RED.group.removeFromGroup(ev.group,ev.nodes);
|
RED.group.removeFromGroup(ev.group,ev.nodes,(ev.hasOwnProperty('reparent')&&ev.hasOwnProperty('reparent')!==undefined)?ev.reparent:true);
|
||||||
}
|
}
|
||||||
} else if (ev.t == "removeFromGroup") {
|
} else if (ev.t == "removeFromGroup") {
|
||||||
inverseEv = {
|
inverseEv = {
|
||||||
t: "addToGroup",
|
t: "addToGroup",
|
||||||
dirty: RED.nodes.dirty(),
|
dirty: RED.nodes.dirty(),
|
||||||
group: ev.group,
|
group: ev.group,
|
||||||
nodes: ev.nodes
|
nodes: ev.nodes,
|
||||||
|
reparent: ev.reparent
|
||||||
}
|
}
|
||||||
if (ev.nodes) {
|
if (ev.nodes) {
|
||||||
RED.group.addToGroup(ev.group,ev.nodes);
|
RED.group.addToGroup(ev.group,ev.nodes);
|
||||||
|
@ -1634,7 +1634,7 @@ RED.nodes = (function() {
|
|||||||
addGroup: addGroup,
|
addGroup: addGroup,
|
||||||
removeGroup: removeGroup,
|
removeGroup: removeGroup,
|
||||||
group: function(id) { return groups[id] },
|
group: function(id) { return groups[id] },
|
||||||
groups: function(z) { return groupsByZ[z] },
|
groups: function(z) { return groupsByZ[z]||[] },
|
||||||
|
|
||||||
eachNode: function(cb) {
|
eachNode: function(cb) {
|
||||||
for (var n=0;n<nodes.length;n++) {
|
for (var n=0;n<nodes.length;n++) {
|
||||||
|
@ -61,9 +61,9 @@ RED.group = (function() {
|
|||||||
|
|
||||||
RED.events.on("view:selection-changed",function(selection) {
|
RED.events.on("view:selection-changed",function(selection) {
|
||||||
RED.menu.setDisabled("menu-item-group-group",!!!selection.nodes);
|
RED.menu.setDisabled("menu-item-group-group",!!!selection.nodes);
|
||||||
RED.menu.setDisabled("menu-item-group-ungroup",!!!selection.groups);
|
RED.menu.setDisabled("menu-item-group-ungroup",!!!selection.nodes || selection.nodes.filter(function(n) { return n.type==='group'}).length === 0);
|
||||||
RED.menu.setDisabled("menu-item-group-merge",!!!selection.nodes);
|
RED.menu.setDisabled("menu-item-group-merge",!!!selection.nodes);
|
||||||
RED.menu.setDisabled("menu-item-group-remove",!!!selection.groups);
|
RED.menu.setDisabled("menu-item-group-remove",!!!selection.nodes || selection.nodes.filter(function(n) { return !!n.g }).length === 0);
|
||||||
});
|
});
|
||||||
|
|
||||||
RED.actions.add("core:group-selection", function() { groupSelection() })
|
RED.actions.add("core:group-selection", function() { groupSelection() })
|
||||||
@ -202,7 +202,7 @@ RED.group = (function() {
|
|||||||
var parentGroup = RED.nodes.group(selection.nodes[0].g);
|
var parentGroup = RED.nodes.group(selection.nodes[0].g);
|
||||||
if (parentGroup) {
|
if (parentGroup) {
|
||||||
try {
|
try {
|
||||||
removeFromGroup(parentGroup,selection.nodes);
|
removeFromGroup(parentGroup,selection.nodes,true);
|
||||||
var historyEvent = {
|
var historyEvent = {
|
||||||
t: "removeFromGroup",
|
t: "removeFromGroup",
|
||||||
dirty: RED.nodes.dirty(),
|
dirty: RED.nodes.dirty(),
|
||||||
@ -306,7 +306,7 @@ RED.group = (function() {
|
|||||||
group.h = Math.max(group.h,n.y+n.h/2+25-group.y);
|
group.h = Math.max(group.h,n.y+n.h/2+25-group.y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function removeFromGroup(group, nodes) {
|
function removeFromGroup(group, nodes, reparent) {
|
||||||
if (!Array.isArray(nodes)) {
|
if (!Array.isArray(nodes)) {
|
||||||
nodes = [nodes];
|
nodes = [nodes];
|
||||||
}
|
}
|
||||||
@ -319,7 +319,6 @@ RED.group = (function() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var parentGroup = RED.nodes.group(group.g);
|
var parentGroup = RED.nodes.group(group.g);
|
||||||
for (var i=0; i<nodes.length; i++) {
|
for (var i=0; i<nodes.length; i++) {
|
||||||
n = nodes[i];
|
n = nodes[i];
|
||||||
@ -327,13 +326,14 @@ RED.group = (function() {
|
|||||||
var index = group.nodes.indexOf(n);
|
var index = group.nodes.indexOf(n);
|
||||||
group.nodes.splice(index,1);
|
group.nodes.splice(index,1);
|
||||||
group.dirty = true;
|
group.dirty = true;
|
||||||
if (group.g) {
|
if (reparent && group.g) {
|
||||||
n.g = group.g
|
n.g = group.g
|
||||||
parentGroup.nodes.push(n);
|
parentGroup.nodes.push(n);
|
||||||
parentGroup.dirty = true;
|
parentGroup.dirty = true;
|
||||||
} else {
|
} else {
|
||||||
delete n.g;
|
delete n.g;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -569,9 +569,11 @@ RED.subflow = (function() {
|
|||||||
var i,n;
|
var i,n;
|
||||||
var nodeList = new Set();
|
var nodeList = new Set();
|
||||||
var tmplist = selection.nodes.slice();
|
var tmplist = selection.nodes.slice();
|
||||||
|
var includedGroups = new Set();
|
||||||
while(tmplist.length > 0) {
|
while(tmplist.length > 0) {
|
||||||
n = tmplist.shift();
|
n = tmplist.shift();
|
||||||
if (n.type === "group") {
|
if (n.type === "group") {
|
||||||
|
includedGroups.add(n.id);
|
||||||
tmplist = tmplist.concat(n.nodes);
|
tmplist = tmplist.concat(n.nodes);
|
||||||
}
|
}
|
||||||
nodeList.add(n);
|
nodeList.add(n);
|
||||||
@ -579,7 +581,20 @@ RED.subflow = (function() {
|
|||||||
|
|
||||||
nodeList = Array.from(nodeList);
|
nodeList = Array.from(nodeList);
|
||||||
|
|
||||||
|
var containingGroup = nodeList[0].g;
|
||||||
|
var nodesMovedFromGroup = [];
|
||||||
|
|
||||||
|
for (i=0; i<nodeList.length;i++) {
|
||||||
|
if (nodeList[i].g && !includedGroups.has(nodeList[i].g)) {
|
||||||
|
if (containingGroup !== nodeList[i].g) {
|
||||||
|
RED.notify("Cannot create subflow across multiple groups","error");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (containingGroup) {
|
||||||
|
containingGroup = RED.nodes.group(containingGroup);
|
||||||
|
}
|
||||||
var nodes = {};
|
var nodes = {};
|
||||||
var new_links = [];
|
var new_links = [];
|
||||||
var removedLinks = [];
|
var removedLinks = [];
|
||||||
@ -703,6 +718,20 @@ RED.subflow = (function() {
|
|||||||
RED.editor.validateNode(subflowInstance);
|
RED.editor.validateNode(subflowInstance);
|
||||||
RED.nodes.add(subflowInstance);
|
RED.nodes.add(subflowInstance);
|
||||||
|
|
||||||
|
if (containingGroup) {
|
||||||
|
RED.group.addToGroup(containingGroup, subflowInstance);
|
||||||
|
nodeList.forEach(function(nl) {
|
||||||
|
if (nl.g === containingGroup.id) {
|
||||||
|
delete nl.g;
|
||||||
|
var index = containingGroup.nodes.indexOf(nl);
|
||||||
|
containingGroup.nodes.splice(index,1);
|
||||||
|
nodesMovedFromGroup.push(nl);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
containingGroup.dirty = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
candidateInputs.forEach(function(l) {
|
candidateInputs.forEach(function(l) {
|
||||||
var link = {source:l.source, sourcePort:l.sourcePort, target: subflowInstance};
|
var link = {source:l.source, sourcePort:l.sourcePort, target: subflowInstance};
|
||||||
new_links.push(link);
|
new_links.push(link);
|
||||||
@ -758,7 +787,8 @@ RED.subflow = (function() {
|
|||||||
RED.nodes.moveNodeToTab(n, subflow.id);
|
RED.nodes.moveNodeToTab(n, subflow.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
RED.history.push({
|
|
||||||
|
var historyEvent = {
|
||||||
t:'createSubflow',
|
t:'createSubflow',
|
||||||
nodes:[subflowInstance.id],
|
nodes:[subflowInstance.id],
|
||||||
links:new_links,
|
links:new_links,
|
||||||
@ -772,11 +802,29 @@ RED.subflow = (function() {
|
|||||||
removedLinks: removedLinks,
|
removedLinks: removedLinks,
|
||||||
|
|
||||||
dirty:RED.nodes.dirty()
|
dirty:RED.nodes.dirty()
|
||||||
});
|
}
|
||||||
RED.view.select(null);
|
if (containingGroup) {
|
||||||
|
historyEvent = {
|
||||||
|
t:'multi',
|
||||||
|
events: [ historyEvent ]
|
||||||
|
}
|
||||||
|
historyEvent.events.push({
|
||||||
|
t:'addToGroup',
|
||||||
|
group: containingGroup,
|
||||||
|
nodes: [subflowInstance]
|
||||||
|
})
|
||||||
|
historyEvent.events.push({
|
||||||
|
t:'removeFromGroup',
|
||||||
|
group: containingGroup,
|
||||||
|
nodes: nodesMovedFromGroup,
|
||||||
|
reparent: false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
RED.history.push(historyEvent);
|
||||||
RED.editor.validateNode(subflow);
|
RED.editor.validateNode(subflow);
|
||||||
RED.nodes.dirty(true);
|
RED.nodes.dirty(true);
|
||||||
RED.view.redraw(true);
|
RED.view.updateActive();
|
||||||
|
RED.view.select(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -4467,7 +4467,7 @@ if (DEBUG_EVENTS) { console.warn("nodeMouseDown", mouse_mode,d); }
|
|||||||
mouse_mode = state;
|
mouse_mode = state;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
updateActive: updateActiveNodes,
|
||||||
redraw: function(updateActive) {
|
redraw: function(updateActive) {
|
||||||
if (updateActive) {
|
if (updateActive) {
|
||||||
updateActiveNodes();
|
updateActiveNodes();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user