From efecfa328bcee4a0af3f48a0422e202e7de9747a Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 3 Jun 2020 14:23:26 +0100 Subject: [PATCH] Fix up event handling when deleting groups and tabs --- .../@node-red/editor-client/src/js/history.js | 29 +++++++++--- .../@node-red/editor-client/src/js/nodes.js | 42 +++++++++++------ .../src/js/ui/tab-info-outliner.js | 15 +++--- .../@node-red/editor-client/src/js/ui/view.js | 47 ++++++++++++------- 4 files changed, 86 insertions(+), 47 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/history.js b/packages/node_modules/@node-red/editor-client/src/js/history.js index ff4a75a1b..9fcfe30f9 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/history.js +++ b/packages/node_modules/@node-red/editor-client/src/js/history.js @@ -66,6 +66,14 @@ RED.history = (function() { } inverseEv.nodes.push(node); RED.nodes.remove(ev.nodes[i]); + if (node.g) { + var group = RED.nodes.group(node.g); + var index = group.nodes.indexOf(node); + if (index !== -1) { + group.nodes.splice(index,1); + RED.group.markDirty(group); + } + } } } if (ev.links) { @@ -80,7 +88,9 @@ RED.history = (function() { for (i=0;i=0; i--) { + removeGroup(removedGroups[i]); + } RED.events.emit('flows:remove',ws); } - return {nodes:removedNodes,links:removedLinks, groups: removedGroups}; } @@ -1562,7 +1572,9 @@ RED.nodes = (function() { function removeGroup(group) { var i = groupsByZ[group.z].indexOf(group); groupsByZ[group.z].splice(i,1); - + if (groupsByZ[group.z].length === 0) { + delete groupsByZ[group.z]; + } if (group.g) { if (groups[group.g]) { var index = groups[group.g].nodes.indexOf(group); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info-outliner.js b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info-outliner.js index 7b3ab2c9f..eb0caf810 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info-outliner.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info-outliner.js @@ -387,19 +387,16 @@ RED.sidebar.info.outliner = (function() { var existingObject = objects[n.id]; existingObject.treeList.remove(); delete objects[n.id] + + // If this is a group being removed, it may have an empty item + if (empties[n.id]) { + delete empties[n.id]; + } + var parent = existingObject.parent; if (parent.children.length === 0) { parent.treeList.addChild(getEmptyItem(parent.id)); } - // if (existingObject.children && (existingObject.children.length > 0)) { - // existingObject.children.forEach(function (nc) { - // if (!nc.empty) { - // var childObject = objects[nc.id]; - // nc.parent = parent; - // objects[parent.id].treeList.addChild(childObject); - // } - // }); - // } } function getGutter(n) { var span = $("",{class:"red-ui-info-outline-gutter"}); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 7f541204e..6dee10bd7 100755 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -1929,6 +1929,7 @@ if (DEBUG_EVENTS) { console.warn("clearSelection", mouse_mode); } redraw(); } else if (moving_set.length > 0 || selected_link != null) { var result; + var node; var removedNodes = []; var removedLinks = []; var removedGroups = []; @@ -1941,12 +1942,25 @@ if (DEBUG_EVENTS) { console.warn("clearSelection", mouse_mode); } var startChanged = false; var selectedGroups = []; if (moving_set.length > 0) { + for (var i=0;i 0) { - var g = selectedGroups.shift(); - if (removedGroups.indexOf(g) === -1) { - removedGroups.push(g); - g.nodes.forEach(function(n) { - if (n.type === "group") { - selectedGroups.push(n); - } - }) - RED.nodes.removeGroup(g); - } + + // Groups must be removed in the right order - from inner-most + // to outermost. + for (i = selectedGroups.length-1; i>=0; i--) { + var g = selectedGroups[i]; + removedGroups.push(g); + RED.nodes.removeGroup(g); } if (removedSubflowOutputs.length > 0) { result = RED.subflow.removeOutput(removedSubflowOutputs);