Fix the config node users count

This commit is contained in:
GogoVega 2024-06-26 19:10:55 +02:00
parent 1b5b3f7f88
commit cc1c87387b
No known key found for this signature in database
GPG Key ID: E1E048B63AC5AC2B
2 changed files with 51 additions and 25 deletions

View File

@ -706,7 +706,7 @@ RED.nodes = (function() {
} else {
if (n.wires && (n.wires.length > n.outputs)) { n.outputs = n.wires.length; }
n.dirty = true;
updateConfigNodeUsers(n);
updateConfigNodeUsers(newNode, { action: "add" });
if (n._def.category == "subflows" && typeof n.i === "undefined") {
var nextId = 0;
RED.nodes.eachNode(function(node) {
@ -779,6 +779,7 @@ RED.nodes = (function() {
delete nodeLinks[id];
removedLinks = links.filter(function(l) { return (l.source === node) || (l.target === node); });
removedLinks.forEach(removeLink);
updateConfigNodeUsers(node, { action: "remove" });
var updatedConfigNode = false;
for (var d in node._def.defaults) {
if (node._def.defaults.hasOwnProperty(d)) {
@ -792,10 +793,6 @@ RED.nodes = (function() {
if (configNode._def.exclusive) {
removeNode(node[d]);
removedNodes.push(configNode);
} else {
var users = configNode.users;
users.splice(users.indexOf(node),1);
RED.events.emit('nodes:change',configNode)
}
}
}
@ -1780,9 +1777,20 @@ RED.nodes = (function() {
// Replace config nodes
//
configNodeIds.forEach(function(id) {
removedNodes = removedNodes.concat(convertNode(getNode(id)));
const configNode = getNode(id);
const currentUserCount = configNode.users;
// Add a snapshot of the Config Node
removedNodes = removedNodes.concat(convertNode(configNode));
// Remove the Config Node instance
removeNode(id);
importNodes([newConfigNodes[id]])
// Import the new one
importNodes([newConfigNodes[id]]);
// Re-attributes the user count
getNode(id).users = currentUserCount;
});
return {
@ -2423,11 +2431,6 @@ RED.nodes = (function() {
nodeList = nodeList.map(function(id) {
var node = node_map[id];
if (node) {
if (node._def.category === 'config') {
if (node.users.indexOf(n) === -1) {
node.users.push(n);
}
}
return node.id;
}
return id;
@ -2648,19 +2651,44 @@ RED.nodes = (function() {
return result;
}
// Update any config nodes referenced by the provided node to ensure their 'users' list is correct
function updateConfigNodeUsers(n) {
for (var d in n._def.defaults) {
if (n._def.defaults.hasOwnProperty(d)) {
var property = n._def.defaults[d];
/**
* Update any config nodes referenced by the provided node to ensure
* their 'users' list is correct.
*
* Options:
* - `action` - Add or remove the node from the Config Node users list. Default `add`.
* - `emitEvent` - Emit the `nodes:changes` event. Default true.
*
* @param {object} node The node in which to check if it contains references
* @param {{ action?: "add" | "remove"; emitEvent?: boolean; }} options Options to apply.
*/
function updateConfigNodeUsers(node, options = {}) {
const defaultOptions = { action: "add", emitEvent: true };
options = Object.assign({}, defaultOptions, options);
for (var d in node._def.defaults) {
if (node._def.defaults.hasOwnProperty(d)) {
var property = node._def.defaults[d];
if (property.type) {
var type = registry.getNodeType(property.type);
if (type && type.category == "config") {
var configNode = configNodes[n[d]];
var configNode = configNodes[node[d]];
if (configNode) {
if (configNode.users.indexOf(n) === -1) {
configNode.users.push(n);
RED.events.emit('nodes:change',configNode)
if (options.action === "add") {
if (configNode.users.indexOf(node) === -1) {
configNode.users.push(node);
if (options.emitEvent) {
RED.events.emit('nodes:change', configNode);
}
}
} else if (options.action === "remove") {
if (configNode.users.indexOf(node) !== -1) {
const users = configNode.users;
users.splice(users.indexOf(node), 1);
if (options.emitEvent) {
RED.events.emit('nodes:change', configNode);
}
}
}
}
}

View File

@ -508,10 +508,8 @@ RED.subflow = (function() {
var activeSubflow = RED.nodes.subflow(id);
RED.nodes.eachNode(function(n) {
if (!keepInstanceNodes && n.type == "subflow:"+id) {
removedNodes.push(n);
}
if (n.z == id) {
if (n.z === id || (!keepInstanceNodes && n.type === "subflow:" + id)) {
RED.nodes.updateConfigNodeUsers(n, { action: "remove" });
removedNodes.push(n);
}
});