diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/group.js b/packages/node_modules/@node-red/editor-client/src/js/ui/group.js index bfc73f098..22deb3f32 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/group.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/group.js @@ -61,6 +61,8 @@ RED.group = (function() { RED.actions.add("core:group-selection", function() { groupSelection() }) RED.actions.add("core:ungroup-selection", function() { ungroupSelection() }) + RED.actions.add("core:merge-selection-to-group", function() { mergeSelection() }) + RED.actions.add("core:remove-selection-from-group", function() { removeSelection() }) $(_groupEditTemplate).appendTo("#red-ui-editor-node-configs"); @@ -81,24 +83,110 @@ RED.group = (function() { var newSelection = []; groups = selection.nodes.filter(function(n) { return n.type === "group" }); groups.forEach(function(g) { - var parentGroup = RED.nodes.group(g.g); - if (parentGroup) { - var index = parentGroup.nodes.indexOf(g); - parentGroup.nodes.splice(index,1); + newSelection = newSelection.concat(ungroup(g)) + }) + RED.view.select({nodes:newSelection}) + } + } + + function ungroup(g) { + var nodes = []; + var parentGroup = RED.nodes.group(g.g); + if (parentGroup) { + var index = parentGroup.nodes.indexOf(g); + parentGroup.nodes.splice(index,1); + } + g.nodes.forEach(function(n) { + nodes.push(n); + if (parentGroup) { + // Move nodes to parent group + n.g = parentGroup.id; + parentGroup.nodes.push(n); + parentGroup.dirty = true; + n.dirty = true; + } else { + delete n.g; + } + }) + RED.nodes.removeGroup(g); + return nodes; + } + + function mergeSelection() { + // TODO: this currently creates an entirely new group. Need to merge properties + // of any existing group + var selection = RED.view.selection(); + if (selection.nodes) { + var nodes = []; + var n; + var parentGroup; + // First pass, check they are all in the same parent + // TODO: DRY mergeSelection,removeSelection,... + for (var i=0; i 0) { if (selectedGroups.length === 1 && selectedGroups[0].active) { // Let nodes be nodes