From f23d0480e4bb30c09e1881ce7545159ee8453fca Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Fri, 4 Nov 2022 18:42:51 +0900 Subject: [PATCH 01/18] add global environment variable feature --- Gruntfile.js | 1 + .../editor-client/locales/en-US/editor.json | 5 + .../editor-client/locales/ja/editor.json | 5 + .../@node-red/editor-client/src/js/red.js | 1 + .../editor-client/src/js/ui/deploy.js | 2 +- .../editor-client/src/js/ui/env-var.js | 190 ++++++++++++++++++ .../@node-red/editor-client/src/js/ui/view.js | 63 +++++- .../nodes/core/common/91-global-config.html | 19 ++ .../nodes/core/common/91-global-config.js | 7 + .../en-US/common/91-global-config.html | 19 ++ .../nodes/locales/en-US/messages.json | 3 + .../locales/ja/common/91-global-config.html | 19 ++ .../@node-red/nodes/locales/ja/messages.json | 3 + .../@node-red/runtime/lib/flows/index.js | 13 ++ .../@node-red/runtime/lib/flows/util.js | 44 +++- .../runtime/lib/nodes/credentials.js | 5 + .../@node-red/runtime/lib/nodes/index.js | 1 + .../core/common/91-global-config_spec.js | 63 ++++++ 18 files changed, 460 insertions(+), 3 deletions(-) create mode 100644 packages/node_modules/@node-red/editor-client/src/js/ui/env-var.js create mode 100644 packages/node_modules/@node-red/nodes/core/common/91-global-config.html create mode 100644 packages/node_modules/@node-red/nodes/core/common/91-global-config.js create mode 100644 packages/node_modules/@node-red/nodes/locales/en-US/common/91-global-config.html create mode 100644 packages/node_modules/@node-red/nodes/locales/ja/common/91-global-config.html create mode 100644 test/nodes/core/common/91-global-config_spec.js diff --git a/Gruntfile.js b/Gruntfile.js index 2f81da923..4f4b3b027 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -169,6 +169,7 @@ module.exports = function(grunt) { "packages/node_modules/@node-red/editor-client/src/js/ui/diagnostics.js", "packages/node_modules/@node-red/editor-client/src/js/ui/diff.js", "packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js", + "packages/node_modules/@node-red/editor-client/src/js/ui/env-var.js", "packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js", "packages/node_modules/@node-red/editor-client/src/js/ui/statusBar.js", "packages/node_modules/@node-red/editor-client/src/js/ui/view.js", diff --git a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json index 1cc571200..fe5120302 100755 --- a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json @@ -1204,5 +1204,10 @@ "node": "Node", "junction": "Junction", "linkNodes": "Link Nodes" + }, + "env-var": { + "environment": "Environment", + "header": "Global Environment Variables", + "revert": "Revert" } } diff --git a/packages/node_modules/@node-red/editor-client/locales/ja/editor.json b/packages/node_modules/@node-red/editor-client/locales/ja/editor.json index fb3458eed..2b438050e 100644 --- a/packages/node_modules/@node-red/editor-client/locales/ja/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/ja/editor.json @@ -1349,5 +1349,10 @@ "show-version-control-tab": "バージョンコントロールタブを表示", "start-flows": "フローを開始", "stop-flows": "フローを停止" + }, + "env-var": { + "environment": "環境変数", + "header": "大域環境変数", + "revert": "破棄" } } diff --git a/packages/node_modules/@node-red/editor-client/src/js/red.js b/packages/node_modules/@node-red/editor-client/src/js/red.js index 129c46799..6c0adf21b 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/red.js +++ b/packages/node_modules/@node-red/editor-client/src/js/red.js @@ -775,6 +775,7 @@ var RED = (function() { RED.deploy.init(RED.settings.theme("deployButton",null)); RED.keyboard.init(buildMainMenu); + RED.envVar.init(); RED.nodes.init(); RED.runtime.init() diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js b/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js index 8a8df6837..254ade55f 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js @@ -421,7 +421,7 @@ RED.deploy = (function() { const unusedConfigNodes = []; RED.nodes.eachConfig(function (node) { - if ((node._def.hasUsers !== false) && (node.users.length === 0)) { + if ((node._def.hasUsers !== false) && (node.users.length === 0) && (node.type !== "global-config")) { unusedConfigNodes.push(getNodeInfo(node)); hasUnusedConfig = true; } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/env-var.js b/packages/node_modules/@node-red/editor-client/src/js/ui/env-var.js new file mode 100644 index 000000000..a8f852307 --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/env-var.js @@ -0,0 +1,190 @@ +/** + * Copyright JS Foundation and other contributors, http://js.foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +RED.envVar = (function() { + function saveEnvList(list) { + const items = list.editableList("items") + const new_env = []; + items.each(function (i,el) { + var data = el.data('data'); + var item; + if (data.nameField && data.valueField) { + item = { + name: data.nameField.val(), + value: data.valueField.typedInput("value"), + type: data.valueField.typedInput("type") + }; + new_env.push(item); + } + }); + return new_env; + } + + function getGlobalConf(create) { + var gconf = null; + RED.nodes.eachConfig(function (conf) { + if (conf.type === "global-config") { + gconf = conf; + } + }); + if ((gconf === null) && create) { + var cred = { + _ : {}, + map: {} + }; + gconf = { + id: RED.nodes.id(), + type: "global-config", + env: [], + name: "global-config", + label: "", + hasUsers: false, + users: [], + credentials: cred, + _def: RED.nodes.getType("global-config"), + }; + RED.nodes.add(gconf); + } + return gconf; + } + + function applyChanges(list) { + var gconf = getGlobalConf(false); + var new_env = []; + var items = list.editableList('items'); + var credentials = gconf ? gconf.credentials : null; + + if (!credentials) { + credentials = { + _ : {}, + map: {} + }; + } + items.each(function (i,el) { + var data = el.data('data'); + if (data.nameField && data.valueField) { + var item = { + name: data.nameField.val(), + value: data.valueField.typedInput("value"), + type: data.valueField.typedInput("type") + }; + if (item.name.trim() !== "") { + new_env.push(item); + if ((item.type === "cred") && (item.value !== "__PWRD__")) { + credentials.map[item.name] = item.value; + credentials.map["has_"+item.name] = (item.value !== ""); + item.value = "__PWRD__"; + } + } + } + }); + if (gconf === null) { + gconf = getGlobalConf(true); + } + if ((JSON.stringify(new_env) !== JSON.stringify(gconf.env)) || + (JSON.stringify(credentials) !== JSON.stringify(gconf.credentials))) { + gconf.env = new_env; + gconf.credentials = credentials; + RED.nodes.dirty(true); + } + } + + function getSettingsPane() { + var gconf = getGlobalConf(false); + var env = gconf ? gconf.env : []; + var cred = gconf ? gconf.credentials : null; + if (!cred) { + cred = { + _ : {}, + map: {} + }; + } + + var pane = $("
", { + id: "red-ui-settings-tab-envvar" + }); + var content = $("
", { + class: "form-row node-input-env-container-row" + }).css({ + "margin": "10px" + }).appendTo(pane); + + var label = $("").css({ + width: "100%" + }).appendTo(content); + $("", { + class: "fa fa-list" + }).appendTo(label); + $("").text(" "+RED._("env-var.header")).appendTo(label); + + var list = $("
    ", { + id: "node-input-env-container" + }).appendTo(content); + var node = { + type: "", + env: env, + credentials: cred.map, + }; + RED.editor.envVarList.create(list, node); + + var buttons = $("
    ").css({ + "text-align": "right", + }).appendTo(content); + var revertButton = $("