mirror of
				https://github.com/node-red/node-red.git
				synced 2025-03-01 10:36:34 +00:00 
			
		
		
		
	Fix up event handling when deleting groups and tabs
This commit is contained in:
		@@ -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<ev.groups.length;i++) {
 | 
			
		||||
                        group = ev.groups[i];
 | 
			
		||||
                        modifiedTabs[group.z] = true;
 | 
			
		||||
                        inverseEv.groups.push(group);
 | 
			
		||||
                        // The order of groups is important
 | 
			
		||||
                        //  - to invert the action, the order is reversed
 | 
			
		||||
                        inverseEv.groups.unshift(group);
 | 
			
		||||
                        RED.nodes.removeGroup(group);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
@@ -205,13 +215,20 @@ RED.history = (function() {
 | 
			
		||||
                }
 | 
			
		||||
                if (ev.groups) {
 | 
			
		||||
                    inverseEv.groups = [];
 | 
			
		||||
                    var groupsToAdd = new Set(ev.groups.map(function(g) { return g.id }));
 | 
			
		||||
                    var groupsToAdd = {};
 | 
			
		||||
                    ev.groups.forEach(function(g) { groupsToAdd[g.id] = g; });
 | 
			
		||||
                    for (i=0;i<ev.groups.length;i++) {
 | 
			
		||||
                        RED.nodes.addGroup(ev.groups[i])
 | 
			
		||||
                        modifiedTabs[ev.groups[i].z] = true;
 | 
			
		||||
                        inverseEv.groups.push(ev.groups[i]);
 | 
			
		||||
                        if (ev.groups[i].g && !groupsToAdd.has(ev.groups[i].g)) {
 | 
			
		||||
                            group = RED.nodes.group(ev.groups[i].g);
 | 
			
		||||
                        // The order of groups is important
 | 
			
		||||
                        //  - to invert the action, the order is reversed
 | 
			
		||||
                        inverseEv.groups.unshift(ev.groups[i]);
 | 
			
		||||
                        if (ev.groups[i].g) {
 | 
			
		||||
                            if (!groupsToAdd[ev.groups[i].g]) {
 | 
			
		||||
                                group = RED.nodes.group(ev.groups[i].g);
 | 
			
		||||
                            } else {
 | 
			
		||||
                                group = groupsToAdd[ev.groups[i].g];
 | 
			
		||||
                            }
 | 
			
		||||
                            if (group.nodes.indexOf(ev.groups[i]) === -1) {
 | 
			
		||||
                                group.nodes.push(ev.groups[i]);
 | 
			
		||||
                            }
 | 
			
		||||
@@ -297,7 +314,7 @@ RED.history = (function() {
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                if (ev.addToGroup) {
 | 
			
		||||
                    RED.group.removeFromGroup(ev.addToGroup,ev.nodes.map(function(n) { return n.n }),true);
 | 
			
		||||
                    RED.group.removeFromGroup(ev.addToGroup,ev.nodes.map(function(n) { return n.n }),false);
 | 
			
		||||
                    inverseEv.removeFromGroup = ev.addToGroup;
 | 
			
		||||
                } else if (ev.removeFromGroup) {
 | 
			
		||||
                    RED.group.addToGroup(ev.removeFromGroup,ev.nodes.map(function(n) { return n.n }));
 | 
			
		||||
 
 | 
			
		||||
@@ -364,35 +364,45 @@ RED.nodes = (function() {
 | 
			
		||||
            delete workspaces[id];
 | 
			
		||||
            delete nodeTabMap[id];
 | 
			
		||||
            workspacesOrder.splice(workspacesOrder.indexOf(id),1);
 | 
			
		||||
            var n;
 | 
			
		||||
            var i;
 | 
			
		||||
            var node;
 | 
			
		||||
            for (n=0;n<nodes.length;n++) {
 | 
			
		||||
                node = nodes[n];
 | 
			
		||||
            for (i=0;i<nodes.length;i++) {
 | 
			
		||||
                node = nodes[i];
 | 
			
		||||
                if (node.z == id) {
 | 
			
		||||
                    removedNodes.push(node);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            for(n in configNodes) {
 | 
			
		||||
                if (configNodes.hasOwnProperty(n)) {
 | 
			
		||||
                    node = configNodes[n];
 | 
			
		||||
            for(i in configNodes) {
 | 
			
		||||
                if (configNodes.hasOwnProperty(i)) {
 | 
			
		||||
                    node = configNodes[i];
 | 
			
		||||
                    if (node.z == id) {
 | 
			
		||||
                        removedNodes.push(node);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            removedGroups = groupsByZ[id] || [];
 | 
			
		||||
            removedGroups.forEach(function(g) {
 | 
			
		||||
                delete groups[g.id]
 | 
			
		||||
            })
 | 
			
		||||
            delete groupsByZ[id];
 | 
			
		||||
 | 
			
		||||
            for (n=0;n<removedNodes.length;n++) {
 | 
			
		||||
                var result = removeNode(removedNodes[n].id);
 | 
			
		||||
            for (i=0;i<removedNodes.length;i++) {
 | 
			
		||||
                var result = removeNode(removedNodes[i].id);
 | 
			
		||||
                removedLinks = removedLinks.concat(result.links);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Must get 'removedGroups' in the right order.
 | 
			
		||||
            //  - start with the top-most groups
 | 
			
		||||
            //  - then recurse into them
 | 
			
		||||
            removedGroups = (groupsByZ[id] || []).filter(function(g) { return !g.g; });
 | 
			
		||||
            for (i=0;i<removedGroups.length;i++) {
 | 
			
		||||
                removedGroups[i].nodes.forEach(function(n) {
 | 
			
		||||
                    if (n.type === "group") {
 | 
			
		||||
                        removedGroups.push(n);
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
            // Now remove them in the reverse order
 | 
			
		||||
            for (i=removedGroups.length-1; 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);
 | 
			
		||||
 
 | 
			
		||||
@@ -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 = $("<span>",{class:"red-ui-info-outline-gutter"});
 | 
			
		||||
 
 | 
			
		||||
@@ -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<moving_set.length;i++) {
 | 
			
		||||
                    var node = moving_set[i].n;
 | 
			
		||||
                    node.selected = false;
 | 
			
		||||
                    node = moving_set[i].n;
 | 
			
		||||
                    if (node.type === "group") {
 | 
			
		||||
                        selectedGroups.push(node);
 | 
			
		||||
                    } else if (node.type != "subflow") {
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                // Make sure we have identified all groups about to be deleted
 | 
			
		||||
                for (i=0;i<selectedGroups.length;i++) {
 | 
			
		||||
                    selectedGroups[i].nodes.forEach(function(n) {
 | 
			
		||||
                        if (n.type === "group" && selectedGroups.indexOf(n) === -1) {
 | 
			
		||||
                            selectedGroups.push(n);
 | 
			
		||||
                        }
 | 
			
		||||
                    })
 | 
			
		||||
                }
 | 
			
		||||
                for (var i=0;i<moving_set.length;i++) {
 | 
			
		||||
                    node = moving_set[i].n;
 | 
			
		||||
                    node.selected = false;
 | 
			
		||||
                    if (node.type !== "group" && node.type !== "subflow") {
 | 
			
		||||
                        if (node.x < 0) {
 | 
			
		||||
                            node.x = 25
 | 
			
		||||
                        }
 | 
			
		||||
@@ -1956,9 +1970,12 @@ if (DEBUG_EVENTS) { console.warn("clearSelection", mouse_mode); }
 | 
			
		||||
                        removedLinks = removedLinks.concat(removedEntities.links);
 | 
			
		||||
                        if (node.g) {
 | 
			
		||||
                            var group = RED.nodes.group(node.g);
 | 
			
		||||
                            if ((!group.selected || group.active) && (selectedGroups.indexOf(group) < 0)) {
 | 
			
		||||
                                RED.group.removeFromGroup(group,node);
 | 
			
		||||
                                node.g = group.id;
 | 
			
		||||
                            if (selectedGroups.indexOf(group) === -1) {
 | 
			
		||||
                                // Don't use RED.group.removeFromGroup as that emits
 | 
			
		||||
                                // a change event on the node - but we're deleting it
 | 
			
		||||
                                var index = group.nodes.indexOf(node);
 | 
			
		||||
                                group.nodes.splice(index,1);
 | 
			
		||||
                                RED.group.markDirty(group);
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    } else {
 | 
			
		||||
@@ -1972,17 +1989,13 @@ if (DEBUG_EVENTS) { console.warn("clearSelection", mouse_mode); }
 | 
			
		||||
                        node.dirty = true;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                while (selectedGroups.length > 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);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user