From 2ec26dc31d0cc6d43d08e5debb200f656a589dbb Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Fri, 27 Mar 2026 11:47:24 +0000 Subject: [PATCH 1/4] allow node defaults to be overridden by settings and add commented example to blank settings file --- .../@node-red/editor-client/src/js/nodes.js | 26 +++++++++++++------ .../@node-red/runtime/lib/api/settings.js | 4 +++ packages/node_modules/node-red/settings.js | 17 ++++++++++-- 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/nodes.js b/packages/node_modules/@node-red/editor-client/src/js/nodes.js index 4a114560b..d605c46f9 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/nodes.js +++ b/packages/node_modules/@node-red/editor-client/src/js/nodes.js @@ -293,6 +293,16 @@ RED.nodes = (function() { } } } + + // override node defaults with any values from settings.js + const over = RED.settings?.nodeDefaults?.[def.type] + if (over) { + for (var prop in over) { + if (over.hasOwnProperty(prop) && def.defaults.hasOwnProperty(prop)) { + def.defaults[prop].value = over[prop]; + } + } + } } @@ -406,9 +416,9 @@ RED.nodes = (function() { }, /** * Add an object to our dirty/clean tracking state - * @param {String} z - * @param {String} id - * @param {Boolean} isDirty + * @param {String} z + * @param {String} id + * @param {Boolean} isDirty */ addObjectToWorkspace: function (z, id, isDirty) { if (isDirty) { @@ -421,8 +431,8 @@ RED.nodes = (function() { }, /** * Remove an object from our dirty/clean tracking state - * @param {String} z - * @param {String} id + * @param {String} z + * @param {String} id */ removeObjectFromWorkspace: function (z, id) { if (!addedDirtyObjects.has(id)) { @@ -444,7 +454,7 @@ RED.nodes = (function() { api.addNode(n) }, /** - * @param {array} nodes + * @param {array} nodes * @param {boolean} direction true:forwards false:back * @param {boolean} singleStep true:single-step false:all-the-way */ @@ -2117,7 +2127,7 @@ RED.nodes = (function() { $("
  • ").text(t).appendTo(typeList); }) typeList = typeList[0].outerHTML; - + unknownNotification = RED.notify( "

    "+RED._("clipboard.importUnrecognised",{count:unknownTypes.length})+"

    "+typeList, notificationOptions @@ -2358,7 +2368,7 @@ RED.nodes = (function() { // We need to sort new_nodes (which only contains config nodes at this point) // to ensure they get added in the right order. If NodeA depends on NodeB, then // NodeB must be added first. - + // Limit us to 5 full iterations of the list - this should be more than // enough to process the list as config->config node relationships are // not very common diff --git a/packages/node_modules/@node-red/runtime/lib/api/settings.js b/packages/node_modules/@node-red/runtime/lib/api/settings.js index 634f5dbf3..e30c0a6a7 100644 --- a/packages/node_modules/@node-red/runtime/lib/api/settings.js +++ b/packages/node_modules/@node-red/runtime/lib/api/settings.js @@ -172,6 +172,10 @@ var api = module.exports = { safeSettings.runtimeState.ui = false; // cannot have UI without endpoint } + if (runtime.settings.nodeDefaults) { + safeSettings.nodeDefaults = runtime.settings.nodeDefaults; + } + runtime.settings.exportNodeSettings(safeSettings); runtime.plugins.exportPluginSettings(safeSettings); } diff --git a/packages/node_modules/node-red/settings.js b/packages/node_modules/node-red/settings.js index 269cac160..76638cfe9 100644 --- a/packages/node_modules/node-red/settings.js +++ b/packages/node_modules/node-red/settings.js @@ -313,10 +313,10 @@ module.exports = { ui: false, }, telemetry: { - /** + /** * By default, telemetry is disabled until the user provides consent the first * time they open the editor. - * + * * The following property can be uncommented and set to true/false to enable/disable * telemetry without seeking further consent in the editor. * The user can override this setting via the user settings dialog within the editor @@ -620,4 +620,17 @@ module.exports = { // * - reason: if result is false, the HTTP reason string to return // */ //}, + +/******************************************************************************* + * Node Default Overrides + * - allows the user to override node default values + * the node type and properties can be found by looking at the info tab + * of an existing node. +******************************************************************************* + // nodeDefaults: { + // "debug": { + // "complete": true // set the debug node to show complete msg by default + // } + // } + } From b77a5299242284689785f6494f5b771f44b7a558 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Fri, 27 Mar 2026 15:02:39 +0000 Subject: [PATCH 2/4] change var to let --- packages/node_modules/@node-red/editor-client/src/js/nodes.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/nodes.js b/packages/node_modules/@node-red/editor-client/src/js/nodes.js index d605c46f9..d7f5a96b1 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/nodes.js +++ b/packages/node_modules/@node-red/editor-client/src/js/nodes.js @@ -297,7 +297,7 @@ RED.nodes = (function() { // override node defaults with any values from settings.js const over = RED.settings?.nodeDefaults?.[def.type] if (over) { - for (var prop in over) { + for (let prop in over) { if (over.hasOwnProperty(prop) && def.defaults.hasOwnProperty(prop)) { def.defaults[prop].value = over[prop]; } From 8a9b35a33bfe201eda318be3935446ecc580c0d1 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 30 Mar 2026 16:43:56 +0100 Subject: [PATCH 3/4] Log when applying default overrides --- .../@node-red/editor-client/src/js/nodes.js | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/nodes.js b/packages/node_modules/@node-red/editor-client/src/js/nodes.js index d7f5a96b1..7608ff1e4 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/nodes.js +++ b/packages/node_modules/@node-red/editor-client/src/js/nodes.js @@ -277,7 +277,7 @@ RED.nodes = (function() { nodeDefinitions[nt] = def; if (def.defaults) { - for (var d in def.defaults) { + for (let d in def.defaults) { if (def.defaults.hasOwnProperty(d)) { if (def.defaults[d].type) { try { @@ -286,26 +286,20 @@ RED.nodes = (function() { console.warn(err); } } - if (internalProperties.includes(d)) { console.warn(`registerType: ${nt}: the property "${d}" is internal and cannot be used.`); delete def.defaults[d]; } - } - } - - // override node defaults with any values from settings.js - const over = RED.settings?.nodeDefaults?.[def.type] - if (over) { - for (let prop in over) { - if (over.hasOwnProperty(prop) && def.defaults.hasOwnProperty(prop)) { - def.defaults[prop].value = over[prop]; + const settingOverride = RED.settings?.nodeDefaults?.[def.type]?.[d] + if (settingOverride !== undefined) { + console.log(`Applying node default override for ${def.type}.${d}:`, settingOverride); + def.defaults[d]._override = true; + def.defaults[d]._originalValue = def.defaults[d].value; + def.defaults[d].value = settingOverride; } } } } - - RED.events.emit("registry:node-type-added",nt); }, removeNodeType: function(nt) { From 83c4e17a6812826a057303e597b00d140599c3de Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 30 Mar 2026 16:55:42 +0100 Subject: [PATCH 4/4] Update settings example --- packages/node_modules/node-red/settings.js | 24 ++++++++++++++-------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/packages/node_modules/node-red/settings.js b/packages/node_modules/node-red/settings.js index 76638cfe9..2faecc47b 100644 --- a/packages/node_modules/node-red/settings.js +++ b/packages/node_modules/node-red/settings.js @@ -623,14 +623,20 @@ module.exports = { /******************************************************************************* * Node Default Overrides - * - allows the user to override node default values - * the node type and properties can be found by looking at the info tab - * of an existing node. -******************************************************************************* - // nodeDefaults: { - // "debug": { - // "complete": true // set the debug node to show complete msg by default - // } - // } + * + * This allows the user to override default values of a node. These are the values + * that are applied when a node is added to the workspace. They do not affect + * nodes that have already been deployed. + * + * The available properties of a node type can be found in the Information sidebar when + * selecting a node of that type. + * + * + *******************************************************************************/ + // nodeDefaults: { + // "debug": { + // "complete": true // set the debug node to show complete msg by default + // } + // } }