From fca77a868faed8189051f4cd2810fd995234a993 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 1 Mar 2017 15:01:07 +0000 Subject: [PATCH] Allow a node to declare settings that should be exported --- nodes/core/io/21-httprequest.js | 8 ++++++++ red/api/info.js | 2 ++ red/runtime/nodes/index.js | 9 +++++++-- red/runtime/settings.js | 22 ++++++++++++++++++++++ test/red/api/index_spec.js | 2 +- test/red/api/info_spec.js | 11 ++++++++--- 6 files changed, 48 insertions(+), 6 deletions(-) diff --git a/nodes/core/io/21-httprequest.js b/nodes/core/io/21-httprequest.js index d6d6f42de..873e3e98e 100644 --- a/nodes/core/io/21-httprequest.js +++ b/nodes/core/io/21-httprequest.js @@ -216,6 +216,14 @@ module.exports = function(RED) { credentials: { user: {type:"text"}, password: {type: "password"} + }, + settings: { + httpRequestColour: { + value: "red", + // validate: function(v) { return IT MUST BE A NUMBER }, + // required: false, + exportable: true + } } }); } diff --git a/red/api/info.js b/red/api/info.js index e2661bdc3..9953ec1a2 100644 --- a/red/api/info.js +++ b/red/api/info.js @@ -48,6 +48,8 @@ module.exports = { safeSettings.editorTheme.palette = safeSettings.editorTheme.palette || {}; safeSettings.editorTheme.palette.editable = false; } + + settings.exportNodeSettings(safeSettings); res.json(safeSettings); } diff --git a/red/runtime/nodes/index.js b/red/runtime/nodes/index.js index 4fd0d1128..5be548549 100644 --- a/red/runtime/nodes/index.js +++ b/red/runtime/nodes/index.js @@ -50,8 +50,13 @@ function registerType(nodeSet,type,constructor,opts) { type = nodeSet; nodeSet = ""; } - if (opts && opts.credentials) { - credentials.register(type,opts.credentials); + if (opts) { + if (opts.credentials) { + credentials.register(type,opts.credentials); + } + if (opts.settings) { + settings.registerNodeSettings(type,opts.settings); + } } registry.registerType(nodeSet,type,constructor); } diff --git a/red/runtime/settings.js b/red/runtime/settings.js index bbb1031fd..0f8d21d65 100644 --- a/red/runtime/settings.js +++ b/red/runtime/settings.js @@ -21,6 +21,7 @@ var log = require("./log"); var userSettings = null; var globalSettings = null; +var nodeSettings = null; var storage = null; var persistentSettings = { @@ -38,6 +39,7 @@ var persistentSettings = { } } globalSettings = null; + nodeSettings = {}; }, load: function(_storage) { storage = _storage; @@ -99,6 +101,26 @@ var persistentSettings = { userSettings = null; globalSettings = null; storage = null; + }, + registerNodeSettings: function(type, opts) { + //console.log(type,opts); + // 1. TODO: validate the option names are allowed for the node type + + // 2. store this information against the node type + nodeSettings[type] = opts; + + + // TODO: remove the node settings if the node is disabled/removed from runtime + }, + exportNodeSettings: function(safeSettings) { + // 1. forEach type in nodeSettings... + // 2. forEach setting for that type... + // 3. if globalSettings has a property with the required name... + // 4. set safeSettings.property to that value + // 5. else if the setting has a default 'value' provided + // 6. set safeSettings.property to that value + + return safeSettings; } } diff --git a/test/red/api/index_spec.js b/test/red/api/index_spec.js index 0b564da73..8edd737d6 100644 --- a/test/red/api/index_spec.js +++ b/test/red/api/index_spec.js @@ -29,7 +29,7 @@ describe("api index", function() { describe("disables editor", function() { before(function() { api.init({},{ - settings:{httpNodeRoot:true, httpAdminRoot: true,disableEditor:true}, + settings:{httpNodeRoot:true, httpAdminRoot: true,disableEditor:true, exportNodeSettings: function() {}}, events: {on:function(){},removeListener: function(){}}, log: {info:function(){},_:function(){}}, nodes: {paletteEditorEnabled: function(){return true}} diff --git a/test/red/api/info_spec.js b/test/red/api/info_spec.js index 70f477a35..c222aec5c 100644 --- a/test/red/api/info_spec.js +++ b/test/red/api/info_spec.js @@ -42,7 +42,10 @@ describe("info api", function() { foo: 123, httpNodeRoot: "testHttpNodeRoot", version: "testVersion", - paletteCategories :["red","blue","green"] + paletteCategories :["red","blue","green"], + exportNodeSettings: function(obj) { + obj.testNodeSetting = "helloWorld"; + } }, nodes: { paletteEditorEnabled: function() { return true; } @@ -59,7 +62,9 @@ describe("info api", function() { res.body.should.have.property("version","testVersion"); res.body.should.have.property("paletteCategories",["red","blue","green"]); res.body.should.have.property("editorTheme",{test:456}); + res.body.should.have.property("testNodeSetting","helloWorld"); res.body.should.not.have.property("foo",123); + done(); }); }); @@ -68,8 +73,8 @@ describe("info api", function() { settings: { httpNodeRoot: "testHttpNodeRoot", version: "testVersion", - paletteCategories :["red","blue","green"] - + paletteCategories :["red","blue","green"], + exportNodeSettings: function() {} }, nodes: { paletteEditorEnabled: function() { return false; }