From 660a2e0ed6f9393f06bc3df6bd2425661d33ec8d Mon Sep 17 00:00:00 2001 From: Ben Hardill Date: Sat, 16 Jul 2022 19:51:35 +0100 Subject: [PATCH 001/253] Allow HTTP Headers not in spec potential fix for #3772 --- .../@node-red/nodes/core/network/21-httprequest.html | 12 ++++++++++++ .../@node-red/nodes/core/network/21-httprequest.js | 4 ++++ .../@node-red/nodes/locales/en-US/messages.json | 3 ++- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/core/network/21-httprequest.html b/packages/node_modules/@node-red/nodes/core/network/21-httprequest.html index 8b1320496..b9a44e1b4 100644 --- a/packages/node_modules/@node-red/nodes/core/network/21-httprequest.html +++ b/packages/node_modules/@node-red/nodes/core/network/21-httprequest.html @@ -91,6 +91,11 @@ +
+ + +
+
@@ -227,6 +232,7 @@ persist: {value:false}, proxy: {type:"http proxy",required: false, label:RED._("node-red:httpin.proxy-config") }, + insecureHTTPParser: {value: false}, authType: {value: ""}, senderr: {value: false}, headers: { value: [] } @@ -338,6 +344,12 @@ } else { $("#node-input-useProxy").prop("checked", false); } + + if (node.insecureHTTPParser) { + $("node-intput-insecureHTTPParser").prop("checked", true) + } else { + $("node-intput-insecureHTTPParser").prop("checked", false) + } updateProxyOptions(); $("#node-input-useProxy").on("click", function() { updateProxyOptions(); diff --git a/packages/node_modules/@node-red/nodes/core/network/21-httprequest.js b/packages/node_modules/@node-red/nodes/core/network/21-httprequest.js index 6a19d2ed2..b94d59dc7 100644 --- a/packages/node_modules/@node-red/nodes/core/network/21-httprequest.js +++ b/packages/node_modules/@node-red/nodes/core/network/21-httprequest.js @@ -244,6 +244,10 @@ in your Node-RED user directory (${RED.settings.userDir}). delete options.headers[h]; } }) + + if (node.insecureHTTPParser) { + options.insecureHTTPParser = true + } } ], beforeRedirect: [ diff --git a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json index 62d5f351f..b38ab3026 100644 --- a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json @@ -554,7 +554,8 @@ }, "status": { "requesting": "requesting" - } + }, + "insecureHTTPParser": "Lenient HTTP Header Parsing" }, "websocket": { "label": { From 93a88a83a8e8bc46eca2487560d9f1c2ad5d3e20 Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Wed, 20 Jul 2022 10:13:13 +0900 Subject: [PATCH 002/253] add JSONata support for env var definition --- .../editor-client/src/js/ui/editors/envVarList.js | 2 +- packages/node_modules/@node-red/util/lib/util.js | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/envVarList.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/envVarList.js index 209e953e0..ba71e651f 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/envVarList.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/envVarList.js @@ -2,7 +2,7 @@ RED.editor.envVarList = (function() { var currentLocale = 'en-US'; var DEFAULT_ENV_TYPE_LIST = ['str','num','bool','json','bin','env']; - var DEFAULT_ENV_TYPE_LIST_INC_CRED = ['str','num','bool','json','bin','env','cred']; + var DEFAULT_ENV_TYPE_LIST_INC_CRED = ['str','num','bool','json','bin','env','cred','jsonata']; /** * Create env var edit interface diff --git a/packages/node_modules/@node-red/util/lib/util.js b/packages/node_modules/@node-red/util/lib/util.js index d82de0d1d..002dc099b 100644 --- a/packages/node_modules/@node-red/util/lib/util.js +++ b/packages/node_modules/@node-red/util/lib/util.js @@ -696,13 +696,19 @@ function evaluateNodeProperty(value, type, node, msg, callback) { function prepareJSONataExpression(value,node) { var expr = jsonata(value); expr.assign('flowContext', function(val, store) { - return node.context().flow.get(val, store); + if (node) { + return node.context().flow.get(val, store); + } + return ""; }); expr.assign('globalContext', function(val, store) { - return node.context().global.get(val, store); + if (node) { + return node.context().global.get(val, store); + } + return ""; }); expr.assign('env', function(name) { - var val = getSetting(node, name, node._flow); + var val = getSetting(node, name, node ? node._flow : null); if (typeof val !== 'undefined') { return val; } else { From d546a4a15b9c5d14982ce9d17e3e2b7543589fae Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 20 Jul 2022 10:14:06 +0100 Subject: [PATCH 003/253] Remove use of Object.hasOwn Fixes #3778 --- packages/node_modules/@node-red/editor-client/src/js/ui/view.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 8c7ea22a3..949d2473f 100755 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -4906,7 +4906,7 @@ RED.view = (function() { if (d._def.button) { var buttonEnabled = isButtonEnabled(d); this.__buttonGroup__.classList.toggle("red-ui-flow-node-button-disabled", !buttonEnabled); - if (RED.runtime && Object.hasOwn(RED.runtime,'started')) { + if (RED.runtime && RED.runtime.started !== undefined) { this.__buttonGroup__.classList.toggle("red-ui-flow-node-button-stopped", !RED.runtime.started); } From e120bad779017682d64bf071bc950946c48db93b Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 20 Jul 2022 10:37:40 +0100 Subject: [PATCH 004/253] Ensure quick-add dialog does not obscure ghost node when shifted --- .../@node-red/editor-client/src/js/ui/typeSearch.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/typeSearch.js b/packages/node_modules/@node-red/editor-client/src/js/ui/typeSearch.js index fc5b8e99e..989cb78ab 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/typeSearch.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/typeSearch.js @@ -269,8 +269,8 @@ RED.typeSearch = (function() { moveCallback = opts.move; RED.events.emit("type-search:open"); //shade.show(); - if ($("#red-ui-main-container").height() - opts.y - 150 < 0) { - opts.y = opts.y - 235; + if ($("#red-ui-main-container").height() - opts.y - 195 < 0) { + opts.y = opts.y - 275; } dialog.css({left:opts.x+"px",top:opts.y+"px"}).show(); searchResultsDiv.slideDown(300); From 5944fdb5dc1446d227344dec33407998472b7027 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 20 Jul 2022 10:40:20 +0100 Subject: [PATCH 005/253] Properly position quick-add dialog in all cases Fixes #3781 --- .../editor-client/src/js/ui/contextMenu.js | 14 +++++--------- .../@node-red/editor-client/src/js/ui/view.js | 7 +++++-- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js b/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js index 66ae2b943..8e1d0d19a 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js @@ -44,14 +44,10 @@ RED.contextMenu = (function () { const canRemoveFromGroup = hasSelection && !!selection.nodes[0].g const offset = $("#red-ui-workspace-chart").offset() - let addX = options.x - offset.left + $("#red-ui-workspace-chart").scrollLeft() - let addY = options.y - offset.top + $("#red-ui-workspace-chart").scrollTop() - - if (RED.view.snapGrid) { - const gridSize = RED.view.gridSize() - addX = gridSize * Math.floor(addX / gridSize) - addY = gridSize * Math.floor(addY / gridSize) - } + // addX/addY must be the position in the workspace accounting for both scroll and scale + // The +5 is because we display the contextMenu -5,-5 to actual click position + let addX = (options.x + 5 - offset.left + $("#red-ui-workspace-chart").scrollLeft()) / RED.view.scale() + let addY = (options.y + 5 - offset.top + $("#red-ui-workspace-chart").scrollTop()) / RED.view.scale() const menuItems = [ { onselect: 'core:show-action-list', onpostselect: function () { } }, @@ -144,7 +140,7 @@ RED.contextMenu = (function () { ($(window).width() -MENU_WIDTH)) { direction = "left"; } - + menu = RED.menu.init({ direction: direction, onpreselect: function() { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 8c7ea22a3..601c625ce 100755 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -1071,12 +1071,15 @@ RED.view = (function() { RED.view.redraw(); } + // `point` is the place in the workspace the mouse has clicked. + // This takes into account scrolling and scaling of the workspace. var ox = point[0]; var oy = point[1]; + // Need to map that to browser location to position the pop-up const offset = $("#red-ui-workspace-chart").offset() - var clientX = ox + offset.left - $("#red-ui-workspace-chart").scrollLeft() - var clientY = oy + offset.top - $("#red-ui-workspace-chart").scrollTop() + var clientX = (ox * scaleFactor) + offset.left - $("#red-ui-workspace-chart").scrollLeft() + var clientY = (oy * scaleFactor) + offset.top - $("#red-ui-workspace-chart").scrollTop() if (RED.settings.get("editor").view['view-snap-grid']) { // eventLayer.append("circle").attr("cx",point[0]).attr("cy",point[1]).attr("r","2").attr('fill','red') From 8d3c5d09f695622bed0507299d0f5f7dd3501c90 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 20 Jul 2022 10:47:57 +0100 Subject: [PATCH 006/253] Do not flag hasUsers=false nodes as unused in search Fixes #3777 --- .../@node-red/editor-client/src/js/ui/search.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js index 217fb5a4e..f9cc79f08 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js @@ -187,7 +187,7 @@ RED.search = (function() { } if (flags.hasOwnProperty("unused")) { var isUnused = (node.node.type === 'subflow' && node.node.instances.length === 0) || - (isConfigNode && node.node.users.length === 0) + (isConfigNode && node.node.users.length === 0 && node.node._def.hasUsers !== false) if (flags.unused !== isUnused) { continue; } @@ -538,7 +538,7 @@ RED.search = (function() { $(previousActiveElement).trigger("focus"); } previousActiveElement = null; - } + } if(!keepSearchToolbar) { clearActiveSearch(); } @@ -630,7 +630,7 @@ RED.search = (function() { $("#red-ui-sidebar-shade").on('mousedown',hide); $("#red-ui-view-searchtools-close").on("click", function close() { - clearActiveSearch(); + clearActiveSearch(); updateSearchToolbar(); }); $("#red-ui-view-searchtools-close").trigger("click"); From 39b2fe45a5639824ce58583227f92fc35ffc4a30 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 20 Jul 2022 11:11:44 +0100 Subject: [PATCH 007/253] Ensure all typedInput buttons have button type set Fixes #3780 Otherwise they act as type="submit" and the browser will click on them when enter is pressed in an input --- .../editor-client/src/js/ui/common/typedInput.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js index 549479d85..ef1be05bc 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js @@ -90,10 +90,10 @@ optEl.append(generateSpans(srcMatch)); optEl.appendTo(element); } - matches.push({ - value: optVal, - label: element, - i: (valMatch.found ? valMatch.index : srcMatch.index) + matches.push({ + value: optVal, + label: element, + i: (valMatch.found ? valMatch.index : srcMatch.index) }); } }) @@ -501,7 +501,7 @@ this.options.types = this.options.types||Object.keys(allOptions); } - this.selectTrigger = $('').prependTo(this.uiSelect); + this.selectTrigger = $('').prependTo(this.uiSelect); $('').toggle(this.options.types.length > 1).appendTo(this.selectTrigger); this.selectLabel = $('').appendTo(this.selectTrigger); @@ -570,7 +570,7 @@ }) // explicitly set optionSelectTrigger display to inline-block otherwise jQ sets it to 'inline' - this.optionSelectTrigger = $('').appendTo(this.uiSelect); + this.optionSelectTrigger = $('').appendTo(this.uiSelect); this.optionSelectLabel = $('').prependTo(this.optionSelectTrigger); // RED.popover.tooltip(this.optionSelectLabel,function() { // return that.optionValue; @@ -591,7 +591,7 @@ that.uiSelect.addClass('red-ui-typedInput-focus'); }); - this.optionExpandButton = $('').appendTo(this.uiSelect); + this.optionExpandButton = $('').appendTo(this.uiSelect); this.optionExpandButtonIcon = $('').appendTo(this.optionExpandButton); this.type(this.typeField.val() || this.options.default||this.typeList[0].value); From 7c5413e568eab28c1fe892c51e39557492cbaaef Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Wed, 20 Jul 2022 12:29:16 +0100 Subject: [PATCH 008/253] ensure red-ui-editor-stack is focusable --- packages/node_modules/@node-red/editor-client/src/js/red.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 55446418b..7544434b7 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 @@ -766,7 +766,7 @@ var RED = (function() { $('
').appendTo(header); $('
'+ '
'+ - '
'+ + '
'+ '
'+ '
'+ '
'+ From 1b53b5b92792b714600869f5d0b8822f1e140079 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Wed, 20 Jul 2022 12:30:15 +0100 Subject: [PATCH 009/253] focus stack when re-showing nested editor --- .../node_modules/@node-red/editor-client/src/js/ui/editor.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js index fb4c200f5..be114c4a8 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js @@ -1105,6 +1105,10 @@ RED.editor = (function() { if (editing_node) { RED.sidebar.info.refresh(editing_node); RED.sidebar.help.show(editing_node.type, false); + //ensure focused element is NOT body (for keyboard scope to operate correctly) + if (document.activeElement.tagName === 'BODY') { + $('#red-ui-editor-stack').trigger('focus') + } } } } From 273404e24df2ca863ef7397a82cc1b344fed50ac Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Wed, 20 Jul 2022 12:30:52 +0100 Subject: [PATCH 010/253] focus search input when opened via context menu --- .../@node-red/editor-client/src/js/ui/contextMenu.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js b/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js index 66ae2b943..1ace19a75 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js @@ -67,6 +67,10 @@ RED.contextMenu = (function () { splice: isSingleLink ? selection.links[0] : undefined, // spliceMultiple: isMultipleLinks }) + }, + onpostselect: function() { + // ensure quick add dialog search input has focus + $('#red-ui-type-search-input').trigger('focus') } }, (hasLinks) ? { // has least 1 wire selected From f7120b32f54cb1a919e82b3e25b25c7b404418f5 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Wed, 20 Jul 2022 13:58:03 +0100 Subject: [PATCH 011/253] Allow `mode` and `title` to be empty fixes #3774 --- .../editor-client/src/js/ui/editors/code-editors/monaco.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/code-editors/monaco.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/code-editors/monaco.js index 701e3da44..497116125 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/code-editors/monaco.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/code-editors/monaco.js @@ -764,7 +764,7 @@ RED.editor.codeEditor.monaco = (function() { if(!options.stateId && options.stateId !== false) { - options.stateId = RED.editor.generateViewStateId("monaco", options, (options.mode || options.title).split("/").pop()); + options.stateId = RED.editor.generateViewStateId("monaco", options, (options.mode || options.title || "").split("/").pop()); } var el = options.element || $("#"+options.id)[0]; var toolbarRow = $("
").appendTo(el); From af4f07cb263f98d27ed424fca48a3eb1212afa6a Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Thu, 21 Jul 2022 09:29:51 +0100 Subject: [PATCH 012/253] include flows stop/start state --- .../node_modules/@node-red/runtime/lib/api/diagnostics.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/runtime/lib/api/diagnostics.js b/packages/node_modules/@node-red/runtime/lib/api/diagnostics.js index cbf9fc9d7..443751ecc 100644 --- a/packages/node_modules/@node-red/runtime/lib/api/diagnostics.js +++ b/packages/node_modules/@node-red/runtime/lib/api/diagnostics.js @@ -100,9 +100,13 @@ function buildDiagnosticReport(scope, callback) { version: os.version(), }, runtime: { - isStarted: runtime.isStarted(), - modules: modules, version: runtime.settings.version, + isStarted: runtime.isStarted(), + flows: { + state: runtime.flows && runtime.flows.state(), + started: runtime.flows && runtime.flows.started, + }, + modules: modules, settings: { available: runtime.settings.available(), apiMaxLength: runtime.settings.apiMaxLength || "UNSET", From a4d66622a5130728e5391e0478db8fa6746e4d45 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Thu, 21 Jul 2022 09:30:49 +0100 Subject: [PATCH 013/253] add a handful of missing settings to basic report --- .../node_modules/@node-red/runtime/lib/api/diagnostics.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/node_modules/@node-red/runtime/lib/api/diagnostics.js b/packages/node_modules/@node-red/runtime/lib/api/diagnostics.js index 443751ecc..b0debf96e 100644 --- a/packages/node_modules/@node-red/runtime/lib/api/diagnostics.js +++ b/packages/node_modules/@node-red/runtime/lib/api/diagnostics.js @@ -118,6 +118,11 @@ function buildDiagnosticReport(scope, callback) { flowFile: runtime.settings.flowFile || "UNSET", mqttReconnectTime: runtime.settings.mqttReconnectTime || "UNSET", serialReconnectTime: runtime.settings.serialReconnectTime || "UNSET", + socketReconnectTime: runtime.settings.socketReconnectTime || "UNSET", + socketTimeout: runtime.settings.socketTimeout || "UNSET", + tcpMsgQueueSize: runtime.settings.tcpMsgQueueSize || "UNSET", + inboundWebSocketTimeout: runtime.settings.inboundWebSocketTimeout || "UNSET", + runtimeState: runtime.settings.runtimeState || "UNSET", adminAuth: runtime.settings.adminAuth ? "SET" : "UNSET", @@ -135,6 +140,7 @@ function buildDiagnosticReport(scope, callback) { uiHost: runtime.settings.uiHost ? "SET" : "UNSET", uiPort: runtime.settings.uiPort ? "SET" : "UNSET", userDir: runtime.settings.userDir ? "SET" : "UNSET", + nodesDir: runtime.settings.nodesDir && runtime.settings.nodesDir.length ? "SET" : "UNSET", } } } From bcd31610f69c81edf6e2abc5cb625457964eae25 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Thu, 21 Jul 2022 10:07:40 +0100 Subject: [PATCH 014/253] update tests for sys info diagnostics ammendments --- .../runtime/lib/api/diagnostics_spec.js | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/test/unit/@node-red/runtime/lib/api/diagnostics_spec.js b/test/unit/@node-red/runtime/lib/api/diagnostics_spec.js index 07e499344..136e4826c 100644 --- a/test/unit/@node-red/runtime/lib/api/diagnostics_spec.js +++ b/test/unit/@node-red/runtime/lib/api/diagnostics_spec.js @@ -33,6 +33,11 @@ describe("runtime-api/diagnostics", function() { flowFile: "flows.json", mqttReconnectTime: 321, serialReconnectTime: 432, + socketReconnectTime: 2222, + socketTimeout: 3333, + tcpMsgQueueSize: 4444, + inboundWebSocketTimeout: 5555, + runtimeState: {enabled: true, ui: false}, adminAuth: {},//should be sanitised to "SET" httpAdminRoot: "/admin/root/", httpAdminCors: {},//should be sanitised to "SET" @@ -45,6 +50,7 @@ describe("runtime-api/diagnostics", function() { uiHost: "something.secret.com",//should be sanitised to "SET" uiPort: 1337,//should be sanitised to "SET" userDir: "/var/super/secret/",//should be sanitised to "SET", + nodesDir: "/var/super/secret/",//should be sanitised to "SET", contextStorage: { default : { module: "memory" }, file: { module: "localfilesystem" }, @@ -73,8 +79,9 @@ describe("runtime-api/diagnostics", function() { //result.runtime.xxxxx const runtimeCount = Object.keys(result.runtime).length; - runtimeCount.should.eql(4);//ensure no more than 4 keys are present in runtime + runtimeCount.should.eql(5);//ensure 5 keys are present in runtime result.runtime.should.have.property('isStarted',true) + result.runtime.should.have.property('flows') result.runtime.should.have.property('modules').type("object"); result.runtime.should.have.property('settings').type("object"); result.runtime.should.have.property('version','7.7.7'); @@ -87,7 +94,7 @@ describe("runtime-api/diagnostics", function() { //result.runtime.settings.xxxxx const settingsCount = Object.keys(result.runtime.settings).length; - settingsCount.should.eql(21);//ensure no more than the 21 settings listed below are present in the settings object + settingsCount.should.eql(27);//ensure no more than the 21 settings listed below are present in the settings object result.runtime.settings.should.have.property('available',true); result.runtime.settings.should.have.property('apiMaxLength', "UNSET");//deliberately disabled to ensure UNSET is returned result.runtime.settings.should.have.property('debugMaxLength', 1111); @@ -96,6 +103,11 @@ describe("runtime-api/diagnostics", function() { result.runtime.settings.should.have.property('flowFile', "flows.json"); result.runtime.settings.should.have.property('mqttReconnectTime', 321); result.runtime.settings.should.have.property('serialReconnectTime', 432); + result.runtime.settings.should.have.property('socketReconnectTime', 2222); + result.runtime.settings.should.have.property('socketTimeout', 3333); + result.runtime.settings.should.have.property('tcpMsgQueueSize', 4444); + result.runtime.settings.should.have.property('inboundWebSocketTimeout', 5555); + result.runtime.settings.should.have.property('runtimeState', {enabled: true, ui: false}); result.runtime.settings.should.have.property("adminAuth", "SET"); //should be sanitised to "SET" result.runtime.settings.should.have.property("httpAdminCors", "SET"); //should be sanitised to "SET" result.runtime.settings.should.have.property('httpAdminRoot', "/admin/root/"); @@ -109,6 +121,7 @@ describe("runtime-api/diagnostics", function() { result.runtime.settings.should.have.property("uiPort", "SET"); //should be sanitised to "SET" result.runtime.settings.should.have.property("userDir", "SET"); //should be sanitised to "SET" result.runtime.settings.should.have.property('contextStorage').type("object"); + result.runtime.settings.should.have.property('nodesDir', "SET") //result.runtime.settings.contextStorage.xxxxx const contextCount = Object.keys(result.runtime.settings.contextStorage).length; From bc7852c1cc0889ec9f4686d0efca00592a99a0d0 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Thu, 21 Jul 2022 14:44:29 +0100 Subject: [PATCH 015/253] Allow codeEditor theme to be set missing from settings.js --- .../node_modules/@node-red/editor-api/lib/editor/theme.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/node_modules/@node-red/editor-api/lib/editor/theme.js b/packages/node_modules/@node-red/editor-api/lib/editor/theme.js index 7be8868d3..c21a7e6e7 100644 --- a/packages/node_modules/@node-red/editor-api/lib/editor/theme.js +++ b/packages/node_modules/@node-red/editor-api/lib/editor/theme.js @@ -327,9 +327,8 @@ module.exports = { themeContext.header.url = themePlugin.header.url || themeContext.header.url } } - if(theme.codeEditor) { - theme.codeEditor.options = Object.assign({}, themePlugin.monacoOptions, theme.codeEditor.options); - } + theme.codeEditor = theme.codeEditor || {} + theme.codeEditor.options = Object.assign({}, themePlugin.monacoOptions, theme.codeEditor.options); } activeThemeInitialised = true; } From da65bf7292428fe8d9b64bd2bfe2260ec8aa045a Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 22 Jul 2022 09:50:37 +0100 Subject: [PATCH 016/253] Update changelog and bump for 3.0.1 --- CHANGELOG.md | 14 ++++++++++++++ package.json | 2 +- .../node_modules/@node-red/editor-api/package.json | 6 +++--- .../@node-red/editor-client/package.json | 2 +- packages/node_modules/@node-red/nodes/package.json | 2 +- .../node_modules/@node-red/registry/package.json | 4 ++-- .../node_modules/@node-red/runtime/package.json | 6 +++--- packages/node_modules/@node-red/util/package.json | 2 +- packages/node_modules/node-red/package.json | 10 +++++----- 9 files changed, 31 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c6f52aeb..a6a9016d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,17 @@ +#### 3.0.1: Maintenance Release + +Editor + + - Allow codeEditor theme to be set even if `codeEditor` is not set in settings.js (#3794) @Steve-Mcl + - Sys info (diagnostics report) amendments (#3793) @Steve-Mcl + - Allow `mode` and `title` to be omitted in `options` argument for `createEditor` (#3791) @Steve-Mcl + - Fix focus issues (#3789) @Steve-Mcl + - Ensure all typedInput buttons have button type set (#3788) @knolleary + - Do not flag hasUsers=false nodes as unused in search (#3787) @knolleary + - Properly position quick-add dialog in all cases (#3786) @knolleary + - Ensure quick-add dialog does not obscure ghost node when shifted (#3785) @knolleary + - Remove use of Object.hasOwn (#3784) @knolleary + #### 3.0.0: Milestone Release Editor diff --git a/package.json b/package.json index 8b64aa743..d5ab3bf5d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-red", - "version": "3.0.0", + "version": "3.0.1", "description": "Low-code programming for event-driven applications", "homepage": "http://nodered.org", "license": "Apache-2.0", diff --git a/packages/node_modules/@node-red/editor-api/package.json b/packages/node_modules/@node-red/editor-api/package.json index fd2f7d469..e95604bab 100644 --- a/packages/node_modules/@node-red/editor-api/package.json +++ b/packages/node_modules/@node-red/editor-api/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/editor-api", - "version": "3.0.0", + "version": "3.0.1", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/util": "3.0.0", - "@node-red/editor-client": "3.0.0", + "@node-red/util": "3.0.1", + "@node-red/editor-client": "3.0.1", "bcryptjs": "2.4.3", "body-parser": "1.20.0", "clone": "2.1.2", diff --git a/packages/node_modules/@node-red/editor-client/package.json b/packages/node_modules/@node-red/editor-client/package.json index a72fedc96..a06359c0c 100644 --- a/packages/node_modules/@node-red/editor-client/package.json +++ b/packages/node_modules/@node-red/editor-client/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/editor-client", - "version": "3.0.0", + "version": "3.0.1", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/@node-red/nodes/package.json b/packages/node_modules/@node-red/nodes/package.json index ff0161f86..c7a31fa10 100644 --- a/packages/node_modules/@node-red/nodes/package.json +++ b/packages/node_modules/@node-red/nodes/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/nodes", - "version": "3.0.0", + "version": "3.0.1", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/@node-red/registry/package.json b/packages/node_modules/@node-red/registry/package.json index f9ab44be8..c8c582ebe 100644 --- a/packages/node_modules/@node-red/registry/package.json +++ b/packages/node_modules/@node-red/registry/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/registry", - "version": "3.0.0", + "version": "3.0.1", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,7 +16,7 @@ } ], "dependencies": { - "@node-red/util": "3.0.0", + "@node-red/util": "3.0.1", "clone": "2.1.2", "fs-extra": "10.1.0", "semver": "7.3.7", diff --git a/packages/node_modules/@node-red/runtime/package.json b/packages/node_modules/@node-red/runtime/package.json index f33cb5175..8b1991a5c 100644 --- a/packages/node_modules/@node-red/runtime/package.json +++ b/packages/node_modules/@node-red/runtime/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/runtime", - "version": "3.0.0", + "version": "3.0.1", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/registry": "3.0.0", - "@node-red/util": "3.0.0", + "@node-red/registry": "3.0.1", + "@node-red/util": "3.0.1", "async-mutex": "0.3.2", "clone": "2.1.2", "express": "4.18.1", diff --git a/packages/node_modules/@node-red/util/package.json b/packages/node_modules/@node-red/util/package.json index 9ce885200..8d677e2cd 100644 --- a/packages/node_modules/@node-red/util/package.json +++ b/packages/node_modules/@node-red/util/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/util", - "version": "3.0.0", + "version": "3.0.1", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/node-red/package.json b/packages/node_modules/node-red/package.json index dfd98f6fb..faa98c48d 100644 --- a/packages/node_modules/node-red/package.json +++ b/packages/node_modules/node-red/package.json @@ -1,6 +1,6 @@ { "name": "node-red", - "version": "3.0.0", + "version": "3.0.1", "description": "Low-code programming for event-driven applications", "homepage": "http://nodered.org", "license": "Apache-2.0", @@ -31,10 +31,10 @@ "flow" ], "dependencies": { - "@node-red/editor-api": "3.0.0", - "@node-red/runtime": "3.0.0", - "@node-red/util": "3.0.0", - "@node-red/nodes": "3.0.0", + "@node-red/editor-api": "3.0.1", + "@node-red/runtime": "3.0.1", + "@node-red/util": "3.0.1", + "@node-red/nodes": "3.0.1", "basic-auth": "2.0.1", "bcryptjs": "2.4.3", "express": "4.18.1", From 4fb40f9077d687cde6231b7439e708758a533d92 Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Sat, 23 Jul 2022 21:39:07 +0900 Subject: [PATCH 017/253] Support color reset to the default in subflow --- .../@node-red/editor-client/src/js/ui/editors/colorPicker.js | 3 +++ .../editor-client/src/js/ui/editors/panes/appearance.js | 1 + .../node_modules/@node-red/editor-client/src/js/ui/group.js | 3 +++ 3 files changed, 7 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/colorPicker.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/colorPicker.js index 4b2e19e5c..5b76d020b 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/colorPicker.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/colorPicker.js @@ -76,6 +76,9 @@ RED.editor.colorPicker = RED.colorPicker = (function() { var focusTarget = colorInput; colorInput.on("change", function (e) { var color = colorInput.val(); + if (options.defaultValue && !color.match(/^([a-z]+|#[0-9a-fA-F]{6}|#[0-9a-fA-F]{3})$/)) { + color = options.defaultValue; + } colorHiddenInput.val(color).trigger('change'); refreshDisplay(color); }); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/panes/appearance.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/panes/appearance.js index 912fa3528..e1e6b2ba3 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/panes/appearance.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/panes/appearance.js @@ -235,6 +235,7 @@ RED.editor.colorPicker.create({ id: "red-ui-editor-node-color", value: color, + defaultValue: "#DDAA99", palette: recommendedColors, sortPalette: function (a, b) {return a.l - b.l;} }).appendTo(colorRow); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/group.js b/packages/node_modules/@node-red/editor-client/src/js/ui/group.js index add6da6c9..a35098e52 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/group.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/group.js @@ -101,6 +101,7 @@ RED.group = (function() { RED.editor.colorPicker.create({ id:"node-input-style-stroke", value: style.stroke || defaultGroupStyle.stroke || "#a4a4a4", + defaultValue: "#a4a4a4", palette: colorPalette, cellPerRow: colorCount, cellWidth: 16, @@ -112,6 +113,7 @@ RED.group = (function() { RED.editor.colorPicker.create({ id:"node-input-style-fill", value: style.fill || defaultGroupStyle.fill ||"none", + defaultValue: "none", palette: colorPalette, cellPerRow: colorCount, cellWidth: 16, @@ -129,6 +131,7 @@ RED.group = (function() { RED.editor.colorPicker.create({ id:"node-input-style-color", value: style.color || defaultGroupStyle.color ||"#a4a4a4", + defaultValue: "#a4a4a4", palette: colorPalette, cellPerRow: colorCount, cellWidth: 16, From b50ba3e0e44c34034cb73603a4a9f81c152062d6 Mon Sep 17 00:00:00 2001 From: Dennis Neufeld Date: Sat, 23 Jul 2022 18:53:39 +0200 Subject: [PATCH 018/253] Update german translation --- .../editor-client/locales/de/editor.json | 77 +++++++++++-------- .../@node-red/runtime/locales/de/runtime.json | 32 ++++---- 2 files changed, 60 insertions(+), 49 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/locales/de/editor.json b/packages/node_modules/@node-red/editor-client/locales/de/editor.json index 41fe1459a..36bf537de 100755 --- a/packages/node_modules/@node-red/editor-client/locales/de/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/de/editor.json @@ -105,7 +105,7 @@ "search": "Flows durchsuchen", "searchInput": "Flows durchsuchen", "subflows": "Subflow", - "createSubflow": "Subflow", + "createSubflow": "Subflow hinzufügen", "selectionToSubflow": "Auswahl in Subflow umwandeln", "flows": "Flow", "add": "Hinzufügen", @@ -152,7 +152,8 @@ "zoom-in": "Vergrößern", "search-flows": "Flows durchsuchen", "search-prev": "Vorherige", - "search-next": "Nächste" + "search-next": "Nächste", + "search-counter": "\"__term__\" __result__ von __count__" }, "user": { "loggedInAs": "Angemeldet als __name__", @@ -168,7 +169,11 @@ } }, "notification": { - "warning": "Warnung: __message__", + "state": { + "flowsStopped": "Flows gestoppt", + "flowsStarted": "Flows gestartet" + }, + "warning": "Warnung: __message__", "warnings": { "undeployedChanges": "Node hat nicht übernommene (deploy) Änderungen", "nodeActionDisabled": "Node-Aktionen deaktiviert", @@ -177,15 +182,15 @@ "missing-modules": "

Flows angehalten aufgrund fehlender Module

", "safe-mode": "

Flows sind im abgesicherten Modus gestoppt.

Flows können bearbeitet und übernommen (deploy) werden, um sie neu zu starten.

", "restartRequired": "Node-RED muss neu gestartet werden, damit die Module nach Upgrade aktiviert werden", - "credentials_load_failed": "

Flows gestoppt, da die Berechtigungen nicht entschlüsselt werden konnten.

Die Datei mit dem Flow-Berechtigungen ist verschlüsselt, aber der Schlüssel des Projekts fehlt oder ist ungültig.

", - "credentials_load_failed_reset": "

Die Berechtigungen konnten nicht entschlüsselt werden.

Die Datei mit den Flow-Berechtigungen ist verschlüsselt, aber der Schlüssel des Projekts fehlt oder ist ungültig.

Die Datei mit den Flow-Berechtigungen wird bei der nächsten Übernahme (deploy) zurückgesetzt. Alle vorhandenen Flow-Berechtigungen werden gelöscht.

", + "credentials_load_failed": "

Flows gestoppt, da die Anmeldeinformationen nicht entschlüsselt werden konnten.

Die Datei mit den Flow-Anmeldeinformationen ist verschlüsselt, aber der Schlüssel des Projekts fehlt oder ist ungültig.

", + "credentials_load_failed_reset": "

Die Anmeldeinformationen konnten nicht entschlüsselt werden.

Die Datei mit den Flow-Anmeldeinformationen ist verschlüsselt, aber der Schlüssel des Projekts fehlt oder ist ungültig.

Die Datei mit den Flow-Anmeldeinformationen wird bei der nächsten Übernahme (deploy) zurückgesetzt. Alle vorhandenen Flow-Anmeldeinformationen werden gelöscht.

", "missing_flow_file": "

Die Flow-Datei des Projekts wurde nicht gefunden.

Das Projekt ist nicht mit einer Flow-Datei konfiguriert.

", "missing_package_file": "

Die Paket-Datei des Projekts wurde nicht gefunden.

In dem Projekt fehlt die 'package.json'-Datei.

", "project_empty": "

Das Projekt ist leer.

Soll ein Standardsatz an Projektdateien erstellen werden?
Andernfalls müssen die Dateien manuell außerhalb des Editors dem Projekt hinzugefügt werden.

", "project_not_found": "

Das Projekt '__project__' wurde nicht gefunden.

", "git_merge_conflict": "

Der automatische Merge der Änderungen ist fehlgeschlagen.

Die Merge-Konflikte müssen behoben und die Ergebnisse ins Repository übertragen werden (commit).

" }, - "error": "Fehler: __message__", + "error": "Fehler: __message__", "errors": { "lostConnection": "Verbindung zum Server verloren. Verbindung wird erneut hergestellt ...", "lostConnectionReconnect": "Verbindung zum Server verloren. Wiederherstellung der Verbindung in __time__s.", @@ -203,7 +208,7 @@ "pull": "Projekt '__project__' erneut geladen", "revert": "Änderungen im Projekt '__project__' rückgängig gemacht", "merge-complete": "Git-Merge abgeschlossen", - "setupCredentials": "Berechtigungen einrichten", + "setupCredentials": "Anmeldeinformationen einrichten", "setupProjectFiles": "Projektdateien einrichten", "no": "Nein, Danke", "createDefault": "Standardprojektdateien erstellen", @@ -211,7 +216,7 @@ }, "label": { "manage-project-dep": "Projektabhängigkeiten verwalten", - "setup-cred": "Berechtigungen einrichten", + "setup-cred": "Anmeldeinformationen einrichten", "setup-project": "Projektdateien einrichten", "create-default-package": "Standardpaketdatei erstellen", "no-thanks": "Nein, Danke", @@ -295,6 +300,10 @@ "modifiedFlowsDesc": "Übernimmt nur Flows, die geänderte Nodes enthalten", "modifiedNodes": "Geänderte Nodes", "modifiedNodesDesc": "Übernimmt nur Nodes, die sich geändert haben", + "startFlows": "Start", + "startFlowsDesc": "Flows starten", + "stopFlows": "Stop", + "stopFlowsDesc": "Flows stoppen", "restartFlows": "Flows neustarten", "restartFlowsDesc": "Startet die aktuell übernommenen Flows (ohne vorheriges Deploy)", "successfulDeploy": "Erfolgreich übernommen (deploy)", @@ -376,7 +385,7 @@ "confirmDelete": "Sind Sie sicher mit dem Löschen dieses Subflows?", "info": "Beschreibung", "category": "Kategorie", - "module": "Module", + "module": "Modul", "license": "Lizenz", "licenseNone": "Keine", "licenseOther": "Andere", @@ -434,7 +443,7 @@ "icon": "Icon", "inputType": "Eingangstyp", "selectType": "Wähle Typen ...", - "loadCredentials": "Lade Node-Berechtigungen", + "loadCredentials": "Lade Node-Anmeldeinformationen", "inputs": { "input": "Eingang", "select": "Auswahl", @@ -450,7 +459,7 @@ "json": "JSON", "bin": "buffer", "env": "Umgebungsvariable", - "cred": "Berechtigung" + "cred": "Anmeldeinformation" }, "menu": { "input": "Eingang", @@ -470,7 +479,7 @@ "errors": { "scopeChange": "Wenn Sie den Geltungsbereich (scope) ändern, wird er für Nodes in anderen Flows nicht verfügbar sein", "invalidProperties": "Ungültige Eigenschaften:", - "credentialLoadFailed": "Laden der Node-Berechtigungen fehlgeschlagen" + "credentialLoadFailed": "Laden der Node-Anmeldeinformationen fehlgeschlagen" } }, "keyboard": { @@ -683,7 +692,8 @@ "showHelp": "Hilfe zeigen", "showInOutline": "Zeige im Editor", "showTopics": "Zeige Hilfethemen", - "noHelp": "Kein Hilfethema ausgewählt" + "noHelp": "Kein Hilfethema ausgewählt", + "changeLog": "Änderungsprotokoll" }, "config": { "name": "Konfigurations-Node", @@ -737,7 +747,7 @@ "addToProject": "Zu Projekt hinzufügen", "files": "Dateien", "flow": "Flow", - "credentials": "Berechtigungen", + "credentials": "Anmeldeinformationen", "package": "Paket", "packageCreate": "Datei wird erstellt beim Speichern der Änderungen", "fileNotExist": "Datei existiert nicht", @@ -750,7 +760,7 @@ "changeTheEncryptionKey": "Schlüssel ändern", "currentKey": "Aktueller Schlüssel", "newKey": "Neuer Schlüssel", - "credentialsAlert": "Dadurch werden alle vorhandenen Berechtigungen gelöscht", + "credentialsAlert": "Dadurch werden alle vorhandenen Anmeldeinformationen gelöscht", "versionControl": "Versionsverwaltung (Git)", "branches": "Branches", "noBranches": "Keine Branches", @@ -886,7 +896,7 @@ "date": "timestamp", "jsonata": "JSONata", "env": "Umgebungsvariable", - "cred": "Berechtigung" + "cred": "Anmeldeinformation" } }, "editableList": { @@ -1026,7 +1036,7 @@ "passphrase": "Passphrase", "ssh-key-desc": "Bevor Sie ein Repository über SSH lokal klonen können, müssen Sie einen SSH-Schlüssel hinzufügen, um auf diesen zugreifen zu können", "ssh-key-add": "SSH-Schlüssel hinzufügen", - "credential-key": "Schlüssel für Berechtigungen", + "credential-key": "Schlüssel für Anmeldeinformationen", "cant-get-ssh-key": "Fehler! Der ausgewählte SSH-Schlüsselpfad kann nicht abgerufen werden", "already-exists2": "bereits vorhanden", "git-error": "Git-Fehler", @@ -1038,27 +1048,27 @@ "create": "Erstellen Sie Ihre Projektdateien", "desc0": "Ein Projekt enthält Ihre Flow-Dateien, eine README-Datei und die 'package.json'-Datei.", "desc1": "Es kann alle anderen Dateien enthalten, die im Git-Repository verwaltet werden sollen.", - "desc2": "Ihre vorhandenen Flow- und Berechtigungs-Dateien werden in das Projekt kopiert.", + "desc2": "Ihre vorhandenen Flow- und Anmeldeinformations-Dateien werden in das Projekt kopiert.", "flow-file": "Flow-Datei", - "credentials-file": "Datei mit Berechtigungen" + "credentials-file": "Datei mit Anmeldeinformationen" }, "encryption-config": { - "setup": "Einrichtung der Verschlüsselung Ihrer Datei mit den Berechtigungen", - "desc0": "Die Datei mit den Flow-Berechtigungen kann verschlüsselt werden, um ihren Inhalt zu schützen.", - "desc1": "Wenn Sie diese Berechtigungen in einem öffentlichen Repository speichern möchten, müssen Sie sie mit einen geheimen Schlüsselausdruck verschlüsseln.", - "desc2": "Die Datei mit den Flow-Berechtigungen ist derzeit nicht verschlüsselt.", + "setup": "Einrichtung der Verschlüsselung Ihrer Datei mit den Anmeldeinformationen", + "desc0": "Die Datei mit den Flow-Anmeldeinformationen kann verschlüsselt werden, um ihren Inhalt zu schützen.", + "desc1": "Wenn Sie diese Anmeldeinformationen in einem öffentlichen Repository speichern möchten, müssen Sie sie mit einen geheimen Schlüsselausdruck verschlüsseln.", + "desc2": "Die Datei mit den Flow-Anmeldeinformationen ist derzeit nicht verschlüsselt.", "desc3": "D.h. ihr Inhalt (z.B. Passwörter und Zugriffs-Tokens) kann von jedem mit Zugriff auf die Datei gelesen werden.", - "desc4": "Wenn Sie diese Berechtigungen in einen öffentlichen Repository speichern möchten, müssen Sie diese verschlüsseln, indem Sie einen geheimen Schlüsselausdruck eingeben.", - "desc5": "Ihre Datei mit den Flow-Berechtigungen wird derzeit mit dem Eintrag 'credentialSecret' Ihrer Einstellungsdatei als Schlüssel verschlüsselt.", - "desc6": "Die Datei mit den Flow-Berechtigungen wird derzeit mit einem vom System generierten Schlüssel verschlüsselt. Sie sollten einen neuen geheimen Schlüssel für dieses Projekt vorgeben.", + "desc4": "Wenn Sie diese Anmeldeinformationen in einen öffentlichen Repository speichern möchten, müssen Sie diese verschlüsseln, indem Sie einen geheimen Schlüsselausdruck eingeben.", + "desc5": "Ihre Datei mit den Flow-Anmeldeinformationen wird derzeit mit dem Eintrag 'credentialSecret' Ihrer Einstellungsdatei als Schlüssel verschlüsselt.", + "desc6": "Die Datei mit den Flow-Anmeldeinformationen wird derzeit mit einem vom System generierten Schlüssel verschlüsselt. Sie sollten einen neuen geheimen Schlüssel für dieses Projekt vorgeben.", "desc7": "Der Schlüssel wird separat von den Projektdateien gespeichert. Sie müssen den Schlüssel angeben, damit dieses Projekt auch in einem anderen Node-RED-System verwendet werden kann.", - "credentials": "Berechtigung", + "credentials": "Anmeldeinformationen", "enable": "Verschlüsselung aktivieren", "disable": "Verschlüsselung deaktivieren", "disabled": "deaktiviert", "copy": "Vorhandenen Schlüssel ersetzen", "use-custom": "Eigenen Schlüssel verwenden", - "desc8": "Die Datei mit den Berechtigungen wird nicht verschlüsselt, und ihr Inhalt kann leicht gelesen werden", + "desc8": "Die Datei mit den Anmeldeinformationen wird nicht verschlüsselt und ihr Inhalt kann leicht gelesen werden", "create-project-files": "Projektdateien erstellen", "create-project": "Projekt erstellen", "already-exists": "bereits vorhanden", @@ -1083,12 +1093,12 @@ "desc": "Beschreibung", "opt": "Optional", "flow-file": "Flow-Datei", - "credentials": "Berechtigungen", + "credentials": "Anmeldeinformationen", "enable-encryption": "Verschlüsselung aktivieren", "disable-encryption": "Verschlüsselung deaktivieren", "encryption-key": "Schlüssel", - "desc0": "Eine Floskel, mit der Sie Ihre Berechtigungen schützen", - "desc1": "Die Datei mit den Berechtigungen wird nicht verschlüsselt, und ihr Inhalt kann leicht gelesen werden", + "desc0": "Eine Ausdruck, mit der Sie Ihre Anmeldeinformationen schützen", + "desc1": "Die Datei mit den Anmeldeinformationen wird nicht verschlüsselt und ihr Inhalt kann leicht gelesen werden", "git-url": "Git-Repository-URL", "protocols": "https://, ssh:// oder file://", "auth-failed": "Authentifizierung fehlgeschlagen", @@ -1098,7 +1108,7 @@ "passphrase": "Passphrase", "desc2": "Bevor Sie ein Repository über SSH klonen können, müssen Sie einen SSH-Schlüssel hinzufügen, um auf diesen zu zugreifen", "add-ssh-key": "Einen SSH-Schlüssel hinzufügen", - "credentials-encryption-key": "Schlüssel für Berechtigungen", + "credentials-encryption-key": "Schlüssel für Anmeldeinformationen", "already-exists-2": "bereits vorhanden", "git-error": "Git-Fehler", "con-failed": "Verbindung fehlgeschlagen", @@ -1156,7 +1166,8 @@ "tourGuide": { "takeATour": "Tour starten", "start": "Start", - "next": "Nächste" + "next": "Nächste", + "welcomeTours": "Willkommens-Touren" }, "diagnostics": { "title": "System-Informationen" diff --git a/packages/node_modules/@node-red/runtime/locales/de/runtime.json b/packages/node_modules/@node-red/runtime/locales/de/runtime.json index 6811ba86a..99800c628 100755 --- a/packages/node_modules/@node-red/runtime/locales/de/runtime.json +++ b/packages/node_modules/@node-red/runtime/locales/de/runtime.json @@ -1,6 +1,6 @@ { "runtime": { - "welcome": "Willkommen bei Node-RED!", + "welcome": "Willkommen bei Node-RED", "version": "__component__ Version: __version__", "unsupported_version": "Nicht unterstützte Version von __component__. Erforderlich: __requires__, jedoch gefunden: __version__", "paths": { @@ -8,7 +8,6 @@ "httpStatic": "HTTP-Statisch: __path__" } }, - "server": { "loading": "Paletten-Nodes werden geladen", "palette-editor": { @@ -34,17 +33,19 @@ "install-failed-not-found": "Das Modul $t(server.install.install-failed-long) wurde nicht gefunden", "install-failed-name": "$t(server.install.install-failed-long). Ungültiger Modulname: __name__", "install-failed-url": "$t(server.install.install-failed-long). Ungültige URL: __url__", + "post-install-error": "Fehler bei der Ausführung des 'postInstall'-Hooks:", "upgrading": "Upgrade von Modul __name__ auf Version __version__ gestartet", "upgraded": "Upgrade von Modul __name__ war erfolgreich. Neustart von Node-RED für die Verwendung der neuen Version erforderlich.", "upgrade-failed-not-found": "Upgrade fehlgeschlagen. $t(server.install.install-failed-long). Version nicht gefunden.", "uninstalling": "Das Modul __name__ wird deinstalliert", "uninstall-failed": "Deinstallation fehlgeschlagen", "uninstall-failed-long": "Die Deinstallation des Moduls __name__ ist fehlgeschlagen:", - "uninstalled": "Das Modul __name__ ist deinstalliert" + "uninstalled": "Das Modul __name__ ist deinstalliert", + "old-ext-mod-dir-warning": "\n\n---------------------------------------------------------------------\nNode-RED 1.3 Verzeichnis externer Module erkannt:\n __oldDir__\nDieses Verzeichnis wird nicht mehr verwendet. Die externen Module werden\nin Ihrem Node-RED-Benutzerverzeichnis neu installiert:\n __newDir__\nLöschen Sie das alte externalModules-Verzeichnis, um diese Meldung abzustellen.\n---------------------------------------------------------------------\n" }, "deprecatedOption": "Die Verwendung von __old__ ist abgekündigt. Stattdessen __new__ verwenden.", "unable-to-listen": "Überwachen (listen) von __listenpath__ nicht möglich", - "port-in-use": "FEHLER: Port wird verwendet", + "port-in-use": "Fehler: Port wird verwendet", "uncaught-exception": "Nicht abgefangene Ausnahmebedingung:", "admin-ui-disabled": "Administrator-Benutzeroberfläche deaktiv", "now-running": "Server wird jetzt auf __listenpath__ ausgeführt", @@ -55,11 +56,10 @@ "refresh-interval": "Erneuerung der https-Einstellungen erfolgt alle __interval__ Stunden", "settings-refreshed": "https-Einstellungen wurden erneuert", "refresh-failed": "Erneuerung der https-Einstellungen fehlgeschlagen: __message__", - "nodejs-version": "httpsRefreshInterval erfordert Node.js 11 or later", + "nodejs-version": "httpsRefreshInterval erfordert Node.js 11 oder höher", "function-required": "httpsRefreshInterval erfordert die https-Eigenschaft in Form einer Funktion" } }, - "api": { "flows": { "error-save": "Fehler beim Speichern der Flows: __message__", @@ -77,17 +77,16 @@ "error-enable": "Der Node konnte nicht aktiviert werden:" } }, - "comms": { "error": "Kommunikationskanal-Fehler: __message__", "error-server": "Kommunikationsserver-Fehler: __message__", "error-send": "Kommunikationsende-Fehler: __message__" }, - "settings": { "user-not-available": "Einstellungen konnten nicht gespeichert werden: __message__", "not-available": "Einstellungen nicht verfügbar", - "property-read-only": "Die Eigenschaft '__prop__ 'ist schreibgeschützt" + "property-read-only": "Die Eigenschaft '__prop__ 'ist schreibgeschützt", + "readonly-mode": "Laufzeitumgebung im Nur-Lese-Modus. Änderungen werden nicht gespeichert." }, "library": { "unknownLibrary": "Unbekannte Bibliothek (Library): __library__", @@ -98,10 +97,12 @@ }, "nodes": { "credentials": { - "error": "Fehler beim Laden der Berechtigungen: __message__", - "error-saving": "Fehler beim Speichern der Berechtigungen: __message__", - "not-registered": "Der Berechtigung-Typ '__type__' ist nicht registriert", - "system-key-warning": "\n---------------------------------------------------------------------\nDie Datei mit den Flow-Berechtigungen wird mit einem vom System\ngenerierten Schlüssel verschlüsselt.\nWenn der vom System generierte Schlüssel aus irgendeinem Grund\nverloren geht, kann die Datei mit den Berechtigungen nicht\nwiederhergestellt werden. Sie muss dann gelöscht und die\nBerechtigungen müssen erneut eingestellt werden.\nEs sollte ein eigener Schlüssel mit Hilfe der Option\n'credentialSecret' in der Einstellungsdatei vorgegeben werden.\nNode-RED wird dann die Datei mit den Flow-Berechtigungen\nbei der nächsten Übernahme (deploy) einer Änderung erneut\nverschlüsseln.\n---------------------------------------------------------------------" + "error": "Fehler beim Laden der Anmeldeinformationen: __message__", + "error-saving": "Fehler beim Speichern der Anmeldeinformationen: __message__", + "not-registered": "Der Anmeldeinformations-Typ '__type__' ist nicht registriert", + "system-key-warning": "\n---------------------------------------------------------------------\nDie Datei mit den Flow-Anmeldeinformationen wird mit einem vom System\ngenerierten Schlüssel verschlüsselt.\nWenn der vom System generierte Schlüssel aus irgendeinem Grund\nverloren geht, kann die Datei mit den Anmeldeinformationen nicht\nwiederhergestellt werden. Sie muss dann gelöscht und die\nAnmeldeinformationen müssen erneut eingestellt werden.\nEs sollte ein eigener Schlüssel mit Hilfe der Option\n'credentialSecret' in der Einstellungsdatei vorgegeben werden.\nNode-RED wird dann die Datei mit den Flow-Anmeldeinformationen\nbei der nächsten Übernahme (deploy) einer Änderung erneut\nverschlüsseln.\n---------------------------------------------------------------------", + "unencrypted": "Verwende unverschlüsselte Anmeldeinformationen", + "encryptedNotFound": "Verschlüsselte Anmeldeinformationen nicht gefunden" }, "flows": { "safe-mode": "Die Flows sind gestoppt im abgesicherten Modus. Übernahme (deploy) zum Starten.", @@ -121,6 +122,7 @@ "stopped-flows": "Flows sind gestoppt", "stopped": "gestoppt", "stopping-error": "Fehler beim Stoppen des Nodes: __message__", + "updated-flows": "Flows aktualisiert", "added-flow": "Flow wird hinzugefügt: __label__", "updated-flow": "Aktualisierter Flow: __label__", "removed-flow": "Entfernter Flow: __label__", @@ -145,7 +147,6 @@ } } }, - "storage": { "index": { "forbidden-flow-name": "Unzulässiger Flow-Name" @@ -159,6 +160,7 @@ "restore": "Die '__type__'-Dateisicherung wird wiederhergestellt: __path__", "restore-fail": "Die Wiederherstellung der '__type__'-Dateisicherung ist fehlgeschlagen: __message__", "fsync-fail": "Die Übertragung der Datei __path__ auf das Laufwerk ist fehlgeschlagen: __message__", + "warn_name": "Flows Dateiname nicht festgelegt. Name wird unter Verwendung des Hostnamens generiert.", "projects": { "changing-project": "Aktives Projekt wird festgelegt: __project__", "active-project": "Aktives Projekt: __project__", @@ -174,7 +176,6 @@ } } }, - "context": { "log-store-init": "Kontextspeicher: __name__ [__info__]", "error-loading-module": "Fehler beim Laden des Kontextspeichers: __message__", @@ -189,5 +190,4 @@ "error-write": "Fehler beim Schreiben des Kontextes: __message__" } } - } From fe5132be1dad0eced29995fba7091b376a8a1139 Mon Sep 17 00:00:00 2001 From: Dennis Neufeld Date: Sun, 24 Jul 2022 16:31:01 +0200 Subject: [PATCH 019/253] Update german translation 2 --- .../editor-client/locales/de/editor.json | 56 +++++++++---------- .../@node-red/runtime/locales/de/runtime.json | 16 +++--- 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/locales/de/editor.json b/packages/node_modules/@node-red/editor-client/locales/de/editor.json index 36bf537de..93a2f5946 100755 --- a/packages/node_modules/@node-red/editor-client/locales/de/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/de/editor.json @@ -105,7 +105,7 @@ "search": "Flows durchsuchen", "searchInput": "Flows durchsuchen", "subflows": "Subflow", - "createSubflow": "Subflow hinzufügen", + "createSubflow": "Hinzufügen", "selectionToSubflow": "Auswahl in Subflow umwandeln", "flows": "Flow", "add": "Hinzufügen", @@ -182,8 +182,8 @@ "missing-modules": "

Flows angehalten aufgrund fehlender Module

", "safe-mode": "

Flows sind im abgesicherten Modus gestoppt.

Flows können bearbeitet und übernommen (deploy) werden, um sie neu zu starten.

", "restartRequired": "Node-RED muss neu gestartet werden, damit die Module nach Upgrade aktiviert werden", - "credentials_load_failed": "

Flows gestoppt, da die Anmeldeinformationen nicht entschlüsselt werden konnten.

Die Datei mit den Flow-Anmeldeinformationen ist verschlüsselt, aber der Schlüssel des Projekts fehlt oder ist ungültig.

", - "credentials_load_failed_reset": "

Die Anmeldeinformationen konnten nicht entschlüsselt werden.

Die Datei mit den Flow-Anmeldeinformationen ist verschlüsselt, aber der Schlüssel des Projekts fehlt oder ist ungültig.

Die Datei mit den Flow-Anmeldeinformationen wird bei der nächsten Übernahme (deploy) zurückgesetzt. Alle vorhandenen Flow-Anmeldeinformationen werden gelöscht.

", + "credentials_load_failed": "

Flows gestoppt, da die Credentials nicht entschlüsselt werden konnten.

Die Datei mit den Flow-Credentials ist verschlüsselt, aber der Schlüssel des Projekts fehlt oder ist ungültig.

", + "credentials_load_failed_reset": "

Die Credentials konnten nicht entschlüsselt werden.

Die Datei mit den Flow-Credentials ist verschlüsselt, aber der Schlüssel des Projekts fehlt oder ist ungültig.

Die Datei mit den Flow-Credentials wird bei der nächsten Übernahme (deploy) zurückgesetzt. Alle vorhandenen Flow-Credentials werden gelöscht.

", "missing_flow_file": "

Die Flow-Datei des Projekts wurde nicht gefunden.

Das Projekt ist nicht mit einer Flow-Datei konfiguriert.

", "missing_package_file": "

Die Paket-Datei des Projekts wurde nicht gefunden.

In dem Projekt fehlt die 'package.json'-Datei.

", "project_empty": "

Das Projekt ist leer.

Soll ein Standardsatz an Projektdateien erstellen werden?
Andernfalls müssen die Dateien manuell außerhalb des Editors dem Projekt hinzugefügt werden.

", @@ -208,7 +208,7 @@ "pull": "Projekt '__project__' erneut geladen", "revert": "Änderungen im Projekt '__project__' rückgängig gemacht", "merge-complete": "Git-Merge abgeschlossen", - "setupCredentials": "Anmeldeinformationen einrichten", + "setupCredentials": "Credentials einrichten", "setupProjectFiles": "Projektdateien einrichten", "no": "Nein, Danke", "createDefault": "Standardprojektdateien erstellen", @@ -216,7 +216,7 @@ }, "label": { "manage-project-dep": "Projektabhängigkeiten verwalten", - "setup-cred": "Anmeldeinformationen einrichten", + "setup-cred": "Credentials einrichten", "setup-project": "Projektdateien einrichten", "create-default-package": "Standardpaketdatei erstellen", "no-thanks": "Nein, Danke", @@ -443,7 +443,7 @@ "icon": "Icon", "inputType": "Eingangstyp", "selectType": "Wähle Typen ...", - "loadCredentials": "Lade Node-Anmeldeinformationen", + "loadCredentials": "Lade Node-Credentials", "inputs": { "input": "Eingang", "select": "Auswahl", @@ -459,7 +459,7 @@ "json": "JSON", "bin": "buffer", "env": "Umgebungsvariable", - "cred": "Anmeldeinformation" + "cred": "Credentials" }, "menu": { "input": "Eingang", @@ -479,7 +479,7 @@ "errors": { "scopeChange": "Wenn Sie den Geltungsbereich (scope) ändern, wird er für Nodes in anderen Flows nicht verfügbar sein", "invalidProperties": "Ungültige Eigenschaften:", - "credentialLoadFailed": "Laden der Node-Anmeldeinformationen fehlgeschlagen" + "credentialLoadFailed": "Laden der Node-Credentials fehlgeschlagen" } }, "keyboard": { @@ -747,7 +747,7 @@ "addToProject": "Zu Projekt hinzufügen", "files": "Dateien", "flow": "Flow", - "credentials": "Anmeldeinformationen", + "credentials": "Credentials", "package": "Paket", "packageCreate": "Datei wird erstellt beim Speichern der Änderungen", "fileNotExist": "Datei existiert nicht", @@ -760,7 +760,7 @@ "changeTheEncryptionKey": "Schlüssel ändern", "currentKey": "Aktueller Schlüssel", "newKey": "Neuer Schlüssel", - "credentialsAlert": "Dadurch werden alle vorhandenen Anmeldeinformationen gelöscht", + "credentialsAlert": "Dadurch werden alle vorhandenen Credentials gelöscht", "versionControl": "Versionsverwaltung (Git)", "branches": "Branches", "noBranches": "Keine Branches", @@ -896,7 +896,7 @@ "date": "timestamp", "jsonata": "JSONata", "env": "Umgebungsvariable", - "cred": "Anmeldeinformation" + "cred": "Credentials" } }, "editableList": { @@ -1036,7 +1036,7 @@ "passphrase": "Passphrase", "ssh-key-desc": "Bevor Sie ein Repository über SSH lokal klonen können, müssen Sie einen SSH-Schlüssel hinzufügen, um auf diesen zugreifen zu können", "ssh-key-add": "SSH-Schlüssel hinzufügen", - "credential-key": "Schlüssel für Anmeldeinformationen", + "credential-key": "Schlüssel für Credentials", "cant-get-ssh-key": "Fehler! Der ausgewählte SSH-Schlüsselpfad kann nicht abgerufen werden", "already-exists2": "bereits vorhanden", "git-error": "Git-Fehler", @@ -1048,27 +1048,27 @@ "create": "Erstellen Sie Ihre Projektdateien", "desc0": "Ein Projekt enthält Ihre Flow-Dateien, eine README-Datei und die 'package.json'-Datei.", "desc1": "Es kann alle anderen Dateien enthalten, die im Git-Repository verwaltet werden sollen.", - "desc2": "Ihre vorhandenen Flow- und Anmeldeinformations-Dateien werden in das Projekt kopiert.", + "desc2": "Ihre vorhandenen Flow- und Credential-Dateien werden in das Projekt kopiert.", "flow-file": "Flow-Datei", - "credentials-file": "Datei mit Anmeldeinformationen" + "credentials-file": "Datei mit Credentials" }, "encryption-config": { - "setup": "Einrichtung der Verschlüsselung Ihrer Datei mit den Anmeldeinformationen", - "desc0": "Die Datei mit den Flow-Anmeldeinformationen kann verschlüsselt werden, um ihren Inhalt zu schützen.", - "desc1": "Wenn Sie diese Anmeldeinformationen in einem öffentlichen Repository speichern möchten, müssen Sie sie mit einen geheimen Schlüsselausdruck verschlüsseln.", - "desc2": "Die Datei mit den Flow-Anmeldeinformationen ist derzeit nicht verschlüsselt.", + "setup": "Einrichtung der Verschlüsselung Ihrer Datei mit den Credentials", + "desc0": "Die Datei mit den Flow-Credentials kann verschlüsselt werden, um ihren Inhalt zu schützen.", + "desc1": "Wenn Sie diese Credentials in einem öffentlichen Repository speichern möchten, müssen Sie sie mit einen geheimen Schlüsselausdruck verschlüsseln.", + "desc2": "Die Datei mit den Flow-Credentials ist derzeit nicht verschlüsselt.", "desc3": "D.h. ihr Inhalt (z.B. Passwörter und Zugriffs-Tokens) kann von jedem mit Zugriff auf die Datei gelesen werden.", - "desc4": "Wenn Sie diese Anmeldeinformationen in einen öffentlichen Repository speichern möchten, müssen Sie diese verschlüsseln, indem Sie einen geheimen Schlüsselausdruck eingeben.", - "desc5": "Ihre Datei mit den Flow-Anmeldeinformationen wird derzeit mit dem Eintrag 'credentialSecret' Ihrer Einstellungsdatei als Schlüssel verschlüsselt.", - "desc6": "Die Datei mit den Flow-Anmeldeinformationen wird derzeit mit einem vom System generierten Schlüssel verschlüsselt. Sie sollten einen neuen geheimen Schlüssel für dieses Projekt vorgeben.", + "desc4": "Wenn Sie diese Credentials in einen öffentlichen Repository speichern möchten, müssen Sie diese verschlüsseln, indem Sie einen geheimen Schlüsselausdruck eingeben.", + "desc5": "Ihre Datei mit den Flow-Credentials wird derzeit mit dem Eintrag 'credentialSecret' Ihrer Einstellungsdatei als Schlüssel verschlüsselt.", + "desc6": "Die Datei mit den Flow-Credentials wird derzeit mit einem vom System generierten Schlüssel verschlüsselt. Sie sollten einen neuen geheimen Schlüssel für dieses Projekt vorgeben.", "desc7": "Der Schlüssel wird separat von den Projektdateien gespeichert. Sie müssen den Schlüssel angeben, damit dieses Projekt auch in einem anderen Node-RED-System verwendet werden kann.", - "credentials": "Anmeldeinformationen", + "credentials": "Credentials", "enable": "Verschlüsselung aktivieren", "disable": "Verschlüsselung deaktivieren", "disabled": "deaktiviert", "copy": "Vorhandenen Schlüssel ersetzen", "use-custom": "Eigenen Schlüssel verwenden", - "desc8": "Die Datei mit den Anmeldeinformationen wird nicht verschlüsselt und ihr Inhalt kann leicht gelesen werden", + "desc8": "Die Datei mit den Credentials wird nicht verschlüsselt und ihr Inhalt kann leicht gelesen werden", "create-project-files": "Projektdateien erstellen", "create-project": "Projekt erstellen", "already-exists": "bereits vorhanden", @@ -1093,12 +1093,12 @@ "desc": "Beschreibung", "opt": "Optional", "flow-file": "Flow-Datei", - "credentials": "Anmeldeinformationen", + "credentials": "Credentials", "enable-encryption": "Verschlüsselung aktivieren", "disable-encryption": "Verschlüsselung deaktivieren", "encryption-key": "Schlüssel", - "desc0": "Eine Ausdruck, mit der Sie Ihre Anmeldeinformationen schützen", - "desc1": "Die Datei mit den Anmeldeinformationen wird nicht verschlüsselt und ihr Inhalt kann leicht gelesen werden", + "desc0": "Eine Ausdruck, mit der Sie Ihre Credentials schützen", + "desc1": "Die Datei mit den Credentials wird nicht verschlüsselt und ihr Inhalt kann leicht gelesen werden", "git-url": "Git-Repository-URL", "protocols": "https://, ssh:// oder file://", "auth-failed": "Authentifizierung fehlgeschlagen", @@ -1108,7 +1108,7 @@ "passphrase": "Passphrase", "desc2": "Bevor Sie ein Repository über SSH klonen können, müssen Sie einen SSH-Schlüssel hinzufügen, um auf diesen zu zugreifen", "add-ssh-key": "Einen SSH-Schlüssel hinzufügen", - "credentials-encryption-key": "Schlüssel für Anmeldeinformationen", + "credentials-encryption-key": "Schlüssel für Credentials", "already-exists-2": "bereits vorhanden", "git-error": "Git-Fehler", "con-failed": "Verbindung fehlgeschlagen", @@ -1167,7 +1167,7 @@ "takeATour": "Tour starten", "start": "Start", "next": "Nächste", - "welcomeTours": "Willkommens-Touren" + "welcomeTours": "Welcome Tours" }, "diagnostics": { "title": "System-Informationen" diff --git a/packages/node_modules/@node-red/runtime/locales/de/runtime.json b/packages/node_modules/@node-red/runtime/locales/de/runtime.json index 99800c628..0249d638d 100755 --- a/packages/node_modules/@node-red/runtime/locales/de/runtime.json +++ b/packages/node_modules/@node-red/runtime/locales/de/runtime.json @@ -85,7 +85,7 @@ "settings": { "user-not-available": "Einstellungen konnten nicht gespeichert werden: __message__", "not-available": "Einstellungen nicht verfügbar", - "property-read-only": "Die Eigenschaft '__prop__ 'ist schreibgeschützt", + "property-read-only": "Die Eigenschaft '__prop__' ist schreibgeschützt", "readonly-mode": "Laufzeitumgebung im Nur-Lese-Modus. Änderungen werden nicht gespeichert." }, "library": { @@ -97,12 +97,12 @@ }, "nodes": { "credentials": { - "error": "Fehler beim Laden der Anmeldeinformationen: __message__", - "error-saving": "Fehler beim Speichern der Anmeldeinformationen: __message__", - "not-registered": "Der Anmeldeinformations-Typ '__type__' ist nicht registriert", - "system-key-warning": "\n---------------------------------------------------------------------\nDie Datei mit den Flow-Anmeldeinformationen wird mit einem vom System\ngenerierten Schlüssel verschlüsselt.\nWenn der vom System generierte Schlüssel aus irgendeinem Grund\nverloren geht, kann die Datei mit den Anmeldeinformationen nicht\nwiederhergestellt werden. Sie muss dann gelöscht und die\nAnmeldeinformationen müssen erneut eingestellt werden.\nEs sollte ein eigener Schlüssel mit Hilfe der Option\n'credentialSecret' in der Einstellungsdatei vorgegeben werden.\nNode-RED wird dann die Datei mit den Flow-Anmeldeinformationen\nbei der nächsten Übernahme (deploy) einer Änderung erneut\nverschlüsseln.\n---------------------------------------------------------------------", - "unencrypted": "Verwende unverschlüsselte Anmeldeinformationen", - "encryptedNotFound": "Verschlüsselte Anmeldeinformationen nicht gefunden" + "error": "Fehler beim Laden der Credentials: __message__", + "error-saving": "Fehler beim Speichern der Credentials: __message__", + "not-registered": "Der Credentials-Typ '__type__' ist nicht registriert", + "system-key-warning": "\n---------------------------------------------------------------------\nDie Datei mit den Flow-Credentials wird mit einem vom System\ngenerierten Schlüssel verschlüsselt.\nWenn der vom System generierte Schlüssel aus irgendeinem Grund\nverloren geht, kann die Datei mit den Credentials nicht\nwiederhergestellt werden. Sie muss dann gelöscht und die\nCredentials müssen erneut eingestellt werden.\nEs sollte ein eigener Schlüssel mit Hilfe der Option\n'credentialSecret' in der Einstellungsdatei vorgegeben werden.\nNode-RED wird dann die Datei mit den Flow-Credentials\nbei der nächsten Übernahme (deploy) einer Änderung erneut\nverschlüsseln.\n---------------------------------------------------------------------", + "unencrypted": "Verwende unverschlüsselte Credentials", + "encryptedNotFound": "Verschlüsselte Credentials nicht gefunden" }, "flows": { "safe-mode": "Die Flows sind gestoppt im abgesicherten Modus. Übernahme (deploy) zum Starten.", @@ -160,7 +160,7 @@ "restore": "Die '__type__'-Dateisicherung wird wiederhergestellt: __path__", "restore-fail": "Die Wiederherstellung der '__type__'-Dateisicherung ist fehlgeschlagen: __message__", "fsync-fail": "Die Übertragung der Datei __path__ auf das Laufwerk ist fehlgeschlagen: __message__", - "warn_name": "Flows Dateiname nicht festgelegt. Name wird unter Verwendung des Hostnamens generiert.", + "warn_name": "Name der Flows-Datei nicht festgelegt. Name wird unter Verwendung des Hostnamens generiert.", "projects": { "changing-project": "Aktives Projekt wird festgelegt: __project__", "active-project": "Aktives Projekt: __project__", From 0908369dba0a7845253b4ed94820cbead974ead8 Mon Sep 17 00:00:00 2001 From: Fabulous Muller Date: Mon, 25 Jul 2022 16:35:06 -0300 Subject: [PATCH 020/253] Portuguese Brazilian (pt-BR) translation Portuguese Brazilian, pt-BR, translation based on v.3.0.1 branch. The initial efforts started with PR #3100(V.2.0.3) but there were some problems and the quality needed to be improved. Now I fixed some failures and reviewed files line by line, double-checked with text editor and dictionary updated to last ortographic agreement of the portuguese language; anyway errors still can happen, this is not a robotic translation and portuguese has a latin branch, so one word in english(sometimes) has many possible translations in portuguese; just to complicate a litlle bit. So we are finally making pt-BR available in Node-Red and hope to just improve from now on. Resolves: #3100 --- .../editor-client/locales/pt-BR/editor.json | 1186 +++++++++++++++++ .../editor-client/locales/pt-BR/infotips.json | 23 + .../editor-client/locales/pt-BR/jsonata.json | 274 ++++ .../nodes/locales/pt-BR/common/20-inject.html | 40 + .../nodes/locales/pt-BR/common/21-debug.html | 26 + .../locales/pt-BR/common/24-complete.html | 29 + .../nodes/locales/pt-BR/common/25-catch.html | 42 + .../nodes/locales/pt-BR/common/25-status.html | 34 + .../nodes/locales/pt-BR/common/60-link.html | 66 + .../locales/pt-BR/common/90-comment.html | 22 + .../locales/pt-BR/common/98-unknown.html | 28 + .../locales/pt-BR/function/10-function.html | 64 + .../locales/pt-BR/function/10-switch.html | 50 + .../locales/pt-BR/function/15-change.html | 39 + .../locales/pt-BR/function/16-range.html | 44 + .../locales/pt-BR/function/80-template.html | 51 + .../locales/pt-BR/function/89-delay.html | 64 + .../locales/pt-BR/function/89-trigger.html | 50 + .../nodes/locales/pt-BR/function/90-exec.html | 83 ++ .../nodes/locales/pt-BR/function/rbe.html | 41 + .../nodes/locales/pt-BR/messages.json | 1127 ++++++++++++++++ .../nodes/locales/pt-BR/network/05-tls.html | 19 + .../locales/pt-BR/network/06-httpproxy.html | 22 + .../nodes/locales/pt-BR/network/10-mqtt.html | 158 +++ .../locales/pt-BR/network/21-httpin.html | 100 ++ .../locales/pt-BR/network/21-httprequest.html | 90 ++ .../locales/pt-BR/network/22-websocket.html | 43 + .../nodes/locales/pt-BR/network/31-tcpin.html | 45 + .../nodes/locales/pt-BR/network/32-udp.html | 31 + .../nodes/locales/pt-BR/parsers/70-CSV.html | 49 + .../nodes/locales/pt-BR/parsers/70-HTML.html | 36 + .../nodes/locales/pt-BR/parsers/70-JSON.html | 53 + .../nodes/locales/pt-BR/parsers/70-XML.html | 50 + .../nodes/locales/pt-BR/parsers/70-YAML.html | 34 + .../locales/pt-BR/sequence/17-split.html | 165 +++ .../nodes/locales/pt-BR/sequence/18-sort.html | 41 + .../locales/pt-BR/sequence/19-batch.html | 43 + .../nodes/locales/pt-BR/storage/10-file.html | 67 + .../nodes/locales/pt-BR/storage/23-watch.html | 30 + .../runtime/locales/pt-BR/runtime.json | 199 +++ 40 files changed, 4658 insertions(+) create mode 100644 packages/node_modules/@node-red/editor-client/locales/pt-BR/editor.json create mode 100755 packages/node_modules/@node-red/editor-client/locales/pt-BR/infotips.json create mode 100755 packages/node_modules/@node-red/editor-client/locales/pt-BR/jsonata.json create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/common/20-inject.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/common/21-debug.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/common/24-complete.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/common/25-catch.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/common/25-status.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/common/60-link.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/common/90-comment.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/common/98-unknown.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/function/10-function.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/function/10-switch.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/function/15-change.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/function/16-range.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/function/80-template.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/function/89-delay.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/function/89-trigger.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/function/90-exec.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/function/rbe.html create mode 100755 packages/node_modules/@node-red/nodes/locales/pt-BR/messages.json create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/network/05-tls.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/network/06-httpproxy.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/network/10-mqtt.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/network/21-httpin.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/network/21-httprequest.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/network/22-websocket.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/network/31-tcpin.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/network/32-udp.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/parsers/70-CSV.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/parsers/70-HTML.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/parsers/70-JSON.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/parsers/70-XML.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/parsers/70-YAML.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/sequence/17-split.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/sequence/18-sort.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/sequence/19-batch.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/storage/10-file.html create mode 100644 packages/node_modules/@node-red/nodes/locales/pt-BR/storage/23-watch.html create mode 100644 packages/node_modules/@node-red/runtime/locales/pt-BR/runtime.json diff --git a/packages/node_modules/@node-red/editor-client/locales/pt-BR/editor.json b/packages/node_modules/@node-red/editor-client/locales/pt-BR/editor.json new file mode 100644 index 000000000..8a428879c --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/locales/pt-BR/editor.json @@ -0,0 +1,1186 @@ +{ + "common": { + "label": { + "name": "Nome", + "ok": "O.K.", + "done": "Feito", + "cancel": "Cancelar", + "delete": "Deletar", + "close": "Fechar", + "load": "Carregar", + "save": "Salvar", + "import": "Importar", + "export": "Exportar", + "back": "Voltar", + "next": "Próximo", + "clone": "Clonar", + "cont": "Continuar", + "style": "Estilo", + "line": "Contorno", + "fill": "Preenchido", + "label": "Etiqueta", + "color": "Cor", + "position": "Posição", + "enable": "Habilitado", + "disable": "Desabilitado", + "upload": "Subir" + }, + "type": { + "string": "cadeia de caracteres", + "number": "numero", + "boolean": "booliano", + "array": "matriz", + "buffer": "armazenamento temporário", + "object": "objeto", + "jsonString": "cadeia de caracteres JSON", + "undefined": "indefinido", + "null": "nulo" + } + }, + "event": { + "loadPlugins": "Carregando programas adicionais", + "loadPalette": "Carregando Paleta", + "loadNodeCatalogs": "Carregando Catálogo de Nós", + "loadNodes": "Carregando Nós __count__", + "loadFlows": "Carregando Fluxos", + "importFlows": "Adicionar Fluxos ao espaço de trabalho", + "importError": "

Erro ao adicionar fluxos

__message__

", + "loadingProject": "Carregando projeto" + }, + "workspace": { + "defaultName": "Fluxo __number__", + "editFlow": "Editar Fluxo: __name__", + "confirmDelete": "Confirmar exclusão", + "delete": "Tem certeza de que deseja excluir '__label__'?", + "dropFlowHere": "Solte o fluxo aqui", + "addFlow": "Adicionar fluxo", + "addFlowToRight": "Adicionar fluxo à direita", + "hideFlow": "Esconder fluxo", + "hideOtherFlows": "Esconder outros fluxos", + "showAllFlows": "Mostrar todos os fluxos", + "hideAllFlows": "Esconder todos os fluxos", + "hiddenFlows": "Listar __count__ fluxo escondido", + "hiddenFlows_plural": "Listar __count__ fluxos escondidos", + "showLastHiddenFlow": "Mostrar último fluxo escondido", + "listFlows": "Listar Fluxos", + "listSubflows": "Listar subfluxos", + "status": "Estado", + "enabled": "Habilitar", + "disabled": "Desabilitar", + "info": "Descrição", + "selectNodes": "Clique em nós para selecionar" + }, + "menu": { + "label": { + "view": { + "view": "Visão", + "grid": "Grade", + "storeZoom": "Restaura nível do zoom ao carregar", + "storePosition": "Restaura posição de rolamento ao carregar", + "showGrid": "Mostre as grades", + "snapGrid": "Ajustar à grade", + "gridSize": "Tamanho da grade", + "textDir": "Direção do texto", + "defaultDir": "Padrão", + "ltr": "Esquerta-para-direita", + "rtl": "Direita-para-esquerda", + "auto": "Contextual", + "language": "Linguagem", + "browserDefault": "Padrão do navegador" + }, + "sidebar": { + "show": "Mostrar barra lateral" + }, + "palette": { + "show": "Mostrar paleta" + }, + "edit": "Editar", + "settings": "Configurações", + "userSettings": "Configurações do usuário", + "nodes": "Nós", + "displayStatus": "Mostrar estados do nó", + "displayConfig": "Configuração dos nós", + "import": "Importar", + "export": "Exportar", + "search": "Procurar fluxos", + "searchInput": "procure seus fluxos", + "subfluxo": "subfluxo", + "createSubflow": "Criar Subfluxo", + "selectionToSubflow": "Seleção para subfluxo", + "flows": "Fluxos", + "add": "Adicionar", + "rename": "Renomear", + "delete": "Apagar", + "keyboardShortcuts": "Atalhos do teclado", + "login": "Ingressar", + "logout": "Sair", + "editPalette": "Gerenciar paleta", + "other": "Outro", + "showTips": "Mostre as dicas", + "showWelcomeTours": "Mostrar excursão guiada para novas versões", + "help": "sítio do Node-RED", + "projects": "Projetos", + "projects-new": "Novo", + "projects-open": "Abrir", + "projects-settings": "Configurações do projeto", + "showNodeLabelDefault": "Mostrar rótulo de nós recém-adicionados", + "codeEditor": "Editor de código", + "groups": "Grupos", + "groupSelection": "Agrupar seleção", + "ungroupSelection": "Desagrupar seleção", + "groupMergeSelection": "Mesclar seleção", + "groupRemoveSelection": "Remover do grupo", + "arrange": "Organizar", + "alignLeft": "Alinhar à esquerda", + "alignCenter": "Alinhar ao centro", + "alignRight": "Alinhar à direita", + "alignTop": "Alinhar ao início", + "alignMiddle": "Alinhar ao meio", + "alignBottom": "Alinhar ao final ", + "distributeHorizontally": "Distribuir horizontalmente", + "distributeVertically": "Distribuir verticalmente", + "moveToBack": "Mover para detrás", + "moveToFront": "Mover para a frente", + "moveBackwards": "Volta", + "moveForwards": "Avança" + } + }, + "actions": { + "toggle-navigator": "Alternar navegador", + "zoom-out": "Diminuir zoom ", + "zoom-reset": "Reiniciar zoom", + "zoom-in": "Aumentar zoom", + "search-flows": "Procura fluxos", + "search-prev": "Anterior", + "search-next": "Próximo", + "search-counter": "\"__term__\" __result__ of __count__" + }, + "user": { + "loggedInAs": "Acessado como __name__", + "username": "Nome do Usuário", + "password": "Senha", + "login": "Ingressar", + "loginFailed": "Falha ao ingressar", + "notAuthorized": "Não autorizado", + "errors": { + "settings": "Você deve ingressar para acessar as configurações", + "deploy": "Você deve ingressar para implementar mudanças", + "notAuthorized": "Você precisa ter ingressado para realizar esta ação" + } + }, + "notification": { + "state": { + "flowsStopped": "Fluxos parados", + "flowsStarted": "Fluxos iniciados" + }, + "warning": "Aviso: __message__", + "warnings": { + "undeployedChanges": "o nó tem mudanças não implementadas", + "nodeActionDisabled": "ações do nó desabilitadas", + "nodeActionDisabledSubflow": "ações do nó desabilitadas dentro do subfluxo", + "missing-types": "

Fluxos parados devido a tipos de nós ausentes.

", + "missing-modules": "

Os fluxos pararam devido à falta de módulos.

", + "safe-mode": "

Fluxos parados no modo de segurança.

Você pode modificar seus fluxos e implementar as mudanças para reiniciar.

", + "restartRequired": "O Node-RED deve ser reiniciado para habilitar os módulos atualizados", + "credentials_load_failed": "

Os fluxos pararam porque as credenciais não puderam ser descriptografadas.

O arquivo de credencial de fluxo está criptografado, mas a chave de criptografia do projeto está ausente ou é inválida.

", + "credentials_load_failed_reset": "

As credenciais não puderam ser descriptografadas

O arquivo de credencial do fluxo está criptografado, mas a chave de criptografia do projeto está ausente ou é inválida.

O arquivo de credencial de fluxo será redefinido na próxima implantação. Todas as credenciais de fluxo existentes serão apagadas.

", + "missing_flow_file": "

Arquivo de fluxo de projeto não encontrado.

O projeto não está configurado com um arquivo de fluxo.

", + "missing_package_file": "

Arquivo de pacote de projeto não encontrado.

O projeto está sem um arquivo package.json.

", + "project_empty": "

O projeto está vazio.

Você deseja criar um conjunto padrão de arquivos de projeto?
Caso contrário, você terá que adicionar arquivos manualmente ao projeto fora do editor.

", + "project_not_found": "

Projeto '__project__' não encontrado.

", + "git_merge_conflict": "

A mesclagem automática de alterações falhou.

Corrija os conflitos não mesclados e confirme os resultados.

" + }, + "error": "Erro: __message__", + "errors": { + "lostConnection": "Conexão perdida com o servidor, reconectando...", + "lostConnectionReconnect": "Conexão perdida com o servidor, reconectando em __time__s.", + "lostConnectionTry": "Tentar novamente", + "cannotAddSubflowToItself": "Não é possível adicionar subfluxo a si mesmo", + "cannotAddCircularReference": "Não é possível adicionar subfluxo - referência circular detectada", + "unsupportedVersion": "

Usando uma versão não suportada do Node.js

Você deve atualizar para a versão mais recente do Node.js LTS

", + "failedToAppendNode": "

Falha ao carregar '__module__'

__error__

" + }, + "project": { + "change-branch": "Mudar para ramo local'__project__'", + "merge-abort": "Mesclagem Git abortada", + "loaded": "Projeto '__project__' carregado", + "updated": "Projeto '__project__' atualizado", + "pull": "Projeto '__project__' recarregado", + "revert": "Projeto '__project__' revertido", + "merge-complete": "Mesclagem Git completa", + "setupCredentials": "Configurar credenciais", + "setupProjectFiles": "Configurar arquivos de projeto", + "no": "Não obrigado", + "createDefault": "Criar arquivos de projeto padrão", + "mergeConflict": "Mostrar conflitos de mesclagem" + }, + "label": { + "manage-project-dep": "Gerenciar dependências do projeto", + "setup-cred": "Configurar credenciais", + "setup-project": "Arquivos de projeto de instalação", + "create-default-package": "Criar arquivo de pacote padrão", + "no-thanks": "Não obrigado", + "create-default-project": "Crie arquivos de projeto padrão", + "show-merge-conflicts": "Mostrar conflitos de mesclagem", + "unknownNodesButton": "Procura por nós desconhecidos" + } + }, + "clipboard": { + "clipboard": "Área de transferência", + "nodes": "Nós", + "node": "__count__ nó", + "node_plural": "__count__ nós", + "configNode": "__count__ nó de configuração", + "configNode_plural": "__count__ nós de configuração", + "group": "__count__ grupo", + "group_plural": "__count__ grupos", + "flow": "__count__ fluxo", + "flow_plural": "__count__ fluxos", + "subflow": "__count__ subfluxo", + "subflow_plural": "__count__ subfluxos", + "replacedNodes": "__count__ nó substituído", + "replacedNodes_plural": "__count__ nós substituídos", + "pasteNodes": "Colar fluxo JSON ou", + "selectFile": "selecione um arquivo para importar", + "importNodes": "Importar nós", + "exportNodes": "Exportar nós", + "download": "Baixar", + "importUnrecognised": "Tipo não reconhecido importado:", + "importUnrecognised_plural": "Tipos não reconhecidos importados:", + "importDuplicate": "Nó duplicado importado:", + "importDuplicate_plural": "Nós duplicados importados:", + "nodesExported": "Nós exportados para a área de transferência", + "nodesImported": "Importado:", + "nodeCopied": "__count__ nó copiado", + "nodeCopied_plural": "__count__ nós copiados", + "groupCopied": "__count__ grupo copiado", + "groupCopied_plural": "__count__ grupos copiados", + "groupStyleCopied": "Estilo de grupo copiado", + "invalidFlow": "Fluxo inválido: __message__", + "recoveredNodes": "Nós recuperados", + "recoveredNodesInfo": "Os nós neste fluxo não tinham um ID de fluxo válido quando foram importados. Eles foram adicionados a este fluxo para que você possa restaurá-los ou excluí-los.", + "recoveredNodesNotification": "

Nós importados sem um ID de fluxo válido

Eles foram adicionados a um novo fluxo chamado '__flowName__'.

", + "export": { + "selected": "nós selecionados", + "current": "fluxo corrente", + "all": "todos os fluxos", + "compact": "compactar", + "formatted": "formatado", + "copy": "Copiar para área de transferência", + "export": "Exportar biblioteca", + "exportAs": "Exportar como", + "overwrite": "Substituir", + "exists": "

\"__file__\" já existe.

Deseja substituir?

" + }, + "import": { + "import": "Importar para", + "importSelected": "Importar selecionado", + "importCopy": "Importar cópia", + "viewNodes": "Ver nós...", + "newFlow": "novo fluxo", + "replace": "substituir", + "errors": { + "notArray": "A entrada não é uma matriz JSON", + "itemNotObject": "A entrada não é um fluxo válido - o item __index__ não é um objeto de nó", + "missingId": "A entrada não é um fluxo válido - item __index__ faltando propriedade 'id'", + "missingType": "A entrada não é um fluxo válido - item __index__ faltando propriedade 'type'" + }, + "conflictNotification1": "Alguns dos nós que você está importando já existem em sua área de trabalho.", + "conflictNotification2": "Selecione quais nós importar e se deseja substituir os nós existentes ou importar uma cópia deles." + }, + "copyMessagePath": "Caminho copiado", + "copyMessageValue": "Valor copiado", + "copyMessageValue_truncated": "Valor truncado copiado" + }, + "deploy": { + "deploy": "implementar", + "full": "Cheio", + "fullDesc": "Implementar tudo no espaço de trabalho", + "modifiedFlows": "Fluxos Modificados", + "modifiedFlowsDesc": "Implantar apenas fluxos que contêm nós alterados", + "modifiedNodes": "Nós Modificados", + "modifiedNodesDesc": "Implantar apenas nós que mudaram", + "startFlows": "Iniciar", + "startFlowsDesc": "Iniciar Fluxos", + "stopFlows": "Parar", + "stopFlowsDesc": "Parar Fluxos", + "restartFlows": "Reiniciar Fluxos", + "restartFlowsDesc": "Reinicia os fluxos atuais implantados", + "successfulDeploy": "Implementado com sucesso", + "successfulRestart": "Fluxos reiniciados com sucesso", + "deployFailed": "Implementação falhou: __message__", + "unusedConfigNodes": "Você tem alguns nós de configuração não utilizados.", + "unusedConfigNodesButton": "Procurar por nós de configuração não utilizados", + "unknownNodesButton": "Procurar por nós desconhecidos", + "invalidNodesButton": "Procurar por nós inválidos", + "errors": { + "noResponse": "sem resposta do servidor" + }, + "confirm": { + "button": { + "ignore": "Ignorar", + "confirm": "Confirmar implantação", + "review": "Rever alterações", + "cancel": "Cancelar", + "merge": "Mesclar", + "overwrite": "Ignorar e implantar" + }, + "undeployedChanges": "Você tem alterações não implementadas. \n\n Se sair desta página, essas alterações serão perdidas.", + "improperlyConfigured": "O espaço de trabalho contém alguns nós que não estão configurados corretamente:", + "unknown": "O espaço de trabalho contém alguns tipos de nós desconhecidos:", + "confirm": "Tem certeza que deseja implantar?", + "doNotWarn": "não avisar sobre isso de novo ", + "conflict": "O servidor está executando um conjunto de fluxos mais recente.", + "backgroundUpdate": "Os fluxos no servidor foram atualizados.", + "conflictChecking": "Verificando se as alterações podem ser mescladas automaticamente", + "conflictAutoMerge": "As alterações não incluem conflitos e podem ser mescladas automaticamente.", + "conflictManualMerge": "As mudanças incluem conflitos que devem ser resolvidos antes de serem implantados.", + "plusNMore": "+ __count__ mais" + } + }, + "eventLog": { + "title": "Registro de Eventos", + "view": "Registro de visão" + }, + "diff": { + "unresolvedCount": "__count__ conflito não resolvido ", + "unresolvedCount_plural": "__count__ conflitos não resolvidos ", + "globalNodes": "Nós globais ", + "flowProperties": "Propriedades de fluxo ", + "type": { + "added": "adicionado", + "changed": "alterado", + "unchanged": "inalterado ", + "deleted": "Excluído", + "flowDeleted": "fluxo excluído ", + "flowAdded": "fluxo adicionado ", + "movedTo": "movido para __id__ ", + "movedFrom": "movido de __id__" + }, + "nodeCount": "__count__ nó", + "nodeCount_plural": "__count__ nós", + "local": "Mudanças locais ", + "remote": "Mudanças remotas ", + "reviewChanges": "Rever alterações ", + "noBinaryFileShowed": "Não é possível mostrar o conteúdo do arquivo binário ", + "viewCommitDiff": "Ver alterações de confirmação ", + "compareChanges": "Compare as alterações ", + "saveConflict": "Salvar resolução de conflito ", + "conflictHeader": "__resolved__ of __unresolved__ conflitos resolvidos", + "commonVersionError": "A versão comum não contém JSON válido: ", + "oldVersionError": "A versão antiga não contém JSON válido: ", + "newVersionError": "A nova versão não contém JSON válido: " + }, + "subflow": { + "editSubflowInstance": "Editar instância de subfluxo: __name__", + "editSubflow": "Editar modelo de subfluxo: __name__", + "edit": "Editar modelo de subfluxo", + "subflowInstances": "Existe uma instância __count__ deste modelo de subfluxo", + "subflowInstances_plural": "Existem __count__ instâncias deste modelo de subfluxo", + "editSubflowProperties": "editar propriedades", + "input": "entradas:", + "output": "saídas:", + "status": "estados do nó", + "deleteSubflow": "excluir subfluxo", + "confirmDelete": "Tem certeza de que deseja excluir este subfluxo?", + "info": "Descrição", + "category": "Categoria", + "module": "Módulo", + "license": "Licença", + "licenseNone": "Nenhum", + "licenseOther": "Outro", + "type": "Tipo de nó", + "version": "Versão", + "versionPlaceholder": "x.y.z", + "keys": "Palavras-chave", + "keysPlaceholder": "Palavras-chave separadas por vírgulas", + "author": "Autor", + "authorPlaceholder": "Seu nome ", + "desc": "Descrição", + "env": { + "restore": "Restaurar para o subfluxo padrão", + "remove": "Remover variável de ambiente" + }, + "errors": { + "noNodesSelected": "Não é possível criar subfluxo : nenhum nó selecionado", + "multipleInputsToSelection": "Não é possível criar subfluxo : várias entradas para seleção" + } + }, + "group": { + "editGroup": "Editar grupo: __name__", + "errors": { + "cannotCreateDiffGroups": "Não é possível criar grupo usando nós de grupos diferentes", + "cannotAddSubflowPorts": "Não é possível adicionar portas de subfluxo a um grupo" + } + }, + "editor": { + "configEdit": "Editar", + "configAdd": "Adicionar", + "configUpdate": "Atualizar", + "configDelete": "Excluir", + "nodesUse": "__count__ o nó usa esta configuração", + "nodesUse_plural": "__count__ os nós usam esta configuração", + "addNewConfig": "Adicionar novo __type__ configuração de nó", + "editNode": "Editar __type__ nó", + "editConfig": "Editar __type__ configuração de nó", + "addNewType": "Adicionar novo __type__...", + "nodeProperties": "propriedades do nó", + "label": "Etiqueta", + "color": "Cor", + "portLabels": "Rótulo da porta", + "labelInputs": "Entradas", + "labelOutputs": "Saídas", + "settingIcon": "Ícone", + "default": "padrão", + "noDefaultLabel": "nenhum", + "defaultLabel": "usar etiqueta padrão", + "searchIcons": "Procurar ícones", + "useDefault": "usar padrão", + "description": "Descrição", + "show": "Mostrar", + "hide": "Esconder", + "locale": "Selecione o idioma da interface", + "icon": "Ícone", + "inputType": "Tipo de entrada", + "selectType": "selecione os tipos...", + "loadCredentials": "Carregando credenciais de nó", + "inputs": { + "input": "entrada", + "select": "seleção", + "checkbox": "caixa de seleção", + "spinner": "caixa de mostruário giratório", + "none": "nenhum", + "hidden": "ocultar propriedade" + }, + "types": { + "str": "cadeia de caracteres", + "num": "numero", + "bool": "booliano", + "json": "JSON", + "bin": "armazenamento temporário", + "env": "variável de ambiente", + "cred": "credencial" + }, + "menu": { + "input": "entrada", + "select": "seleção", + "checkbox": "caixa de seleção", + "spinner": "roleta", + "hidden": "Somente etiqueta" + }, + "select": { + "label": "Etiqueta", + "value": "Valor" + }, + "spinner": { + "min": "Mínimo", + "max": "Máximo" + }, + "errors": { + "scopeChange": "Alterar o escopo o tornará indisponível para nós em outros fluxos que o utilizam", + "invalidProperties": "Propriedades inválidas:", + "credentialLoadFailed": "Falha ao carregar credenciais de nó" + } + }, + "keyboard": { + "title": "Atalhos do teclado", + "keyboard": "Teclado", + "filterActions": "ações de filtro", + "shortcut": "atalho", + "scope": "escopo", + "unassigned": "Não atribuído", + "global": "global", + "workspace": "área de trabalho", + "selectAll": "Selecionar todos", + "selectNone": "Selecionar nenhum", + "selectAllConnected": "Selecione todos os nós conectados", + "addRemoveNode": "Adicionar / remover nó da seleção", + "editSelected": "Editar nó selecionado", + "deleteSelected": "Excluir nós selecionados ou link", + "importNode": "Importar nós", + "exportNode": "Exportar nós", + "nudgeNode": "Mover nós selecionados (1px)", + "moveNode": "Mover nós selecionados (20px)", + "toggleSidebar": "Alternar barra lateral", + "togglePalette": "Alternar paleta", + "copyNode": "Copiar nós selecionados", + "cutNode": "Cortar nós selecionados", + "pasteNode": "Colar nós", + "copyGroupStyle": "Copiar estilo de grupo", + "pasteGroupStyle": "Colar estilo de grupo", + "undoChange": "Desfazer", + "redoChange": "Refazer", + "searchBox": "Abrir caixa de pesquisa", + "managePalette": "Gerenciar paleta", + "actionList": "Lista de Ação", + "splitWireWithLinks": "Separa a seleção com os nós de ligação" + }, + "library": { + "library": "Biblioteca", + "openLibrary": "Biblioteca aberta ...", + "saveToLibrary": "Salvar na biblioteca ...", + "typeLibrary": "__type__ biblioteca", + "unnamedType": "Sem nome __tipo__", + "exportedToLibrary": "Nós exportados para a biblioteca", + "dialogSaveOverwrite": "Já existe um __libraryType__ chamado __libraryName__. Substituir?", + "invalidFilename": "Nome de arquivo inválido", + "savedNodes": "Nós salvos", + "savedType": "Salvo __tipo__", + "saveFailed": "Falha ao salvar: __message__", + "newFolder": "Nova pasta", + "types": { + "local": "Local", + "examples": "Exemplos" + } + }, + "palette": { + "noInfo": "sem informação disponível", + "filter": "filtrar nós", + "search": "procurar módulos", + "addCategory": "Adicionar novo...", + "label": { + "subfluxo": "subfluxo", + "network": "rede", + "common": "comum", + "input": "entrada", + "output": "saída", + "function": "função", + "sequence": "sequencia", + "parser": "analisador sintático", + "social": "social", + "storage": "armazenar", + "analysis": "análise", + "advanced": "avançado" + }, + "actions": { + "collapse-all": "Recolher todas as categorias", + "expand-all": "Expandir todas as categorias" + }, + "event": { + "nodeAdded": "Nó adicionado à paleta:", + "nodeAdded_plural": "Nós adicionados à paleta:", + "nodeRemoved": "Nó removido da paleta:", + "nodeRemoved_plural": "Nós removidos da paleta:", + "nodeEnabled": "Nó habilitado:", + "nodeEnabled_plural": "Nós habilitados:", + "nodeDisabled": "Nó desativado:", + "nodeDisabled_plural": "Nós desativados:", + "nodeUpgraded": "Módulo de nó __module__ atualizado para a versão __version__", + "unknownNodeRegistered": "Erro carregando o nó:
  • __type__
    __error__
" + }, + "editor": { + "title": "Gerenciar paleta", + "palette": "Paleta", + "times": { + "seconds": "segundos atrás", + "minutes": "minutos atrás", + "minutesV": "__count__ minutos atrás", + "hoursV": "__count__ hora atrás", + "hoursV_plural": "__count__ horas atrás", + "daysV": "__count__ dia atrás", + "daysV_plural": "__count__ dias atrás", + "weeksV": "__count__ semana atrás", + "weeksV_plural": "__count__ semanas atrás", + "monthsV": "__count__ mês atrás", + "monthsV_plural": "__count__ meses atrás", + "yearsV": "__count__ ano atrás", + "yearsV_plural": "__count__ anos atrás", + "yearMonthsV": "__y__ ano, __count__ mês atrás", + "yearMonthsV_plural": "__y__ ano, __count__ meses atrás", + "yearsMonthsV": "__y__ anos, __count__ mês atrás", + "yearsMonthsV_plural": "__y__ anos, __count__ meses atrás" + }, + "nodeCount": "__label__ node", + "nodeCount_plural": "__label__ nodes", + "moduleCount": "módulo __count__ disponível", + "moduleCount_plural": "__count__ módulos disponíveis", + "inuse": "em uso", + "enableall": "habilitar todos", + "disableall": "desabilitar todos", + "enable": "habilitar", + "disable": "desabilitar", + "remove": "remover", + "update": "atualizar para __version__", + "updated": "atualizado", + "install": "instalar", + "installed": "instalado", + "conflict": "conflito", + "conflictTip": "

Este módulo não pode ser instalado porque inclui um
tipo de nó que já foi instalado

Conflitos com __module__

" , + "loading": "Carregando catálogos ...", + "tab-nodes": "Nós", + "tab-install": "Instalar", + "sort": "ordenar:", + "sortAZ": "a-z", + "sortRecent": "recente", + "more": "+ __count__ mais", + "upload": "Carregar arquivo tgz do módulo", + "refresh": "Atualizar lista de módulos", + "errors": { + "catalogLoadFailed": "

Falha ao carregar o catálogo de nós.

Verifique o console do navegador para obter mais informações

", + "installFailed": "

Falha ao instalar: __module__

__message__

Verifique o log para obter mais informações

", + "removeFailed": "

Falha ao remover: __module__

__message__

Verifique o log para obter mais informações

", + "updateFailed": "

Falha ao atualizar: __module__

__message__

Verifique o log para obter mais informações

", + "enableFailed": "

Falha ao ativar: __module__

__message__

Verifique o log para obter mais informações

", + "disableFailed": "

Falha ao desativar: __module__

__message__

Verifique o log para obter mais informações

" + }, + "confirm": { + "install": { + "body": "

Instalando '__module__'

Antes de instalar, leia a documentação do nó. Alguns nós têm dependências que não podem ser resolvidas automaticamente e podem exigir a reinicialização do Node-RED.

", + "title": "Instalar nós" + }, + "remove": { + "body": "

Remover '__module__'

Remover o nó irá desinstalá-lo do Node-RED. O nó pode continuar a usar recursos até que o Node-RED seja reiniciado.

", + "title": "Remover nós" + }, + "update": { + "body": "

Atualizar '__module__'

Atualizar o nó exigirá a reinicialização do Node-RED para concluir a atualização. Isso deve ser feito manualmente.

", + "title": "Atualizar nós" + }, + "cannotUpdate": { + "body": "Uma atualização para este nó está disponível, mas não está instalada em um local que o gerenciador de paletas possa atualizar.

Consulte a documentação para saber como atualizar este nó." + }, + "button": { + "review": "Abrir informação do nó", + "install": "Instalar", + "remove": "Remover", + "update": "Atualizar" + } + } + } + }, + "sidebar": { + "info": { + "name": "Informação", + "tabName": "Nome", + "label": "informações", + "node": "Nó", + "type": "Tipo", + "group": "Grupo", + "module": "Módulo", + "id": "ID", + "status": "Estado", + "enabled": "Habilitado", + "disabled": "Desabilitado", + "subflow": "Subfluxo", + "instances": "Instâncias", + "properties": "Propriedades", + "info": "Informação", + "desc": "Descrição", + "blank": "branco", + "null": "nulo", + "showMore": "mostrar mais", + "showLess": "mostrar menos", + "flow": "Fluxo", + "selection": "Seleção", + "nodes": "__count__ nós", + "flowDesc": "Descrição do Fluxo", + "subflowDesc": "Descrição do Subfluxo", + "nodeHelp": "Ajuda do Nó", + "none": "Nenhum", + "arrayItems": "__count__ items", + "showTips": "Você pode abrir as dicas a partir do painel de configurações", + "outline": "Contorno", + "empty": "vazio", + "globalConfig": "Nós de configuração global", + "triggerAction": "Ação de gatilho", + "find": "Encontre no espaço de trabalho", + }, + "help": { + "name": "Ajuda", + "label": "ajuda", + "search": "Ajuda sobre a procura", + "nodeHelp": "Ajuda sobre o nó", + "showHelp": "Mostrar ajuda", + "showInOutline": "Mostrar no contorno", + "showTopics": "Mostrar tópicos", + "noHelp": "Nenhum tópico de ajuda selecionado", + "changeLog": "Log de alteração" + }, + "config": { + "name": "Configuração dos nós", + "label": "configuração", + "global": "Em todos os fluxos", + "none": "nenhum", + "subfluxo": "subfluxos", + "flows": "fluxos", + "filterAll": "todos", + "showAllConfigNodes": "Ver todas as configurações dos nós", + "filterUnused": "não utilizados", + "showAllUnusedConfigNodes": "Mostrar todas os nós de configuração não usados", + "filtered": "__count__ hidden" + }, + "context": { + "name": "Contexto dos Dados", + "label": "contexto", + "none": "nenhum selecionado", + "refresh": "atualize para carregar", + "empty": "vazio", + "node": "Nó", + "flow": "Fluxo", + "global": "Global", + "deleteConfirm": "Você tem certeza que deseja remover este item?", + "autoRefresh": "Atualizar na mudança de seleção", + "refrsh": "Atualizar", + "delete": "Remover" + }, + "palette": { + "name": "Gerenciamento de paleta", + "label": "paleta" + }, + "project": { + "label": "projeto", + "name": "Projeto", + "description": "Descrição", + "dependencies": "Dependências", + "settings": "Configurações", + "noSummaryAvailable": "Nenhum resumo disponível", + "editDescription": "Editar a descrição do projeto", + "editDependencies": "Editar dependências do projeto", + "noDescriptionAvailable": "Descrição não disponível", + "editReadme": "Editar README.md", + "showProjectSettings": "Mostrar configurações do projeto", + "projectSettings": { + "title": "Configurações do Projeto", + "edit": "editar", + "none": "Nenhum", + "install": "instalar", + "removeFromProject": "remover do projeto", + "addToProject": "adicionar ao projeto", + "files": "Arquivos", + "flow": "Fluxos", + "credentials": "Credenciais", + "package": "Pacote", + "packageCreate": "O arquivo será criado quando as alterações forem salvas", + "fileNotExist": "Arquivo não existe", + "selectFile": "Selecione o arquivo", + "invalidEncryptionKey": "Chave de criptografia inválida", + "encryptionEnabled": "Criptografia habilitada", + "encryptionDisabled": "Criptografia desabilitada", + "setTheEncryptionKey": "Defina a chave de criptografia", + "resetTheEncryptionKey": "Redefina a chave de criptografia", + "changeTheEncryptionKey": "Troque a chave de criptografia", + "currentKey": "Chave atual", + "newKey": "Nova chave", + "credentialsAlert": "Isso excluirá todas as credenciais existentes", + "versionControl": "Controle de versão", + "branches": "Ramos", + "noBranches": "Sem ramos", + "deleteConfirm": "Tem certeza de que deseja excluir o ramo local '__name__'? Isto não pode ser desfeito.", + "unmergedConfirm": "O ramo local '__name__' tem alterações não mescladas que serão perdidas. Tem certeza que deseja excluir?", + "deleteUnmergedBranch": "Excluir ramo não mesclado", + "gitRemotes": "Git remoto", + "addRemote": "adicionar remoto", + "addRemote2": "Adicionar remoto", + "remoteName": "Nome do remoto", + "nameRule": "Deve conter apenas A-Z 0-9 _ -", + "url": "URL", + "urlRule": "https://, ssh:// ou file://", + "urlRule2": "Não inclua o nome de usuário / senha na URL", + "noRemotes": "Sem remotos", + "deleteRemoteConfrim": "Tem certeza de que deseja excluir o remoto '__name__'?", + "deleteRemote": "Excluir remoto" + }, + "userSettings": { + "committerDetail": "Detalhes do Cometedor", + "committerTip": "Deixe em branco para usar o padrão do sistema", + "userName": "Nome de usuário", + "email": "Email", + "workflow": "Fluxo de trabalho", + "workfowTip": "Escolha seu fluxo de trabalho git preferido", + "workflowManual": "Manual", + "workflowManualTip": "Todas as alterações devem ser confirmadas manualmente na barra lateral 'histórico'", + "workflowAuto": "Automático", + "workflowAutoTip": "As alterações são confirmadas automaticamente a cada implantação", + "sshKeys": "Chaves SSH", + "sshKeysTip": "Permite que você crie conexões seguras para repositórios git remotos.", + "add": "adicionar chave", + "addSshKey": "Adicionar chave SSH", + "addSshKeyTip": "Gerar um novo par de chaves públicas / privadas", + "name": "Nome", + "nameRule": "Deve conter apenas A-Z 0-9 _ -", + "passphrase": "Frase de passe", + "passphraseShort": "Frase de passe muito curta", + "optional": "Opcional", + "cancel": "Cancelar", + "generate": "Gerar chave", + "noSshKeys": "Sem chaves SSH", + "copyPublicKey": "Copiar chave pública para a área de transferência", + "delete": "Excluir chave key", + "gitConfig": "Configuração do Git", + "deleteConfirm": "Tem certeza de que deseja excluir a chave SSH __name__? Isso não pode ser desfeito." + }, + "versionControl": { + "unstagedChanges": "Alterações não realizadas", + "stagedChanges": "Alterações realizadas", + "unstageChange": "Desfazer alteração", + "stageChange": "Realizar alteração", + "unstageAllChange": "Desfazer todas as alterações", + "stageAllChange": "Realizar todas as alterações", + "commitChanges": "Cometer alterações", + "resolveConflicts": "Resolver conflitos", + "head": "CABEÇA", + "staged": "Alterado", + "unstaged": "Desfeita Alteração", + "local": "Local", + "remote": "Remoto", + "revert": "Tem certeza de que deseja reverter as alterações para '__file__'? Essa ação não poderá ser desfeita.", + "revertChanges": "Reverter alterações", + "localChanges": "Mudanças locais", + "none": "Nenhum", + "conflictResolve": "Todos os conflitos resolvidos. Cometa as alterações para concluir a mesclagem.", + "localFiles": "Arquivos locais", + "all": "todos", + "unmergedChanges": "Alterações não mescladas", + "abortMerge": "interromper mesclagem", + "commit": "cometer", + "changeToCommit": "Alterações para cometer", + "commitPlaceholder": "Digite sua mensagem de cometimento", + "cancelCapital": "Cancelar", + "commitCapital": "Cometer", + "commitHistory": "Histórico do cometimento", + "branch": "Ramo:", + "moreCommits": "mais cometimentos", + "changeLocalBranch": "Alterar ramo local", + "createBranchPlaceholder": "Encontrar ou criar um ramo", + "upstream": "subir do cliente ao servidor", + "localOverwrite": "Você tem alterações locais que seriam sobrescritas alterando o ramo. Você deve cometer ou desfazer essas alterações primeiro.", + "manageRemoteBranch": "Gerenciar ramo remoto", + "unableToAccess": "Incapaz de acessar o repositório remoto", + "retry": "Tentar novamente", + "setUpstreamBranch": "Definir como ramo de subida do cliente para o servidor", + "createRemoteBranchPlaceholder": "Encontrar ou criar um ramo remoto", + "trackedUpstreamBranch": "O ramo criado será definido como o ramo de subida do cliente para o servidor rastreado.", + "selectUpstreamBranch": "O ramo será criado. Selecione abaixo para defini-lo como o ramo de subida do cliente para o servidor rastreado.", + "pushFailed": "falha ao empurrar porque o remoto tem cometimentos mais recentes. Puxe e mescle primeiro, depois empurre novamente.", + "push": "empurrar", + "pull": "puxar", + "unablePull": "

Incapaz de puxar as alterações remotas; suas alterações locais não realizadas seriam sobrescritas.

Cometa suas alterações e tente novamente.

", + "showUnstagedChanges": "Mostrar alterações não realizadas", + "connectionFailed": "Não foi possível conectar ao repositório remoto:", + "pullUnrelatedHistory": "

O remoto tem um histórico não relacionado de cometimentos.

Tem certeza que deseja puxar as mudanças para o seu repositório local?

", + "pullChanges": "Puxar modificações", + "history": "histórico", + "projectHistory": "Histórico do Projeto", + "daysAgo": "__count__ dia atrás", + "daysAgo_plural": "__count__ dias atrás", + "hoursAgo": "__count__ hora atrás", + "hoursAgo_plural": "__count__ horas atrás", + "minsAgo": "__count__ min ago", + "minsAgo_plural": "__count__ minutos atrás", + "secondsAgo": "Segundos atrás", + "notTracking": "Seu ramo local não está atualmente rastreando um ramo remoto.", + "statusUnmergedChanged": "Seu repositório tem alterações não mescladas. Você precisa corrigir os conflitos e enviar o resultado.", + "repositoryUpToDate": "Seu repositório está atualizado.", + "commitsAhead": "Seu repositório está __count__ cometimento à frente do remoto. Você pode empurrar este cometimento agora.", + "commitsAhead_plural": "Seu repositório está __count__ cometimentos à frente do remoto. Você pode empurrar estes cometimentos agora.", + "commitsBehind": "Seu repositório está __count__ cometimento atrás do remoto. Você pode puxar este cometimento agora.", + "commitsBehind_plural": "Seu repositório está __count__ cometimentos atrás do remoto. Você pode puxar esses cometimentos agora.", + "commitsAheadAndBehind1": "Seu repositório está __count__ cometimento atrás e", + "commitsAheadAndBehind1_plural": "Seu repositório está __count__ cometimentos atrás e", + "commitsAheadAndBehind2": "__count__ cometimento à frente do remoto.", + "commitsAheadAndBehind2_plural": "__count__ cometimentos à frente do remoto.", + "commitsAheadAndBehind3": "Você deve baixar o cometimento remoto antes de empurrar.", + "commitsAheadAndBehind3_plural": "Você deve baixar os cometimentos remotos antes de empurrar.", + "refreshCommitHistory": "Atualizar histórico de cometimentos", + "refreshChanges": "Atualizar alterações" + } + } + }, + "typedInput": { + "type": { + "str": "cadeia de caracteres", + "num": "número", + "re": "expressão regular", + "bool": "booliano", + "json": "JSON", + "bin": "armazenamento temporário", + "date": "registro de tempo", + "jsonata": "expressão", + "env": "variável de ambiente", + "cred": "credencial" + } + }, + "editableList": { + "add": "adicionar", + "addTitle": "adicionar um item" + }, + "search": { + "history": "Histórico da procura", + "clear": "limpar tudo", + "empty": "Nenhuma equivalência encontrada", + "addNode": "adicionar um nó...", + "options": { + "configNodes": "Configuração de nós", + "unusedConfigNodes": "Configuração de nós não utilizadas", + "invalidNodes": "Nós inválidos", + "uknownNodes": "Nós desconhecidos", + "unusedSubflows": "Subfluxos não utilizados", + "hiddenFlows": "Flux escondidos", + "modifiedNodes": "Nós e Fluxos Modificados", + "thisFlow": "Fluxo atual" + } + }, + "expressionEditor": { + "functions": "Funções", + "functionReference": "Referência de função", + "insert": "Inserir", + "title": "Editor de Expressões JSONata", + "test": "Teste", + "data": "Mensagem de exemplo", + "result": "Resultado", + "format": "expressão de formato", + "compatMode": "Modo de compatibilidade habilitado", + "compatModeDesc": "

Modo de compatibilidade JSONata

A expressão atual parece ainda fazer referência a msg , então será avaliada no modo de compatibilidade. Atualize a expressão para não usar msg , pois este modo será removido no futuro.

Quando o suporte JSONata foi adicionado pela primeira vez ao Node-RED, era necessária a expressão para fazer referência ao objeto msg . Por exemplo, msg.payload seria usado para acessar a carga útil.

Isso não é mais necessário, pois a expressão será avaliada em relação à mensagem diretamente. Para acessar a carga útil, a expressão deve ser apenas payload.

", + "noMatch": "Nenhum resultado correspondente", + "errors": { + "invalid-expr": "Expressão JSONata inválida:\n __message__", + "invalid-msg": "Exemplo de mensagem JSON inválida:\n __message__", + "context-unsupported": "Não é possível testar funções de contexto\n $flowContext or $globalContext", + "eval": "Erro ao avaliar a expressão:\n __message__" + } + }, + "monaco": { + "setTheme": "Definir tema" + }, + "jsEditor": { + "title": "Editor JavaScript" + }, + "textEditor": { + "title": "Editor de texto" + }, + "jsonEditor": { + "title": "editor JSON", + "format": "formatar JSON", + "rawMode": "Editar JSON", + "uiMode": "Editor visual", + "rawMode-readonly": "JSON", + "uiMode-readonly": "Visual", + "insertAbove": "Inserir acima", + "insertBelow": "Inserir abaixo", + "addItem": "Adicionar item", + "copyPath": "Copiar caminho para o item", + "expandItems": "Expandir itens", + "collapseItems": "Recolher itens", + "duplicate": "Duplicar", + "error": { + "invalidJSON": "JSON inválido: " + } + }, + "markdownEditor": { + "title": "Editor de Remarcação", + "expand": "Expandir", + "format": "Formatado com Remarcação", + "heading1": "Cabeçalho 1", + "heading2": "Cabeçalho 2", + "heading3": "Cabeçalho 3", + "bold": "Negrito", + "italic": "Itálico", + "code": "Código", + "ordered-list": "Lista ordenada", + "unordered-list": "Lista não-ordenada", + "quote": "Citar", + "link": "criar atalho", + "horizontal-rule": "Régua Horizontal", + "toggle-preview": "Alternar visualização" + }, + "bufferEditor": { + "title": "Editor de armazenamento temporário", + "modeString": "Tratar como cadeia de caracteres UTF-8", + "modeArray": "Manipular como matriz JSON", + "modeDesc": "

Editor de armazenamento temporário

O tipo de armazenamento temporário é armazenado como uma matriz JSON de valores de bytes. O editor tentará analisar o valor inserido como uma matriz JSON. Se não for um JSON válido, será tratada como uma cadeia de caracteres UTF-8 e convertida em uma matriz de pontos de código de caractere individual.

Por exemplo, um valor de Hello World será convertido na matriz JSON:

 [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100] 

" + }, + "projects": { + "config-git": "Configurar cliente Git", + "welcome": { + "hello": "Olá! Introduzimos 'projetos' no Node-RED.", + "desc0": "Esta é uma nova maneira de gerenciar seus arquivos de fluxo e incluir controle de versão de seus fluxos.", + "desc1": "Para começar, você pode criar seu primeiro projeto ou clonar um projeto existente de um repositório git.", + "desc2": "Se você não tiver certeza, pode pular isso por enquanto. Você ainda poderá criar seu primeiro projeto a partir do menu 'Projetos' a qualquer momento.", + "create": "Criar Projeto", + "clone": "Repositório de clones", + "openExistingProject": "Abrir projeto existente", + "not-right-now": "Não nesse exato momento" + }, + "git-config": { + "setup": "Configure seu cliente de controle de versão", + "desc0": "O Node-RED usa a ferramenta de código aberto Git para controle de versão. Ele rastreia as alterações em seus arquivos de projeto e permite enviá-los para repositórios remotos.", + "desc1": "Quando você confirma um conjunto de alterações, o Git registra quem fez as alterações com um nome de usuário e endereço de e-mail. O nome de usuário pode ser o que você quiser - não precisa ser seu nome real.", + "desc2": "Seu cliente Git já está configurado com os detalhes abaixo.", + "desc3": "Você pode alterar essas configurações mais tarde na guia 'Git config' da caixa de diálogo de configurações.", + "username": "Nome do usuário", + "email": "E-mail" + }, + "project-details": { + "create": "Crie seu projeto", + "desc0": "Um projeto é mantido como um repositório Git. Isso torna muito mais fácil compartilhar seus fluxos com outras pessoas e colaborar neles.", + "desc1": "Você pode criar vários projetos e alternar rapidamente entre eles no editor.", + "desc2": "Para começar, seu projeto precisa de um nome e uma descrição opcional.", + "already-exists": "Projeto já existe", + "must-contain": "Deve conter apenas A-Z 0-9 _ -", + "project-name": "Nome do Projeto", + "desc": "Descrição", + "opt": "Opcional" + }, + "clone-project": { + "clone": "Clonar um projeto", + "desc0": "Se você já tem um repositório git contendo um projeto, pode cloná-lo para começar.", + "already-exists": "Projeto já existe", + "must-contain": "Deve conter apenas A-Z 0-9 _ -", + "project-name": "Nome do projeto", + "no-info-in-url": "Não inclua o nome de usuário / senha no url", + "git-url": "Git repository URL", + "protocols": "https: //, ssh: // ou file://", + "auth-failed": "Autenticação falhou", + "username": "Nome de usuário", + "passwd": "Senha", + "ssh-key": "Chave SSH", + "passphrase": "Frase de Passe", + "ssh-key-desc": "Antes de clonar um repositório usando ssh, você deve adicionar uma chave SSH para acessá-lo.", + "ssh-key-add": "Adicionar uma chave ssh", + "credential-key": "Chave de criptografia de credenciais", + "cant-get-ssh-key": "Erro! Não é possível obter o caminho da chave SSH selecionada.", + "already-exists2": "já existe", + "git-error": "git error", + "connection-failed": "Conexão falhou", + "not-git-repo": "Não é um repositório git", + "repo-not-found": "Repositório não encontrado" + }, + "default-files": { + "create": "Crie seus arquivos de projeto", + "desc0": "Um projeto contém seus arquivos de fluxo, um arquivo README e um arquivo package.json.", + "desc1": "Pode conter quaisquer outros arquivos que você deseja manter no repositório Git.", + "desc2": "Seus arquivos de fluxo e credenciais existentes serão copiados para o projeto.", + "flow-file": "Arquivo de fluxo", + "credentials-file": "Arquivo de credenciais" + }, + "encryption-config": { + "setup": "Configure a criptografia do seu arquivo de credenciais", + "desc0": "Seu arquivo de credenciais de fluxo pode ser criptografado para manter seu conteúdo seguro.", + "desc1": "Se você deseja armazenar essas credenciais em um repositório Git público, deve criptografá-las fornecendo uma frase-chave secreta.", + "desc2": "Seu arquivo de credenciais de fluxo não está criptografado no momento.", + "desc3": "Isso significa que seu conteúdo, como senhas e fichas de acesso, pode ser lido por qualquer pessoa com acesso ao arquivo.", + "desc4": "Se você deseja armazenar essas credenciais em um repositório Git público, deve criptografá-las fornecendo uma frase-chave secreta.", + "desc5": "Seu arquivo de credenciais de fluxo está atualmente criptografado usando a propriedade credentialSecret de seu arquivo de configurações como a chave.", + "desc6": "Seu arquivo de credenciais de fluxo está criptografado usando uma chave gerada pelo sistema. Você deve fornecer uma nova chave secreta para este projeto.", + "desc7": "A chave será armazenada separadamente dos arquivos do seu projeto. Você precisará fornecer a chave para usar este projeto em outra instância do Node-RED.", + "credentials": "Credenciais", + "enable": "Habilitar criptografia", + "disable": "Desabilitar criptografia", + "disabled": "desabilitado", + "copy": "Copiar sobre a chave existente", + "use-custom": "Usar chave personalizada", + "desc8": "O arquivo de credenciais não será criptografado e seu conteúdo será lido facilmente", + "create-project-files": "Criar arquivos de projeto", + "create-project": "Criar projeto", + "already-exists": "já existe", + "git-error": "erro no git", + "git-auth-error": "git erro de autenticação" + }, + "create-success": { + "success": "Você criou com sucesso o seu primeiro projeto!", + "desc0": "Agora você pode continuar usando o Node-RED como sempre fez.", + "desc1": "A guia 'informações' na barra lateral mostra qual é o seu projeto ativo atual. O botão ao lado do nome pode ser usado para acessar a visualização das configurações do projeto.", + "desc2": "A guia 'histórico' na barra lateral pode ser usada para ver os arquivos que foram alterados no seu projeto e para submetê-los. Ela mostra um histórico completo de seus cometimentos e permite que você envie suas alterações para um repositório remoto . " + }, + "create": { + "projects": "Projetos", + "already-exists": "Projeto já existe", + "must-contain": "Deve conter apenas A-Z 0-9 _ -", + "no-info-in-url": "Não inclua o nome de usuário/senha no url", + "open": "Abrir projeto", + "create": "Criar Projeto", + "clone": "Clone Repositório", + "project-name": "Nome do projeto", + "desc": "Descrição", + "opt": "Opcional", + "flow-file": "Arquivo de fluxo", + "credentials": "Credenciais", + "enable-encryption": "Habilitar criptografia", + "disable-encryption": "Desabilitar criptografia", + "encryption-key": "Chave de criptografia", + "desc0": "Uma frase para proteger suas credenciais com", + "desc1": "O arquivo de credenciais não será criptografado e seu conteúdo poderá ser lido facilmente", + "git-url": "URL do repositório Git", + "protocols": "https://, ssh:// or file://", + "auth-failed": "Falha na autenticação", + "username": "Nome do usuário", + "password": "Senha", + "ssh-key": "Chave SSH", + "passphrase": "Frase de Passe", + "desc2": "Antes de clonar um repositório usando ssh, você deve adicionar uma chave SSH para acessá-lo.", + "add-ssh-key": "Adicionar uma chave ssh", + "credentials-encryption-key": "Chave de criptografia de credenciais", + "already-exists-2": "já existe", + "git-error": "erro de git", + "con-failed": "Conexão falhou", + "not-git": "Não é um repositório git", + "no-resource": "Repositório não encontrado", + "cant-get-ssh-key-path": "Erro! Não é possível obter o caminho da chave SSH selecionado.", + "unexpected_error": "erro_inesperado", + "clearContext": "Limpar contexto quando ocorrer troca de projetos" + }, + "delete": { + "confirm": "Tem certeza de que deseja excluir este projeto?" + }, + "create-project-list": { + "search": "procure seus projetos", + "current": "atual" + }, + "require-clean": { + "confirm": "

Você tem alterações não implantadas que serão perdidas.

Deseja continuar?

" + }, + "send-req": { + "auth-req": "Autenticação necessária para repositório", + "username": "Nome do usuário", + "password": "Senha", + "passphrase": "Frase de Passe", + "retry": "Tentar novamente", + "update-failed": "Falha ao atualizar autenticação", + "unhandled": "Resposta de erro não tratada", + "host-key-verify-failed": "

Falha na verificação da chave do servidor anfitrião.

A chave do servidor anfitrião do repositório não pôde ser verificada. Atualize seu arquivo known_hosts e tente novamente.

" + }, + "create-branch-list": { + "invalid": "Ramo inválido", + "create": "Criar ramo", + "current": "atual" + }, + "create-default-file-set": { + "no-active": "Não é possível criar um conjunto de arquivos padrão sem um projeto ativo", + "no-empty": "Não é possível criar um arquivo padrão definido em um projeto não vazio", + "git-error": "erro no git" + }, + "errors": { + "no-username-email": "Seu cliente Git não está configurado com um nome de usuário / e-mail.", + "unexpected": "Um erro inesperado ocorreu", + "code": "código" + } + }, + "editor-tab": { + "properties": "Propriedades", + "envProperties": "Variáveis de Ambiente", + "module": "Propriedades do Módulo", + "description": "Descrição", + "appearance": "Aparência", + "preview": "Visualização da IU", + "defaultValue": "Valor padrão" + }, + "tourGuide": { + "takeATour": "Faça um tour", + "start": "Inicio", + "next": "Próximo", + "welcomeTours": "Tour de Boas-vindas" + }, + "diagnostics": { + "title": "informações do Sistema" + }, + "languages": { + "de": "Alemão", + "en-US": "Inglês", + "ja": "Japonês", + "ko": "Coreano", + "pt-BR": "Português(Brasil)", + "ru": "Russo", + "zh-CN": "Chinês(Simplificado)", + "zh-TW": "Chinês(Tradicional)" + } +} diff --git a/packages/node_modules/@node-red/editor-client/locales/pt-BR/infotips.json b/packages/node_modules/@node-red/editor-client/locales/pt-BR/infotips.json new file mode 100755 index 000000000..7ac7502c1 --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/locales/pt-BR/infotips.json @@ -0,0 +1,23 @@ +{ + "info": { + "tip0": "Você pode remover os nós ou links selecionados com {{core:delete-selection}}", + "tip1": "Procure por nós usando {{core:search}}", + "tip2": "{{core:toggle-sidebar}} irá alternar a visualização desta barra lateral", + "tip3": "Você pode gerenciar sua paleta de nós com {{core:manage-palette}}", + "tip4": "Seus nós de configuração de fluxo são listados no painel da barra lateral. Pode ser acessado a partir do menu ou com{{core:show-config-tab}}", + "tip5": "Habilite ou desabilite essas dicas na opção nas configurações", + "tip6": "Mova os nós selecionados usando o [left] [up] [down] e [right] chaves. Segure [shift] para empurrá-los ainda mais", + "tip7": "Arrastar um nó para um fio o unirá no link", + "tip8": "Exporte os nós selecionados ou a guia atual com {{core:show-export-dialog}}", + "tip9": "Importe um fluxo arrastando seu JSON para o editor ou com {{core:show-import-dialog}}", + "tip10": "[shift] [click] e arraste em uma porta de nó para mover todos os fios conectados ou apenas o selecionado", + "tip11": "Mostre a guia Informações com {{core:show-info-tab}} ou a guia Depurar com {{core:show-debug-tab}}", + "tip12": "[ctrl] [click] na área de trabalho para abrir a caixa de diálogo de adição rápida", + "tip13": "Mantenha pressionado [ctrl] enquanto você [click] em uma porta de nó para habilitar a ligação rápida", + "tip14": "Mantenha pressionado [shift] enquanto você [click] em um nó para também selecionar todos os seus nós conectados", + "tip15": "Mantenha pressionado [ctrl] enquanto você [click] em um nó para adicioná-lo ou removê-lo da seleção atual", + "tip16": "Alternar guias de fluxo com {{core:show-previous-tab}} e {{core:show-next-tab}}", + "tip17": "Você pode confirmar suas alterações na bandeja de edição do nó com {{core:confirm-edit-tray}} ou cancele-os com {{core:cancel-edit-tray}}", + "tip18": "Pressionando {{core:edit-selected-node}} irá editar o primeiro nó na seleção atual" + } +} diff --git a/packages/node_modules/@node-red/editor-client/locales/pt-BR/jsonata.json b/packages/node_modules/@node-red/editor-client/locales/pt-BR/jsonata.json new file mode 100755 index 000000000..18d0e78c1 --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/locales/pt-BR/jsonata.json @@ -0,0 +1,274 @@ +{ + "$string": { + "args": "arg[, prettify]", + "desc": "Converte o tipo do parâmetro `arg` em uma cadeia de caracteres usando as seguintes regras de conversão de tipo:\n\n - Cadeia de caracteres não são alteradas\n - As funções são convertidas para uma cadeia de caracteres vazia\n - os tipos numérico infinito e NaN geram um erro porque não podem ser representados como um número JSON\n - Todos os outros valores são convertidos para uma cadeia de caracteres JSON usando a função `JSON.stringify`. Se `prettify` for verdadeira, então o JSON \"prettified\" é produzido. Isto é, uma linha por campo e as linhas serão indentadas com base na profundidade do campo." + }, + "$length": { + "args": "str", + "desc": "Retorna o número de caracteres na cadeia de caracteres `str`. Um erro é gerado se `str` não for uma cadeia de caracteres." + }, + "$substring": { + "args": "str, start[, length]", + "desc": "Retorna uma cadeia de caracteres contendo os caracteres no primeiro parâmetro `str` começando na posição `start` (deslocamento zero). Se` length` for especificado, então a sub cadeia de caracteres conterá o máximo `length` de caracteres. Se` start` for negativo isso indica o número de caracteres a partir do fim de `str`." + }, + "$substringBefore": { + "args": "str, chars", + "desc": "Retorna a sub cadeia de caracteres antes da primeira ocorrência da sequência de caracteres `chars` em `string`. Se` string` não contiver `chars`, então retorna `str`. " + }, + "$substringAfter": { + "args": "str, chars", + "desc": "Retorna a sub cadeia de caracteres após a primeira ocorrência da sequência de caracteres `chars` em `string`. Se `string` não contiver `chars`, então retorna `str`. " + }, + "$uppercase": { + "args": "str", + "desc": "Retorna uma cadeia de caracteres com todos os caracteres de `string` convertidos em maiúsculas. " + }, + "$lowercase": { + "args": "str", + "desc": "Retorna uma cadeia de caracteres com todos os caracteres de `string` convertidos em minúsculas. " + }, + "$trim": { + "args": "str", + "desc": "Normaliza e retira todos os caracteres de espaço em branco em `str` aplicando as seguintes etapas:\n\n - Todas as tabulações, retornos de carro e avanços de linha são substituídos por espaços.\n- Sequências contíguas de espaços são reduzidas a um único espaço.\n- Espaços à direita e à esquerda são removidos.\n\n Se `str` não for especificado (isto é, esta função é chamada sem argumentos), então o valor do contexto é usado como o valor de `str`. Um erro é gerado se `str` não for uma cadeia de caracteres." + }, + "$contains": { + "args": "str, pattern", + "desc": "Retorna `true` se `str` tiver correspondente em `pattern`, caso contrário, retorna `false`. Se `str` não for especificado (isto é, esta função é chamada com um argumento), então o valor do contexto é usado como o valor de `str`. O parâmetro `pattern` pode ser uma cadeia de caracteres ou uma expressão regular. " + }, + "$split": { + "args": "str[, separator][, limit]", + "desc": "Divide o parâmetro `str` em uma matriz de sub cadeia de caracteres. É um erro se `str` não for uma cadeia de caracteres. O parâmetro opcional `separator` especifica os caracteres dentro de `str` sobre os quais devem ser divididos como uma cadeia de caracteres ou expressão regular. Se `separator` não for especificado, a cadeia de caracteres vazia será assumida e `str` será dividido em uma matriz de caracteres únicos. É um erro se `separador` não for uma cadeia de caracteres. O parâmetro opcional `limit` é um número que especifica o número máximo de sub cadeia de caracteres a serem incluídas na matriz resultante. Quaisquer sub cadeia de caracteres adicionais são descartadas. Se `limit` não for especificado, então `str` será totalmente dividido sem limite para o tamanho da matriz resultante . É um erro se `limit` não for um número não negativo." + }, + "$join": { + "args": "array[, separator]", + "desc": "Une uma matriz de cadeias de caracteres de componentes em uma única cadeia de caracteres concatenada com cada cadeia de caracteres de componente separada pelo parâmetro opcional `separator`. É um erro se a `matriz` de entrada contiver um item que não seja uma cadeia de caracteres. Se `separator` for não especificado, assume-se que é uma cadeia de caracteres vazia, ou seja, nenhum `separator` entre as cadeias de caracteres do componente. É um erro se `separator` não for uma cadeia de caracteres. " + }, + "$match": { + "args": "str, pattern [, limit]", + "desc": "Aplica a cadeia de caracteres `str` à expressão regular `pattern` e retorna uma matriz de objetos, com cada objeto contendo informações sobre cada ocorrência de uma correspondência dentro de `str`. " + }, + "$replace": { + "args": "str, pattern, replacement [, limit]", + "desc": "Encontra ocorrências de `pattern` dentro de `str` e as substitui por `replacement`.\n\nO parâmetro opcional `limit` é o número máximo de substituições." + }, + "$now": { + "args":"$[picture [, timezone]]", + "desc":"Gera um carimbo de data/hora em formato compatível com ISO 8601 e o retorna como uma cadeia de caracteres. Se os parâmetros opcionais de imagem e fuso horário forem fornecidos, o carimbo de data/hora atual é formatado conforme descrito pela função `$ fromMillis ()`" + }, + "$base64encode": { + "args":"string", + "desc":"Converte uma cadeia de caracteres ASCII em uma representação de base 64. Cada caractere na cadeia de caracteres é tratado como um byte de dados binários. Isso requer que todos os caracteres na cadeia de caracteres estejam no intervalo de 0x00 a 0xFF, o que inclui todos os caracteres em cadeias de caracteres codificadas em URI. Caracteres Unicode fora desse intervalo não são suportados." + }, + "$base64decode": { + "args":"string", + "desc":"Converte bytes codificados de base 64 em uma cadeia de caracteres, usando uma página de código UTF-8 Unicode." + }, + "$number": { + "args": "arg", + "desc": "Converte o parâmetro `arg` em um número usando as seguintes regras de conversão:\n\n - Os números permanecem inalterados\n - Cadeias de caracteres que contêm uma sequência de caracteres que representam um número JSON válido são convertidos para esse número\n - Todos os outros valores causam a geração de um erro." + }, + "$abs": { + "args":"number", + "desc":"Retorna o valor absoluto do parâmetro `number`." + }, + "$floor": { + "args":"number", + "desc":"Retorna o valor de `number` arredondado para baixo para o inteiro mais próximo que seja menor ou igual a `number`." + }, + "$ceil": { + "args":"number", + "desc":"Retorna o valor de `number` arredondado para o número inteiro mais próximo que é maior ou igual a `number`." + }, + "$round": { + "args":"number [, precision]", + "desc":"Retorna o valor do parâmetro `number` arredondado para o número de casas decimais especificado pelo parâmetro opcional `precision`." + }, + "$power": { + "args":"base, exponent", + "desc":"Retorna o valor de `base` elevado à potência de `exponent`." + }, + "$sqrt": { + "args":"number", + "desc":"Retorna a raiz quadrada do valor do parâmetro `number`." + }, + "$random": { + "args":"", + "desc":"Retorna um número pseudoaleatório maior ou igual a zero e menor que um." + }, + "$millis": { + "args":"", + "desc":"Retorna o número de milissegundos desde o Unix Epoch (1º de janeiro de 1970 UTC) como um número. Todas as invocações de `$ millis ()` dentro de uma avaliação de uma expressão retornarão todas o mesmo valor." + }, + "$sum": { + "args": "array", + "desc": "Retorna a soma aritmética de uma `array` de números. É um erro se o `array` de entrada contiver um item que não seja um número." + }, + "$max": { + "args": "array", + "desc": "Retorna o número máximo em uma `array` de números. É um erro se o `array` de entrada contiver um item que não seja um número." + }, + "$min": { + "args": "array", + "desc": "Retorna o número mínimo em uma `array` de números. É um erro se o `array` de entrada contiver um item que não seja um número." + }, + "$average": { + "args": "array", + "desc": "Retorna o valor médio de uma `array` de números. É um erro se o `array` de entrada contiver um item que não seja um número." + }, + "$boolean": { + "args": "arg", + "desc": "Converte o argumento em um booliano usando as seguintes regras:\n\n - `Boolean` : inalterado\n - `string`: vazio : `false`\n - `string`: não-vazio : `true`\n - `number`: `0` : `false`\n - `number`: não-zero : `true`\n - `null` : `false`\n - `array`: vazio : `false`\n - `array`: contém um membro que converte de tipo para `true` : `true`\n - `array`: todos os membros convertidos de tipo para `false` : `false`\n - `object`: vazio : `false`\n - `object`: não-vazio : `true`\n - `function` : `false`" + }, + "$not": { + "args": "arg", + "desc": "Retorna booliano NOT no argumento. `Arg` é convertido de tipo primeiro para um booliano " + }, + "$exists": { + "args": "arg", + "desc": "Retorna booliano `true` se a expressão `arg` for avaliada como um valor, ou `false` se a expressão não corresponder a nada (por exemplo, um caminho para uma referência de campo inexistente)." + }, + "$count": { + "args": "array", + "desc": "Retorna o número de itens na matriz" + }, + "$append": { + "args": "array, array", + "desc": "Anexa duas matrizes" + }, + "$sort": { + "args":"array [, function]", + "desc":"Retorna uma matriz contendo todos os valores no parâmetro `array`, mas classificados em ordem.\n\nSe um comparador `function` for fornecido, então deve ser uma função que leva dois parâmetros:\n\n`function(left, right)`\n\nEsta função é invocada pelo algoritmo de classificação para comparar dois valores à esquerda e à direita. Se o valor de esquerda deve ser colocado após o valor de direita na ordem de classificação desejada, a função deve retornar o booliano `true` para indicar uma troca. Caso contrário, deve retornar `false`." + }, + "$reverse": { + "args":"array", + "desc":"Retorna uma matriz contendo todos os valores do parâmetro `array`, mas na ordem reversa. " + }, + "$shuffle": { + "args":"array", + "desc":"Retorna uma matriz contendo todos os valores do parâmetro `array`, mas misturados em ordem aleatória. " + }, + "$zip": { + "args":"array, ...", + "desc":"Retorna uma matriz convolucional (compactada) contendo matrizes agrupadas de valores dos argumentos `array1`… `arrayN` do índice 0, 1, 2 ...." + }, + "$keys": { + "args": "object", + "desc": "Retorna uma matriz contendo as chaves do objeto. Se o argumento for uma matriz de objetos, então a matriz retornada contém uma lista não duplicada de todas as chaves em todos os objetos." + }, + "$lookup": { + "args": "object, key", + "desc": "Retorna o valor associado à chave no objeto. Se o primeiro argumento for uma matriz de objetos, todos os objetos na matriz são pesquisados e os valores associados a todas as ocorrências da chave são retornados." + }, + "$spread": { + "args": "object", + "desc": "Divide um objeto que contém pares de chave/valor em uma matriz de objetos, cada um com um único par de chave/valor do objeto de entrada. Se o parâmetro for uma matriz de objetos, a matriz resultante conterá um objeto para cada par de chave/valor em todo objeto na matriz fornecida. " + }, + "$merge": { + "args": "array<object>", + "desc": "Mescla uma matriz de `objects` em um único `object` contendo todos os pares de chave/valor de cada um dos objetos na matriz de entrada. Se qualquer um dos objetos de entrada contiver a mesma chave, então o `object` retornado conterá o valor do último na matriz. É um erro se a matriz de entrada contiver um item que não seja um objeto." + }, + "$sift": { + "args":"object, function", + "desc": "Retorna um objeto que contém apenas os pares de chave/valor do parâmetro `object` que satisfazem o predicado `function` passado como o segundo parâmetro.\n\nA `function` que é fornecida como o segundo parâmetro deve ter o seguinte assinatura:\n\n`function(value [, key [, object]])`" + }, + "$each": { + "args":"object, function", + "desc":"Retorna uma matriz contendo os valores retornados por `function` quando aplicado a cada par chave/valor no `object`." + }, + "$map": { + "args":"array, function", + "desc":"Retorna uma matriz contendo os resultados da aplicação do parâmetro `function` a cada valor no parâmetro `array`.\n\nA `function` que é fornecido como o segundo parâmetro deve ter a seguinte assinatura:\n\n`function(value [, index [, array]])`" + }, + "$filter": { + "args":"array, function", + "desc":"Retorna uma matriz contendo apenas os valores no parâmetro `array` que satisfazem o predicado `function`.\n\nThe `function` que é fornecido como o segundo parâmetro deve ter a seguinte assinatura:\n\n`function(value [, index [, array]])`" + }, + "$reduce": { + "args":"array, function [, init]", + "desc":"Retorna um valor agregado derivado da aplicação do parâmetro `function` sucessivamente a cada valor em `array` em combinação com o resultado da aplicação anterior da função.\n\nA função deve aceitar dois argumentos e se comportar como um operador inserido entre cada valor dentro de `array`. A assinatura da `function` deve estar no formato: `myfunc($accumulator, $value[, $index[, $array]])`\n\nO parâmetro opcional `init` é usado como o valor inicial na agregação." + }, + "$flowContext": { + "args": "string[, string]", + "desc": "Recupera uma propriedade de contexto de fluxo.\n\nEsta é uma função definida pelo Node-RED. " + }, + "$globalContext": { + "args": "string[, string]", + "desc": "Recupera uma propriedade de contexto global.\n\nEsta é uma função definida pelo Node-RED. " + }, + "$pad": { + "args": "string, width [, char]", + "desc": "Retorna uma cópia da `string` com preenchimento extra, se necessário, de forma que seu número total de caracteres seja pelo menos o valor absoluto do parâmetro `width`.\n\nSe `width` for um número positivo, a cadeia de caracteres será preenchida à direita; se negativo, é preenchida à esquerda.\n\nO argumento opcional `char` especifica os caracteres de preenchimento a serem usados. Se não for especificado, o padrão é o caractere de espaço. " + }, + "$fromMillis": { + "args": "number, [, picture [, timezone]]", + "desc": "Converta o `number` que representa os milissegundos desde a época do Unix (1 January, 1970 UTC) em uma representação de cadeia de caracteres formatada do carimbo de data/hora conforme especificado pela cadeia de caracteres de imagem.\n\nSe o parâmetro opcional `image` for omitido, o carimbo de data/hora será formatado no formato ISO 8601.\n\nSe a cadeia de caracteresopcional `picture` for fornecida, o carimbo de data/hora é formatado de acordo com a representação especificada nessa cadeia de caracteres. O comportamento desta função é consistente com a versão de dois argumentos da função XPath/XQuery `format-dateTime` conforme definido na especificação XPath F&O 3.1. O parâmetro de cadeia de caracteres de imagem define como o carimbo de data/hora é formatado e tem a mesma sintaxe de `format-dateTime`.\n\nSe a cadeia de caracteres opcional `timezone` for fornecida, o carimbo de data/hora formatado estará nesse fuso horário. A cadeia de caracteres `timezone` deve estar no formato '± HHMM', onde ± é o sinal de mais ou menos e HHMM é o deslocamento em horas e minutos do UTC. Deslocamento positivo para fusos horários a leste do UTC, deslocamento negativo para fusos horários a oeste do UTC. " + }, + "$formatNumber": { + "args": "number, picture [, options]", + "desc": "Converte o tipo de `number` em uma cadeia de caracteres e o formata em uma representação decimal conforme especificado pela cadeia de caracteres `picture`.\n\n O comportamento desta função é consistente com a função XPath/XQuery fn: format-number conforme definido na especificação XPath F&O 3.1. O parâmetro de cadeia de caracteres de imagem define como o número é formatado e tem a mesma sintaxe de fn: format-number.\n\nO terceiro argumento opcional `options` é usado para substituir os caracteres de formatação específicos da localidade padrão, como o separador decimal. Se fornecido, este argumento deve ser um objeto contendo pares de nome/valor especificados na seção de formato decimal da especificação XPath F&O 3.1." + }, + "$formatBase": { + "args": "number [, radix]", + "desc": "Converte o `number` em uma cadeia de caracteres e o formata em um inteiro representado na base do número especificada pelo argumento `radix`. Se `radix` não for especificado, o padrão é a base 10. `radix` pode estar entre 2 e 36, caso contrário, um erro será gerado. " + }, + "$toMillis": { + "args": "timestamp", + "desc": "Converta o tipo de uma cadeia de caracteres `timestamp` no formato ISO 8601 para o número de milissegundos desde a época do Unix (1 January, 1970 UTC) como um número. Um erro é gerado se a cadeia de caracteres não estiver no formato correto. " + }, + "$env": { + "args": "arg", + "desc": "Retorna o valor de uma variável de ambiente.\n\nEsta é uma função definida pelo Node-RED." + }, + "$eval": { + "args": "expr [, context]", + "desc": "Analisa e avalia a cadeia de caracteres `expr` que contém um JSON literal ou uma expressão JSONata usando o contexto atual como o contexto para avaliação. " + }, + "$formatInteger": { + "args": "number, picture", + "desc": "Converte o tipo de `number` em uma cadeia de caracteres e o formata em uma representação inteira conforme especificado pela cadeia de caracteres `picture`. O parâmetro da cadeia de caracteres de imagem define como o número é formatado e tem a mesma sintaxe de `fn: format-integer` do Especificação XPath F&O 3.1. " + }, + "$parseInteger": { + "args": "string, picture", + "desc": "Examina e troca o conteúdo do parâmetro `string` para um inteiro (como um número JSON) usando o formato especificado pela cadeia de caracteres `picture`. O parâmetro da cadeia de caracteres `picture` tem o mesmo formato que `$ formatInteger`." + }, + "$error": { + "args": "[str]", + "desc": "Gera um erro com uma mensagem. O (parâmetro) opcional `str` substituirá a mensagem padrão de `$error() function evaluated`" + }, + "$assert": { + "args": "arg, str", + "desc": "Se `arg` for verdadeiro, a função retorna indefinido. Se `arg` for falso, uma exceção é gerada com `str` como a mensagem da exceção. " + }, + "$single": { + "args": "array, function", + "desc": "Retorna o único valor no parâmetro `array` que satisfaz o predicado `function` (isto é, O (parâmetro) `function` retorna o booliano `true` quando passado o valor). Gera uma exceção se o número de valores correspondentes não for exatamente um .\n\nA função deve ser fornecida na seguinte assinatura: `function(value [, index [, array]])` onde 'value' é cada entrada da matriz, 'index' é a posição desse valor e toda a matriz é passada como o terceiro argumento" + }, + "$encodeUrlComponent": { + "args": "str", + "desc": "Codifica um componente Localizador Uniforme de Recursos (URL) substituindo cada instância de certos caracteres por uma, duas, três ou quatro sequências de escape que representam a codificação UTF-8 do caractere.\n\nExemplo: `$encodeUrlComponent(\"?x=test\")` => `\"%3Fx%3Dtest\"`" + }, + "$encodeUrl": { + "args": "str", + "desc": "Codifica um Localizador Uniforme de Recursos (URL) substituindo cada instância de certos caracteres por uma, duas, três ou quatro sequências de escape que representam a codificação UTF-8 do caractere. \n\nExemplo: `$encodeUrl(\"https://mozilla.org/?x=шеллы\")` => `\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\"`" + }, + "$decodeUrlComponent": { + "args": "str", + "desc": "Decodifica um componente Localizador Uniforme de Recursos (URL) criado anteriormente por encodeUrlComponent. \n\nExemplo: `$decodeUrlComponent(\"%3Fx%3Dtest\")` => `\"?x=test\"`" + }, + "$decodeUrl": { + "args": "str", + "desc": "Decodifica um Localizador Uniforme de Recursos (URL) criado anteriormente por encodeUrl. \n\nExemplo: `$decodeUrl(\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\")` => `\"https://mozilla.org/?x=шеллы\"`" + }, + "$distinct": { + "args": "array", + "desc": "Retorna uma matriz com valores duplicados removidos da `array` " + }, + "$type": { + "args": "value", + "desc": "Retorna o tipo de `value` como uma cadeia de caracteres. Se `value` for indefinido, retornará `undefined` " + }, + "$moment": { + "args": "[str]", + "desc": "Obtém um objeto de dados usando a biblioteca 'Moment'." + } +} diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/common/20-inject.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/common/20-inject.html new file mode 100644 index 000000000..c2f3fedd5 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/common/20-inject.html @@ -0,0 +1,40 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/common/21-debug.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/common/21-debug.html new file mode 100644 index 000000000..0b0b3886d --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/common/21-debug.html @@ -0,0 +1,26 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/common/24-complete.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/common/24-complete.html new file mode 100644 index 000000000..a387a527a --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/common/24-complete.html @@ -0,0 +1,29 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/common/25-catch.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/common/25-catch.html new file mode 100644 index 000000000..848bd42b1 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/common/25-catch.html @@ -0,0 +1,42 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/common/25-status.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/common/25-status.html new file mode 100644 index 000000000..14056e88a --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/common/25-status.html @@ -0,0 +1,34 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/common/60-link.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/common/60-link.html new file mode 100644 index 000000000..7828e44d2 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/common/60-link.html @@ -0,0 +1,66 @@ + + + + + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/common/90-comment.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/common/90-comment.html new file mode 100644 index 000000000..520769ae0 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/common/90-comment.html @@ -0,0 +1,22 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/common/98-unknown.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/common/98-unknown.html new file mode 100644 index 000000000..ed7333e7a --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/common/98-unknown.html @@ -0,0 +1,28 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/function/10-function.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/function/10-function.html new file mode 100644 index 000000000..9791424aa --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/function/10-function.html @@ -0,0 +1,64 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/function/10-switch.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/function/10-switch.html new file mode 100644 index 000000000..a99ab31eb --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/function/10-switch.html @@ -0,0 +1,50 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/function/15-change.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/function/15-change.html new file mode 100644 index 000000000..fd93eefaa --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/function/15-change.html @@ -0,0 +1,39 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/function/16-range.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/function/16-range.html new file mode 100644 index 000000000..37dbe0127 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/function/16-range.html @@ -0,0 +1,44 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/function/80-template.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/function/80-template.html new file mode 100644 index 000000000..2eba49478 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/function/80-template.html @@ -0,0 +1,51 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/function/89-delay.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/function/89-delay.html new file mode 100644 index 000000000..7d9a5c42e --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/function/89-delay.html @@ -0,0 +1,64 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/function/89-trigger.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/function/89-trigger.html new file mode 100644 index 000000000..7c77e8d7d --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/function/89-trigger.html @@ -0,0 +1,50 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/function/90-exec.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/function/90-exec.html new file mode 100644 index 000000000..f97b138b4 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/function/90-exec.html @@ -0,0 +1,83 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/function/rbe.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/function/rbe.html new file mode 100644 index 000000000..48addc1ea --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/function/rbe.html @@ -0,0 +1,41 @@ + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/messages.json b/packages/node_modules/@node-red/nodes/locales/pt-BR/messages.json new file mode 100755 index 000000000..0b33937d8 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/messages.json @@ -0,0 +1,1127 @@ +{ + "common": { + "label": { + "payload": "Carga útil", + "topic": "Tópico", + "name": "Nome", + "username": "Nome de usuário", + "password": "Senha", + "property": "Propriedade", + "selectNodes": "Selecionar nós ...", + "expand": "Expandir" + }, + "status": { + "connected": "conectado", + "not-connected": "não conectado", + "disconnected": "desconectado", + "connecting": "conectando", + "error": "erro", + "ok": "OK" + }, + "notification": { + "error": " Erro : __message__", + "errors": { + "not-deployed": "nó não implementado", + "no-response": "sem resposta do servidor", + "unexpected": "erro inesperado (__status__) __message__" + } + }, + "errors": { + "nooverride": "Aviso: as propriedades do msg não podem mais substituir as propriedades do nó definido. Consulte bit.ly/nr-override-msg-props" + } + }, + "inject": { + "inject": "injetar", + "injectNow": "injetar agora", + "repeat": "repita = __repeat__", + "crontab": "crontab = __crontab__", + "stopped": "parado", + "failed": "Injeção falhou: __error__", + "label": { + "properties": "Propriedades", + "repeat": "Repetir", + "flow": "contexto de fluxo", + "global": "contexto global", + "str": "Cadeia de caracteres", + "num": "número", + "bool": "booliano", + "json": "objeto", + "bin": "Armazenamento temporário", + "date": "Carimbo de data/hora", + "env": "variável env", + "object": "objeto", + "string": "Cadeia de caracteres", + "boolean": "booliano", + "number": "número", + "Array": "matriz", + "invalid": "Objeto JSON inválido" + }, + "timestamp": "Carimbo de data/hora", + "none": "nenhum", + "interval": "intervalo", + "interval-time": "intervalo entre tempos", + "time": "em uma hora específica", + "seconds": "segundos", + "minutes": "minutos", + "hours": "horas", + "between": "entre", + "previous": "valor anterior", + "at": "a", + "and": "e", + "every": "todo", + "days": [ + "Segunda-feira", + "Terça-feira", + "Quarta-feira", + "Quinta-feira", + "Sexta-feira", + "Sábado", + "Domingo" + ], + "on": "em", + "onstart": "Injetar uma única vez depois", + "onceDelay": "segundos, depois", + "success": "Injetado com sucesso: __label__", + "errors": { + "failed": "injeção falhou, consulte o log para obter detalhes", + "toolong": "Intervalo muito grande", + "invalid-expr": "Expressão JSONata inválida: __error__", + "invalid-jsonata": "__prop__: expressão de propriedade inválida: __error__", + "invalid-prop": "__prop__: expressão de propriedade inválida: __error__", + "invalid-json": "__prop__: Dados JSON inválidos: __error__", + "invalid-repeat": "Valor de repetição inválido" + } + }, + "catch": { + "catch": "capturar: todos", + "catchNodes": "capturar: __number__", + "catchUncaught": "capturar: não capturado", + "label": { + "source": "Capturar erros de", + "selectAll": "selecionar tudo", + "uncaught": "Ignorar erros manipulados por outros nós de captura" + }, + "scope": { + "all": "todos os nós", + "selected": "nós selecionados" + } + }, + "status": { + "status": "estado: todos", + "statusNodes": "estado: __number__", + "label": { + "source": "Estado do relatório de", + "sortByType": "ordenar por tipo" + }, + "scope": { + "all": "todos os nós", + "selected": "nós selecionados" + } + }, + "complete": { + "completeNodes": "completo: __number__" + }, + "debug": { + "output": "Saída", + "status": "estados", + "none": "Nenhum", + "invalid-exp": "Expressão JSONata inválida: __error__", + "msgprop": "propriedades da mensagem", + "msgobj": "objeto msg completo", + "autostatus": "igual à saída de depuração", + "messageCount": "contador de mensagem", + "to": "Para", + "debtab": "aba de depuração", + "tabcon": "guia de depuração e console", + "toSidebar": "janela de depuração", + "toConsole": "console do sistema", + "toStatus": "estado do nó (32 caracteres)", + "severity": "Nível", + "node": "nó", + "notification": { + "activated": "Ativado com sucesso: __label__", + "deactivated": "Desativado com sucesso: __label__" + }, + "sidebar": { + "label": "depurar", + "name": "mensagens de depuração", + "filterAll": "todos os nós", + "filterSelected": "nós selecionados", + "filterCurrent": "fluxo atual", + "debugNodes": "Nós de depuração", + "clearLog": "Remover mensagens", + "clearFilteredLog": "Remover mensagens filtradas", + "filterLog": "filtrar mensagens", + "openWindow": "Abrir em uma nova janela", + "copyPath": "Copiar caminho", + "copyPayload": "Copiar valor", + "pinPath": "Pin aberto", + "selectAll": "selecionar todos", + "selectNone": "selecionar nenhum", + "all": "todos", + "filtered": "filtrado" + }, + "messageMenu": { + "collapseAll": "Recolher todos os caminhos", + "clearPinned": "Limpar caminhos fixados", + "filterNode": "Filtrar este nó", + "clearFilter": "Limpar filtro" + } + }, + "link": { + "linkIn": "entrada de ligação", + "linkOut": "saída de ligação", + "linkCall": "chamada de ligação", + "linkOutReturn": "retorno de ligação", + "outMode": "Modo", + "sendToAll": "Enviar para todos os nós de ligação conectados", + "returnToCaller": "Retornar ao nó de ligação que chamou", + "timeout": "tempo limite", + "linkCallType": "Tipo de Ligação", + "staticLinkCall": "Destino fixo", + "dynamicLinkCall": "Destino dinâmico(msg.target)", + "dynamicLinkLabel": "Dinâmico", + "error": { + "missingReturn": "Informação de retorno do nó ausente" + } + }, + "tls": { + "tls": "Configuração TLS", + "label": { + "use-local-files": "Use a chave e os certificados dos arquivos locais", + "upload": "Subir", + "cert": "Certificado", + "key": "Chave privada", + "passphrase": "Frase de passe", + "ca": "Certificado CA", + "verify-server-cert": "Verifique o certificado do servidor", + "servername": "Nome do servidor", + "alpnprotocol": "Protocolo ALPN" + }, + "placeholder": { + "cert": "caminho para o certificado (formato PEM)", + "key": "caminho para a chave privada (formato PEM)", + "ca": "caminho para o certificado CA (formato PEM)", + "passphrase": "frase de passe de chave privada (opcional)", + "servername": "para uso com SNI", + "alpnprotocol": "para uso com ALPN" + }, + "error": { + "missing-file": "Nenhum certificado/arquivo de chave fornecido", + "invalid-cert": "Certificado não especificado", + "invalid-key": "Chave privada não especificada" + } + }, + "exec": { + "exec": "executa", + "spawn": "gera", + "label": { + "command": "Comando", + "append": "Acrescentar", + "timeout": "Tempo esgotado", + "timeoutplace": "opcional", + "return": "Saída", + "seconds": "segundos", + "stdout": "stdout", + "stderr": "stderr", + "retcode": "código de retorno", + "winHide": "Ocultar console" + }, + "placeholder": { + "extraparams": "parâmetros de entrada extras" + }, + "opt": { + "exec": "quando o comando estiver completo - modo execução", + "spawn": "enquanto o comando está em execução - modo geração" + }, + "oldrc": "Usar saída de estilo antigo(modo de compatibilidade)" + }, + "function": { + "function": "", + "label": { + "setup": "Configurar", + "function": "Na mensagem", + "initialize": "No início", + "finalize": "Na parada", + "outputs": "Saídas", + "modules": "Módulos" + }, + "text": { + "initialize": "//O código adicionado aqui será executado uma vez\n// sempre que o nó for iniciado.\n", + "finalize": "//O código adicionado aqui será executado quando o nó\n// for interrompido ou reimplementado.\n" + }, + "require": { + "var": "variável", + "module": "módulo", + "moduleName": "Nome do módulo", + "importAs": "Importar como" + }, + "error": { + "externalModuleNotAllowed": "O nó de função não tem permissão para carregar módulos externos", + "moduleNotAllowed": "Módulo __module__ não permitido", + "externalModuleLoadError": "O nó de função falhou ao carregar módulos externos", + "moduleLoadError": "Falha ao carregar o módulo __module__: __error__", + "moduleNameError": "Nome da variável do módulo inválido: __name__", + "moduleNameReserved": "Nome da variável reservada: __name__", + "inputListener": "Não é possível adicionar um ouvinte ao evento de 'input' dentro da Função", + "non-message-returned": "A função tentou enviar uma mensagem do tipo __type__", + "invalid-js": "Erro no código JavaScript", + "missing-module": "Modulo __module__ ausente" + } + }, + "template": { + "template": "modelo", + "label": { + "template": "Modelo", + "property": "Propriedade", + "format": "Destaque de sintaxe", + "syntax": "Formato", + "output": "Saída como", + "mustache": "Modelo de bigode", + "plain": "Texto simples", + "json": "JSON analisado", + "yaml": "YAML analisado", + "none": "nenhum" + }, + "templatevalue": "Esta é a mensagem transmitida: {{payload}}!" + }, + "delay": { + "action": "Ação", + "for": "Para", + "delaymsg": "Atrasar cada mensagem", + "delayfixed": "Atraso corrigido", + "delayvarmsg": "Substituir atraso com msg.delay", + "randomdelay": "Atraso aleatório", + "limitrate": "Limite de taxa", + "limitall": "Todas as mensagens", + "limittopic": "Para cada msg.topic", + "fairqueue": "Envie cada tópico por vez", + "timedqueue": "Enviar todos os tópicos", + "milisecs": "Milissegundos", + "secs": "Segundos", + "sec": "Segundo", + "mins": "Minutos", + "min": "Minuto", + "hours": "Horas", + "hour": "Hora", + "days": "Dias", + "day": "Dia", + "between": "Entre", + "and": "&", + "rate": "Taxa", + "msgper": "msg(s) por", + "queuemsg": "Enfileirar mensagens intermediárias", + "dropmsg": "descarte mensagens intermediárias", + "sendmsg": "Enviar mensagens intermediárias na 2ª saída", + "allowrate": "permitir msg.rate (em ms) para substituir a taxa", + "label": { + "delay": "atraso", + "variable": "variável", + "limit": "limite", + "limitTopic": "limite de tópico", + "random": "randômico", + "rate": "taxa", + "random-first": "primeiro valor randômico", + "random-last": "último valor randômico", + "units" : { + "second": { + "plural" : "Segundos", + "singular": "Segundo" + }, + "minute": { + "plural" : "Minutos", + "singular": "Minuto" + }, + "hour": { + "plural" : "Horas", + "singular": "Hora" + }, + "day": { + "plural" : "Dias", + "singular": "Dia" + } + } + }, + "errors": { + "too-many": "muitas mensagens pendentes no nó de atraso", + "invalid-timeout": "Valor de atraso inválido", + "invalid-rate": "Valor de taxa inválido", + "invalid-rate-unit": "Valor de unidade de taxa inválido", + "invalid-random-first": "Primeiro valor randômico inválido", + "invalid-random-last": "Último valor randômico inválido" + } + }, + "trigger": { + "send": "Enviar", + "then": "então", + "then-send": "então enviem", + "output": { + "string": "a cadeia de caracteres", + "number": "o número", + "existing": "o objeto msg existente", + "original": "o objeto msg original", + "latest": "o objeto de mensagem mais recente", + "nothing": "nada" + }, + "wait-reset": "aguarde para ser reiniciado", + "wait-for": "esperar por", + "wait-loop": "reenviar a cada", + "for": "Manuseio", + "bytopics": "cada", + "alltopics": "todas as mensagens", + "duration": { + "ms": "Milissegundos", + "s": "Segundos", + "m": "Minutos", + "h": "Horas" + }, + "extend": "estender o atraso se uma nova mensagem chegar", + "override": "anular o atraso com msg.delay", + "second": "enviar segunda mensagem para saída separada", + "label": { + "trigger": "gatilho", + "trigger-block": "gatilho & bloqueio", + "trigger-loop": "reenviar a cada", + "reset": "Reinicialize o gatilho se:", + "resetMessage": "msg.reset está definida", + "resetPayload": "msg.payload é igual a", + "resetprompt": "opcional", + "duration": "duração", + "topic": "tópico" + } + }, + "comment": { + "comment": "comentário" + }, + "unknown": { + "label": { + "unknown": "desconhecido" + }, + "tip": "

Este nó é desconhecido para a sua instalação do Node-RED.

Se você decidir implementar com o nó neste estado, sua configuração será preservada, mas o fluxo não será iniciado até que o tipo ausente seja instalado.

Consulte a barra lateral de informações para obter mais ajuda

" + }, + "mqtt": { + "label": { + "broker": "Servidor", + "example": "por exemplo, localhost", + "output": "Saída", + "qos": "QoS", + "retain": "Reter", + "clientid": "ID do cliente", + "port": "Porta", + "keepalive": "Mantenha-se vivo", + "cleansession": "Usar sessão limpa", + "cleanstart": "Usar um começo limpo", + "use-tls": "Usar TLS", + "tls-config": "Configuração TLS", + "verify-server-cert": "Verifique o certificado do servidor", + "compatmode": "Usar suporte MQTT 3.1 legado", + "userProperties": "Propriedades do usuário", + "subscriptionIdentifier": "ID de inscrição", + "flags": "Bandeiras", + "nl": "Não receber mensagens publicadas por este cliente", + "rap": "Manter a bandeira de retenção da publicação original", + "rh": "Tratamento de mensagens retidas", + "rh0": "Enviar mensagens retidas", + "rh1": "Enviar apenas para novas assinaturas", + "rh2": "Não enviar", + "responseTopic": "Tópico de resposta", + "contentType": "Tipo de conteúdo", + "correlationData": "Dados de Correlação", + "expiry": "Expira (s)", + "sessionExpiry": "Expiração da Sessão (s)", + "topicAlias": "Apelido", + "payloadFormatIndicator": "Formato", + "payloadFormatIndicatorFalse": "bytes não especificados (padrão)", + "payloadFormatIndicatorTrue": "Mensagem codificada em UTF-8", + "protocolVersion": "Protocolo", + "protocolVersion3": "MQTT V3.1 (legado)", + "protocolVersion4": "MQTT V3.1.1", + "protocolVersion5": "MQTT V5", + "topicAliasMaximum": "Alias ​​Max", + "maximumPacketSize": "Tamanho máximo do pacote", + "receiveMaximum": "Recebimento Máximo", + "session": "Sessão", + "delay": "Atraso", + "action": "Ação", + "staticTopic": "Assinar um tópico único", + "dynamicTopic": "Assinatura dinâmica", + "auto-connect": "Conectar automaticamente", + "auto-mode-depreciated": "Esta opção está deprecada. Favor utilizar o novo modo de auto-detecção.", + }, + "sections-label": { + "birth-message": "Mensagem enviada na conexão (mensagem de nascimento)", + "will-message": "Mensagem enviada em uma desconexão inesperada (mensagem de dever)", + "close-message": "Mensagem enviada antes de desconectar (mensagem de fechamento)" + }, + "tabs-label": { + "connection": "Conexão", + "security": "Segurança", + "messages": "Mensagens" + }, + "placeholder": { + "clientid": "Deixe em branco para geração automática", + "clientid-nonclean": "Deve ser definido para sessões não limpas", + "will-topic": "Deixe em branco para desativar a mensagem de dever", + "birth-topic": "Deixe em branco para desativar a mensagem de nascimento", + "close-topic": "Deixe em branco para desativar a mensagem de fechamento" + }, + "state": { + "connected": "Conectado ao negociante: _ broker _", + "disconnected": "Desconectado do negociante: _ broker _", + "connect-failed": "Falha na conexão com o negociante: __broker__", + "broker-disconnected": "Cliente de negociante __broker__ desconectado: __reasonCode__ __reasonString__" + }, + "retain": "Reter", + "output": { + "buffer": "um armazenamento temporário", + "string": "uma cadeia de caracteres", + "base64": "uma cadeia de caracteres codificada em Base64", + "auto": "detecção automática (cadeia de caracteres ou armazenamento temporário)", + "auto-detect": "auto-detecção(objeto JSON, cadeia de caracteres ou armazenamento temporário analisados sintaticamente)", + "json": "um objeto JSON analisado sintaticamente" + }, + "true": "verdadeiro", + "false": "falso", + "tip": "Dica: deixe o tópico, qos ou retenha em branco se quiser defini-los por meio das propriedades da mensagem.", + "errors": { + "not-defined": "tópico não definido", + "missing-config": "configuração do corretor ausente", + "invalid-topic": "Tópico inválido especificado", + "nonclean-missingclientid": "Nenhum ID de cliente definido, usando sessão limpa", + "invalid-json-string": "Cadeia de caracteres JSON inválida", + "invalid-json-parse": "Falha ao analisar a cadeia de caracteres JSON", + "invalid-action-action": "ação inválida especificada", + "invalid-action-alreadyconnected": "Desconectado do agente antes de estar conectado", + "invalid-action-badsubscription": "msg.topic não encontrado ou inválido", + "invalid-client-id": "Faltando ID do cliente" + } + }, + "httpin": { + "label": { + "method": "Método", + "url": "URL", + "doc": "Documentos", + "return": "Retorno", + "upload": "Aceitar Subir arquivos?", + "status": "Código de estado", + "headers": "Cabeçalhos", + "other": "outro", + "paytoqs" : { + "ignore": "Ignorar", + "query": "Anexar aos parâmetros da cadeia de caracteres de consulta", + "body": "Enviar como corpo de pedido" + }, + "utf8String": "cadeia de caracteres UTF8", + "binaryBuffer": "armazenamento temporário binário", + "jsonObject": "objeto JSON analisado", + "authType": "Tipo", + "bearerToken": "Ficha" + }, + "setby": "- definido por msg.method -", + "basicauth": "Usar autenticação", + "use-tls": "Ativar conexão segura (SSL / TLS)", + "tls-config": "Configuração TLS", + "basic": "autenticação básica", + "digest": "processar autenticação", + "bearer": "autenticação do portador", + "use-proxy": "Use proxy", + "persist": "Habilitar conexão mantenha-se vivo", + "proxy-config": "Configuração de proxy", + "use-proxyauth": "Usar autenticação de proxy", + "noproxy-hosts": "Ignorar servidores", + "senderr": "Somente envie respostas não-2xx para o nó de Captura", + "utf8": "uma cadeia de caracteres UTF-8", + "binary": "um armazenamento temporário binário", + "json": "um objeto JSON analisado", + "tip": { + "in": "A url será relativa a", + "res": "As mensagens enviadas para este nó tem que ser originadas a partir de um nó http input", + "req": "Dica: Se a análise sintática JSON falhar, a cadeia de caracteres coletada é retornada assim como está." + }, + "httpreq": "requisição http", + "errors": { + "not-created": "Não é possível criar o nó http-in quando o httpNodeRoot estiver definido como falso", + "missing-path": "caminho ausente", + "no-response": "Objeto sem resposta", + "json-error": "Erro de análise sintática JSON", + "no-url": "Nenhuma url especificada", + "deprecated-call": "Chamada obsoleta para __method__", + "invalid-transport": "transporte não-http solicitado", + "timeout-isnan": "O valor do tempo de expiração não é um número válido, ignorando", + "timeout-isnegative": "O valor do tempo de expiração é negativo, ignorando", + "invalid-payload": "carga útil inválida", + "invalid-url": "URL inválida" + }, + "status": { + "requesting": "solicitando" + } + }, + "websocket": { + "label": { + "type": "Tipo", + "path": "Caminho", + "url": "URL", + "subprotocol": "Subprotocolo" + }, + "listenon": "Ouvir em", + "connectto": "Conectar-se a", + "sendrec": "Enviar/Receber", + "payload": "carga útil", + "message": "mensagem inteira", + "sendheartbeat": "Enviar batida de coração", + "tip": { + "path1": "Por padrão, a carga útil conterá os dados a serem enviados ou recebidos de um websocket. O ouvinte pode ser configurado para enviar ou receber todo o objeto de mensagem como uma cadeia de caracteres formatada em JSON.", + "path2": "Este caminho será relativo a __path__.", + "url1": "A URL deve usar o esquema ws:// ou wss:// e apontar para um ouvinte de websocket existente.", + "url2": "Por padrão, carga útil conterá os dados a serem enviados ou recebidos de um websocket. O cliente pode ser configurado para enviar ou receber todo o objeto de mensagem como uma cadeia de caracteres formatada em JSON." + }, + "status": { + "conectado": "conectado __count__", + "conectado_plural": "conectado __count__" + }, + "errors": { + "connect-error": "Ocorreu um erro na conexão ws:", + "send-error": "Ocorreu um erro ao enviar:", + "missing-conf": "Configuração do servidor ausente", + "duplicate-path": "Não é possível ter dois ouvintes WebSocket no mesmo caminho: __path__", + "missing-server": "Configuração de servidor não encontrada", + "missing-client": "Configuração de cliente não encontrada" + } + }, + "watch": { + "watch": "Observar", + "label": { + "files": "Arquivo(s)", + "recursive": "Observe os subdiretórios recursivamente" + }, + "placeholder": { + "files": "Lista separada por vírgulas de arquivos e/ou diretórios" + }, + "tip": "No Windows você deve usar barras invertidas duplas \\\\ em qualquer nome de diretório." + }, + "tcpin": { + "label": { + "type": "Tipo", + "output": "Saída", + "port": "porta", + "host": "no servidor", + "payload": "carga(s) útil(eis)", + "delimited": "delimitado por", + "close-connection": "Fechar a conexão após o envio de cada mensagem?", + "decode-base64": "Decodificar mensagem Base64?", + "server": "Servidor", + "return": "Retornar", + "ms": "ms", + "chars": "caracteres", + "close": "Fechar", + "optional": "(opcional)", + "reattach": "Reanexar delimitador" + }, + "type": { + "listen": "Ouvindo na", + "connect": "Conectar a", + "reply": "Responder ao TCP" + }, + "output": { + "stream": "transmissão de", + "single": "único", + "buffer": "Armazenamento Temporário", + "string": "Cadeia de caracteres", + "base64": "Cadeia de caracteres Base64" + }, + "return": { + "timeout": "após um tempo de expiração fixo de", + "character": "quando o caractere recebido é", + "number": "depois de um número fixo de caracteres", + "never": "nunca - mantenha a conexão aberta", + "immed": "imediatamente - não espere por resposta" + }, + "status": { + "connecting": "conectando a __host __: __ port__", + "connected": "conectado a __host __: __ port__", + "listening-port": "escutando na porta __port__", + "stopped-listening": "parou de ouvir na porta", + "connection-from": "conexão de __host __: __ port__", + "connection-closed": "conexão fechada de __host __: __ port__", + "connections": "__count__ conexão", + "connections_plural": "__count__ conexões" + }, + "errors": { + "connection-lost": "conexão perdida para __host __: __ port__", + "timeout": "tempo limite fechado porta do soquete __port__", + "cannot-listen": "não é possível escutar na porta __port__, erro: __error__", + "error": "erro: __error__", + "socket-error": "erro de soquete __host __: __ port__", + "no-host": "Servidor e/ou porta não configurada", + "connect-timeout": "tempo limite de conexão", + "connect-fail": "falha de conexão", + "bad-string": "falha ao converter para cadeia de caracteres", + "invalid-host": "Servidor inválido", + "invalid-port": "Porta inválida" + } + }, + "udp": { + "label": { + "listen": "Ouvindo ao", + "onport": "na porta", + "using": "usando", + "output": "Saída", + "group": "Grupo", + "interface": "IF Local", + "send": "Enviar um", + "toport": "para a porta", + "address": "Endereço", + "decode-base64": "Decodificar carga útil codificada em Base64?", + "port": "porta" + }, + "placeholder": { + "interface": "(opcional) interface local ou endereço para vincular a", + "interfaceprompt": "(opcional) interface local ou endereço para vincular a", + "address": "ip de destino" + }, + "udpmsgs": "mensagens udp", + "mcmsgs": "mensagens multidifusão", + "udpmsg": "mensagem udp", + "bcmsg": "mensagem de transmissão abrangente", + "mcmsg": "mensagem multidifusão", + "output": { + "buffer": "um Armazenamento temporário", + "string": "uma Cadeia de caracteres", + "base64": "uma Cadeia de caracteres codificada em Base64" + }, + "bind": { + "random": "vincular a porta local aleatória", + "local": "vincular à porta local", + "target": "vincular à porta de destino" + }, + "tip": { + "in": "Dica: certifique-se de que seu dispositivo firewall permitirá a entrada de dados.", + "out": "Dica: deixe o endereço e a porta em branco se quiser definir usando msg.ip e msg.port.", + "port": "Portas já em uso:" + }, + "status": { + "listener-at": "ouvinte udp em __host __: __ port__", + "mc-group": "grupo multidifusão udp __group__", + "listener-stopped": "ouvinte udp parado", + "output-stopped": "saída udp parada", + "mc-ready": "multidifusão udp pronto: __iface __: __ outport__ -> __host __: __ port__", + "bc-ready": "transmissão abrangente udp pronta: __outport__ -> __host __: __ port__", + "ready": "udp pronto: __outport__ -> __host __: __ port__", + "ready-nolocal": "udp pronto: __host __: __ port__", + "re-use": "udp reutilizar soquete: __outport__ -> __host __: __ port__" + }, + "errors": { + "access-error": "Erro de acesso UDP, você pode precisar de acesso root para portas abaixo de 1024", + "error": "erro: __error__", + "bad-mcaddress": "Endereço multidifusão Ruim", + "interface": "Deve ser o endereço IP da interface necessária", + "ip-notset": "udp: endereço ip não definido", + "port-notset": "udp: porta não configurada", + "port-invalid": "udp: número da porta não é válido", + "alreadyused": "udp: porta __port__ já em uso", + "ifnotfound": "udp: interface __iface__ não encontrada", + "invalid-group": "grupo multidifusão inválido" + } + }, + "switch": { + "switch": "interruptor", + "label": { + "property": "Propriedade", + "rule": "regra", + "repair": "recriar sequências de mensagens", + "value-rules": "regras de valores", + "sequence-rules": "regras de sequencia" + }, + "previous": "valor anterior", + "and": "e", + "checkall": "checando todas as regras", + "stopfirst": "parando após a primeira correspondência", + "ignorecase": "ignorar caso", + "rules": { + "btwn": "está entre", + "cont": "contém", + "regex": "corresponde a regex", + "true": "é verdadeiro", + "false": "é falso", + "null": "é nulo", + "nnull": "não é nulo", + "istype": "é do tipo", + "empty": "está vazio", + "nempty": "não está vazio", + "head": "topo", + "tail": "final", + "index": "índice entre", + "exp": "JSONata exp", + "else": "caso contrário", + "hask": "tem chave" + }, + "errors": { + "invalid-expr": "Expressão JSONata inválida: __error__", + "too-many": "muitas mensagens pendentes no nó interruptor" + } + }, + "change": { + "label": { + "rules": "Regras", + "rule": "regra", + "set": "definir __property__", + "change": "alterar __property__", + "delete": "apagar __property__", + "move": "mover __property__", + "changeCount": "alterar: __count__ regras", + "regex": "Use expressões regulares", + "deepCopy": "Valor de copia profunda" + }, + "action": { + "set": "Definir", + "change": "Mudar", + "delete": "Apagar", + "move": "Mover", + "toValue": "para o valor", + "to": "para", + "search": "Procurar por", + "replace": "Substituir por" + }, + "errors": { + "invalid-from": "Propriedade 'from' inválida: __error__", + "invalid-json": "Propriedade 'to' JSON inválida", + "invalid-expr": "Expressão JSONata inválida: __error__", + "no-override": "Não é possível definir a propriedade do tipo não objeto: __property__", + "invalid-prop": "expressão de propriedade inválida: __property__", + "invalid-json-data": " Dados JSON inválidos: __error__" + } + }, + "range": { + "range": "alcance", + "label": { + "action": "Ação", + "inputrange": "Mapeie o intervalo de entrada", + "resultrange": "para o intervalo alvo", + "from": "de", + "to": "para", + "roundresult": "Arredonda o resultado para o número inteiro mais próximo?", + "minin": "entrada de", + "maxin": "entrada para", + "minout": "destino de", + "maxout": "destino para" + }, + "placeholder": { + "min": "ex: 0", + "maxin": "ex: 99", + "maxout": "ex: 255" + }, + "scale": { + "payload": "Dimensione a propriedade da mensagem", + "limit": "Escala e limite para o intervalo desejado", + "wrap": "Escala e quebra dentro do intervalo desejado" + }, + "tip": "Dica: Este nó SOMENTE funciona com números.", + "errors": { + "notnumber": "Não é um número" + } + }, + "csv": { + "label": { + "columns": "Colunas", + "separator": "Separador", + "c2o": "opções CSV para objeto", + "o2c": "opções Objeto para CSV", + "input": "Entrada", + "skip-s": "Pular primeiro", + "skip-e": "linhas", + "firstrow": "a primeira linha contém os nomes das colunas", + "output": "Saída", + "includerow": "incluir linha de nome de coluna", + "newline": "Nova linha", + "usestrings": "analise sintática de valores numéricos", + "include_empty_strings": "incluir cadeia de caracteres vazias", + "include_null_values": "incluir valores nulos" + }, + "placeholder": { + "columns": "nomes de colunas separados por vírgulas" + }, + "separator": { + "comma": "vírgula", + "tab": "tabulação", + "space": "espaço", + "semicolon": "ponto e vírgula", + "colon": "dois pontos", + "hashtag": "tralha", + "other": "outro..." + }, + "output": { + "row": "uma mensagem por linha", + "array": "uma única mensagem [matriz]" + }, + "newline": { + "linux": "Linux (\\n)", + "mac": "Mac (\\r)", + "windows": "Windows (\\r\\n)" + }, + "hdrout": { + "none": "nunca enviar cabeçalhos de coluna", + "all": "sempre enviar cabeçalhos de coluna", + "once": "envia cabeçalhos uma vez, até msg.reset" + }, + "errors": { + "csv_js": "Este nó lida apenas com cadeia de caracteres CSV ou objetos js.", + "obj_csv": "Nenhum modelo de colunas especificado para o objeto -> CSV.", + "bad_csv": "Dados CSV malformados - saída provavelmente corrompida." + } + }, + "html": { + "label": { + "select": "Seletor", + "output": "Saída", + "in": "entrada" + }, + "output": { + "html": "o conteúdo HTML dos elementos", + "text": "apenas o conteúdo de texto dos elementos", + "attr": "um objeto de quaisquer atributos dos elementos" + }, + "format": { + "single": "como uma única mensagem contendo uma matriz", + "multi": "como mensagens múltiplas, uma para cada elemento" + } + }, + "json": { + "errors": { + "dropped-object": "Carga útil não objeto ignorada", + "dropped": "Tipo de carga útil não suportada ignorada", + "dropped-error": "Falha ao converter carga útil", + "schema-error": "Erro de esquema JSON", + "schema-error-compile": "Erro de esquema JSON: falha ao compilar o esquema" + }, + "label": { + "o2j": "Objeto para opções JSON", + "pretty": "Formatar cadeia de caracteres JSON", + "action": "Ação", + "property": "Propriedade", + "actions": { + "toggle": "Converter entre cadeia de caracteres JSON e Objeto", + "str": "Sempre converter em cadeia de caracteres JSON", + "obj": "Sempre converter para objeto JavaScript" + } + } + }, + "yaml": { + "errors": { + "dropped-object": "Carga útil não objeto ignorada", + "dropped": "Tipo de carga útil não suportada ignorado", + "dropped-error": "Falha ao converter carga útil" + } + }, + "xml": { + "label": { + "represent": "Nome da propriedade para atributos de tag XML", + "prefix": "Nome da propriedade para o conteúdo do texto da tag", + "advanced": "Opções avançadas", + "x2o": "Opções de XML para objeto" + }, + "errors": { + "xml_js": "Este nó lida apenas com cadeia de caracteres xml ou objetos js." + } + }, + "file": { + "label": { + "write": "escrever arquivo", + "read": "ler arquivo", + "filename": "Nome do arquivo", + "path": "caminho", + "action": "Ação", + "addnewline": "Adicionar nova linha (\\n) a cada carga útil?", + "createdir": "Criar diretório se não existir?", + "outputas": "Gerar como", + "breakchunks": "Quebre em pedaços", + "breaklines": "Quebra nas linhas", + "sendError": "Enviar mensagem em caso de erro (modo legado)", + "encoding": "Codificação", + "deletelabel": "excluir __file__", + "utf8String": "cadeia de caracteres UTF8", + "utf8String_plural": "cadeia de caracteres UTF8", + "binaryBuffer": "armazenamento temporário binário", + "binaryBuffer_plural": "armazenamentos temporários binários", + "allProps": "inclui todas as propriedades existentes em cada mensagem" + }, + "action": { + "append": "adicionar ao arquivo", + "overwrite": "sobrescrever file", + "delete": "apagar file" + }, + "output": { + "utf8": "uma única cadeia de caracteres utf8", + "buffer": "um único objeto de armazenamento temporário", + "lines": "uma mensagem por linha", + "stream": "um transmissão do armazenamento temporário" + }, + "status": { + "wrotefile": "escreveu no arquivo: __file__", + "deletedfile": "arquivo excluído: __file__", + "appendedfile": "anexado ao arquivo: __file__" + }, + "encoding": { + "none": "padrão", + "setbymsg": "definido por msg.encoding", + "native": "Nativo", + "unicode": "Unicode", + "japanese": "Japonês", + "chinese": "Chinês", + "korean": "Coreano", + "taiwan": "Taiwan / Hong Kong", + "windows": "Páginas de código do Windows", + "iso": "Páginas de código ISO", + "ibm": "Páginas de código IBM", + "mac": "Páginas de código Mac", + "koi8": "Páginas de código KOI8", + "misc": "Diversos" + }, + "errors": { + "nofilename": "Nenhum nome de arquivo especificado", + "invaliddelete": "Aviso: exclusão inválida. Use a opção de exclusão específica na caixa de diálogo de configuração.", + "deletefail": "falhou ao apagar o arquivo: __error__", + "writefail": "falha ao gravar no arquivo: __error__", + "appendfail": "falhou ao adicionar ao final do arquivo: __error__", + "createfail": "falhou ao criar o arquivo: __error__" + }, + "tip": "Dica: O nome do arquivo deve ser um caminho absoluto, caso contrário, será relativo ao diretório de trabalho do processo Node-RED." + }, + "split": { + "split": "dividir", + "intro": "Divida msg.payload com base no tipo:", + "object": "Objeto", + "objectSend": "Envia uma mensagem para cada par chave/valor", + "strBuff": "Cadeia de caracteres / Armazenamento Temporário", + "array": "Matriz", + "splitUsing": "Dividir usando", + "splitLength": "Comprimento fixo de", + "stream": "Tratar como uma transmissão de mensagens", + "addname": "Copiar chave para" + }, + "join": { + "join": "junte", + "mode": { + "mode": "Modo", + "auto": "automático", + "merge": "sequências de mesclagem", + "reduce": "reduzir sequência", + "custom": "manual" + }, + "combine": "Combine cada", + "completeMessage": "mensagem completa", + "create": "para criar", + "type": { + "string": "uma Cadeia de caracteres", + "array": "uma Matriz", + "buffer": "um Armazenamento Temporário", + "object": "um Objeto chave/valor", + "merged": "um Objeto mesclado" + }, + "using": "usando o valor de", + "key": "como a chave", + "joinedUsing": "juntou-se usando", + "send": "Envie a mensagem:", + "afterCount": "Depois de várias partes da mensagem", + "count": "contar", + "subsequent": "e todas as mensagens subsequentes.", + "afterTimeout": "Após um tempo limite esgotado em seguida da primeira mensagem", + "seconds": "segundos", + "complete": "Após uma mensagem com a propriedade msg.complete definida", + "tip": "Este modo assume que este nó ou está pareado com um nó de divisão ou as mensagens recebidas terão uma propriedade msg.parts devidamente configurada.", + "too-many": "muitas mensagens pendentes no nó de junção", + "message-prop": "propriedade da mensagem", + "merge": { + "topics-label": "Tópicos mesclados", + "topics": "tópicos", + "topic": "tópico", + "on-change": "Enviar mensagem mesclada na chegada de um novo tópico" + }, + "reduce": { + "exp": "Reduzir exp", + "exp-value": "valor da exp", + "init": "Valor inicial", + "right": "Avalie na ordem inversa (do último ao primeiro)", + "fixup": "Exp de reparo" + }, + "errors": { + "invalid-expr": "Expressão JSONata inválida: __error__", + "invalid-type": "Não é possível juntar __error__ ao armazenamento temporário" + } + }, + "sort": { + "sort": "ordenar", + "target": "Classificar", + "seq": "sequência de mensagens", + "key": "Chave", + "elem": "valor do elemento", + "order": "Pedido", + "ascending": "ascendente", + "descending": "descendente", + "as-number": "como número", + "invalid-exp": "Expressão JSONata inválida no nó de classificação: __message__", + "too-many": "Muitas mensagens pendentes no nó de classificação", + "clear": "limpar a mensagem pendente no nó de classificação" + }, + "batch" : { + "batch": "lote", + "mode": { + "label": "Modo", + "num-msgs": "Agrupar por número de mensagens", + "interval": "Agrupar por intervalo de tempo", + "concat": "Concatenar sequências" + }, + "count": { + "label": "Número de mensagens", + "overlap": "Sobreposição", + "count": "contar", + "invalid": "Contagem inválida e sobreposição" + }, + "interval": { + "label": "Intervalo", + "seconds": "segundos", + "empty": "enviar mensagem vazia quando nenhuma mensagem chegar" + }, + "concat": { + "topics-label": "Tópicos", + "topic": "tópico" + }, + "too-many": "muitas mensagens pendentes no nó de lote", + "unexpected": "modo inesperado", + "no-parts": "sem partes de propriedades na mensagem", + "error": { + "invalid-count": "Contador inválido", + "invalid-overlap": "Sobreposição inválida", + "invalid-interval": "Intervalo inválido" + } + }, + "rbe": { + "rbe": "filtro", + "label": { + "func": "Modo", + "init": "Enviar valor inicial", + "start": "Valor inicial", + "name": "Nome", + "septopics": "Aplicar modo separadamente para cada", + "gap": "troca de valor", + "property": "propriedade", + "topic": "tópico" + }, + "placeholder":{ + "bandgap": "por exemplo, 10 ou 5%", + "start": "deixe em branco para usar os primeiros dados recebidos" + }, + "opts": { + "rbe": "bloquear a menos que o valor mude", + "rbei": "bloquear a menos que o valor mude (ignorar o valor inicial)", + "deadband": "bloquear a menos que a alteração do valor seja maior que", + "deadbandEq": "bloquear a menos que a alteração do valor seja maior ou igual a", + "narrowband": "bloquear se a alteração do valor for maior que", + "narrowbandEq": "bloquear se a alteração do valor for maior ou igual a", + "in": "em comparação com o último valor de entrada", + "out": "em comparação com o último valor de saída válido" + }, + "warn": { + "nonumber": "nenhum número encontrado na carga útil" + } + } +} diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/network/05-tls.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/network/05-tls.html new file mode 100644 index 000000000..74c9ff97f --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/network/05-tls.html @@ -0,0 +1,19 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/network/06-httpproxy.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/network/06-httpproxy.html new file mode 100644 index 000000000..1a7b14a51 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/network/06-httpproxy.html @@ -0,0 +1,22 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/network/10-mqtt.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/network/10-mqtt.html new file mode 100644 index 000000000..6d25c14ed --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/network/10-mqtt.html @@ -0,0 +1,158 @@ + + + + + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/network/21-httpin.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/network/21-httpin.html new file mode 100644 index 000000000..88212eab3 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/network/21-httpin.html @@ -0,0 +1,100 @@ + + + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/network/21-httprequest.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/network/21-httprequest.html new file mode 100644 index 000000000..5a333e6ea --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/network/21-httprequest.html @@ -0,0 +1,90 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/network/22-websocket.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/network/22-websocket.html new file mode 100644 index 000000000..91abd8cdd --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/network/22-websocket.html @@ -0,0 +1,43 @@ + + + + + + + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/network/31-tcpin.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/network/31-tcpin.html new file mode 100644 index 000000000..1329e79eb --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/network/31-tcpin.html @@ -0,0 +1,45 @@ + + + + + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/network/32-udp.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/network/32-udp.html new file mode 100644 index 000000000..661d43083 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/network/32-udp.html @@ -0,0 +1,31 @@ + + + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/parsers/70-CSV.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/parsers/70-CSV.html new file mode 100644 index 000000000..3bb441857 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/parsers/70-CSV.html @@ -0,0 +1,49 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/parsers/70-HTML.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/parsers/70-HTML.html new file mode 100644 index 000000000..46ab6f60c --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/parsers/70-HTML.html @@ -0,0 +1,36 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/parsers/70-JSON.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/parsers/70-JSON.html new file mode 100644 index 000000000..4c91e4f9e --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/parsers/70-JSON.html @@ -0,0 +1,53 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/parsers/70-XML.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/parsers/70-XML.html new file mode 100644 index 000000000..757d38dbf --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/parsers/70-XML.html @@ -0,0 +1,50 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/parsers/70-YAML.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/parsers/70-YAML.html new file mode 100644 index 000000000..cdc73673f --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/parsers/70-YAML.html @@ -0,0 +1,34 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/sequence/17-split.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/sequence/17-split.html new file mode 100644 index 000000000..0e1cd10f9 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/sequence/17-split.html @@ -0,0 +1,165 @@ + + + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/sequence/18-sort.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/sequence/18-sort.html new file mode 100644 index 000000000..8d4bfac3a --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/sequence/18-sort.html @@ -0,0 +1,41 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/sequence/19-batch.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/sequence/19-batch.html new file mode 100644 index 000000000..e1f33f3bc --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/sequence/19-batch.html @@ -0,0 +1,43 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/storage/10-file.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/storage/10-file.html new file mode 100644 index 000000000..f2299a230 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/storage/10-file.html @@ -0,0 +1,67 @@ + + + + + diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/storage/23-watch.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/storage/23-watch.html new file mode 100644 index 000000000..478103586 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/storage/23-watch.html @@ -0,0 +1,30 @@ + + + diff --git a/packages/node_modules/@node-red/runtime/locales/pt-BR/runtime.json b/packages/node_modules/@node-red/runtime/locales/pt-BR/runtime.json new file mode 100644 index 000000000..7ef9c8676 --- /dev/null +++ b/packages/node_modules/@node-red/runtime/locales/pt-BR/runtime.json @@ -0,0 +1,199 @@ +{ + "runtime": { + "welcome": "Bem vindo ao Node-RED", + "version": "__component__ versão: __version__", + "unsupported_version": "Versão não suportada de __component__. Requer: __requires__ Encontrado: __version__", + "paths": { + "settings": "Arquivo de configurações : __path__", + "httpStatic": "HTTP Estático : __path__" + } + }, + + "server": { + "loading": "Carregando paletá de nós", + "palette-editor": { + "disabled": "Editor de paletas desativado : configurações do usuário", + "npm-not-found": "Editor de paleta desativado : comando npm não encontrado", + "npm-too-old": "Editor de paleta desativado : versão npm muito antiga. Requer npm> = 3.x" + }, + "errors": "Falha ao registrar __count__ tipo de nó", + "errors_plural": "Falha ao registrar __count__ tipos de nós", + "errors-help": "Execute com -v para obter detalhes", + "missing-modules": "Módulos de nó que estão faltando:", + "node-version-mismatch": "O módulo de nó não pode ser carregado nesta versão. Requer: __version__", + "type-already-registered": "'__type__' já registrado pelo módulo __module__", + "removing-modules": "Removendo os módulos da configuração", + "added-types": "Tipos de nós adicionados:", + "removed-types": "Tipos de nós removidos:", + "install": { + "invalid": "Nome de módulo inválido", + "installing": "Módulo de instalação: __name__, versão: __version__", + "installed": "Módulo instalado: __name__", + "install-failed": "Instalação falhou", + "install-failed-long": "Instalação do módulo __name__ falhou:", + "install-failed-not-found": "Módulo $t(server.install.install-failed-long) não encontrado", + "install-failed-name": "$t(server.install.install-failed-long) nome do módulo inválido: __name__", + "install-failed-url": "$t(server.install.install-failed-long) url inválido: __url__", + "post-install-error": "Erro ao executar o gancho 'postInstall':", + "upgrading": "Módulo de atualização: __name__ para a versão: __version__", + "upgraded": "Módulo atualizado: __name__. Reinicie o Node-RED para usar a nova versão", + "upgrade-failed-not-found": "$t(server.install.install-failed-long) versão não encontrada", + "uninstalling": "Desinstalando módulo: __name__", + "uninstall-failed": "Desinstalação falhou", + "uninstall-failed-long": "A desinstalação do módulo __name__ falhou:", + "uninstalled": "Módulo desinstalado: __name__", + "old-ext-mod-dir-warning": "\n\n---------------------------------------------------------------------\ndetectado diretório de módulos externos do Node-RED 1.3:\n __oldDir__\nEste diretório não é mais usado. Módulos externos serão\nreinstalados em seu diretório de usuário Node-RED:\n __newDir__\nExclua o diretório 'externalModules' antigo para interromper esta mensagem.\n---------------------------------------------------------------------\n" + }, + "deprecatedOption": "O uso de __old__ está DESCONTINUADO. Use __new__ em seu lugar", + "unable-to-listen": "Incapaz de ouvir em __listenpath__", + "port-in-use": "Erro: porta em uso", + "uncaught-exception": "Exceção não capturada:", + "admin-ui-disabled": "Admin UI desativada", + "now-running": "servidor rodando agora em __listenpath__", + "failed-to-start": "Falhou ao iniciar o servidor:", + "headless-mode": "Executando no modo sem interface gráfica", + "httpadminauth-deprecated": "O uso de 'httpAdminAuth' está DESCONTINUADO. Use 'adminAuth' em seu lugar", + "https": { + "refresh-interval": "Atualizando as configurações de https a cada __interval__ hora(s)", + "settings-refreshed": "As configurações https do servidor foram atualizadas", + "refresh-failed": "Falha ao atualizar as configurações https: __message__", + "nodejs-version": "httpsRefreshInterval requer Node.js 11 ou posterior", + "function-required": "httpsRefreshInterval requer que a propriedade https seja uma função" + } + }, + + "api": { + "flows": { + "error-save": "Erro ao salvar fluxos: __message__", + "error-reload": "Erro ao recarregar fluxos: __message__" + }, + "library": { + "error-load-entry": "Erro ao carregar a entrada da biblioteca '__path__': __message__", + "error-save-entry": "Erro ao salvar a entrada da biblioteca '__path__': __message__", + "error-load-flow": "Erro ao carregar o fluxo '__path__': __message__", + "error-save-flow": "Erro ao salvar o fluxo '__path__': __message__" + }, + "nodes": { + "enabled": "Tipos de nós habilitados:", + "disabled": "Tipos de nós desabilitados:", + "error-enable": "Falha ao habilitar o nó:" + } + }, + "comms": { + "error": "Erro do canal de comunicação: __message__", + "error-server": "Erro do servidor de comunicação: __message__", + "error-send": "Erro de envio de comunicação: __message__" + }, + "settings": { + "user-not-available": "Não é possível salvar as configurações do usuário: __message__", + "not-available": "Configurações não disponíveis", + "property-read-only": "A propriedade '__prop__' é somente leitura", + "readonly-mode": "Execução em modo leitura somente. As alterações não serão salvas." + }, + "library": { + "unknownLibrary": "Biblioteca desconhecida: __library__", + "unknownType": "Tipo de biblioteca desconhecido: __type__", + "readOnly": "A biblioteca __library__ é somente de leitura", + "failedToInit": "Falha ao inicializar a biblioteca __library__: __error__", + "invalidProperty": "Propriedade inválida __prop__: '__value__'" + }, + "nodes": { + "credentials": { + "error": "Erro ao carregar credenciais: __message__", + "error-saving": "Erro ao salvar credenciais: __message__", + "not-registered": "O tipo de credencial '__type__' não está registrado", + "system-key-warning": "\n\n------------------------------------- --------------------------------\nSeu arquivo de credenciais de fluxo é criptografado usando uma chave gerada pelo sistema.\n\nSe a chave gerada pelo sistema foi perdida por qualquer motivo, seu arquivo de credenciais \nnão será recuperável; você terá que excluí-lo e inserir novamente \nsuas credenciais. \n\nVocê deve definir sua própria chave usando a opção 'credentialSecret' em \n seu arquivo de configurações. O Node-RED irá então criptografar novamente o arquivo de credenciais \n usando a chave escolhida na próxima vez que você implantar uma alteração. \n ------------------- -------------------------------------------------- \n ", + "unencrypted": "Usando credenciais não criptografadas", + "encryptedNotFound": "Credenciais criptografadas não encontradas" + }, + "flows": { + "safe-mode": "Fluxos interrompidos no modo de segurança. Implementar para iniciar.", + "registered-missing": "Tipo ausente registrado: __type__", + "error": "Erro ao carregar fluxos: __message__", + "starting-modified-nodes": "Iniciando nós modificados", + "starting-modified-flows": "Iniciando fluxos modificados", + "starting-flows": "Iniciando fluxos", + "started-modified-nodes": "Nós modificados iniciados", + "started-modified-flows": "Fluxos modificados iniciados", + "started-flows": "Fluxos iniciados", + "stopping-modified-nodes": "Parando nós modificados", + "stopping-modified-flows": "Parando fluxos modificados", + "stopping-flows": "Parando fluxos", + "stopped-modified-nodes": "Nós modificados interrompidos", + "stopped-modified-flows": "Fluxos modificados interrompidos", + "stopped-flows": "Fluxos interrompidos", + "stopped": "Parado", + "stopping-error": "Erro ao parar o nó: __message__", + "updated-flows": "Fluxos atualizados", + "added-flow": "Adicionando fluxo: __label__", + "updated-flow": "Fluxo atualizado: __label__", + "removed-flow": "Fluxo removido: __label__", + "missing-types": "Esperando que os tipos ausentes sejam registrados:", + "missing-type-provided": "- __type__ (fornecido pelo módulo npm __module__)", + "missing-type-install-1": "Para instalar qualquer um desses módulos ausentes, execute:", + "missing-type-install-2": "no diretório:" + }, + "flow": { + "unknown-type": "Tipo desconhecido: __type__", + "missing-types": "tipos ausentes", + "error-loop": "A mensagem excedeu o número máximo de capturas" + + }, + "index": { + "unrecognised-id": "Não reconhecido id: __id__", + "type-in-use": "Tipo em uso: __msg__", + "unrecognised-module": "Módulo não reconhecido: __module__" + }, + "registry": { + "localfilesystem": { + "module-not-found": "Não é possível encontrar o módulo '__module__'" + } + } + }, + "storage": { + "index": { + "forbidden-flow-name": "nome do fluxo proibido" + }, + "localfilesystem": { + "user-dir": "Diretório do usuário: __path__", + "flows-file": "Arquivo de fluxos: __path__", + "create": "Criando novo arquivo __type__", + "empty": "O arquivo __type__ existente está vazio", + "invalid": "O arquivo __type__ existente não é json válido", + "restore": "Restaurando backup de arquivo __type__: __path__", + "restore-fail": "Falha ao restaurar o backup do arquivo __type__: __message__", + "fsync-fail": "A liberação do arquivo __path__ para o disco falhou: __message__", + "warn_name": "Nome do arquivo de fluxo não definido. Gerando nome usando o nome do servidor.", + "projects": { + "changing-project": "Configurando projeto ativo: __project__", + "active-project": "Projeto ativo: __projeto__", + "projects-directory": "Diretório de projetos: __projectsDirectory__", + "project-not-found": "Projeto não encontrado: __project__", + "no-active-project": "Nenhum projeto ativo: usando arquivo de fluxos padrão", + "disabled": "Projetos desativados: editorTheme.projects.enabled = false", + "disabledNoFlag": "Projetos desativados: defina editorTheme.projects.enabled = true para ativar", + "git-not-found": "Projetos desativados: comando git não encontrado", + "git-version-old": "Projetos desativados: git __version__ não é compatível. Requer 2.x", + "summary": "Um Projeto Node-RED", + "readme": "### Sobre\n\nEste é o arquivo README.md do seu projeto. O Arquivo ajuda usuários a entender o que seu \nprojeto faz, como usá-lo e qualquer outra coisa que eles precisem saber." + } + } + }, + + "context": { + "log-store-init": "Armazenamento de contexto: '__name__' [__info__]", + "error-loading-module": "Erro ao carregar armazenamento de contexto: __message__", + "error-loading-module2": "Erro ao carregar o armazenamento de contexto '__module__': __message__", + "error-module-not-defined": "Armazenamento de contexto '__storage__' opção de 'módulo' ausente", + "error-invalid-module-name": "Nome de armazenamento de contexto inválido: '__name__'", + "error-invalid-default-module": "Armazenamento de contexto padrão desconhecido: '__storage__'", + "unknown-store": "Armazenamento de contexto desconhecido '__name__' especificado. Usando armazenamento padrão.", + + "localfilesystem": { + "invalid-json": "JSON inválido no arquivo de contexto '__file__'", + "error-circular": "O contexto __scope__ contém uma referência circular que não pode ser continuada", + "error-write": "Erro ao escrever o contexto: __message__" + } + } + +} From b937c37be325991debaf37b23d16a90af9b1092e Mon Sep 17 00:00:00 2001 From: Fabulous Muller Date: Tue, 26 Jul 2022 17:18:43 -0300 Subject: [PATCH 021/253] Fixed JSON errors in 2 files fixed 2 errors in editor.json and messages.json as reported by run tests #1174 build(16). --- .../@node-red/editor-client/locales/pt-BR/editor.json | 2 +- .../node_modules/@node-red/nodes/locales/pt-BR/messages.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/locales/pt-BR/editor.json b/packages/node_modules/@node-red/editor-client/locales/pt-BR/editor.json index 8a428879c..0a4040d73 100644 --- a/packages/node_modules/@node-red/editor-client/locales/pt-BR/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/pt-BR/editor.json @@ -683,7 +683,7 @@ "empty": "vazio", "globalConfig": "Nós de configuração global", "triggerAction": "Ação de gatilho", - "find": "Encontre no espaço de trabalho", + "find": "Encontre no espaço de trabalho" }, "help": { "name": "Ajuda", diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/messages.json b/packages/node_modules/@node-red/nodes/locales/pt-BR/messages.json index 0b33937d8..b55e336a3 100755 --- a/packages/node_modules/@node-red/nodes/locales/pt-BR/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/messages.json @@ -446,7 +446,7 @@ "staticTopic": "Assinar um tópico único", "dynamicTopic": "Assinatura dinâmica", "auto-connect": "Conectar automaticamente", - "auto-mode-depreciated": "Esta opção está deprecada. Favor utilizar o novo modo de auto-detecção.", + "auto-mode-depreciated": "Esta opção está deprecada. Favor utilizar o novo modo de auto-detecção." }, "sections-label": { "birth-message": "Mensagem enviada na conexão (mensagem de nascimento)", From 1ddbeaa50f64f89d337ebb3cc0e70c8c867ffd37 Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Wed, 27 Jul 2022 20:25:43 +0900 Subject: [PATCH 022/253] add test cases --- test/nodes/subflow/subflow_spec.js | 6 ++-- .../@node-red/runtime/lib/flows/Flow_spec.js | 34 +++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/test/nodes/subflow/subflow_spec.js b/test/nodes/subflow/subflow_spec.js index 38c552606..f4b8257d8 100644 --- a/test/nodes/subflow/subflow_spec.js +++ b/test/nodes/subflow/subflow_spec.js @@ -260,7 +260,8 @@ describe('subflow', function() { {name: "KB", type: "bool", value: "true"}, {name: "KJ", type: "json", value: "[1,2,3]"}, {name: "Kb", type: "bin", value: "[65,65]"}, - {name: "Ke", type: "env", value: "KS"} + {name: "Ke", type: "env", value: "KS"}, + {name: "Kj", type: "jsonata", value: "1+2"}, ], wires:[["n2"]]}, {id:"n2", x:10, y:10, z:"t0", type:"helper", wires:[]}, @@ -279,7 +280,7 @@ describe('subflow', function() { ] }, {id:"s1-n1", x:10, y:10, z:"s1", type:"function", - func:"msg.VE = env.get('Ke'); msg.VS = env.get('KS'); msg.VN = env.get('KN'); msg.VB = env.get('KB'); msg.VJ = env.get('KJ'); msg.Vb = env.get('Kb'); return msg;", + func:"msg.VE = env.get('Ke'); msg.VS = env.get('KS'); msg.VN = env.get('KN'); msg.VB = env.get('KB'); msg.VJ = env.get('KJ'); msg.Vb = env.get('Kb'); msg.Vj = env.get('Kj'); return msg;", wires:[]} ]; helper.load(functionNode, flow, function() { @@ -294,6 +295,7 @@ describe('subflow', function() { msg.should.have.property("Vb"); should.ok(msg.Vb instanceof Buffer); msg.should.have.property("VE","STR"); + msg.should.have.property("Vj",3); done(); } catch (e) { diff --git a/test/unit/@node-red/runtime/lib/flows/Flow_spec.js b/test/unit/@node-red/runtime/lib/flows/Flow_spec.js index eed4810c4..ca30868d7 100644 --- a/test/unit/@node-red/runtime/lib/flows/Flow_spec.js +++ b/test/unit/@node-red/runtime/lib/flows/Flow_spec.js @@ -1322,6 +1322,40 @@ describe('Flow', function() { }); + it("can define environment variable using JSONata", function (done) { + try { + after(function() { + delete process.env.V0; + }) + var config = flowUtils.parseConfig([ + {id:"t1",type:"tab",env:[ + {"name": "V0", value: "1+2", type: "jsonata"} + ]}, + {id:"g1",type:"group",z:"t1",env:[ + {"name": "V1", value: "2+3", type: "jsonata"}, + ]}, + {id:"1",x:10,y:10,z:"t1",g:"g1",type:"test",foo:"$(V0)",wires:[]}, + {id:"2",x:10,y:10,z:"t1",g:"g1",type:"test",foo:"$(V1)",wires:[]}, + ]); + var flow = Flow.create({getSetting:v=>process.env[v]},config,config.flows["t1"]); + flow.start(); + + var activeNodes = flow.getActiveNodes(); + + activeNodes["1"].foo.should.equal(3); + activeNodes["2"].foo.should.equal(5); + + flow.stop().then(function() { + done(); + }); + } + catch (e) { + console.log(e.stack); + done(e); + } + + }); + }); }); From f454c29b8c37942175ff0f764facf5249a00b9cd Mon Sep 17 00:00:00 2001 From: Mauricio Bonani Date: Thu, 28 Jul 2022 10:56:38 -0400 Subject: [PATCH 023/253] Hide scrollbars until they're needed --- .../@node-red/editor-client/src/js/ui/common/editableList.js | 2 +- .../@node-red/editor-client/src/js/ui/tab-help.js | 2 +- .../@node-red/editor-client/src/js/ui/tab-info.js | 2 +- .../node_modules/@node-red/editor-client/src/sass/debug.scss | 2 +- .../node_modules/@node-red/editor-client/src/sass/editor.scss | 4 ++-- .../@node-red/editor-client/src/sass/projects.scss | 4 ++-- .../@node-red/editor-client/src/sass/tab-context.scss | 2 +- .../@node-red/editor-client/src/sass/userSettings.scss | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js index ea1938e5c..f308614d7 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js @@ -160,7 +160,7 @@ this.element.css("maxHeight",null); } if (this.options.height !== 'auto') { - this.uiContainer.css("overflow-y","scroll"); + this.uiContainer.css("overflow-y","auto"); if (!isNaN(this.options.height)) { this.uiHeight = this.options.height; } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-help.js b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-help.js index e5199b5bc..7ed93f48d 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-help.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-help.js @@ -50,7 +50,7 @@ RED.sidebar.help = (function() { tocPanel = $("
", {class: "red-ui-sidebar-help-toc"}).appendTo(stackContainer); var helpPanel = $("
").css({ - "overflow-y": "scroll" + "overflow-y": "auto" }).appendTo(stackContainer); panels = RED.panels.create({ diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js index dfd4b1e43..cc8539363 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js @@ -98,7 +98,7 @@ RED.sidebar.info = (function() { propertiesPanelContent = $("
").css({ "flex":"1 1 auto", - "overflow-y":"scroll", + "overflow-y":"auto", }).appendTo(propertiesPanel); diff --git a/packages/node_modules/@node-red/editor-client/src/sass/debug.scss b/packages/node_modules/@node-red/editor-client/src/sass/debug.scss index 58099877f..eb550c6f5 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/debug.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/debug.scss @@ -30,7 +30,7 @@ bottom: 0px; left:0px; right: 0px; - overflow-y: scroll; + overflow-y: auto; } .red-ui-debug-filter-box { position:absolute; diff --git a/packages/node_modules/@node-red/editor-client/src/sass/editor.scss b/packages/node_modules/@node-red/editor-client/src/sass/editor.scss index 1730b9e35..b6d12faf2 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/editor.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/editor.scss @@ -368,7 +368,7 @@ button.red-ui-button-small border:1px solid var(--red-ui-secondary-border-color); border-radius:5px; height: calc(100% - 21px); - overflow-y: scroll; + overflow-y: auto; background: var(--red-ui-secondary-background); } @@ -562,7 +562,7 @@ div.red-ui-button-small.red-ui-color-picker-opacity-slider-handle { .red-ui-icon-list { width: 308px; height: 200px; - overflow-y: scroll; + overflow-y: auto; line-height: 0px; position: relative; &.red-ui-icon-list-dark { diff --git a/packages/node_modules/@node-red/editor-client/src/sass/projects.scss b/packages/node_modules/@node-red/editor-client/src/sass/projects.scss index ee43c7a87..a32fd53b4 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/projects.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/projects.scss @@ -26,7 +26,7 @@ } } #red-ui-project-settings-tab-settings { - overflow-y: scroll; + overflow-y: auto; } .red-ui-sidebar-vc-shade { background: var(--red-ui-primary-background); @@ -183,7 +183,7 @@ } .red-ui-projects-dialog-project-list-inner-container { flex-grow: 1 ; - overflow-y: scroll; + overflow-y: auto; position:relative; .red-ui-editableList-border { border: none; diff --git a/packages/node_modules/@node-red/editor-client/src/sass/tab-context.scss b/packages/node_modules/@node-red/editor-client/src/sass/tab-context.scss index fc4c78afb..94450f337 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/tab-context.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/tab-context.scss @@ -20,7 +20,7 @@ bottom: 0; left: 0; right: 0; - overflow-y: scroll; + overflow-y: auto; .red-ui-palette-category { &:not(.expanded) button { diff --git a/packages/node_modules/@node-red/editor-client/src/sass/userSettings.scss b/packages/node_modules/@node-red/editor-client/src/sass/userSettings.scss index 36ab67e3f..5e0c7fa47 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/userSettings.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/userSettings.scss @@ -67,7 +67,7 @@ left: 0; bottom: 0; padding: 8px 20px 20px; - overflow-y: scroll; + overflow-y: auto; } .red-ui-settings-row { padding: 5px 10px 2px; From 5ea0c6fca1c8bf3bf5ccb5672bfd0b4696878625 Mon Sep 17 00:00:00 2001 From: Mauricio Bonani Date: Fri, 29 Jul 2022 09:49:59 -0400 Subject: [PATCH 024/253] Fix workspace chart bottom property --- .../@node-red/editor-client/src/sass/workspace.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss b/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss index 24e156b1e..a5734570d 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss @@ -29,7 +29,7 @@ #red-ui-workspace-chart { overflow: auto; position: absolute; - bottom:25px; + bottom:26px; top: 35px; left:0px; right:0px; From 14a33668508d68efa5caf286eb214d96dd3cac05 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 1 Aug 2022 20:54:05 +0100 Subject: [PATCH 025/253] Include junctins/groups when exporting subflows plus related fixes Fixes #3805 --- .../@node-red/editor-client/src/js/nodes.js | 15 ++++++--------- .../@node-red/editor-client/src/js/ui/subflow.js | 8 ++++++++ 2 files changed, 14 insertions(+), 9 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 9da5aad05..d387f01b3 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 @@ -868,14 +868,7 @@ RED.nodes = (function() { var node; if (allNodes.hasTab(id)) { - removedNodes = allNodes.getNodes(id).filter(n => { - if (n.type === 'junction') { - removedJunctions.push(n) - return false - } else { - return true - } - }) + removedNodes = allNodes.getNodes(id).slice() } for (i in configNodes) { if (configNodes.hasOwnProperty(i)) { @@ -885,6 +878,7 @@ RED.nodes = (function() { } } } + removedJunctions = RED.nodes.junctions(id) for (i=0;i Date: Mon, 1 Aug 2022 21:05:52 +0100 Subject: [PATCH 026/253] Allow generateNodeNames to handle names containing regex control characters Fixes #3813 --- .../@node-red/editor-client/src/js/ui/view-tools.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view-tools.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view-tools.js index bc81d4a43..3588b38bf 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view-tools.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view-tools.js @@ -1015,7 +1015,7 @@ RED.view.tools = (function() { const nodeDef = n._def || RED.nodes.getType(n.type) if (nodeDef && nodeDef.defaults && nodeDef.defaults.name) { const paletteLabel = RED.utils.getPaletteLabel(n.type, nodeDef) - const defaultNodeNameRE = new RegExp('^'+paletteLabel+' (\\d+)$') + const defaultNodeNameRE = new RegExp('^'+paletteLabel.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')+' (\\d+)$') if (!typeIndex.hasOwnProperty(n.type)) { const existingNodes = RED.nodes.filterNodes({type: n.type}) let maxNameNumber = 0; From 5c29feec635387dfdbd436da3a4879a33bd266f8 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 2 Aug 2022 00:05:21 +0100 Subject: [PATCH 027/253] Register subflow module instance node with parent flow Fixes #3798 --- packages/node_modules/@node-red/runtime/lib/flows/util.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/runtime/lib/flows/util.js b/packages/node_modules/@node-red/runtime/lib/flows/util.js index 0f3435b77..7c98fc041 100644 --- a/packages/node_modules/@node-red/runtime/lib/flows/util.js +++ b/packages/node_modules/@node-red/runtime/lib/flows/util.js @@ -134,10 +134,12 @@ function createNode(flow,config) { subflowInstanceConfig, instanceConfig ); + // Register this subflow as an instance node of the parent flow. + // This allows nodes inside the subflow to get ahold of each other + // such as a node accessing its config node + flow.subflowInstanceNodes[config.id] = subflow subflow.start(); return subflow.node; - - Log.error(Log._("nodes.flow.unknown-type", {type:type})); } } catch(err) { Log.error(err); From b008a6a2aa39e6f355bea887c93328cddb91ce63 Mon Sep 17 00:00:00 2001 From: Stephen McLaughlin <44235289+Steve-Mcl@users.noreply.github.com> Date: Thu, 4 Aug 2022 11:05:27 +0100 Subject: [PATCH 028/253] remove console.log fixes #3819 --- .../node_modules/@node-red/editor-client/src/js/ui/subflow.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js b/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js index ca4f651ab..772985101 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js @@ -932,7 +932,6 @@ RED.subflow = (function() { function buildEnvUIRow(row, tenv, ui, node) { - console.log(tenv, ui) ui.label = ui.label||{}; if ((tenv.type === "cred" || (tenv.parent && tenv.parent.type === "cred")) && !ui.type) { ui.type = "cred"; From abccdc7f215ccde8a358f7f6aa69ca4567c435b0 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 4 Aug 2022 13:10:05 +0100 Subject: [PATCH 029/253] Update packages/node_modules/@node-red/nodes/locales/en-US/messages.json --- .../node_modules/@node-red/nodes/locales/en-US/messages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json index b38ab3026..282485ca2 100644 --- a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json @@ -555,7 +555,7 @@ "status": { "requesting": "requesting" }, - "insecureHTTPParser": "Lenient HTTP Header Parsing" + "insecureHTTPParser": "Disable strict HTTP parsing" }, "websocket": { "label": { From c9b0a7c2ddc272eb133907c42b9b68de34aa925a Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 4 Aug 2022 13:50:31 +0100 Subject: [PATCH 030/253] Bump for 3.0.2 --- CHANGELOG.md | 20 +++++++++++++++++++ package.json | 12 +++++------ .../@node-red/editor-api/package.json | 6 +++--- .../@node-red/editor-client/package.json | 2 +- .../node_modules/@node-red/nodes/package.json | 4 ++-- .../@node-red/registry/package.json | 6 +++--- .../@node-red/runtime/package.json | 6 +++--- .../node_modules/@node-red/util/package.json | 4 ++-- packages/node_modules/node-red/package.json | 10 +++++----- 9 files changed, 45 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a6a9016d9..630d91b4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,23 @@ +#### 3.0.2: Maintenance Release + +Editor + + - Fix workspace chart bottom property (#3812) @bonanitech + - Update german translation (#3802) @Dennis14e + - Support color reset to the default in subflow and group (#3801) @kazuhitoyokoi + - Allow generateNodeNames to handle names containing regex control chars (#3817) @knolleary + - Hide scrollbars until they're needed (#3808) @bonanitech + - Include junctions/groups when exporting subflows plus related fixes (#3816) @knolleary + - remove console.log (#3820) @Steve-Mcl + +Runtime + + - Register subflow module instance node with parent flow (#3818) @knolleary + +Nodes + + - HTTP Request: Allow HTTP Headers not in spec (#3776) @hardillb + #### 3.0.1: Maintenance Release Editor diff --git a/package.json b/package.json index d5ab3bf5d..a57de03c5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-red", - "version": "3.0.1", + "version": "3.0.2", "description": "Low-code programming for event-driven applications", "homepage": "http://nodered.org", "license": "Apache-2.0", @@ -40,7 +40,7 @@ "cookie-parser": "1.4.6", "cors": "2.8.5", "cronosjs": "1.7.1", - "denque": "2.0.1", + "denque": "2.1.0", "express": "4.18.1", "express-session": "1.17.3", "form-data": "4.0.0", @@ -49,7 +49,7 @@ "hash-sum": "2.0.0", "hpagent": "1.0.0", "https-proxy-agent": "5.0.1", - "i18next": "21.8.14", + "i18next": "21.8.16", "iconv-lite": "0.6.3", "is-utf8": "0.2.1", "js-yaml": "4.1.0", @@ -76,7 +76,7 @@ "semver": "7.3.7", "tar": "6.1.11", "tough-cookie": "4.0.0", - "uglify-js": "3.16.2", + "uglify-js": "3.16.3", "uuid": "8.3.2", "ws": "7.5.6", "xml2js": "0.4.23" @@ -85,7 +85,7 @@ "bcrypt": "5.0.1" }, "devDependencies": { - "dompurify": "2.3.9", + "dompurify": "2.3.10", "grunt": "1.5.3", "grunt-chmod": "~1.1.1", "grunt-cli": "~1.4.3", @@ -114,7 +114,7 @@ "node-red-node-test-helper": "^0.3.0", "nodemon": "2.0.19", "proxy": "^1.0.2", - "sass": "1.53.0", + "sass": "1.54.2", "should": "13.2.3", "sinon": "11.1.2", "stoppable": "^1.1.0", diff --git a/packages/node_modules/@node-red/editor-api/package.json b/packages/node_modules/@node-red/editor-api/package.json index e95604bab..e2c53fe84 100644 --- a/packages/node_modules/@node-red/editor-api/package.json +++ b/packages/node_modules/@node-red/editor-api/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/editor-api", - "version": "3.0.1", + "version": "3.0.2", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/util": "3.0.1", - "@node-red/editor-client": "3.0.1", + "@node-red/util": "3.0.2", + "@node-red/editor-client": "3.0.2", "bcryptjs": "2.4.3", "body-parser": "1.20.0", "clone": "2.1.2", diff --git a/packages/node_modules/@node-red/editor-client/package.json b/packages/node_modules/@node-red/editor-client/package.json index a06359c0c..0ef939fb3 100644 --- a/packages/node_modules/@node-red/editor-client/package.json +++ b/packages/node_modules/@node-red/editor-client/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/editor-client", - "version": "3.0.1", + "version": "3.0.2", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/@node-red/nodes/package.json b/packages/node_modules/@node-red/nodes/package.json index c7a31fa10..818110f2f 100644 --- a/packages/node_modules/@node-red/nodes/package.json +++ b/packages/node_modules/@node-red/nodes/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/nodes", - "version": "3.0.1", + "version": "3.0.2", "license": "Apache-2.0", "repository": { "type": "git", @@ -25,7 +25,7 @@ "cookie": "0.5.0", "cors": "2.8.5", "cronosjs": "1.7.1", - "denque": "2.0.1", + "denque": "2.1.0", "form-data": "4.0.0", "fs-extra": "10.1.0", "got": "11.8.5", diff --git a/packages/node_modules/@node-red/registry/package.json b/packages/node_modules/@node-red/registry/package.json index c8c582ebe..6b707a87e 100644 --- a/packages/node_modules/@node-red/registry/package.json +++ b/packages/node_modules/@node-red/registry/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/registry", - "version": "3.0.1", + "version": "3.0.2", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,11 +16,11 @@ } ], "dependencies": { - "@node-red/util": "3.0.1", + "@node-red/util": "3.0.2", "clone": "2.1.2", "fs-extra": "10.1.0", "semver": "7.3.7", "tar": "6.1.11", - "uglify-js": "3.16.2" + "uglify-js": "3.16.3" } } diff --git a/packages/node_modules/@node-red/runtime/package.json b/packages/node_modules/@node-red/runtime/package.json index 8b1991a5c..c7d02e948 100644 --- a/packages/node_modules/@node-red/runtime/package.json +++ b/packages/node_modules/@node-red/runtime/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/runtime", - "version": "3.0.1", + "version": "3.0.2", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/registry": "3.0.1", - "@node-red/util": "3.0.1", + "@node-red/registry": "3.0.2", + "@node-red/util": "3.0.2", "async-mutex": "0.3.2", "clone": "2.1.2", "express": "4.18.1", diff --git a/packages/node_modules/@node-red/util/package.json b/packages/node_modules/@node-red/util/package.json index 8d677e2cd..66f5750b8 100644 --- a/packages/node_modules/@node-red/util/package.json +++ b/packages/node_modules/@node-red/util/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/util", - "version": "3.0.1", + "version": "3.0.2", "license": "Apache-2.0", "repository": { "type": "git", @@ -16,7 +16,7 @@ ], "dependencies": { "fs-extra": "10.1.0", - "i18next": "21.8.14", + "i18next": "21.8.16", "json-stringify-safe": "5.0.1", "jsonata": "1.8.6", "lodash.clonedeep": "^4.5.0", diff --git a/packages/node_modules/node-red/package.json b/packages/node_modules/node-red/package.json index faa98c48d..aaaccad22 100644 --- a/packages/node_modules/node-red/package.json +++ b/packages/node_modules/node-red/package.json @@ -1,6 +1,6 @@ { "name": "node-red", - "version": "3.0.1", + "version": "3.0.2", "description": "Low-code programming for event-driven applications", "homepage": "http://nodered.org", "license": "Apache-2.0", @@ -31,10 +31,10 @@ "flow" ], "dependencies": { - "@node-red/editor-api": "3.0.1", - "@node-red/runtime": "3.0.1", - "@node-red/util": "3.0.1", - "@node-red/nodes": "3.0.1", + "@node-red/editor-api": "3.0.2", + "@node-red/runtime": "3.0.2", + "@node-red/util": "3.0.2", + "@node-red/nodes": "3.0.2", "basic-auth": "2.0.1", "bcryptjs": "2.4.3", "express": "4.18.1", From 3bae92b356ed2aff7fbd95755e548ddb1181127b Mon Sep 17 00:00:00 2001 From: "Fabio Barcello S. Dos R. Muller" Date: Thu, 4 Aug 2022 11:15:57 -0300 Subject: [PATCH 031/253] Changing as pr-3804 discussion Added some lines to /pt-br/editor.json and added pt-br into other language editor.json locales. --- .../editor-client/locales/de/editor.json | 1 + .../editor-client/locales/en-US/editor.json | 1 + .../editor-client/locales/ja/editor.json | 1 + .../editor-client/locales/pt-BR/editor.json | 24 ++++++++++++++++++- .../editor-client/locales/ru/editor.json | 1 + .../editor-client/locales/zh-CN/editor.json | 2 ++ .../editor-client/locales/zh-TW/editor.json | 2 ++ 7 files changed, 31 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/locales/de/editor.json b/packages/node_modules/@node-red/editor-client/locales/de/editor.json index 41fe1459a..20dced804 100755 --- a/packages/node_modules/@node-red/editor-client/locales/de/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/de/editor.json @@ -1166,6 +1166,7 @@ "en-US": "Englisch", "ja": "Japanisch", "ko": "Koreanisch", + "pt-BR":"Portugiesisch", "ru": "Russisch", "zh-CN": "Chinesisch (Vereinfacht)", "zh-TW": "Chinesisch (Traditionell)" 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 c8abada3e..84870339d 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 @@ -1178,6 +1178,7 @@ "en-US": "English", "ja": "Japanese", "ko": "Korean", + "pt-BR":"Portuguese", "ru": "Russian", "zh-CN": "Chinese(Simplified)", "zh-TW": "Chinese(Traditional)" 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..4667c8bef 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 @@ -1179,6 +1179,7 @@ "en-US": "英語", "ja": "日本語", "ko": "韓国語", + "pt-BR":"ポルトガル語", "ru": "ロシア語", "zh-CN": "中国語(簡体)", "zh-TW": "中国語(繁体)" diff --git a/packages/node_modules/@node-red/editor-client/locales/pt-BR/editor.json b/packages/node_modules/@node-red/editor-client/locales/pt-BR/editor.json index 0a4040d73..161435032 100644 --- a/packages/node_modules/@node-red/editor-client/locales/pt-BR/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/pt-BR/editor.json @@ -1182,5 +1182,27 @@ "ru": "Russo", "zh-CN": "Chinês(Simplificado)", "zh-TW": "Chinês(Tradicional)" - } + }, + "validator": { + "errors": { + "invalid-json": "Dados JSON inválidos: __error__", + "invalid-json-prop": "__prop__: dados JSON inválidos: __error__", + "invalid-prop": "Expressão de propriedade inválida", + "invalid-prop-prop": "__prop__: expressão de propriedade inválida", + "invalid-num": "Número inválido", + "invalid-num-prop": "__prop__: número inválido", + "invalid-regexp": "Padrão de entrada inválido", + "invalid-regex-prop": "__prop__: Padrão de entrada inválido", + "missing-required-prop": "__prop__: valor de propriedade ausente", + "invalid-config": "__prop__: nó de configuração inválido", + "missing-config": "__prop__: nó de Configuração ausente", + "validation-error": "__prop__: erro de validação: __node__, __id__: __error__" + } + }, + "contextMenu": { + "insert": "Inserir", + "node": "Nó", + "junction": "Junção", + "linkNodes": "Nós de Ligação" + } } diff --git a/packages/node_modules/@node-red/editor-client/locales/ru/editor.json b/packages/node_modules/@node-red/editor-client/locales/ru/editor.json index d669b3f09..abc6e5219 100755 --- a/packages/node_modules/@node-red/editor-client/locales/ru/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/ru/editor.json @@ -1135,6 +1135,7 @@ "en-US": "Английский", "ja": "Японский", "ko": "Корейский", + "pt-BR":"португальский", "ru": "Русский", "zh-CN": "Китайский (упрощенный)", "zh-TW": "Китайский (традиционный)" diff --git a/packages/node_modules/@node-red/editor-client/locales/zh-CN/editor.json b/packages/node_modules/@node-red/editor-client/locales/zh-CN/editor.json index eca5878ae..0cb3b471d 100644 --- a/packages/node_modules/@node-red/editor-client/locales/zh-CN/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/zh-CN/editor.json @@ -1089,6 +1089,8 @@ "en-US": "英文", "ja": "日语", "ko": "韩文", + "pt-BR":"葡萄牙语", + "ru":"俄語", "zh-CN": "简体中文", "zh-TW": "繁体中文" } diff --git a/packages/node_modules/@node-red/editor-client/locales/zh-TW/editor.json b/packages/node_modules/@node-red/editor-client/locales/zh-TW/editor.json index 42316176f..c8e4cf49f 100644 --- a/packages/node_modules/@node-red/editor-client/locales/zh-TW/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/zh-TW/editor.json @@ -1090,6 +1090,8 @@ "en-US": "英語", "ja": "日語", "ko": "韓語", + "pt-BR":"葡萄牙语", + "ru":"俄語", "zh-CN": "簡體中文", "zh-TW": "繁體中文" } From e7c657f82d8d83fb1b285fce6f737ce241293f79 Mon Sep 17 00:00:00 2001 From: "Fabio Barcello S. Dos R. Muller" Date: Fri, 5 Aug 2022 16:29:19 -0300 Subject: [PATCH 032/253] Some minor changes to sections that were missing in some files Fixing missing sessions is some pt-BR files and also one small typo of an hmtl end paragraph

in the 21-httprequest.html of en-US original language file. --- .../@node-red/editor-client/locales/pt-BR/editor.json | 6 +++--- .../nodes/locales/en-US/network/21-httprequest.html | 2 +- .../nodes/locales/pt-BR/function/80-template.html | 6 +++++- .../@node-red/nodes/locales/pt-BR/messages.json | 4 ++-- .../nodes/locales/pt-BR/network/21-httprequest.html | 7 ++++++- .../@node-red/nodes/locales/pt-BR/sequence/17-split.html | 5 +++++ 6 files changed, 22 insertions(+), 8 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/locales/pt-BR/editor.json b/packages/node_modules/@node-red/editor-client/locales/pt-BR/editor.json index 161435032..6e20bc32d 100644 --- a/packages/node_modules/@node-red/editor-client/locales/pt-BR/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/pt-BR/editor.json @@ -104,7 +104,7 @@ "export": "Exportar", "search": "Procurar fluxos", "searchInput": "procure seus fluxos", - "subfluxo": "subfluxo", + "subflows": "subfluxos", "createSubflow": "Criar Subfluxo", "selectionToSubflow": "Seleção para subfluxo", "flows": "Fluxos", @@ -539,7 +539,7 @@ "search": "procurar módulos", "addCategory": "Adicionar novo...", "label": { - "subfluxo": "subfluxo", + "subflows": "subfluxos", "network": "rede", "common": "comum", "input": "entrada", @@ -701,7 +701,7 @@ "label": "configuração", "global": "Em todos os fluxos", "none": "nenhum", - "subfluxo": "subfluxos", + "subflows": "subfluxos", "flows": "fluxos", "filterAll": "todos", "showAllConfigNodes": "Ver todas as configurações dos nós", diff --git a/packages/node_modules/@node-red/nodes/locales/en-US/network/21-httprequest.html b/packages/node_modules/@node-red/nodes/locales/en-US/network/21-httprequest.html index b8d7fc048..383c9fadb 100644 --- a/packages/node_modules/@node-red/nodes/locales/en-US/network/21-httprequest.html +++ b/packages/node_modules/@node-red/nodes/locales/en-US/network/21-httprequest.html @@ -73,7 +73,7 @@

Cookie handling

The cookies property passed to the node must be an object of name/value pairs. The value can be either a string to set the value of the cookie or it can be an - object with a single value property.

+ object with a single value property.

Any cookies returned by the request are passed back under the responseCookies property.

Content type handling

If msg.payload is an Object, the node will automatically set the content type diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/function/80-template.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/function/80-template.html index 2eba49478..907fc5eca 100644 --- a/packages/node_modules/@node-red/nodes/locales/pt-BR/function/80-template.html +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/function/80-template.html @@ -47,5 +47,9 @@ payload:{ {{global.name}}, ou para armazenamento persistente armazenar usando {{flow [store] .name}} ou {{global [store] .name}}.

Nota: Por padrão, bigode usará códigos de escape de quaisquer entidades não alfanuméricas ou HTML nos valores que ele substitui. - Para evitar isso, use colchetes {{{triplos}}}. + Para evitar isso, use colchetes {{{triplos}}}.

+

Se precisar usar {{ }} em seu conteúdo, você poderá alterar os caracteres + usados para marcar as seções do modelo. Por exemplo, ao invés de utilizar [[ ]]; + adicione a seguinte linha ao topo do modelo:

+
{{=[[ ]]=}}
diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/messages.json b/packages/node_modules/@node-red/nodes/locales/pt-BR/messages.json index b55e336a3..00058ddf3 100755 --- a/packages/node_modules/@node-red/nodes/locales/pt-BR/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/messages.json @@ -576,8 +576,8 @@ "url2": "Por padrão, carga útil conterá os dados a serem enviados ou recebidos de um websocket. O cliente pode ser configurado para enviar ou receber todo o objeto de mensagem como uma cadeia de caracteres formatada em JSON." }, "status": { - "conectado": "conectado __count__", - "conectado_plural": "conectado __count__" + "connected": "conectado __count__", + "connected_plural": "conectados __count__" }, "errors": { "connect-error": "Ocorreu um erro na conexão ws:", diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/network/21-httprequest.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/network/21-httprequest.html index 5a333e6ea..6604708da 100644 --- a/packages/node_modules/@node-red/nodes/locales/pt-BR/network/21-httprequest.html +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/network/21-httprequest.html @@ -73,10 +73,15 @@

Tratamento de cookies

A propriedade cookies passada ao nó deve ser um objeto de pares nome/valor. O valor pode ser uma cadeia de caracteres para definir o valor do cookie ou pode ser um - objeto com uma única propriedade value.

+ objeto com uma única propriedade value.

Todos os cookies retornados pela solicitação são devolvidos à propriedade responseCookies.

Tratamento do tipo de conteúdo

Se msg.payload for um objeto, o nó definirá automaticamente o tipo de conteúdo + da solicitação para application/json e irá codificar o corpo como tal.

+

Para codificar a solicitação como dados de formulário, msg.headers["content-type"] deve ser definido como application/x-www-form-urlencoded.

+

Subida de arquivo

+

Para subir um arquivo, msg.headers["content-type"] deve ser definido como multipart/form-data + e o msg.payload passado para o nó deve ser um objeto com a seguinte estrutura:

{
     "KEY": {
         "value": FILE_CONTENTS,
diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/sequence/17-split.html b/packages/node_modules/@node-red/nodes/locales/pt-BR/sequence/17-split.html
index 0e1cd10f9..96b86f438 100644
--- a/packages/node_modules/@node-red/nodes/locales/pt-BR/sequence/17-split.html
+++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/sequence/17-split.html
@@ -162,4 +162,9 @@
              
  • Valor inicial: 0
  • Expressão de correção: $A/$N
  • +

    +

    Armazenando mensagens

    +

    Este nó armazenará temporariamente de forma interna as mensagens para ir trabalhando através das sequências. + A configuração de tempo de execução nodeMessageBufferMaxLength pode ser usada para limitar quantos nós de mensagens + serão armazenados temporariamente.

    From 598bcf675fe9635164e8b6c8abcb2dd1da1fb472 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Fri, 12 Aug 2022 15:45:12 +0100 Subject: [PATCH 033/253] fix searching by type when type name has a space --- .../editor-client/src/js/ui/palette.js | 14 +++++- .../editor-client/src/js/ui/search.js | 46 +++++++++++++------ 2 files changed, 44 insertions(+), 16 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js index 9f20cc674..322283fcb 100755 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js @@ -175,9 +175,19 @@ RED.palette = (function() { $('').appendTo(popOverContent) } - var safeType = type.replace(/'/g,"\\'"); + const safeType = type.replace(/'/g,"\\'"); + function wrapStr(str) { + if(str.indexOf(' ') >= 0) { + return '"' + str + '"' + } + return str + } - $('').appendTo(popOverContent) + $('') + .appendTo(popOverContent) + .on('click', function() { + RED.search.show('type:' + wrapStr(safeType)) + }) $('').appendTo(popOverContent) $('

    ',{style:"font-size: 0.8em"}).text(metaData).appendTo(popOverContent); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js index f9cc79f08..d8035908a 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js @@ -106,14 +106,26 @@ RED.search = (function() { return val; } + function extractType(val, flags) { + // extracts: type:XYZ & type:"X Y Z" + console.log(`extractType(val, flags): val:${val}`) + const regEx = /(?:type):\s*(?:"([^"]+)"|([^" ]+))/; + let m + while ((m = regEx.exec(val)) !== null) { + // avoid infinite loops with zero-width matches + if (m.index === regEx.lastIndex) { + regEx.lastIndex++; + } + val = val.replace(m[0]," ").trim() + const flag = m[2] || m[1] // quoted entries in capture group 1, unquoted in capture group 2 + flags.type = flags.type || []; + flags.type.push(flag); + } + return val; + } + function search(val) { var results = []; - var typeFilter; - var m = /(?:^| )type:([^ ]+)/.exec(val); - if (m) { - val = val.replace(/(?:^| )type:[^ ]+/,""); - typeFilter = m[1]; - } var flags = {}; val = extractFlag(val,"invalid",flags); val = extractFlag(val,"unused",flags); @@ -121,18 +133,20 @@ RED.search = (function() { val = extractFlag(val,"subflow",flags); val = extractFlag(val,"hidden",flags); val = extractFlag(val,"modified",flags); - val = extractValue(val,"flow",flags);// flow:active or flow: + val = extractValue(val,"flow",flags);// flow:current or flow: val = extractValue(val,"uses",flags);// uses: + val = extractType(val,flags);// uses: val = val.trim(); var hasFlags = Object.keys(flags).length > 0; if (flags.flow && flags.flow.indexOf("current") >= 0) { let idx = flags.flow.indexOf("current"); - flags.flow[idx] = RED.workspaces.active();//convert active to flow ID + flags.flow[idx] = RED.workspaces.active();//convert 'current' to active flow ID } if (flags.flow && flags.flow.length) { flags.flow = [ ...new Set(flags.flow) ]; //deduplicate } - if (val.length > 0 || typeFilter || hasFlags) { + const hasTypeFilter = flags.type && flags.type.length > 0 + if (val.length > 0 || hasFlags) { val = val.toLowerCase(); var i; var j; @@ -146,8 +160,8 @@ RED.search = (function() { } for (i=0;i -1) { + var kpos = val ? keys[i].indexOf(val) : -1; + if (kpos > -1 || (val === "" && hasTypeFilter)) { var ids = Object.keys(index[key]||{}); for (j=0;j -1) { + nodes[node.node.id] = nodes[node.node.id] || { node: node.node, label: node.label }; - nodes[node.node.id].index = Math.min(nodes[node.node.id].index||Infinity,kpos); + nodes[node.node.id].index = Math.min(nodes[node.node.id].index || Infinity, typeIndex > -1 ? typeIndex : kpos); } } } From 7d4c857a43c61002844a841af6a1a8f1dd7a62c9 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Fri, 12 Aug 2022 15:47:15 +0100 Subject: [PATCH 034/253] ensure sessionExpiry(Interval) is applied --- .../node_modules/@node-red/nodes/core/network/10-mqtt.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/core/network/10-mqtt.js b/packages/node_modules/@node-red/nodes/core/network/10-mqtt.js index 9e6195b5d..dccf1310b 100644 --- a/packages/node_modules/@node-red/nodes/core/network/10-mqtt.js +++ b/packages/node_modules/@node-red/nodes/core/network/10-mqtt.js @@ -474,7 +474,6 @@ module.exports = function(RED) { setIfHasProperty(opts, node, "protocolVersion", init); setIfHasProperty(opts, node, "keepalive", init); setIfHasProperty(opts, node, "cleansession", init); - setIfHasProperty(opts, node, "sessionExpiry", init); setIfHasProperty(opts, node, "topicAliasMaximum", init); setIfHasProperty(opts, node, "maximumPacketSize", init); setIfHasProperty(opts, node, "receiveMaximum", init); @@ -484,6 +483,11 @@ module.exports = function(RED) { } else if (hasProperty(opts, "userProps")) { node.userProperties = opts.userProps; } + if (hasProperty(opts, "sessionExpiry")) { + node.sessionExpiryInterval = opts.sessionExpiry; + } else if (hasProperty(opts, "sessionExpiryInterval")) { + node.sessionExpiryInterval = opts.sessionExpiryInterval + } function createLWT(topic, payload, qos, retain, v5opts, v5SubPropName) { let message = undefined; From 5a36e8fb119c79a1f6c99ee08baaf8d7076253f4 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Fri, 12 Aug 2022 18:20:11 +0100 Subject: [PATCH 035/253] add tests for MQTT v5 (sessionExpiry property) --- test/nodes/core/network/21-mqtt_spec.js | 49 ++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/test/nodes/core/network/21-mqtt_spec.js b/test/nodes/core/network/21-mqtt_spec.js index 655cc9c73..44154a802 100644 --- a/test/nodes/core/network/21-mqtt_spec.js +++ b/test/nodes/core/network/21-mqtt_spec.js @@ -27,7 +27,7 @@ describe('MQTT Nodes', function () { } catch (error) { } }); - it('should be loaded and have default values', function (done) { + it('should be loaded and have default values (MQTT V4)', function (done) { this.timeout = 2000; const { flow, nodes } = buildBasicMQTTSendRecvFlow({ id: "mqtt.broker", name: "mqtt_broker", autoConnect: false }, { id: "mqtt.in", topic: "in_topic" }, { id: "mqtt.out", topic: "out_topic" }); helper.load(mqttNodes, flow, function () { @@ -61,6 +61,52 @@ describe('MQTT Nodes', function () { mqttBroker.options.clientId.should.containEql('nodered_'); mqttBroker.options.should.have.property('keepalive').type("number"); mqttBroker.options.should.have.property('reconnectPeriod').type("number"); + //as this is not a v5 connection, ensure v5 properties are not present + mqttBroker.options.should.not.have.property('protocolVersion', 5); + mqttBroker.options.should.not.have.property('properties'); + done(); + } catch (error) { + done(error) + } + }); + }); + it('should be loaded and have default values (MQTT V5)', function (done) { + this.timeout = 2000; + const { flow, nodes } = buildBasicMQTTSendRecvFlow({ id: "mqtt.broker", name: "mqtt_broker", autoConnect: false, cleansession: false, clientid: 'clientid', keepalive: 35, sessionExpiry: '6000', protocolVersion: '5', userProps: {"prop": "val"}}, { id: "mqtt.in", topic: "in_topic" }, { id: "mqtt.out", topic: "out_topic" }); + helper.load(mqttNodes, flow, function () { + try { + const mqttIn = helper.getNode("mqtt.in"); + const mqttOut = helper.getNode("mqtt.out"); + const mqttBroker = helper.getNode("mqtt.broker"); + + should(mqttIn).be.type("object", "mqtt in node should be an object") + mqttIn.should.have.property('broker', nodes.mqtt_broker.id); //should be the id of the broker node + mqttIn.should.have.property('datatype', 'utf8'); //default: 'utf8' + mqttIn.should.have.property('isDynamic', false); //default: false + mqttIn.should.have.property('inputs', 0); //default: 0 + mqttIn.should.have.property('qos', 2); //default: 2 + mqttIn.should.have.property('topic', "in_topic"); + mqttIn.should.have.property('wires', [["helper.node"]]); + + should(mqttOut).be.type("object", "mqtt out node should be an object") + mqttOut.should.have.property('broker', nodes.mqtt_broker.id); //should be the id of the broker node + mqttOut.should.have.property('topic', "out_topic"); + + should(mqttBroker).be.type("object", "mqtt broker node should be an object") + mqttBroker.should.have.property('broker', BROKER_HOST); + mqttBroker.should.have.property('port', BROKER_PORT); + mqttBroker.should.have.property('brokerurl'); + // mqttBroker.should.have.property('autoUnsubscribe', true);//default: true + mqttBroker.should.have.property('autoConnect', false);//Set "autoConnect:false" in brokerOptions + mqttBroker.should.have.property('options'); + mqttBroker.options.should.have.property('clean', false); + mqttBroker.options.should.have.property('clientId', 'clientid'); + mqttBroker.options.should.have.property('keepalive').type("number", 35); + mqttBroker.options.should.have.property('reconnectPeriod').type("number"); + //as this IS a v5 connection, ensure v5 properties are not present + mqttBroker.options.should.have.property('protocolVersion', 5); + mqttBroker.options.should.have.property('properties'); + mqttBroker.options.properties.should.have.property('sessionExpiryInterval'); done(); } catch (error) { done(error) @@ -666,6 +712,7 @@ function buildMQTTBrokerNode(id, name, brokerHost, brokerPort, options) { node.cleansession = String(options.cleansession) == "false" ? false : true; node.autoUnsubscribe = String(options.autoUnsubscribe) == "false" ? false : true; node.autoConnect = String(options.autoConnect) == "false" ? false : true; + node.sessionExpiry = options.sessionExpiry ? options.sessionExpiry : undefined; if (options.birthTopic) { node.birthTopic = options.birthTopic; From 5c6b8e9e50dfd26e5acbac5dec6bd3b65c468048 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Fri, 12 Aug 2022 18:21:36 +0100 Subject: [PATCH 036/253] opportunistic tidy up MQTT tests --- test/nodes/core/network/21-mqtt_spec.js | 29 ++++++++++++++++++------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/test/nodes/core/network/21-mqtt_spec.js b/test/nodes/core/network/21-mqtt_spec.js index 44154a802..fd1309b74 100644 --- a/test/nodes/core/network/21-mqtt_spec.js +++ b/test/nodes/core/network/21-mqtt_spec.js @@ -219,7 +219,7 @@ describe('MQTT Nodes', function () { topic: nextTopic(), payload: '{prop:"value3", "num":3}', // send invalid JSON ... } - const hooks = { done: done, beforeLoad: null, afterLoad: null, afterConnect: null } + const hooks = { done: null, beforeLoad: null, afterLoad: null, afterConnect: null } hooks.afterLoad = (helperNode, mqttBroker, mqttIn, mqttOut) => { helperNode.on("input", function (msg) { try { @@ -345,7 +345,7 @@ describe('MQTT Nodes', function () { topic: nextTopic(), payload: '{prop:"value3", "num":3}', contentType: "application/json", // send invalid JSON ... } - const hooks = { done: done, beforeLoad: null, afterLoad: null, afterConnect: null } + const hooks = { done: null, beforeLoad: null, afterLoad: null, afterConnect: null } hooks.afterLoad = (helperNode, mqttBroker, mqttIn, mqttOut) => { helperNode.on("input", function (msg) { try { @@ -431,7 +431,7 @@ describe('MQTT Nodes', function () { if (skipTests) { return this.skip() } this.timeout = 2000; const options = {} - const hooks = { done: done, beforeLoad: null, afterLoad: null, afterConnect: null } + const hooks = { beforeLoad: null, afterLoad: null, afterConnect: null } hooks.beforeLoad = (flow) => { //add a status node pointed at MQTT Out node (to watch for connection status change) flow.push({ "id": "status.node", "type": "status", "name": "status_node", "scope": ["mqtt.out"], "wires": [["helper.node"]] });//add status node to watch mqtt_out } @@ -462,18 +462,31 @@ describe('MQTT Nodes', function () { this.timeout = 2000; const baseTopic = nextTopic(); const brokerOptions = { + autoConnect: false, protocolVersion: 4, birthTopic: baseTopic + "/birth", - birthPayload: "broker connected", + birthPayload: "broker birth", birthQos: 2, } - const options = {}; - const hooks = { done: done, beforeLoad: null, afterLoad: null, afterConnect: null }; - options.expectMsg = { + const expectMsg = { topic: brokerOptions.birthTopic, payload: brokerOptions.birthPayload, qos: brokerOptions.birthQos }; + const options = { }; + const hooks = { }; + hooks.afterLoad = (helperNode, mqttBroker, mqttIn, mqttOut) => { + helperNode.on("input", function (msg) { + try { + compareMsgToExpected(msg, expectMsg); + done(); + } catch (error) { + done(error) + } + }) + mqttIn.receive({ "action": "connect" }); //now request connect action + return true; //handled + } testSendRecv(brokerOptions, { topic: brokerOptions.birthTopic }, {}, options, hooks); }); itConditional('should publish close message', function (done) { @@ -807,8 +820,8 @@ function waitBrokerConnect(broker, timeLimit) { let waitConnected = (broker, timeLimit) => { const brokers = Array.isArray(broker) ? broker : [broker]; timeLimit = timeLimit || 1000; - let timer, resolved = false; return new Promise( (resolve, reject) => { + let timer, resolved = false; timer = wait(); function wait() { if (brokers.every(e => e.connected == true)) { From 31b17faa2ade0e8a22b588ae29ae6c86e6eac0e8 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Fri, 12 Aug 2022 18:23:07 +0100 Subject: [PATCH 037/253] fix MQTT test fail due to birth sent before connection done --- packages/node_modules/@node-red/nodes/core/network/10-mqtt.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/core/network/10-mqtt.js b/packages/node_modules/@node-red/nodes/core/network/10-mqtt.js index dccf1310b..50b1d690f 100644 --- a/packages/node_modules/@node-red/nodes/core/network/10-mqtt.js +++ b/packages/node_modules/@node-red/nodes/core/network/10-mqtt.js @@ -786,7 +786,9 @@ module.exports = function(RED) { // Send any birth message if (node.birthMessage) { - node.publish(node.birthMessage); + setTimeout(() => { + node.publish(node.birthMessage); + }, 1); } }); node._clientOn("reconnect", function() { From 9540cfe74931720aa34f1b0e8dbbef566cb91c8b Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Sat, 13 Aug 2022 18:09:11 +0100 Subject: [PATCH 038/253] fix flags search without val --- .../editor-client/src/js/ui/search.js | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js index d8035908a..7d147bde9 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js @@ -125,8 +125,8 @@ RED.search = (function() { } function search(val) { - var results = []; - var flags = {}; + const results = []; + const flags = {}; val = extractFlag(val,"invalid",flags); val = extractFlag(val,"unused",flags); val = extractFlag(val,"config",flags); @@ -137,7 +137,8 @@ RED.search = (function() { val = extractValue(val,"uses",flags);// uses: val = extractType(val,flags);// uses: val = val.trim(); - var hasFlags = Object.keys(flags).length > 0; + const hasFlags = Object.keys(flags).length > 0; + const hasTypeFilter = flags.type && flags.type.length > 0 if (flags.flow && flags.flow.indexOf("current") >= 0) { let idx = flags.flow.indexOf("current"); flags.flow[idx] = RED.workspaces.active();//convert 'current' to active flow ID @@ -145,13 +146,12 @@ RED.search = (function() { if (flags.flow && flags.flow.length) { flags.flow = [ ...new Set(flags.flow) ]; //deduplicate } - const hasTypeFilter = flags.type && flags.type.length > 0 if (val.length > 0 || hasFlags) { val = val.toLowerCase(); - var i; - var j; - var list = []; - var nodes = {}; + let i; + let j; + let list = []; + const nodes = {}; let keys = []; if (flags.uses) { keys = flags.uses; @@ -159,10 +159,10 @@ RED.search = (function() { keys = Object.keys(index); } for (i=0;i -1 || (val === "" && hasTypeFilter)) { - var ids = Object.keys(index[key]||{}); + const key = keys[i]; + const kpos = val ? keys[i].indexOf(val) : -1; + if (kpos > -1 || (val === "" && hasFlags)) { + const ids = Object.keys(index[key]||{}); for (j=0;j Date: Sun, 14 Aug 2022 15:02:39 +0100 Subject: [PATCH 039/253] Add missing property to node object HTTPRequest Also add tests for broken headers --- .../nodes/core/network/21-httprequest.js | 1 + .../nodes/core/network/21-httprequest_spec.js | 71 +++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/packages/node_modules/@node-red/nodes/core/network/21-httprequest.js b/packages/node_modules/@node-red/nodes/core/network/21-httprequest.js index b94d59dc7..9eac4da91 100644 --- a/packages/node_modules/@node-red/nodes/core/network/21-httprequest.js +++ b/packages/node_modules/@node-red/nodes/core/network/21-httprequest.js @@ -86,6 +86,7 @@ in your Node-RED user directory (${RED.settings.userDir}). if (n.paytoqs === true || n.paytoqs === "query") { paytoqs = true; } else if (n.paytoqs === "body") { paytobody = true; } + node.insecureHTTPParser = n.insecureHTTPParser var prox, noprox; if (process.env.http_proxy) { prox = process.env.http_proxy; } diff --git a/test/nodes/core/network/21-httprequest_spec.js b/test/nodes/core/network/21-httprequest_spec.js index 688776289..dff99f3b0 100644 --- a/test/nodes/core/network/21-httprequest_spec.js +++ b/test/nodes/core/network/21-httprequest_spec.js @@ -31,6 +31,8 @@ var multer = require("multer"); var RED = require("nr-test-utils").require("node-red/lib/red"); var fs = require('fs-extra'); var auth = require('basic-auth'); +const { version } = require("os"); +const net = require('net') describe('HTTP Request Node', function() { var testApp; @@ -2265,4 +2267,73 @@ describe('HTTP Request Node', function() { }); }); }); + + describe('should parse broken headers', function(done) { + + const versions = process.versions.node.split('.') + + if (( versions[0] == 14 && versions[1] >= 20 ) || + ( versions[0] == 16 && versions[1] >= 16 ) || + ( versions[0] == 18 && versions[1] >= 5 ) || + ( versions[0] > 18)) { + // only test if on new enough NodeJS version + + let port = testPort++ + + let server; + + before(function() { + server = net.createServer(function (socket) { + socket.write("HTTP/1.0 200\nContent-Type: text/plain\n\nHelloWorld") + socket.end() + }) + + server.listen(port,'127.0.0.1', function(err) { + }) + }); + + after(function() { + server.close() + }); + + it('should accept broken headers', function (done) { + var flow = [{id:'n1',type:'http request',wires:[['n2']],method:'GET',ret:'obj',url:`http://localhost:${port}/`, insecureHTTPParser: true}, + {id:"n2", type:"helper"}]; + helper.load(httpRequestNode, flow, function() { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + n2.on('input', function(msg) { + try { + msg.payload.should.equal('HelloWorld') + done() + } catch (err) { + done(err) + } + }) + n1.receive({payload: 'foo'}) + }); + }); + + it('should reject broken headers', function (done) { + var flow = [{id:'n1',type:'http request',wires:[['n2']],method:'GET',ret:'obj',url:`http://localhost:${port}/`}, + {id:"n2", type:"helper"}]; + helper.load(httpRequestNode, flow, function() { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + n2.on('input', function(msg) { + try{ + msg.payload.should.equal('RequestError: Parse Error: Missing expected CR after header value : http://localhost:10234/') + done() + } catch (err) { + done(err) + } + }) + n1.receive({payload: 'foo'}) + + }); + }); + } else { + done() + } + }); }); From 58b951e134ab7815640c7184ea33bd561ec427e3 Mon Sep 17 00:00:00 2001 From: Ben Hardill Date: Sun, 14 Aug 2022 15:09:48 +0100 Subject: [PATCH 040/253] Make port number dynamic in test --- test/nodes/core/network/21-httprequest_spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/nodes/core/network/21-httprequest_spec.js b/test/nodes/core/network/21-httprequest_spec.js index dff99f3b0..65f8f5814 100644 --- a/test/nodes/core/network/21-httprequest_spec.js +++ b/test/nodes/core/network/21-httprequest_spec.js @@ -2322,7 +2322,7 @@ describe('HTTP Request Node', function() { var n2 = helper.getNode("n2"); n2.on('input', function(msg) { try{ - msg.payload.should.equal('RequestError: Parse Error: Missing expected CR after header value : http://localhost:10234/') + msg.payload.should.equal(`RequestError: Parse Error: Missing expected CR after header value : http://localhost:${port}/`) done() } catch (err) { done(err) From 0d0d5bafb0f530fdcefe5576b248d63103b4a458 Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Thu, 18 Aug 2022 01:29:07 +0900 Subject: [PATCH 041/253] Make pre-defined header list sortable in http request node --- .../@node-red/nodes/core/network/21-httprequest.html | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/node_modules/@node-red/nodes/core/network/21-httprequest.html b/packages/node_modules/@node-red/nodes/core/network/21-httprequest.html index b9a44e1b4..eb0aeaf47 100644 --- a/packages/node_modules/@node-red/nodes/core/network/21-httprequest.html +++ b/packages/node_modules/@node-red/nodes/core/network/21-httprequest.html @@ -417,6 +417,7 @@ }); }, + sortable: true, removable: true }); if (node.headers) { From 266ba17ebb741aef2e5eefb8285eccc55fecff0f Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Thu, 18 Aug 2022 11:52:56 +0900 Subject: [PATCH 042/253] Use sortable list in http response node and proxy setting --- .../node_modules/@node-red/nodes/core/network/06-httpproxy.html | 1 + .../node_modules/@node-red/nodes/core/network/21-httpin.html | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/node_modules/@node-red/nodes/core/network/06-httpproxy.html b/packages/node_modules/@node-red/nodes/core/network/06-httpproxy.html index 7819ab8ec..446cbd324 100644 --- a/packages/node_modules/@node-red/nodes/core/network/06-httpproxy.html +++ b/packages/node_modules/@node-red/nodes/core/network/06-httpproxy.html @@ -101,6 +101,7 @@ hostField.val(data.host); } }, + sortable: true, removable: true }); if (this.noproxy) { diff --git a/packages/node_modules/@node-red/nodes/core/network/21-httpin.html b/packages/node_modules/@node-red/nodes/core/network/21-httpin.html index ce2f81e12..f828077a1 100644 --- a/packages/node_modules/@node-red/nodes/core/network/21-httpin.html +++ b/packages/node_modules/@node-red/nodes/core/network/21-httpin.html @@ -227,6 +227,7 @@ } }); }, + sortable: true, removable: true }); From d0d22c333c3d9479d19544b3726bff73fa5738fc Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Sun, 28 Aug 2022 02:04:13 +0900 Subject: [PATCH 043/253] Add Japanese translation for v3.0.2 --- .../@node-red/editor-client/locales/ja/editor.json | 3 +-- packages/node_modules/@node-red/nodes/locales/ja/messages.json | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) 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..dc7858250 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 @@ -1168,8 +1168,7 @@ "takeATour": "ツアーを開始", "start": "開始", "next": "次へ", - "welcomeTours": "ウェルカムツアー", - "tours": "ツアー" + "welcomeTours": "ウェルカムツアー" }, "diagnostics": { "title": "システム情報" diff --git a/packages/node_modules/@node-red/nodes/locales/ja/messages.json b/packages/node_modules/@node-red/nodes/locales/ja/messages.json index 6e16daa6f..76c8f8462 100644 --- a/packages/node_modules/@node-red/nodes/locales/ja/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/ja/messages.json @@ -554,7 +554,8 @@ }, "status": { "requesting": "要求中" - } + }, + "insecureHTTPParser": "厳密なHTTPパース処理を無効化" }, "websocket": { "label": { From cd8ca8981ba4146de22e79457fb7d46651061005 Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Sat, 3 Sep 2022 21:03:08 +0900 Subject: [PATCH 044/253] Add button type to the adding SSH key button --- .../@node-red/editor-client/src/js/ui/projects/projects.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projects.js b/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projects.js index 190561e15..30a1e51d0 100755 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projects.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projects.js @@ -545,7 +545,7 @@ RED.projects = (function() { var sshwarningRow = $('

    ').hide().appendTo(subrow); $('
    '+RED._("projects.clone-project.ssh-key-desc")+'
    ').appendTo(sshwarningRow); subrow = $('
    ').appendTo(sshwarningRow); - $('').appendTo(subrow).on("click", function(e) { + $('').appendTo(subrow).on("click", function(e) { e.preventDefault(); dialog.dialog( "close" ); RED.userSettings.show('gitconfig'); From d6bb3a558f6da935e05488cb1708562b0b242ebb Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Sat, 3 Sep 2022 21:23:38 +0100 Subject: [PATCH 045/253] fix loading node package in nodesDir on linux fixes #3861 --- .../@node-red/registry/lib/loader.js | 39 ++++++++++--------- .../@node-red/registry/lib/localfilesystem.js | 10 +++++ .../@node-red/registry/lib/registry.js | 11 +++++- 3 files changed, 40 insertions(+), 20 deletions(-) diff --git a/packages/node_modules/@node-red/registry/lib/loader.js b/packages/node_modules/@node-red/registry/lib/loader.js index 61f28ab86..3f0487750 100644 --- a/packages/node_modules/@node-red/registry/lib/loader.js +++ b/packages/node_modules/@node-red/registry/lib/loader.js @@ -43,37 +43,40 @@ function load(disableNodePathScan) { return loadModuleFiles(modules); } +function splitPath(p) { + return path.posix.normalize((p || '').replace(/\\/g, path.sep)).split(path.sep) +} function loadModuleTypeFiles(module, type) { const things = module[type]; - var first = true; - var promises = []; - for (var thingName in things) { + let first = true; + const promises = []; + for (let thingName in things) { /* istanbul ignore else */ if (things.hasOwnProperty(thingName)) { if (module.name != "node-red" && first) { // Check the module directory exists first = false; - var fn = things[thingName].file; - var parts = fn.split("/"); - var i = parts.length-1; - for (;i>=0;i--) { - if (parts[i] == "node_modules") { - break; - } + let moduleFn = module.path + const fn = things[thingName].file + const parts = splitPath(fn) + const nmi = parts.indexOf('node_modules') + if(nmi > -1) { + moduleFn = parts.slice(0,nmi+2).join(path.sep); + } + if (!moduleFn) { + // shortcut - skip calling statSync on empty string + break; // Module not found, don't attempt to load its nodes } - var moduleFn = parts.slice(0,i+2).join("/"); - try { - var stat = fs.statSync(moduleFn); + const stat = fs.statSync(moduleFn); } catch(err) { - // Module not found, don't attempt to load its nodes - break; + break; // Module not found, don't attempt to load its nodes } } try { - var promise; + let promise; if (type === "nodes") { promise = loadNodeConfig(things[thingName]); } else if (type === "plugins") { @@ -82,8 +85,7 @@ function loadModuleTypeFiles(module, type) { promises.push( promise.then( (function() { - var m = module.name; - var n = thingName; + const n = thingName; return function(nodeSet) { things[n] = nodeSet; return nodeSet; @@ -93,7 +95,6 @@ function loadModuleTypeFiles(module, type) { ); } catch(err) { console.log(err) - // } } } diff --git a/packages/node_modules/@node-red/registry/lib/localfilesystem.js b/packages/node_modules/@node-red/registry/lib/localfilesystem.js index da4006ecc..edb805572 100644 --- a/packages/node_modules/@node-red/registry/lib/localfilesystem.js +++ b/packages/node_modules/@node-red/registry/lib/localfilesystem.js @@ -156,6 +156,16 @@ function scanDirForNodesModules(dir,moduleName,package) { } } } + + // if we have found a package.json, this IS a node_module, lets see if it is a node-red node + if (!isNodeRedModule && files.indexOf('package.json') > -1) { + package = getPackageDetails(dir) // get package details + if(package && package.isNodeRedModule) { + isNodeRedModule = true + files = ['package.json'] // shortcut the file scan + } + } + for (let i=0;i Date: Sat, 3 Sep 2022 21:37:27 +0100 Subject: [PATCH 046/253] add test for specific arrangement of node package --- .../registry/lib/localfilesystem_spec.js | 21 ++++++++++++++- .../@lower-case2/lower-case2/lower-case.html | 26 +++++++++++++++++++ .../@lower-case2/lower-case2/lower-case.js | 11 ++++++++ .../nodesDir2/@lower-case2/package.json | 9 +++++++ .../lower-case/lower-case/lower-case.html | 26 +++++++++++++++++++ .../lower-case/lower-case/lower-case.js | 11 ++++++++ .../nodesDir2/lower-case/package.json | 9 +++++++ 7 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 test/unit/@node-red/registry/lib/resources/nodesDir2/@lower-case2/lower-case2/lower-case.html create mode 100644 test/unit/@node-red/registry/lib/resources/nodesDir2/@lower-case2/lower-case2/lower-case.js create mode 100644 test/unit/@node-red/registry/lib/resources/nodesDir2/@lower-case2/package.json create mode 100644 test/unit/@node-red/registry/lib/resources/nodesDir2/lower-case/lower-case/lower-case.html create mode 100644 test/unit/@node-red/registry/lib/resources/nodesDir2/lower-case/lower-case/lower-case.js create mode 100644 test/unit/@node-red/registry/lib/resources/nodesDir2/lower-case/package.json diff --git a/test/unit/@node-red/registry/lib/localfilesystem_spec.js b/test/unit/@node-red/registry/lib/localfilesystem_spec.js index 3b1bb63f3..3ce74c158 100644 --- a/test/unit/@node-red/registry/lib/localfilesystem_spec.js +++ b/test/unit/@node-red/registry/lib/localfilesystem_spec.js @@ -329,17 +329,36 @@ describe("red/nodes/registry/localfilesystem",function() { localfilesystem.init({nodesDir:[nodesDir2]}); const nodeModule = localfilesystem.getModuleFiles(); const loaded = Object.keys(nodeModule) - loaded.should.have.a.property("length", 3) loaded.indexOf('@test/testnode').should.greaterThan(-1, "Should load @test/testnode") + loaded.indexOf('lower-case').should.greaterThan(-1, "Should load lower-case") + loaded.indexOf('@lowercase/lower-case2').should.greaterThan(-1, "Should load @lowercase/lower-case2") loaded.indexOf('testnode2').should.greaterThan(-1, "Should load testnode2") loaded.indexOf('test-theme2').should.greaterThan(-1, "Should load test-theme2") + loaded.should.have.a.property("length", 5) + // scoped module with nodes in same dir as package.json nodeModule['@test/testnode'].should.have.a.property('name','@test/testnode'); nodeModule['@test/testnode'].should.have.a.property('version','1.0.0'); nodeModule['@test/testnode'].should.have.a.property('nodes'); nodeModule['@test/testnode'].should.have.a.property('path'); nodeModule['@test/testnode'].should.have.a.property('user', false); + // node-red module with nodes in sub dir + nodeModule['@lowercase/lower-case2'].should.have.a.property('name','@lowercase/lower-case2'); + nodeModule['@lowercase/lower-case2'].should.have.a.property('version','2.0.0'); + nodeModule['@lowercase/lower-case2'].should.have.a.property('nodes'); + nodeModule['@lowercase/lower-case2'].nodes.should.have.a.property('lower-case'); + nodeModule['@lowercase/lower-case2'].should.have.a.property('path'); + nodeModule['@lowercase/lower-case2'].should.have.a.property('user', false); + + // scoped module with nodes in sub dir + nodeModule['lower-case'].should.have.a.property('name', 'lower-case'); + nodeModule['lower-case'].should.have.a.property('version','1.0.0'); + nodeModule['lower-case'].should.have.a.property('nodes'); + nodeModule['lower-case'].nodes.should.have.a.property('lower-case'); + nodeModule['lower-case'].should.have.a.property('path'); + nodeModule['lower-case'].should.have.a.property('user', false); + nodeModule['testnode2'].should.have.a.property('name','testnode2'); nodeModule['testnode2'].should.have.a.property('version','1.0.0'); nodeModule['testnode2'].should.have.a.property('nodes'); diff --git a/test/unit/@node-red/registry/lib/resources/nodesDir2/@lower-case2/lower-case2/lower-case.html b/test/unit/@node-red/registry/lib/resources/nodesDir2/@lower-case2/lower-case2/lower-case.html new file mode 100644 index 000000000..617f48491 --- /dev/null +++ b/test/unit/@node-red/registry/lib/resources/nodesDir2/@lower-case2/lower-case2/lower-case.html @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file diff --git a/test/unit/@node-red/registry/lib/resources/nodesDir2/@lower-case2/lower-case2/lower-case.js b/test/unit/@node-red/registry/lib/resources/nodesDir2/@lower-case2/lower-case2/lower-case.js new file mode 100644 index 000000000..73579ba04 --- /dev/null +++ b/test/unit/@node-red/registry/lib/resources/nodesDir2/@lower-case2/lower-case2/lower-case.js @@ -0,0 +1,11 @@ +module.exports = function(RED) { +function LowerCaseNode(config) { + RED.nodes.createNode(this,config); + var node = this; + node.on('input', function(msg) { + msg.payload = msg.payload.toLowerCase(); + node.send(msg); + }); + } + RED.nodes.registerType("lower-case2",LowerCaseNode); +} \ No newline at end of file diff --git a/test/unit/@node-red/registry/lib/resources/nodesDir2/@lower-case2/package.json b/test/unit/@node-red/registry/lib/resources/nodesDir2/@lower-case2/package.json new file mode 100644 index 000000000..6b6ce9aa9 --- /dev/null +++ b/test/unit/@node-red/registry/lib/resources/nodesDir2/@lower-case2/package.json @@ -0,0 +1,9 @@ +{ + "name" : "@lowercase/lower-case2", + "node-red" : { + "nodes": { + "lower-case": "lower-case2/lower-case.js" + } + }, + "version": "2.0.0" +} \ No newline at end of file diff --git a/test/unit/@node-red/registry/lib/resources/nodesDir2/lower-case/lower-case/lower-case.html b/test/unit/@node-red/registry/lib/resources/nodesDir2/lower-case/lower-case/lower-case.html new file mode 100644 index 000000000..e57d51131 --- /dev/null +++ b/test/unit/@node-red/registry/lib/resources/nodesDir2/lower-case/lower-case/lower-case.html @@ -0,0 +1,26 @@ + + + + + diff --git a/test/unit/@node-red/registry/lib/resources/nodesDir2/lower-case/lower-case/lower-case.js b/test/unit/@node-red/registry/lib/resources/nodesDir2/lower-case/lower-case/lower-case.js new file mode 100644 index 000000000..006b35eb6 --- /dev/null +++ b/test/unit/@node-red/registry/lib/resources/nodesDir2/lower-case/lower-case/lower-case.js @@ -0,0 +1,11 @@ +module.exports = function(RED) { + function LowerCaseNode(config) { + RED.nodes.createNode(this,config); + var node = this; + node.on('input', function(msg) { + msg.payload = msg.payload.toLowerCase(); + node.send(msg); + }); + } + RED.nodes.registerType("lower-case",LowerCaseNode); +} diff --git a/test/unit/@node-red/registry/lib/resources/nodesDir2/lower-case/package.json b/test/unit/@node-red/registry/lib/resources/nodesDir2/lower-case/package.json new file mode 100644 index 000000000..a632eaddd --- /dev/null +++ b/test/unit/@node-red/registry/lib/resources/nodesDir2/lower-case/package.json @@ -0,0 +1,9 @@ +{ + "name" : "lower-case", + "node-red" : { + "nodes": { + "lower-case": "lower-case/lower-case.js" + } + }, + "version": "1.0.0" +} From 5f159c1fbd4e78373292472263f8caa0d720721d Mon Sep 17 00:00:00 2001 From: Stephen McLaughlin <44235289+Steve-Mcl@users.noreply.github.com> Date: Sat, 3 Sep 2022 21:54:21 +0100 Subject: [PATCH 047/253] Update packages/node_modules/@node-red/editor-client/src/js/ui/search.js Co-authored-by: Nick O'Leary --- .../node_modules/@node-red/editor-client/src/js/ui/search.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js index 7d147bde9..6dcd44b88 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js @@ -108,7 +108,6 @@ RED.search = (function() { function extractType(val, flags) { // extracts: type:XYZ & type:"X Y Z" - console.log(`extractType(val, flags): val:${val}`) const regEx = /(?:type):\s*(?:"([^"]+)"|([^" ]+))/; let m while ((m = regEx.exec(val)) !== null) { From c038c99f9dbc54f15c88f6ec8a2b5f379d4e8253 Mon Sep 17 00:00:00 2001 From: Stephen McLaughlin <44235289+Steve-Mcl@users.noreply.github.com> Date: Sat, 3 Sep 2022 21:54:41 +0100 Subject: [PATCH 048/253] Update packages/node_modules/@node-red/editor-client/src/js/ui/search.js Co-authored-by: Nick O'Leary --- .../node_modules/@node-red/editor-client/src/js/ui/search.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js index 6dcd44b88..3903a4a0a 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js @@ -134,7 +134,7 @@ RED.search = (function() { val = extractFlag(val,"modified",flags); val = extractValue(val,"flow",flags);// flow:current or flow: val = extractValue(val,"uses",flags);// uses: - val = extractType(val,flags);// uses: + val = extractType(val,flags);// type: val = val.trim(); const hasFlags = Object.keys(flags).length > 0; const hasTypeFilter = flags.type && flags.type.length > 0 From e11f17672c0b208d7560c249ca617ef989b11ee9 Mon Sep 17 00:00:00 2001 From: Stephen McLaughlin <44235289+Steve-Mcl@users.noreply.github.com> Date: Sat, 3 Sep 2022 22:01:54 +0100 Subject: [PATCH 049/253] Update packages/node_modules/@node-red/editor-client/src/js/ui/palette.js --- .../node_modules/@node-red/editor-client/src/js/ui/palette.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js index 322283fcb..928793610 100755 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js @@ -176,7 +176,7 @@ RED.palette = (function() { } const safeType = type.replace(/'/g,"\\'"); - function wrapStr(str) { + const wrapStr = function (str) { if(str.indexOf(' ') >= 0) { return '"' + str + '"' } From a533943a4043cd915ec40e37a424ae168a0b4793 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Sun, 4 Sep 2022 01:50:54 +0100 Subject: [PATCH 050/253] add function node monaco types util and promisify fixes #3851 --- .../editor-client/src/js/ui/editors/code-editors/monaco.js | 2 +- .../@node-red/editor-client/src/types/node-red/func.d.ts | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/code-editors/monaco.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/code-editors/monaco.js index 497116125..68b9a487e 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/code-editors/monaco.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/code-editors/monaco.js @@ -100,7 +100,7 @@ RED.editor.codeEditor.monaco = (function() { "node-red-util": {package: "node-red", module: "util", path: "node-red/util.d.ts" }, "node-red-func": {package: "node-red", module: "func", path: "node-red/func.d.ts" }, } - const defaultServerSideTypes = [ knownModules["node-red-util"], knownModules["node-red-func"], knownModules["globals"], knownModules["console"], knownModules["buffer"] ]; + const defaultServerSideTypes = [ knownModules["node-red-util"], knownModules["node-red-func"], knownModules["globals"], knownModules["console"], knownModules["buffer"] , knownModules["util"] ]; const modulesCache = {}; diff --git a/packages/node_modules/@node-red/editor-client/src/types/node-red/func.d.ts b/packages/node_modules/@node-red/editor-client/src/types/node-red/func.d.ts index ae411f33c..fd2adcbd8 100644 --- a/packages/node_modules/@node-red/editor-client/src/types/node-red/func.d.ts +++ b/packages/node_modules/@node-red/editor-client/src/types/node-red/func.d.ts @@ -14,6 +14,9 @@ declare var msg: NodeMessage; /** @type {string} the id of the incoming `msg` (alias of msg._msgid) */ declare const __msgid__:string; +declare const util:typeof import('util') +declare const promisify:typeof import('util').promisify + /** * @typedef NodeStatus * @type {object} From fbde0091de47a8393e8e541bebc973b51fa0f721 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Sun, 4 Sep 2022 11:08:41 +0100 Subject: [PATCH 051/253] fix node-red crash with invalid mqtt birth topic fixes #3865 --- .../@node-red/nodes/core/network/10-mqtt.js | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/network/10-mqtt.js b/packages/node_modules/@node-red/nodes/core/network/10-mqtt.js index 9e6195b5d..532d54d8e 100644 --- a/packages/node_modules/@node-red/nodes/core/network/10-mqtt.js +++ b/packages/node_modules/@node-red/nodes/core/network/10-mqtt.js @@ -991,14 +991,21 @@ module.exports = function(RED) { } if (topicOK) { - node.client.publish(msg.topic, msg.payload, options, function(err) { - done && done(err); - return - }); + node.client.publish(msg.topic, msg.payload, options, function (err) { + if (done) { + done(err) + } else { + node.error(err, msg) + } + }) } else { - const error = new Error(RED._("mqtt.errors.invalid-topic")); - error.warn = true; - done(error); + const error = new Error(RED._("mqtt.errors.invalid-topic")) + error.warn = true + if (done) { + done(error) + } else { + node.warn(error, msg) + } } } }; From cc5a770b164e8e55713c37d468ee2c4c717be1b3 Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Sun, 4 Sep 2022 21:58:02 +0900 Subject: [PATCH 052/253] Add button type to buttons on projects dialog --- .../src/js/ui/projects/projects.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projects.js b/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projects.js index 30a1e51d0..6294c4c51 100755 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projects.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projects.js @@ -1171,11 +1171,11 @@ RED.projects = (function() { row = $('
    ').appendTo(container); - var openProject = $('').appendTo(row); - var createAsEmpty = $('').appendTo(row); - // var createAsCopy = $('').appendTo(row); - var createAsClone = $('').appendTo(row); - // var createAsClone = $('').appendTo(row); + var openProject = $('').appendTo(row); + var createAsEmpty = $('').appendTo(row); + // var createAsCopy = $('').appendTo(row); + var createAsClone = $('').appendTo(row); + // var createAsClone = $('').appendTo(row); row.find(".red-ui-projects-dialog-screen-create-type").on("click", function(evt) { evt.preventDefault(); container.find(".red-ui-projects-dialog-screen-create-type").removeClass('selected'); @@ -1397,7 +1397,7 @@ RED.projects = (function() { var sshwarningRow = $('
    ').hide().appendTo(subrow); $('
    '+RED._("projects.create.desc2")+'
    ').appendTo(sshwarningRow); subrow = $('
    ').appendTo(sshwarningRow); - $('').appendTo(subrow).on("click", function(e) { + $('').appendTo(subrow).on("click", function(e) { e.preventDefault(); $('#red-ui-projects-dialog-cancel').trigger("click"); RED.userSettings.show('gitconfig'); @@ -1631,14 +1631,14 @@ RED.projects = (function() { function deleteProject(row,name,done) { var cover = $('
    ').on("click", function(evt) { evt.stopPropagation(); }).appendTo(row); $('').text(RED._("projects.delete.confirm")).appendTo(cover); - $('') + $('') .appendTo(cover) .on("click", function(e) { e.stopPropagation(); cover.remove(); done(true); }); - $('') + $('') .appendTo(cover) .on("click", function(e) { e.stopPropagation(); @@ -1822,7 +1822,7 @@ RED.projects = (function() { header.addClass("selectable"); var tools = $('
    ').appendTo(header); - $('') + $('') .appendTo(tools) .on("click", function(e) { e.stopPropagation(); From 745607b5bce56c125e76f8e4baf6b0707d542ed5 Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Sun, 4 Sep 2022 23:21:34 +0900 Subject: [PATCH 053/253] Add button type to buttons on node properties --- .../@node-red/nodes/core/common/24-complete.html | 2 +- .../node_modules/@node-red/nodes/core/common/25-catch.html | 2 +- .../node_modules/@node-red/nodes/core/common/25-status.html | 2 +- .../@node-red/nodes/core/function/10-function.html | 6 +++--- .../@node-red/nodes/core/function/80-template.html | 2 +- .../node_modules/@node-red/nodes/core/network/05-tls.html | 6 +++--- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/common/24-complete.html b/packages/node_modules/@node-red/nodes/core/common/24-complete.html index a6a7a2a45..b2d406bb5 100644 --- a/packages/node_modules/@node-red/nodes/core/common/24-complete.html +++ b/packages/node_modules/@node-red/nodes/core/common/24-complete.html @@ -1,6 +1,6 @@ diff --git a/packages/node_modules/@node-red/nodes/locales/ja/function/80-template.html b/packages/node_modules/@node-red/nodes/locales/ja/function/80-template.html index 1a9c17453..9b64003a5 100644 --- a/packages/node_modules/@node-red/nodes/locales/ja/function/80-template.html +++ b/packages/node_modules/@node-red/nodes/locales/ja/function/80-template.html @@ -48,4 +48,7 @@

    注: デフォルトでは、mustache形式は置換対象のHTML要素をエスケープします。これを抑止するには{{{三重}}}括弧形式を使います。

    もし、コンテンツの中で{{ }}を出力する必要がある場合は、テンプレートで使われる記号文字を変えることもできます。例えば、[[ ]]を代わりに用いるには、テンプレートの先頭に以下の行を追加します。

    {{=[[ ]]=}}
    +

    環境変数の利用

    +

    templateノードでは、次の構文を用いると環境変数にアクセスできます:

    +
    私の好きな色は{{env.COLOUR}}です。
    From 7507a7b459fdebf22287dda7b9dc4ac939402a4a Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Fri, 16 Sep 2022 02:10:14 +0900 Subject: [PATCH 063/253] Limit number of ports in function node --- .../@node-red/nodes/core/function/10-function.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/core/function/10-function.html b/packages/node_modules/@node-red/nodes/core/function/10-function.html index fc57895a2..a647bed49 100644 --- a/packages/node_modules/@node-red/nodes/core/function/10-function.html +++ b/packages/node_modules/@node-red/nodes/core/function/10-function.html @@ -451,7 +451,8 @@ tabs.activateTab("func-tab-body"); $( "#node-input-outputs" ).spinner({ - min:0, + min: 0, + max: 10, change: function(event, ui) { var value = this.value; if (!value.match(/^\d+$/)) { value = 1; } From 9fd4989142243d63f914fe523542fc8f03a1abbe Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 15 Sep 2022 21:22:55 +0100 Subject: [PATCH 064/253] Fix autocomplete entry for responseUrl Fixes #3883 --- .../@node-red/editor-client/src/js/ui/common/typedInput.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js index ef1be05bc..7440b464e 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js @@ -146,7 +146,7 @@ { value: "reset", source: ["delay","trigger","join","rbe"] }, { value: "responseCookies", source: ["http request"] }, { value: "responseTopic", source: ["mqtt"] }, - { value: "responseURL", source: ["http request"] }, + { value: "responseUrl", source: ["http request"] }, { value: "restartTimeout", source: ["join"] }, { value: "retain", source: ["mqtt"] }, { value: "schema", source: ["json"] }, From 199caccbc3244fe73ac131bf5bd772c09fe2d112 Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Sat, 17 Sep 2022 00:25:46 +0900 Subject: [PATCH 065/253] Change the maximum number of ports to 500 --- .../node_modules/@node-red/nodes/core/function/10-function.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/core/function/10-function.html b/packages/node_modules/@node-red/nodes/core/function/10-function.html index a647bed49..345a77aab 100644 --- a/packages/node_modules/@node-red/nodes/core/function/10-function.html +++ b/packages/node_modules/@node-red/nodes/core/function/10-function.html @@ -452,7 +452,7 @@ $( "#node-input-outputs" ).spinner({ min: 0, - max: 10, + max: 500, change: function(event, ui) { var value = this.value; if (!value.match(/^\d+$/)) { value = 1; } From ce31edc80327d4141d5a46b6f07ef33c5113c1ec Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Sun, 18 Sep 2022 02:22:52 +0900 Subject: [PATCH 066/253] Fix handling of max and min values in function outputs --- .../@node-red/nodes/core/function/10-function.html | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/function/10-function.html b/packages/node_modules/@node-red/nodes/core/function/10-function.html index 345a77aab..43f8c7b39 100644 --- a/packages/node_modules/@node-red/nodes/core/function/10-function.html +++ b/packages/node_modules/@node-red/nodes/core/function/10-function.html @@ -454,9 +454,10 @@ min: 0, max: 500, change: function(event, ui) { - var value = this.value; - if (!value.match(/^\d+$/)) { value = 1; } - else if (value < this.min) { value = this.min; } + var value = parseInt(this.value); + value = isNaN(value) ? 1 : value; + value = Math.max(value, parseInt($(this).attr("aria-valuemin"))); + value = Math.min(value, parseInt($(this).attr("aria-valuemax"))); if (value !== this.value) { $(this).spinner("value", value); } } }); From efc0f1ab9144f6444544095fe7fbdfcd4732f2f0 Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Sun, 18 Sep 2022 16:24:25 +0900 Subject: [PATCH 067/253] Fix default values for MQTT retain settings --- .../node_modules/@node-red/nodes/core/network/10-mqtt.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/network/10-mqtt.html b/packages/node_modules/@node-red/nodes/core/network/10-mqtt.html index 03ef4b2e3..cf443f48b 100644 --- a/packages/node_modules/@node-red/nodes/core/network/10-mqtt.html +++ b/packages/node_modules/@node-red/nodes/core/network/10-mqtt.html @@ -499,17 +499,17 @@ cleansession: {value: true}, birthTopic: {value:"", validate:validateMQTTPublishTopic}, birthQos: {value:"0"}, - birthRetain: {value:false}, + birthRetain: {value:"false"}, birthPayload: {value:""}, birthMsg: { value: {}}, closeTopic: {value:"", validate:validateMQTTPublishTopic}, closeQos: {value:"0"}, - closeRetain: {value:false}, + closeRetain: {value:"false"}, closePayload: {value:""}, closeMsg: { value: {}}, willTopic: {value:"", validate:validateMQTTPublishTopic}, willQos: {value:"0"}, - willRetain: {value:false}, + willRetain: {value:"false"}, willPayload: {value:""}, willMsg: { value: {}}, userProps: { value: ""}, From a81b1aa0cb769b3cc90a562f14c6eb79cbaa00ff Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Sun, 18 Sep 2022 17:10:19 +0900 Subject: [PATCH 068/253] Support i18n in MQTT node property --- .../@node-red/nodes/core/network/10-mqtt.html | 8 ++++++-- .../@node-red/nodes/locales/en-US/messages.json | 4 +++- .../node_modules/@node-red/nodes/locales/ja/messages.json | 4 +++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/network/10-mqtt.html b/packages/node_modules/@node-red/nodes/core/network/10-mqtt.html index cf443f48b..6492060e2 100644 --- a/packages/node_modules/@node-red/nodes/core/network/10-mqtt.html +++ b/packages/node_modules/@node-red/nodes/core/network/10-mqtt.html @@ -421,7 +421,11 @@ diff --git a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json index 62d5f351f..8b66bf5e9 100644 --- a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json @@ -813,7 +813,8 @@ "scale": { "payload": "Scale the message property", "limit": "Scale and limit to the target range", - "wrap": "Scale and wrap within the target range" + "wrap": "Scale and wrap within the target range", + "drop": "Scale, but drop msg if outside input range" }, "tip": "Tip: This node ONLY works with numbers.", "errors": { diff --git a/test/nodes/core/function/16-range_spec.js b/test/nodes/core/function/16-range_spec.js index a0dcd0078..620d21b12 100644 --- a/test/nodes/core/function/16-range_spec.js +++ b/test/nodes/core/function/16-range_spec.js @@ -106,6 +106,27 @@ describe('range Node', function() { genericRangeTest("clamp", 0, 10, 0, 1000, false, -1, 0, done); }); + it('drops msg if in drop mode and input outside range', function(done) { + var flow = [{"id":"rangeNode1","type":"range","minin":2,"maxin":8,"minout":20,"maxout":80,"action":"drop","round":true,"name":"rangeNode","wires":[["helperNode1"]]}, + {id:"helperNode1", type:"helper", wires:[]}]; + helper.load(rangeNode, flow, function() { + var rangeNode1 = helper.getNode("rangeNode1"); + var helperNode1 = helper.getNode("helperNode1"); + helperNode1.on("input", function(msg) { + try { + msg.should.have.property('payload'); + msg.payload.should.equal(50); + done(); + } catch(err) { + done(err); + } + }); + rangeNode1.receive({payload:1}); + rangeNode1.receive({payload:9}); + rangeNode1.receive({payload:5}); + }); + }); + it('just passes on msg if payload not present', function(done) { var flow = [{"id":"rangeNode1","type":"range","minin":0,"maxin":100,"minout":0,"maxout":100,"action":"scale","round":true,"name":"rangeNode","wires":[["helperNode1"]]}, {id:"helperNode1", type:"helper", wires:[]}]; From d693af9615137655974f3ca51010794180158b0f Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sun, 16 Oct 2022 18:05:21 +0100 Subject: [PATCH 095/253] CSV node check header properties for ' and " and add test to close #3919 --- .../@node-red/nodes/core/parsers/70-CSV.js | 5 +++- test/nodes/core/parsers/70-CSV_spec.js | 27 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/core/parsers/70-CSV.js b/packages/node_modules/@node-red/nodes/core/parsers/70-CSV.js index 39d03f05c..ca193c2b9 100644 --- a/packages/node_modules/@node-red/nodes/core/parsers/70-CSV.js +++ b/packages/node_modules/@node-red/nodes/core/parsers/70-CSV.js @@ -135,7 +135,10 @@ module.exports = function(RED) { ou += node.sep; } else { - var p = RED.util.getMessageProperty(msg,"payload["+s+"]['"+template[t]+"']"); + var tt = template[t]; + if (template[t].indexOf('"') >=0 ) { tt = "'"+tt+"'"; } + else { tt = '"'+tt+'"'; } + var p = RED.util.getMessageProperty(msg,'payload["'+s+'"]['+tt+']'); /* istanbul ignore else */ if (p === undefined) { p = ""; } // fix to honour include null values flag diff --git a/test/nodes/core/parsers/70-CSV_spec.js b/test/nodes/core/parsers/70-CSV_spec.js index d56f05db3..681711b3b 100644 --- a/test/nodes/core/parsers/70-CSV_spec.js +++ b/test/nodes/core/parsers/70-CSV_spec.js @@ -766,6 +766,33 @@ describe('CSV node', function() { }); }); + it('should handle a template with quotes in the property names', function(done) { + var flow = [ { id:"n1", type:"csv", temp:"", hdrout:"all", wires:[["n2"]] }, + {id:"n2", type:"helper"} ]; + helper.load(csvNode, flow, function() { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + n2.on("input", function(msg) { + try { + msg.should.have.property('payload', 'a"a,b\'b\nA1,B1\nA2,B2\n'); + done(); + } + catch(e) { done(e); } + }); + var testJson = [ + { + "a\"a": "A1", + "b'b": "B1" + }, + { + "a\"a": "A2", + "b'b": "B2" + } + ] + n1.emit("input", {payload:testJson}); + }); + }); + it('should convert an array of objects to a multi-line csv', function(done) { var flow = [ { id:"n1", type:"csv", temp:"a,d,c,b", wires:[["n2"]] }, {id:"n2", type:"helper"} ]; From dd76840568c7435bd6568f488180f81b8d56f1c5 Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Tue, 1 Nov 2022 01:09:06 +0900 Subject: [PATCH 096/253] Fix uncleared translations in change node --- .../node_modules/@node-red/nodes/locales/ja/messages.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/locales/ja/messages.json b/packages/node_modules/@node-red/nodes/locales/ja/messages.json index 6e16daa6f..124dd4f09 100644 --- a/packages/node_modules/@node-red/nodes/locales/ja/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/ja/messages.json @@ -777,8 +777,8 @@ "change": "値の置換", "delete": "値の削除", "move": "値の移動", - "toValue": "対象の値", - "to": "対象の値", + "toValue": "代入する値", + "to": "移動先", "search": "検索する文字列", "replace": "置換後の文字列" }, From d8e01584f33a3f8d205180d60ec80cf91a72399a Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 31 Oct 2022 20:20:05 +0000 Subject: [PATCH 097/253] Remove add-flow-to-right option if clicked in tab bar --- .../editor-client/src/js/ui/workspaces.js | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js b/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js index a34f45b83..5df1ca69c 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js @@ -161,15 +161,21 @@ RED.workspaces = (function() { id:"red-ui-tabs-menu-option-add-flow", label: RED._("workspace.addFlow"), onselect: "core:add-flow" - }, - { - id:"red-ui-tabs-menu-option-add-flow-right", - label: RED._("workspace.addFlowToRight"), - shortcut: RED.keyboard.getShortcut("core:add-flow-to-right"), - onselect: function() { - RED.actions.invoke("core:add-flow-to-right", tab) + } + ) + if (isMenuButton || !!tab) { + menuItems.push( + { + id:"red-ui-tabs-menu-option-add-flow-right", + label: RED._("workspace.addFlowToRight"), + shortcut: RED.keyboard.getShortcut("core:add-flow-to-right"), + onselect: function() { + RED.actions.invoke("core:add-flow-to-right", tab) + } } - }, + ) + } + menuItems.push( null, { id:"red-ui-tabs-menu-option-add-hide-flows", From a351cd9d9f58556e06f979867ba88ed5edb22d68 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 1 Nov 2022 10:35:57 +0000 Subject: [PATCH 098/253] Add move-to-start/end and better subflow menu options --- .../editor-client/locales/en-US/editor.json | 6 +- .../@node-red/editor-client/src/js/nodes.js | 2 +- .../editor-client/src/js/ui/subflow.js | 83 ++++++----- .../editor-client/src/js/ui/workspaces.js | 137 ++++++++++++++---- 4 files changed, 162 insertions(+), 66 deletions(-) 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 f226cb79e..44d370aac 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 @@ -68,7 +68,11 @@ "enabled": "Enabled", "disabled": "Disabled", "info": "Description", - "selectNodes": "Click nodes to select" + "selectNodes": "Click nodes to select", + "enableFlow": "Enable flow", + "disableFlow": "Disable flow", + "moveToStart": "Move flow to start", + "moveToEnd": "Move flow to end" }, "menu": { "label": { 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 9da5aad05..6dd500581 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 @@ -2834,7 +2834,7 @@ RED.nodes = (function() { }, addWorkspace: addWorkspace, removeWorkspace: removeWorkspace, - getWorkspaceOrder: function() { return workspacesOrder }, + getWorkspaceOrder: function() { return [...workspacesOrder] }, setWorkspaceOrder: function(order) { workspacesOrder = order; }, workspace: getWorkspace, diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js b/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js index ca4f651ab..e979adf65 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js @@ -431,44 +431,7 @@ RED.subflow = (function() { $("#red-ui-subflow-delete").on("click", function(event) { event.preventDefault(); - var subflow = RED.nodes.subflow(RED.workspaces.active()); - if (subflow.instances.length > 0) { - var msg = $('
    ') - $('

    ').text(RED._("subflow.subflowInstances",{count: subflow.instances.length})).appendTo(msg); - $('

    ').text(RED._("subflow.confirmDelete")).appendTo(msg); - var confirmDeleteNotification = RED.notify(msg, { - modal: true, - fixed: true, - buttons: [ - { - text: RED._('common.label.cancel'), - click: function() { - confirmDeleteNotification.close(); - } - }, - { - text: RED._('workspace.confirmDelete'), - class: "primary", - click: function() { - confirmDeleteNotification.close(); - completeDelete(); - } - } - ] - }); - - return; - } else { - completeDelete(); - } - function completeDelete() { - var startDirty = RED.nodes.dirty(); - var historyEvent = removeSubflow(RED.workspaces.active()); - historyEvent.t = 'delete'; - historyEvent.dirty = startDirty; - RED.history.push(historyEvent); - } - + RED.subflow.delete(RED.workspaces.active()) }); refreshToolbar(activeSubflow); @@ -481,7 +444,48 @@ RED.subflow = (function() { $("#red-ui-workspace-toolbar").hide().empty(); $("#red-ui-workspace-chart").css({"margin-top": "0"}); } + function deleteSubflow(id) { + const subflow = RED.nodes.subflow(id || RED.workspaces.active()); + if (!subflow) { + return + } + if (subflow.instances.length > 0) { + const msg = $('

    ') + $('

    ').text(RED._("subflow.subflowInstances",{count: subflow.instances.length})).appendTo(msg); + $('

    ').text(RED._("subflow.confirmDelete")).appendTo(msg); + const confirmDeleteNotification = RED.notify(msg, { + modal: true, + fixed: true, + buttons: [ + { + text: RED._('common.label.cancel'), + click: function() { + confirmDeleteNotification.close(); + } + }, + { + text: RED._('workspace.confirmDelete'), + class: "primary", + click: function() { + confirmDeleteNotification.close(); + completeDelete(); + } + } + ] + }); + return; + } else { + completeDelete(); + } + function completeDelete() { + const startDirty = RED.nodes.dirty(); + const historyEvent = removeSubflow(subflow.id); + historyEvent.t = 'delete'; + historyEvent.dirty = startDirty; + RED.history.push(historyEvent); + } + } function removeSubflow(id, keepInstanceNodes) { // TODO: A lot of this logic is common with RED.nodes.removeWorkspace var removedNodes = []; @@ -1323,7 +1327,10 @@ RED.subflow = (function() { init: init, createSubflow: createSubflow, convertToSubflow: convertToSubflow, + // removeSubflow: Internal function to remove subflow removeSubflow: removeSubflow, + // delete: Prompt user for confirmation + delete: deleteSubflow, refresh: refresh, removeInput: removeSubflowInput, removeOutput: removeSubflowOutput, diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js b/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js index 5df1ca69c..d274ba519 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js @@ -141,6 +141,8 @@ RED.workspaces = (function() { }) } const hiddenflowCount = hiddenFlows.size; + let activeWorkspace = tab || RED.nodes.workspace(RED.workspaces.active()) || RED.nodes.subflow(RED.workspaces.active()) + let isFlowDisabled = activeWorkspace ? activeWorkspace.disabled : false var menuItems = [] if (isMenuButton) { @@ -172,27 +174,69 @@ RED.workspaces = (function() { onselect: function() { RED.actions.invoke("core:add-flow-to-right", tab) } + }, + null + ) + if (activeWorkspace && activeWorkspace.type === 'tab') { + menuItems.push( + isFlowDisabled ? { + label: RED._("workspace.enableFlow"), + shortcut: RED.keyboard.getShortcut("core:enable-flow"), + onselect: function() { + RED.actions.invoke("core:enable-flow", tab?tab.id:undefined) + } + } : { + label: RED._("workspace.disableFlow"), + shortcut: RED.keyboard.getShortcut("core:disable-flow"), + onselect: function() { + RED.actions.invoke("core:disable-flow", tab?tab.id:undefined) + } + } + ) + } + const currentTabs = workspace_tabs.listTabs() + const activeIndex = currentTabs.findIndex(id => id === activeWorkspace.id) + menuItems.push( + { + label: RED._("workspace.moveToStart"), + shortcut: RED.keyboard.getShortcut("core:move-flow-to-start"), + onselect: function() { + RED.actions.invoke("core:move-flow-to-start", tab?tab.id:undefined) + }, + disabled: activeIndex === 0 + }, + { + label: RED._("workspace.moveToEnd"), + shortcut: RED.keyboard.getShortcut("core:move-flow-to-end"), + onselect: function() { + RED.actions.invoke("core:move-flow-to-end", tab?tab.id:undefined) + }, + disabled: activeIndex === currentTabs.length - 1 + } + ) + } + menuItems.push(null) + if (isMenuButton || !!tab) { + menuItems.push( + { + id:"red-ui-tabs-menu-option-add-hide-flows", + label: RED._("workspace.hideFlow"), + shortcut: RED.keyboard.getShortcut("core:hide-flow"), + onselect: function() { + RED.actions.invoke("core:hide-flow", tab) + } + }, + { + id:"red-ui-tabs-menu-option-add-hide-other-flows", + label: RED._("workspace.hideOtherFlows"), + shortcut: RED.keyboard.getShortcut("core:hide-other-flows"), + onselect: function() { + RED.actions.invoke("core:hide-other-flows", tab) + } } ) } menuItems.push( - null, - { - id:"red-ui-tabs-menu-option-add-hide-flows", - label: RED._("workspace.hideFlow"), - shortcut: RED.keyboard.getShortcut("core:hide-flow"), - onselect: function() { - RED.actions.invoke("core:hide-flow", tab) - } - }, - { - id:"red-ui-tabs-menu-option-add-hide-other-flows", - label: RED._("workspace.hideOtherFlows"), - shortcut: RED.keyboard.getShortcut("core:hide-other-flows"), - onselect: function() { - RED.actions.invoke("core:hide-other-flows", tab) - } - }, { id:"red-ui-tabs-menu-option-add-hide-all-flows", label: RED._("workspace.hideAllFlows"), @@ -216,9 +260,12 @@ RED.workspaces = (function() { null, { label: RED._("common.label.delete"), - disabled: tab.type !== 'tab', onselect: function() { - RED.workspaces.delete(tab) + if (tab.type === 'tab') { + RED.workspaces.delete(tab) + } else if (tab.type === 'subflow') { + RED.subflow.delete(tab.id) + } } }, { @@ -302,13 +349,19 @@ RED.workspaces = (function() { RED.history.push({ t:'reorder', workspaces: { - from:oldOrder, - to:newOrder + from: oldOrder, + to: newOrder }, dirty:RED.nodes.dirty() }); - RED.nodes.dirty(true); - setWorkspaceOrder(newOrder); + // Only mark flows dirty if flow-order has changed (excluding subflows) + const filteredOldOrder = oldOrder.filter(id => !!RED.nodes.workspace(id)) + const filteredNewOrder = newOrder.filter(id => !!RED.nodes.workspace(id)) + + if (JSON.stringify(filteredOldOrder) !== JSON.stringify(filteredNewOrder)) { + RED.nodes.dirty(true); + setWorkspaceOrder(newOrder); + } }, onselect: function(selectedTabs) { RED.view.select(false) @@ -412,6 +465,8 @@ RED.workspaces = (function() { RED.actions.add("core:remove-flow",removeWorkspace); RED.actions.add("core:enable-flow",enableWorkspace); RED.actions.add("core:disable-flow",disableWorkspace); + RED.actions.add("core:move-flow-to-start", function(id) { moveWorkspace(id, 'start') }); + RED.actions.add("core:move-flow-to-end", function(id) { moveWorkspace(id, 'end') }); RED.actions.add("core:hide-flow", function(workspace) { let selection @@ -597,16 +652,46 @@ RED.workspaces = (function() { } } + function moveWorkspace(id, direction) { + const workspace = RED.nodes.workspace(id||activeWorkspace) || RED.nodes.subflow(id||activeWorkspace); + if (!workspace) { + return; + } + const currentOrder = workspace_tabs.listTabs() + const oldOrder = [...currentOrder] + const currentIndex = currentOrder.findIndex(id => id === workspace.id) + currentOrder.splice(currentIndex, 1) + if (direction === 'start') { + currentOrder.unshift(workspace.id) + } else if (direction === 'end') { + currentOrder.push(workspace.id) + } + const newOrder = setWorkspaceOrder(currentOrder) + if (JSON.stringify(newOrder) !== JSON.stringify(oldOrder)) { + RED.history.push({ + t:'reorder', + workspaces: { + from:oldOrder, + to:newOrder + }, + dirty:RED.nodes.dirty() + }); + const filteredOldOrder = oldOrder.filter(id => !!RED.nodes.workspace(id)) + const filteredNewOrder = newOrder.filter(id => !!RED.nodes.workspace(id)) + if (JSON.stringify(filteredOldOrder) !== JSON.stringify(filteredNewOrder)) { + RED.nodes.dirty(true); + } + } + } function setWorkspaceOrder(order) { - var newOrder = order.filter(function(id) { - return RED.nodes.workspace(id) !== undefined; - }) + var newOrder = order.filter(id => !!RED.nodes.workspace(id)) var currentOrder = RED.nodes.getWorkspaceOrder(); if (JSON.stringify(newOrder) !== JSON.stringify(currentOrder)) { RED.nodes.setWorkspaceOrder(newOrder); RED.events.emit("flows:reorder",newOrder); } workspace_tabs.order(order); + return newOrder } function flashTab(tabId) { From 3cb52594942545e27494e212c62b5b29e7c73762 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 19 Sep 2022 21:09:00 +0100 Subject: [PATCH 099/253] Initial locking flows UX --- .../@node-red/editor-client/src/js/nodes.js | 4 ++ .../editor-client/src/js/ui/editor.js | 23 ++++++++ .../src/js/ui/tab-info-outliner.js | 19 ++++++ .../editor-client/src/js/ui/workspaces.js | 59 ++++++++++++++++++- .../editor-client/src/sass/tab-info.scss | 14 +++++ .../editor-client/src/sass/workspace.scss | 22 +++++++ 6 files changed, 140 insertions(+), 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 6dd500581..adbf86741 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 @@ -63,6 +63,7 @@ RED.nodes = (function() { defaults: { label: {value:""}, disabled: {value: false}, + locked: {value: false}, info: {value: ""}, env: {value: []} } @@ -1052,6 +1053,9 @@ RED.nodes = (function() { node.type = n.type; for (var d in n._def.defaults) { if (n._def.defaults.hasOwnProperty(d)) { + if (d === 'locked' && !n.locked) { + continue + } node[d] = n[d]; } } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js index fb4c200f5..0a644ba42 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js @@ -1852,6 +1852,16 @@ RED.editor = (function() { } } + var locked = $("#node-input-locked").prop("checked"); + if (workspace.locked !== locked) { + editState.changes.locked = workspace.locked; + editState.changed = true; + workspace.locked = locked; + $("#red-ui-tab-"+(workspace.id.replace(".","-"))).toggleClass('red-ui-workspace-locked',!!workspace.locked); + // if (workspace.id === RED.workspaces.active()) { + // $("#red-ui-workspace").toggleClass("red-ui-workspace-locked",!!workspace.locked); + // } + } if (editState.changed) { var historyEvent = { t: "edit", @@ -1892,6 +1902,7 @@ RED.editor = (function() { var trayBody = tray.find('.red-ui-tray-body'); trayBody.parent().css('overflow','hidden'); var trayFooterLeft = $('

    ').appendTo(trayFooter) + var trayFooterRight = $('').appendTo(trayFooter) var nodeEditPanes = [ 'editor-tab-flow-properties', @@ -1906,6 +1917,18 @@ RED.editor = (function() { disabledIcon: "fa-ban", invertState: true }) + + if (!workspace.hasOwnProperty("locked")) { + workspace.locked = false; + } + $('').prop("checked",workspace.locked).appendTo(trayFooterRight).toggleButton({ + enabledLabel: 'Unlocked', + enabledIcon: "fa-unlock-alt", + disabledLabel: 'Locked', + disabledIcon: "fa-lock", + invertState: true + }) + prepareEditDialog(trayBody, nodeEditPanes, workspace, {}, "node-input", defaultTab, function(_activeEditPanes) { activeEditPanes = _activeEditPanes; trayBody.i18n(); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info-outliner.js b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info-outliner.js index 32491f297..20bf627f0 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info-outliner.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info-outliner.js @@ -221,6 +221,22 @@ RED.sidebar.info.outliner = (function() { } else { $('
    ').appendTo(controls) } + if (n.type === 'tab') { + var lockToggleButton = $('').appendTo(controls).on("click",function(evt) { + evt.preventDefault(); + evt.stopPropagation(); + if (n.locked) { + RED.workspaces.unlock(n.id) + } else { + RED.workspaces.lock(n.id) + } + }) + RED.popover.tooltip(lockToggleButton,function() { + return RED._("common.label."+(n.locked?"unlock":"lock")); + }); + } else { + $('
    ').appendTo(controls) + } controls.find("button").on("dblclick", function(evt) { evt.preventDefault(); evt.stopPropagation(); @@ -364,6 +380,8 @@ RED.sidebar.info.outliner = (function() { flowList.treeList.addChild(objects[ws.id]) objects[ws.id].element.toggleClass("red-ui-info-outline-item-disabled", !!ws.disabled) objects[ws.id].treeList.container.toggleClass("red-ui-info-outline-item-disabled", !!ws.disabled) + objects[ws.id].element.toggleClass("red-ui-info-outline-item-locked", !!ws.locked) + // objects[ws.id].treeList.container.toggleClass("red-ui-info-outline-item-disabled", !!ws.disabled) updateSearch(); } @@ -378,6 +396,7 @@ RED.sidebar.info.outliner = (function() { existingObject.element.find(".red-ui-info-outline-item-label").text(label); existingObject.element.toggleClass("red-ui-info-outline-item-disabled", !!n.disabled) existingObject.treeList.container.toggleClass("red-ui-info-outline-item-disabled", !!n.disabled) + existingObject.element.toggleClass("red-ui-info-outline-item-locked", !!n.locked) updateSearch(); } function onFlowsReorder(order) { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js b/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js index d274ba519..23171fb5a 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js @@ -58,6 +58,9 @@ RED.workspaces = (function() { if (!ws.closeable) { ws.hideable = true; } + if (!ws.hasOwnProperty('locked')) { + ws.locked = false + } workspace_tabs.addTab(ws,targetIndex); var hiddenTabs = JSON.parse(RED.settings.getLocal("hiddenTabs")||"{}"); @@ -75,6 +78,7 @@ RED.workspaces = (function() { type: "tab", id: tabId, disabled: false, + locked: false, info: "", label: RED._('workspace.defaultName',{number:workspaceIndex}), env: [], @@ -329,6 +333,12 @@ RED.workspaces = (function() { if (tab.disabled) { $("#red-ui-tab-"+(tab.id.replace(".","-"))).addClass('red-ui-workspace-disabled'); } + $(' ').prependTo("#red-ui-tab-"+(tab.id.replace(".","-"))+" .red-ui-tab-label"); + if (tab.locked) { + $("#red-ui-tab-"+(tab.id.replace(".","-"))).addClass('red-ui-workspace-locked'); + } + + RED.menu.setDisabled("menu-item-workspace-delete",activeWorkspace === 0 || workspaceTabCount <= 1); if (workspaceTabCount === 1) { showWorkspace(); @@ -465,6 +475,8 @@ RED.workspaces = (function() { RED.actions.add("core:remove-flow",removeWorkspace); RED.actions.add("core:enable-flow",enableWorkspace); RED.actions.add("core:disable-flow",disableWorkspace); + RED.actions.add("core:lock-flow",lockWorkspace); + RED.actions.add("core:unlock-flow",unlockWorkspace); RED.actions.add("core:move-flow-to-start", function(id) { moveWorkspace(id, 'start') }); RED.actions.add("core:move-flow-to-end", function(id) { moveWorkspace(id, 'end') }); @@ -638,6 +650,49 @@ RED.workspaces = (function() { } } } + function lockWorkspace(id) { + setWorkspaceLockState(id,true); + } + function unlockWorkspace(id) { + setWorkspaceLockState(id,false); + } + function setWorkspaceLockState(id,locked) { + var workspace = RED.nodes.workspace(id||activeWorkspace); + if (!workspace) { + return; + } + if (workspace.locked !== locked) { + var changes = { locked: workspace.locked }; + workspace.locked = locked; + $("#red-ui-tab-"+(workspace.id.replace(".","-"))).toggleClass('red-ui-workspace-locked',!!workspace.locked); + if (!id || (id === activeWorkspace)) { + $("#red-ui-workspace").toggleClass("red-ui-workspace-locked",!!workspace.locked); + } + var historyEvent = { + t: "edit", + changes:changes, + node: workspace, + dirty: RED.nodes.dirty() + } + workspace.changed = true; + RED.history.push(historyEvent); + RED.events.emit("flows:change",workspace); + RED.nodes.dirty(true); + // RED.sidebar.config.refresh(); + // var selection = RED.view.selection(); + // if (!selection.nodes && !selection.links && workspace.id === activeWorkspace) { + // RED.sidebar.info.refresh(workspace); + // } + // if (changes.hasOwnProperty('disabled')) { + // RED.nodes.eachNode(function(n) { + // if (n.z === workspace.id) { + // n.dirty = true; + // } + // }); + // RED.view.redraw(); + // } + } + } function removeWorkspace(ws) { if (!ws) { @@ -793,6 +848,8 @@ RED.workspaces = (function() { workspace_tabs.resize(); }, enable: enableWorkspace, - disable: disableWorkspace + disable: disableWorkspace, + lock: lockWorkspace, + unlock: unlockWorkspace } })(); diff --git a/packages/node_modules/@node-red/editor-client/src/sass/tab-info.scss b/packages/node_modules/@node-red/editor-client/src/sass/tab-info.scss index 57dc7d6e3..ed526b263 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/tab-info.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/tab-info.scss @@ -467,6 +467,9 @@ div.red-ui-info-table { .fa-eye { display: none; } + .fa-unlock-alt { + display: none; + } } .red-ui-info-outline-item-control-reveal, .red-ui-info-outline-item-control-action { @@ -500,6 +503,17 @@ div.red-ui-info-table { display: none; } } + .fa-lock { + display: none; + } + .red-ui-info-outline-item.red-ui-info-outline-item-locked & { + .fa-lock { + display: inline-block; + } + .fa-unlock-alt { + display: none; + } + } button { margin-right: 3px } diff --git a/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss b/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss index 24e156b1e..c458d03d1 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss @@ -106,6 +106,28 @@ } } +.red-ui-workspace-locked-icon { + display: none; +} +.red-ui-workspace-locked { + &.red-ui-tab { + // border-top-style: dashed; + // border-left-style: dashed; + // border-right-style: dashed; + + // a { + // font-style: italic; + // color: var(--red-ui-tab-text-color-disabled-inactive) !important; + // } + // &.active a { + // font-weight: normal; + // color: var(--red-ui-tab-text-color-disabled-active) !important; + // } + .red-ui-workspace-locked-icon { + display: inline; + } + } +} #red-ui-navigator-canvas { position: absolute; From f12d36b5ede4898fa8d3fc8a89da79870b6d01f9 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 1 Nov 2022 10:48:48 +0000 Subject: [PATCH 100/253] Locking flows fixes and context menu options --- .../editor-client/locales/en-US/editor.json | 2 + .../@node-red/editor-client/src/js/history.js | 6 +- .../@node-red/editor-client/src/js/nodes.js | 107 +++++++++--- .../editor-client/src/js/ui/clipboard.js | 50 +++--- .../editor-client/src/js/ui/contextMenu.js | 34 ++-- .../editor-client/src/js/ui/editor.js | 6 - .../src/js/ui/editors/panes/flowProperties.js | 2 - .../editor-client/src/js/ui/group.js | 22 ++- .../editor-client/src/js/ui/palette.js | 164 +++++++++--------- .../editor-client/src/js/ui/subflow.js | 5 +- .../editor-client/src/js/ui/tab-config.js | 20 ++- .../src/js/ui/tab-info-outliner.js | 3 +- .../editor-client/src/js/ui/view-tools.js | 47 ++++- .../@node-red/editor-client/src/js/ui/view.js | 138 ++++++++++----- .../editor-client/src/js/ui/workspaces.js | 43 ++++- .../editor-client/src/sass/flow.scss | 11 +- .../editor-client/src/sass/tab-info.scss | 10 +- 17 files changed, 447 insertions(+), 223 deletions(-) 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 44d370aac..e74dbdbaa 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 @@ -71,6 +71,8 @@ "selectNodes": "Click nodes to select", "enableFlow": "Enable flow", "disableFlow": "Disable flow", + "lockFlow": "Lock flow", + "unlockFlow": "Unlock flow", "moveToStart": "Move flow to start", "moveToEnd": "Move flow to end" }, diff --git a/packages/node_modules/@node-red/editor-client/src/js/history.js b/packages/node_modules/@node-red/editor-client/src/js/history.js index b23071239..977ecb187 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/history.js +++ b/packages/node_modules/@node-red/editor-client/src/js/history.js @@ -14,7 +14,7 @@ * limitations under the License. **/ -/** +/** * An API for undo / redo history buffer * @namespace RED.history */ @@ -434,7 +434,9 @@ RED.history = (function() { if (ev.node.type === 'tab' && ev.changes.hasOwnProperty('disabled')) { $("#red-ui-tab-"+(ev.node.id.replace(".","-"))).toggleClass('red-ui-workspace-disabled',!!ev.node.disabled); - $("#red-ui-workspace").toggleClass("red-ui-workspace-disabled",!!ev.node.disabled); + } + if (ev.node.type === 'tab' && ev.changes.hasOwnProperty('locked')) { + $("#red-ui-tab-"+(ev.node.id.replace(".","-"))).toggleClass('red-ui-workspace-locked',!!ev.node.locked); } if (ev.subflow) { inverseEv.subflow = {}; 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 adbf86741..715ae9c49 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 @@ -19,7 +19,6 @@ * @namespace RED.nodes */ RED.nodes = (function() { - var PORT_TYPE_INPUT = 1; var PORT_TYPE_OUTPUT = 0; @@ -576,8 +575,41 @@ RED.nodes = (function() { } } + const nodeProxyHandler = { + get(node, prop) { + if (prop === '__isProxy__') { + return true + } else if (prop == '__node__') { + return node + } + return node[prop] + }, + set(node, prop, value) { + if (node.z && (RED.nodes.workspace(node.z)?.locked || RED.nodes.subflow(node.z)?.locked)) { + if ( + node._def.defaults[prop] || + prop === 'z' || + prop === 'l' || + prop === 'd' || + (prop === 'changed' && !!node.changed !== !!value) || + ((prop === 'x' || prop === 'y') && !node.resize && node.type !== 'group') + ) { + throw new Error(`Cannot modified property '${prop}' of locked object '${node.type}:${node.id}'`) + } + } + node[prop] = value; + return true + } + } function addNode(n) { + let newNode + if (!n.__isProxy__) { + newNode = new Proxy(n, nodeProxyHandler) + } else { + newNode = n + } + if (n.type.indexOf("subflow") !== 0) { n["_"] = n._def._; } else { @@ -601,12 +633,13 @@ RED.nodes = (function() { }); n.i = nextId+1; } - allNodes.addNode(n); + allNodes.addNode(newNode); if (!nodeLinks[n.id]) { nodeLinks[n.id] = {in:[],out:[]}; } } - RED.events.emit('nodes:add',n); + RED.events.emit('nodes:add',newNode); + return newNode } function addLink(l) { if (nodeLinks[l.source.id]) { @@ -1335,7 +1368,6 @@ RED.nodes = (function() { } else { nodeSet = [sf]; } - console.log(nodeSet); return createExportableNodeSet(nodeSet); } /** @@ -2322,19 +2354,6 @@ RED.nodes = (function() { if (n.g && !new_group_set.has(n.g)) { delete n.g; } - n.nodes = n.nodes.map(function(id) { - return node_map[id]; - }) - // Just in case the group references a node that doesn't exist for some reason - n.nodes = n.nodes.filter(function(v) { - if (v) { - // Repair any nodes that have forgotten they are in this group - if (v.g !== n.id) { - v.g = n.id; - } - } - return !!v - }); if (!n.g) { groupDepthMap[n.id] = 0; } @@ -2357,21 +2376,22 @@ RED.nodes = (function() { return groupDepthMap[A.id] - groupDepthMap[B.id]; }); for (i=0;i { + const mappedNode = node_map[id] + if (!mappedNode) { + return null + } + if (mappedNode.__isProxy__) { + return mappedNode + } else { + return node_map[mappedNode.id] + } + } + // Update groups to reference proxy node objects + for (i=0;i 1 const canDelete = hasSelection || hasLinks const isGroup = hasSelection && selection.nodes.length === 1 && selection.nodes[0].type === 'group' - + const canEdit = !RED.workspaces.isActiveLocked() const canRemoveFromGroup = hasSelection && !!selection.nodes[0].g + const offset = $("#red-ui-workspace-chart").offset() let addX = options.x - offset.left + $("#red-ui-workspace-chart").scrollLeft() @@ -55,12 +56,13 @@ RED.contextMenu = (function () { splice: isSingleLink ? selection.links[0] : undefined, // spliceMultiple: isMultipleLinks }) - } + }, + disabled: !canEdit }, (hasLinks) ? { // has least 1 wire selected label: RED._("contextMenu.junction"), onselect: 'core:split-wires-with-junctions', - disabled: !hasLinks + disabled: !canEdit || !hasLinks } : { label: RED._("contextMenu.junction"), onselect: function () { @@ -86,41 +88,39 @@ RED.contextMenu = (function () { RED.nodes.dirty(true); RED.view.select({nodes: [nn] }); RED.view.redraw(true) - } + }, + disabled: !canEdit }, { label: RED._("contextMenu.linkNodes"), onselect: 'core:split-wire-with-link-nodes', - disabled: !hasLinks + disabled: !canEdit || !hasLinks } ] - } - ) - - menuItems.push( + }, null, { onselect: 'core:undo', disabled: RED.history.list().length === 0 }, { onselect: 'core:redo', disabled: RED.history.listRedo().length === 0 }, null, - { onselect: 'core:cut-selection-to-internal-clipboard', label: RED._("keyboard.cutNode"), disabled: !hasSelection }, + { onselect: 'core:cut-selection-to-internal-clipboard', label: RED._("keyboard.cutNode"), disabled: !canEdit || !hasSelection }, { onselect: 'core:copy-selection-to-internal-clipboard', label: RED._("keyboard.copyNode"), disabled: !hasSelection }, - { onselect: 'core:paste-from-internal-clipboard', label: RED._("keyboard.pasteNode"), disabled: !RED.view.clipboard() }, - { onselect: 'core:delete-selection', disabled: !canDelete }, + { onselect: 'core:paste-from-internal-clipboard', label: RED._("keyboard.pasteNode"), disabled: !canEdit || !RED.view.clipboard() }, + { onselect: 'core:delete-selection', disabled: !canEdit || !canDelete }, { onselect: 'core:show-export-dialog', label: RED._("menu.label.export") }, - { onselect: 'core:select-all-nodes' } + { onselect: 'core:select-all-nodes' }, ) - if (hasSelection) { + if (hasSelection && canEdit) { menuItems.push( null, isGroup ? - { onselect: 'core:ungroup-selection', disabled: !isGroup } - : { onselect: 'core:group-selection', disabled: !hasSelection } + { onselect: 'core:ungroup-selection', disabled: !canEdit || !isGroup } + : { onselect: 'core:group-selection', disabled: !canEdit || !hasSelection } ) - if (canRemoveFromGroup) { + if (canRemoveFromGroup && canEdit) { menuItems.push({ onselect: 'core:remove-selection-from-group', label: RED._("menu.label.groupRemoveSelection") }) } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js index 0a644ba42..29202a0ab 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js @@ -1847,9 +1847,6 @@ RED.editor = (function() { workspace.disabled = disabled; $("#red-ui-tab-"+(workspace.id.replace(".","-"))).toggleClass('red-ui-workspace-disabled',!!workspace.disabled); - if (workspace.id === RED.workspaces.active()) { - $("#red-ui-workspace").toggleClass("red-ui-workspace-disabled",!!workspace.disabled); - } } var locked = $("#node-input-locked").prop("checked"); @@ -1858,9 +1855,6 @@ RED.editor = (function() { editState.changed = true; workspace.locked = locked; $("#red-ui-tab-"+(workspace.id.replace(".","-"))).toggleClass('red-ui-workspace-locked',!!workspace.locked); - // if (workspace.id === RED.workspaces.active()) { - // $("#red-ui-workspace").toggleClass("red-ui-workspace-locked",!!workspace.locked); - // } } if (editState.changed) { var historyEvent = { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/panes/flowProperties.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/panes/flowProperties.js index 2db4d0c85..214335f1b 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/panes/flowProperties.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/panes/flowProperties.js @@ -52,8 +52,6 @@ node.info = info; } $("#red-ui-tab-"+(node.id.replace(".","-"))).toggleClass('red-ui-workspace-disabled',!!node.disabled); - $("#red-ui-workspace").toggleClass("red-ui-workspace-disabled",!!node.disabled); - } } }); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/group.js b/packages/node_modules/@node-red/editor-client/src/js/ui/group.js index add6da6c9..15eda31d5 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/group.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/group.js @@ -185,6 +185,8 @@ RED.group = (function() { var activateMerge = false; var activateRemove = false; var singleGroupSelected = false; + var locked = RED.workspaces.isActiveLocked() + if (activateGroup) { singleGroupSelected = selection.nodes.length === 1 && selection.nodes[0].type === 'group'; selection.nodes.forEach(function (n) { @@ -199,12 +201,12 @@ RED.group = (function() { activateMerge = (selection.nodes.length > 1); } } - RED.menu.setDisabled("menu-item-group-group", !activateGroup); - RED.menu.setDisabled("menu-item-group-ungroup", !activateUngroup); - RED.menu.setDisabled("menu-item-group-merge", !activateMerge); - RED.menu.setDisabled("menu-item-group-remove", !activateRemove); + RED.menu.setDisabled("menu-item-group-group", locked || !activateGroup); + RED.menu.setDisabled("menu-item-group-ungroup", locked || !activateUngroup); + RED.menu.setDisabled("menu-item-group-merge", locked || !activateMerge); + RED.menu.setDisabled("menu-item-group-remove", locked || !activateRemove); RED.menu.setDisabled("menu-item-edit-copy-group-style", !singleGroupSelected); - RED.menu.setDisabled("menu-item-edit-paste-group-style", !activateUngroup); + RED.menu.setDisabled("menu-item-edit-paste-group-style", locked || !activateUngroup); }); RED.actions.add("core:group-selection", function() { groupSelection() }) @@ -261,6 +263,7 @@ RED.group = (function() { } } function pasteGroupStyle() { + if (RED.workspaces.isActiveLocked()) { return } if (RED.view.state() !== RED.state.DEFAULT) { return } if (groupStyleClipboard) { var selection = RED.view.selection(); @@ -295,6 +298,7 @@ RED.group = (function() { } function groupSelection() { + if (RED.workspaces.isActiveLocked()) { return } if (RED.view.state() !== RED.state.DEFAULT) { return } var selection = RED.view.selection(); if (selection.nodes) { @@ -313,6 +317,7 @@ RED.group = (function() { } } function ungroupSelection() { + if (RED.workspaces.isActiveLocked()) { return } if (RED.view.state() !== RED.state.DEFAULT) { return } var selection = RED.view.selection(); if (selection.nodes) { @@ -336,6 +341,7 @@ RED.group = (function() { } function ungroup(g) { + if (RED.workspaces.isActiveLocked()) { return } var nodes = []; var parentGroup = RED.nodes.group(g.g); g.nodes.forEach(function(n) { @@ -362,6 +368,7 @@ RED.group = (function() { } function mergeSelection() { + if (RED.workspaces.isActiveLocked()) { return } if (RED.view.state() !== RED.state.DEFAULT) { return } var selection = RED.view.selection(); if (selection.nodes) { @@ -431,6 +438,7 @@ RED.group = (function() { } function removeSelection() { + if (RED.workspaces.isActiveLocked()) { return } if (RED.view.state() !== RED.state.DEFAULT) { return } var selection = RED.view.selection(); if (selection.nodes) { @@ -458,6 +466,7 @@ RED.group = (function() { } } function createGroup(nodes) { + if (RED.workspaces.isActiveLocked()) { return } if (nodes.length === 0) { return; } @@ -480,7 +489,7 @@ RED.group = (function() { } group.z = nodes[0].z; - RED.nodes.addGroup(group); + group = RED.nodes.addGroup(group); try { addToGroup(group,nodes); @@ -563,6 +572,7 @@ RED.group = (function() { markDirty(group); } function removeFromGroup(group, nodes, reparent) { + if (RED.workspaces.isActiveLocked()) { return } if (!Array.isArray(nodes)) { nodes = [nodes]; } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js index 9f20cc674..ceaa33775 100755 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js @@ -282,6 +282,7 @@ RED.palette = (function() { var hoverGroup; var paletteWidth; var paletteTop; + var dropEnabled; $(d).draggable({ helper: 'clone', appendTo: '#red-ui-editor', @@ -289,6 +290,7 @@ RED.palette = (function() { revertDuration: 200, containment:'#red-ui-main-container', start: function() { + dropEnabled = !RED.nodes.workspace(RED.workspaces.active()).locked; paletteWidth = $("#red-ui-palette").width(); paletteTop = $("#red-ui-palette").parent().position().top + $("#red-ui-palette-container").position().top; hoverGroup = null; @@ -299,96 +301,100 @@ RED.palette = (function() { RED.view.focus(); }, stop: function() { - d3.select('.red-ui-flow-link-splice').classed('red-ui-flow-link-splice',false); - if (hoverGroup) { - document.getElementById("group_select_"+hoverGroup.id).classList.remove("red-ui-flow-group-hovered"); + if (dropEnabled) { + d3.select('.red-ui-flow-link-splice').classed('red-ui-flow-link-splice',false); + if (hoverGroup) { + document.getElementById("group_select_"+hoverGroup.id).classList.remove("red-ui-flow-group-hovered"); + } + if (activeGroup) { + document.getElementById("group_select_"+activeGroup.id).classList.remove("red-ui-flow-group-active-hovered"); + } + if (spliceTimer) { clearTimeout(spliceTimer); spliceTimer = null; } + if (groupTimer) { clearTimeout(groupTimer); groupTimer = null; } } - if (activeGroup) { - document.getElementById("group_select_"+activeGroup.id).classList.remove("red-ui-flow-group-active-hovered"); - } - if (spliceTimer) { clearTimeout(spliceTimer); spliceTimer = null; } - if (groupTimer) { clearTimeout(groupTimer); groupTimer = null; } }, drag: function(e,ui) { var paletteNode = getPaletteNode(nt); ui.originalPosition.left = paletteNode.offset().left; - mouseX = ui.position.left - paletteWidth + (ui.helper.width()/2) + chart.scrollLeft(); - mouseY = ui.position.top - paletteTop + (ui.helper.height()/2) + chart.scrollTop() + 10; - if (!groupTimer) { - groupTimer = setTimeout(function() { - var mx = mouseX / RED.view.scale(); - var my = mouseY / RED.view.scale(); - var group = RED.view.getGroupAtPoint(mx,my); - if (group !== hoverGroup) { - if (hoverGroup) { - document.getElementById("group_select_"+hoverGroup.id).classList.remove("red-ui-flow-group-hovered"); - } - if (group) { - document.getElementById("group_select_"+group.id).classList.add("red-ui-flow-group-hovered"); - } - hoverGroup = group; - if (hoverGroup) { - $(ui.helper).data('group',hoverGroup); - } else { - $(ui.helper).removeData('group'); - } - } - groupTimer = null; - - },200) - } - if (def.inputs > 0 && def.outputs > 0) { - if (!spliceTimer) { - spliceTimer = setTimeout(function() { - var nodes = []; - var bestDistance = Infinity; - var bestLink = null; - if (chartSVG.getIntersectionList) { - var svgRect = chartSVG.createSVGRect(); - svgRect.x = mouseX; - svgRect.y = mouseY; - svgRect.width = 1; - svgRect.height = 1; - nodes = chartSVG.getIntersectionList(svgRect,chartSVG); - } else { - // Firefox doesn't do getIntersectionList and that - // makes us sad - nodes = RED.view.getLinksAtPoint(mouseX,mouseY); - } + if (dropEnabled) { + mouseX = ui.position.left - paletteWidth + (ui.helper.width()/2) + chart.scrollLeft(); + mouseY = ui.position.top - paletteTop + (ui.helper.height()/2) + chart.scrollTop() + 10; + if (!groupTimer) { + groupTimer = setTimeout(function() { var mx = mouseX / RED.view.scale(); var my = mouseY / RED.view.scale(); - for (var i=0;i 0 && def.outputs > 0) { + if (!spliceTimer) { + spliceTimer = setTimeout(function() { + var nodes = []; + var bestDistance = Infinity; + var bestLink = null; + if (chartSVG.getIntersectionList) { + var svgRect = chartSVG.createSVGRect(); + svgRect.x = mouseX; + svgRect.y = mouseY; + svgRect.width = 1; + svgRect.height = 1; + nodes = chartSVG.getIntersectionList(svgRect,chartSVG); + } else { + // Firefox doesn't do getIntersectionList and that + // makes us sad + nodes = RED.view.getLinksAtPoint(mouseX,mouseY); + } + var mx = mouseX / RED.view.scale(); + var my = mouseY / RED.view.scale(); + for (var i=0;i
    ').appendTo(parent); var header = $('
    ').appendTo(container); + let lockIcon if (label) { + lockIcon = $('').appendTo(header) + lockIcon.toggle(!!isLocked) $('').text(label).appendTo(header); } else { $('').appendTo(header); @@ -62,6 +65,7 @@ RED.sidebar.config = (function() { var icon = header.find("i"); var result = { label: label, + lockIcon, list: category, size: function() { return result.list.find("li:not(.red-ui-palette-node-config-none)").length @@ -100,6 +104,9 @@ RED.sidebar.config = (function() { }); categories[name] = result; } else { + if (isLocked !== undefined && categories[name].lockIcon) { + categories[name].lockIcon.toggle(!!isLocked) + } if (categories[name].label !== label) { categories[name].list.parent().find('.red-ui-palette-node-config-label').text(label); categories[name].label = label; @@ -216,7 +223,7 @@ RED.sidebar.config = (function() { RED.nodes.eachWorkspace(function(ws) { validList[ws.id.replace(/\./g,"-")] = true; - getOrCreateCategory(ws.id,flowCategories,ws.label); + getOrCreateCategory(ws.id,flowCategories,ws.label, ws.locked); }) RED.nodes.eachSubflow(function(sf) { validList[sf.id.replace(/\./g,"-")] = true; @@ -274,6 +281,15 @@ RED.sidebar.config = (function() { changes: {}, dirty: RED.nodes.dirty() } + for (let i = 0; i < selectedNodes.length; i++) { + let node = RED.nodes.node(selectedNodes[i]) + if (node.z) { + let ws = RED.nodes.workspace(node.z) + if (ws && ws.locked) { + return + } + } + } selectedNodes.forEach(function(id) { var node = RED.nodes.node(id); try { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info-outliner.js b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info-outliner.js index 20bf627f0..d398cc2d0 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info-outliner.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info-outliner.js @@ -381,7 +381,7 @@ RED.sidebar.info.outliner = (function() { objects[ws.id].element.toggleClass("red-ui-info-outline-item-disabled", !!ws.disabled) objects[ws.id].treeList.container.toggleClass("red-ui-info-outline-item-disabled", !!ws.disabled) objects[ws.id].element.toggleClass("red-ui-info-outline-item-locked", !!ws.locked) - // objects[ws.id].treeList.container.toggleClass("red-ui-info-outline-item-disabled", !!ws.disabled) + objects[ws.id].treeList.container.toggleClass("red-ui-info-outline-item-locked", !!ws.locked) updateSearch(); } @@ -397,6 +397,7 @@ RED.sidebar.info.outliner = (function() { existingObject.element.toggleClass("red-ui-info-outline-item-disabled", !!n.disabled) existingObject.treeList.container.toggleClass("red-ui-info-outline-item-disabled", !!n.disabled) existingObject.element.toggleClass("red-ui-info-outline-item-locked", !!n.locked) + existingObject.treeList.container.toggleClass("red-ui-info-outline-item-locked", !!n.locked) updateSearch(); } function onFlowsReorder(order) { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view-tools.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view-tools.js index 1ed5791a6..27d45dcd3 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view-tools.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view-tools.js @@ -15,7 +15,7 @@ **/ RED.view.tools = (function() { - + 'use strict'; function selectConnected(type) { var selection = RED.view.selection(); var visited = new Set(); @@ -39,6 +39,9 @@ RED.view.tools = (function() { } function alignToGrid() { + if (RED.workspaces.isActiveLocked()) { + return + } var selection = RED.view.selection(); if (selection.nodes) { var changedNodes = []; @@ -87,6 +90,9 @@ RED.view.tools = (function() { } function moveSelection(dx,dy) { + if (RED.workspaces.isActiveLocked()) { + return + } if (moving_set === null) { moving_set = []; var selection = RED.view.selection(); @@ -153,6 +159,9 @@ RED.view.tools = (function() { } function setSelectedNodeLabelState(labelShown) { + if (RED.workspaces.isActiveLocked()) { + return + } var selection = RED.view.selection(); var historyEvents = []; var nodes = []; @@ -439,6 +448,9 @@ RED.view.tools = (function() { } function alignSelectionToEdge(direction) { + // if (RED.workspaces.isActiveLocked()) { + // return + // } var selection = RED.view.selection(); if (selection.nodes && selection.nodes.length > 1) { @@ -539,8 +551,10 @@ RED.view.tools = (function() { } } - function distributeSelection(direction) { + if (RED.workspaces.isActiveLocked()) { + return + } var selection = RED.view.selection(); if (selection.nodes && selection.nodes.length > 2) { @@ -699,6 +713,9 @@ RED.view.tools = (function() { } function reorderSelection(dir) { + if (RED.workspaces.isActiveLocked()) { + return + } var selection = RED.view.selection(); if (selection.nodes) { var nodesToMove = []; @@ -734,8 +751,10 @@ RED.view.tools = (function() { } } - function wireSeriesOfNodes() { + if (RED.workspaces.isActiveLocked()) { + return + } var selection = RED.view.selection(); if (selection.nodes) { if (selection.nodes.length > 1) { @@ -776,6 +795,9 @@ RED.view.tools = (function() { } function wireNodeToMultiple() { + if (RED.workspaces.isActiveLocked()) { + return + } var selection = RED.view.selection(); if (selection.nodes) { if (selection.nodes.length > 1) { @@ -823,6 +845,9 @@ RED.view.tools = (function() { * @param {Object || Object[]} wires The wire(s) to split and replace with link-out, link-in nodes. */ function splitWiresWithLinkNodes(wires) { + if (RED.workspaces.isActiveLocked()) { + return + } let wiresToSplit = wires || (RED.view.selection().links && RED.view.selection().links.filter(e => !e.link)); if (!wiresToSplit) { return @@ -877,7 +902,6 @@ RED.view.tools = (function() { if(!nnLinkOut) { const nLinkOut = RED.view.createNode("link out"); //create link node nnLinkOut = nLinkOut.node; - nodeSrcMap[linkOutMapId] = nnLinkOut; let yOffset = 0; if(nSrc.outputs > 1) { @@ -892,7 +916,8 @@ RED.view.tools = (function() { updateNewNodePosXY(nSrc, nnLinkOut, false, RED.view.snapGrid, yOffset); } //add created node - RED.nodes.add(nnLinkOut); + nnLinkOut = RED.nodes.add(nnLinkOut); + nodeSrcMap[linkOutMapId] = nnLinkOut; RED.editor.validateNode(nnLinkOut); history.events.push(nLinkOut.historyEvent); //connect node to link node @@ -913,10 +938,10 @@ RED.view.tools = (function() { if(!nnLinkIn) { const nLinkIn = RED.view.createNode("link in"); //create link node nnLinkIn = nLinkIn.node; - nodeTrgMap[nTrg.id] = nnLinkIn; updateNewNodePosXY(nTrg, nnLinkIn, true, RED.view.snapGrid, 0); //add created node - RED.nodes.add(nnLinkIn); + nnLinkIn = RED.nodes.add(nnLinkIn); + nodeTrgMap[nTrg.id] = nnLinkIn; RED.editor.validateNode(nnLinkIn); history.events.push(nLinkIn.historyEvent); //connect node to link node @@ -991,6 +1016,9 @@ RED.view.tools = (function() { * @param {{ renameBlank: boolean, renameClash: boolean, generateHistory: boolean }} options Possible options are `renameBlank`, `renameClash` and `generateHistory` */ function generateNodeNames(node, options) { + if (RED.workspaces.isActiveLocked()) { + return + } options = Object.assign({ renameBlank: true, renameClash: true, @@ -1061,6 +1089,9 @@ RED.view.tools = (function() { } function addJunctionsToWires(wires) { + if (RED.workspaces.isActiveLocked()) { + return + } let wiresToSplit = wires || (RED.view.selection().links && RED.view.selection().links.filter(e => !e.link)); if (!wiresToSplit) { return @@ -1131,7 +1162,7 @@ RED.view.tools = (function() { var nodeGroups = new Set() - RED.nodes.addJunction(junction) + junction = RED.nodes.addJunction(junction) addedJunctions.push(junction) let newLink if (gid === links[0].source.id+":"+links[0].sourcePort) { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 83215afe4..d783ce941 100755 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -54,6 +54,7 @@ RED.view = (function() { var spliceTimer; var groupHoverTimer; + var activeFlowLocked = false; var activeSubflow = null; var activeNodes = []; var activeLinks = []; @@ -411,6 +412,17 @@ RED.view = (function() { activeSubflow = RED.nodes.subflow(event.workspace); + if (activeSubflow) { + activeFlowLocked = activeSubflow.locked + } else { + var activeWorkspace = RED.nodes.workspace(event.workspace) + if (activeWorkspace) { + activeFlowLocked = activeWorkspace.locked + } else { + activeFlowLocked = true + } + } + RED.menu.setDisabled("menu-item-workspace-edit", activeSubflow || event.workspace === 0); RED.menu.setDisabled("menu-item-workspace-delete",event.workspace === 0 || RED.workspaces.count() == 1 || activeSubflow); @@ -439,6 +451,15 @@ RED.view = (function() { redraw(); }); + RED.events.on("flows:change", function(workspace) { + if (workspace.id === RED.workspaces.active()) { + activeFlowLocked = !!workspace.locked + $("#red-ui-workspace").toggleClass("red-ui-workspace-disabled",!!workspace.disabled); + $("#red-ui-workspace").toggleClass("red-ui-workspace-locked",!!workspace.locked); + + } + }) + RED.statusBar.add({ id: "view-zoom-controls", align: "right", @@ -496,6 +517,9 @@ RED.view = (function() { chart.droppable({ accept:".red-ui-palette-node", drop: function( event, ui ) { + if (activeFlowLocked) { + return + } d3.event = event; var selected_tool = $(ui.draggable[0]).attr("data-palette-type"); var result = createNode(selected_tool); @@ -503,9 +527,7 @@ RED.view = (function() { return; } var historyEvent = result.historyEvent; - var nn = result.node; - - RED.nodes.add(nn); + var nn = RED.nodes.add(result.node); var showLabel = RED.utils.getMessageProperty(RED.settings.get('editor'),"view.view-node-show-label"); if (showLabel !== undefined && (nn._def.hasOwnProperty("showLabel")?nn._def.showLabel:true) && !nn._def.defaults.hasOwnProperty("l")) { @@ -632,6 +654,9 @@ RED.view = (function() { RED.actions.add("core:copy-selection-to-internal-clipboard",copySelection); RED.actions.add("core:cut-selection-to-internal-clipboard",function(){copySelection(true);deleteSelection();}); RED.actions.add("core:paste-from-internal-clipboard",function(){ + if (RED.workspaces.isActiveLocked()) { + return + } importNodes(clipboard,{generateIds: clipboardSource === 'copy', generateDefaultNames: clipboardSource === 'copy'}); }); @@ -640,22 +665,27 @@ RED.view = (function() { RED.events.on("view:selection-changed", function(selection) { var hasSelection = (selection.nodes && selection.nodes.length > 0); var hasMultipleSelection = hasSelection && selection.nodes.length > 1; - RED.menu.setDisabled("menu-item-edit-cut",!hasSelection); - RED.menu.setDisabled("menu-item-edit-copy",!hasSelection); - RED.menu.setDisabled("menu-item-edit-select-connected",!hasSelection); - RED.menu.setDisabled("menu-item-view-tools-move-to-back",!hasSelection); - RED.menu.setDisabled("menu-item-view-tools-move-to-front",!hasSelection); - RED.menu.setDisabled("menu-item-view-tools-move-backwards",!hasSelection); - RED.menu.setDisabled("menu-item-view-tools-move-forwards",!hasSelection); + var hasLinkSelected = selection.links && selection.links.length > 0; + var canEdit = !activeFlowLocked && hasSelection + var canEditMultiple = !activeFlowLocked && hasMultipleSelection + RED.menu.setDisabled("menu-item-edit-cut", !canEdit); + RED.menu.setDisabled("menu-item-edit-copy", !hasSelection); + RED.menu.setDisabled("menu-item-edit-select-connected", !hasSelection); + RED.menu.setDisabled("menu-item-view-tools-move-to-back", !canEdit); + RED.menu.setDisabled("menu-item-view-tools-move-to-front", !canEdit); + RED.menu.setDisabled("menu-item-view-tools-move-backwards", !canEdit); + RED.menu.setDisabled("menu-item-view-tools-move-forwards", !canEdit); - RED.menu.setDisabled("menu-item-view-tools-align-left",!hasMultipleSelection); - RED.menu.setDisabled("menu-item-view-tools-align-center",!hasMultipleSelection); - RED.menu.setDisabled("menu-item-view-tools-align-right",!hasMultipleSelection); - RED.menu.setDisabled("menu-item-view-tools-align-top",!hasMultipleSelection); - RED.menu.setDisabled("menu-item-view-tools-align-middle",!hasMultipleSelection); - RED.menu.setDisabled("menu-item-view-tools-align-bottom",!hasMultipleSelection); - RED.menu.setDisabled("menu-item-view-tools-distribute-horizontally",!hasMultipleSelection); - RED.menu.setDisabled("menu-item-view-tools-distribute-veritcally",!hasMultipleSelection); + RED.menu.setDisabled("menu-item-view-tools-align-left", !canEditMultiple); + RED.menu.setDisabled("menu-item-view-tools-align-center", !canEditMultiple); + RED.menu.setDisabled("menu-item-view-tools-align-right", !canEditMultiple); + RED.menu.setDisabled("menu-item-view-tools-align-top", !canEditMultiple); + RED.menu.setDisabled("menu-item-view-tools-align-middle", !canEditMultiple); + RED.menu.setDisabled("menu-item-view-tools-align-bottom", !canEditMultiple); + RED.menu.setDisabled("menu-item-view-tools-distribute-horizontally", !canEditMultiple); + RED.menu.setDisabled("menu-item-view-tools-distribute-veritcally", !canEditMultiple); + + RED.menu.setDisabled("menu-item-edit-split-wire-with-links", activeFlowLocked || !hasLinkSelected); }) RED.actions.add("core:delete-selection",deleteSelection); @@ -1045,7 +1075,7 @@ RED.view = (function() { .attr("class", "nr-ui-view-lasso"); d3.event.preventDefault(); } - } else if (d3.event.altKey) { + } else if (d3.event.altKey && !activeFlowLocked) { //Alt [+shift] held - Begin slicing clearSelection(); mouse_mode = (d3.event.shiftKey) ? RED.state.SLICING_JUNCTION : RED.state.SLICING; @@ -1059,6 +1089,9 @@ RED.view = (function() { } function showQuickAddDialog(options) { + if (activeFlowLocked) { + return + } options = options || {}; var point = options.position || lastClickPosition; var spliceLink = options.splice; @@ -1238,6 +1271,11 @@ RED.view = (function() { if (showLabel !== undefined && (nn._def.hasOwnProperty("showLabel")?nn._def.showLabel:true) && !nn._def.defaults.hasOwnProperty("l")) { nn.l = showLabel; } + if (nn.type === 'junction') { + nn = RED.nodes.addJunction(nn); + } else { + nn = RED.nodes.add(nn); + } if (quickAddLink) { var drag_line = quickAddLink; var src = null,dst,src_port; @@ -1340,11 +1378,7 @@ RED.view = (function() { } } } - if (nn.type === 'junction') { - RED.nodes.addJunction(nn); - } else { - RED.nodes.add(nn); - } + RED.editor.validateNode(nn); if (targetGroup) { @@ -1602,16 +1636,18 @@ RED.view = (function() { } var d = (mouse_offset[0]-mousePos[0])*(mouse_offset[0]-mousePos[0]) + (mouse_offset[1]-mousePos[1])*(mouse_offset[1]-mousePos[1]); if ((d > 3 && !dblClickPrimed) || (dblClickPrimed && d > 10)) { - mouse_mode = RED.state.MOVING_ACTIVE; clickElapsed = 0; - spliceActive = false; - if (movingSet.length() === 1) { - node = movingSet.get(0); - spliceActive = node.n.hasOwnProperty("_def") && - ((node.n.hasOwnProperty("inputs") && node.n.inputs > 0) || (!node.n.hasOwnProperty("inputs") && node.n._def.inputs > 0)) && - ((node.n.hasOwnProperty("outputs") && node.n.outputs > 0) || (!node.n.hasOwnProperty("outputs") && node.n._def.outputs > 0)) && - RED.nodes.filterLinks({ source: node.n }).length === 0 && - RED.nodes.filterLinks({ target: node.n }).length === 0; + if (!activeFlowLocked) { + mouse_mode = RED.state.MOVING_ACTIVE; + spliceActive = false; + if (movingSet.length() === 1) { + node = movingSet.get(0); + spliceActive = node.n.hasOwnProperty("_def") && + ((node.n.hasOwnProperty("inputs") && node.n.inputs > 0) || (!node.n.hasOwnProperty("inputs") && node.n._def.inputs > 0)) && + ((node.n.hasOwnProperty("outputs") && node.n.outputs > 0) || (!node.n.hasOwnProperty("outputs") && node.n._def.outputs > 0)) && + RED.nodes.filterLinks({ source: node.n }).length === 0 && + RED.nodes.filterLinks({ target: node.n }).length === 0; + } } } } else if (mouse_mode == RED.state.MOVING_ACTIVE || mouse_mode == RED.state.IMPORT_DRAGGING || mouse_mode == RED.state.DETACHED_DRAGGING) { @@ -2456,6 +2492,7 @@ RED.view = (function() { } function editSelection() { + if (RED.workspaces.isActiveLocked()) { return } if (movingSet.length() > 0) { var node = movingSet.get(0).n; if (node.type === "subflow") { @@ -2471,6 +2508,9 @@ RED.view = (function() { if (mouse_mode === RED.state.SELECTING_NODE) { return; } + if (activeFlowLocked) { + return + } if (portLabelHover) { portLabelHover.remove(); portLabelHover = null; @@ -2786,6 +2826,7 @@ RED.view = (function() { function detachSelectedNodes() { + if (RED.workspaces.isActiveLocked()) { return } var selection = RED.view.selection(); if (selection.nodes) { const {newLinks, removedLinks} = RED.nodes.detachNodes(selection.nodes); @@ -2927,7 +2968,7 @@ RED.view = (function() { mousedown_node = d; mousedown_port_type = portType; mousedown_port_index = portIndex || 0; - if (mouse_mode !== RED.state.QUICK_JOINING) { + if (mouse_mode !== RED.state.QUICK_JOINING && !activeFlowLocked) { mouse_mode = RED.state.JOINING; document.body.style.cursor = "crosshair"; if (evt.ctrlKey || evt.metaKey) { @@ -3367,6 +3408,11 @@ RED.view = (function() { } if (dblClickPrimed && mousedown_node == d && clickElapsed > 0 && clickElapsed < dblClickInterval) { mouse_mode = RED.state.DEFAULT; + if (RED.workspaces.isActiveLocked()) { + clickElapsed = 0; + d3.event.stopPropagation(); + return + } if (d.type != "subflow") { if (/^subflow:/.test(d.type) && (d3.event.ctrlKey || d3.event.metaKey)) { RED.workspaces.show(d.type.substring(8)); @@ -3690,7 +3736,6 @@ RED.view = (function() { } // selectedLinks.clear(); if (d3.event.button != 2) { - mouse_mode = RED.state.MOVING; var mouse = d3.touches(this)[0]||d3.mouse(this); mouse[0] += d.x-d.w/2; mouse[1] += d.y-d.h/2; @@ -3883,6 +3928,7 @@ RED.view = (function() { if (RED.view.DEBUG) { console.warn("groupMouseUp", { mouse_mode, event: d3.event }); } + if (RED.workspaces.isActiveLocked()) { return } if (dblClickPrimed && mousedown_group == g && clickElapsed > 0 && clickElapsed < dblClickInterval) { mouse_mode = RED.state.DEFAULT; RED.editor.editGroup(g); @@ -4053,7 +4099,7 @@ RED.view = (function() { function isButtonEnabled(d) { var buttonEnabled = true; var ws = RED.nodes.workspace(RED.workspaces.active()); - if (ws && !ws.disabled && !d.d) { + if (ws && !ws.disabled && !d.d && !ws.locked) { if (d._def.button.hasOwnProperty('enabled')) { if (typeof d._def.button.enabled === "function") { buttonEnabled = d._def.button.enabled.call(d); @@ -4076,7 +4122,7 @@ RED.view = (function() { } var activeWorkspace = RED.workspaces.active(); var ws = RED.nodes.workspace(activeWorkspace); - if (ws && !ws.disabled && !d.d) { + if (ws && !ws.disabled && !d.d && !ws.locked) { if (d._def.button.toggle) { d[d._def.button.toggle] = !d[d._def.button.toggle]; d.dirty = true; @@ -4091,7 +4137,7 @@ RED.view = (function() { if (d.dirty) { redraw(); } - } else { + } else if (!ws || !ws.locked){ if (activeSubflow) { RED.notify(RED._("notification.warning", {message:RED._("notification.warnings.nodeActionDisabledSubflow")}),"warning"); } else { @@ -4106,14 +4152,15 @@ RED.view = (function() { function showTouchMenu(obj,pos) { var mdn = mousedown_node; var options = []; - options.push({name:"delete",disabled:(movingSet.length()===0 && selectedLinks.length() === 0),onselect:function() {deleteSelection();}}); - options.push({name:"cut",disabled:(movingSet.length()===0),onselect:function() {copySelection(true);deleteSelection();}}); - options.push({name:"copy",disabled:(movingSet.length()===0),onselect:function() {copySelection();}}); - options.push({name:"paste",disabled:(clipboard.length===0),onselect:function() {importNodes(clipboard, {generateIds: true, touchImport: true});}}); - options.push({name:"edit",disabled:(movingSet.length() != 1),onselect:function() { RED.editor.edit(mdn);}}); + const isActiveLocked = RED.workspaces.isActiveLocked() + options.push({name:"delete",disabled:(isActiveLocked || movingSet.length()===0 && selectedLinks.length() === 0),onselect:function() {deleteSelection();}}); + options.push({name:"cut",disabled:(isActiveLocked || movingSet.length()===0),onselect:function() {copySelection(true);deleteSelection();}}); + options.push({name:"copy",disabled:(isActiveLocked || movingSet.length()===0),onselect:function() {copySelection();}}); + options.push({name:"paste",disabled:(isActiveLocked || clipboard.length===0),onselect:function() {importNodes(clipboard, {generateIds: true, touchImport: true});}}); + options.push({name:"edit",disabled:(isActiveLocked || movingSet.length() != 1),onselect:function() { RED.editor.edit(mdn);}}); options.push({name:"select",onselect:function() {selectAll();}}); options.push({name:"undo",disabled:(RED.history.depth() === 0),onselect:function() {RED.history.pop();}}); - options.push({name:"add",onselect:function() { + options.push({name:"add",disabled:isActiveLocked, onselect:function() { chartPos = chart.offset(); showQuickAddDialog({ position:[pos[0]-chartPos.left+chart.scrollLeft(),pos[1]-chartPos.top+chart.scrollTop()], @@ -5811,6 +5858,9 @@ RED.view = (function() { if (mouse_mode === RED.state.SELECTING_NODE) { return; } + if (activeFlowLocked) { + return + } var workspaceSelection = RED.workspaces.selection(); var changed = false; if (workspaceSelection.length > 0) { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js b/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js index 23171fb5a..79f361a39 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js @@ -103,6 +103,9 @@ RED.workspaces = (function() { if (workspaceTabCount === 1) { return; } + if (ws.locked) { + return + } var workspaceOrder = RED.nodes.getWorkspaceOrder(); ws._index = workspaceOrder.indexOf(ws.id); removeWorkspace(ws); @@ -123,7 +126,9 @@ RED.workspaces = (function() { RED.editor.editSubflow(subflow); } } else { - RED.editor.editFlow(workspace); + if (!workspace.locked) { + RED.editor.editFlow(workspace); + } } } @@ -148,6 +153,11 @@ RED.workspaces = (function() { let activeWorkspace = tab || RED.nodes.workspace(RED.workspaces.active()) || RED.nodes.subflow(RED.workspaces.active()) let isFlowDisabled = activeWorkspace ? activeWorkspace.disabled : false + let isCurrentLocked = RED.workspaces.isActiveLocked() + if (tab) { + isCurrentLocked = tab.locked + } + var menuItems = [] if (isMenuButton) { menuItems.push({ @@ -188,14 +198,30 @@ RED.workspaces = (function() { shortcut: RED.keyboard.getShortcut("core:enable-flow"), onselect: function() { RED.actions.invoke("core:enable-flow", tab?tab.id:undefined) - } + }, + disabled: isCurrentLocked } : { label: RED._("workspace.disableFlow"), shortcut: RED.keyboard.getShortcut("core:disable-flow"), onselect: function() { RED.actions.invoke("core:disable-flow", tab?tab.id:undefined) + }, + disabled: isCurrentLocked + }, + isCurrentLocked? { + label: RED._("workspace.unlockFlow"), + shortcut: RED.keyboard.getShortcut("core:unlock-flow"), + onselect: function() { + RED.actions.invoke('core:unlock-flow', tab?tab.id:undefined) } - } + } : { + label: RED._("workspace.lockFlow"), + shortcut: RED.keyboard.getShortcut("core:lock-flow"), + onselect: function() { + RED.actions.invoke('core:lock-flow', tab?tab.id:undefined) + } + }, + null ) } const currentTabs = workspace_tabs.listTabs() @@ -239,6 +265,7 @@ RED.workspaces = (function() { } } ) + } menuItems.push( { @@ -264,6 +291,7 @@ RED.workspaces = (function() { null, { label: RED._("common.label.delete"), + disabled: isCurrentLocked, onselect: function() { if (tab.type === 'tab') { RED.workspaces.delete(tab) @@ -302,6 +330,7 @@ RED.workspaces = (function() { activeWorkspace = tab.id; window.location.hash = 'flow/'+tab.id; $("#red-ui-workspace").toggleClass("red-ui-workspace-disabled",!!tab.disabled); + $("#red-ui-workspace").toggleClass("red-ui-workspace-locked",!!tab.locked); } else { $("#red-ui-workspace-chart").hide(); activeWorkspace = 0; @@ -615,7 +644,7 @@ RED.workspaces = (function() { } function setWorkspaceState(id,disabled) { var workspace = RED.nodes.workspace(id||activeWorkspace); - if (!workspace) { + if (!workspace || workspace.locked) { return; } if (workspace.disabled !== disabled) { @@ -695,6 +724,8 @@ RED.workspaces = (function() { } function removeWorkspace(ws) { + if (ws.locked) { return } + if (!ws) { deleteWorkspace(RED.nodes.workspace(activeWorkspace)); } else { @@ -792,6 +823,10 @@ RED.workspaces = (function() { active: function() { return activeWorkspace }, + isActiveLocked: function() { + var ws = RED.nodes.workspace(activeWorkspace) || RED.nodes.subflow(activeWorkspace) + return ws && ws.locked + }, selection: function() { return workspace_tabs.selection(); }, diff --git a/packages/node_modules/@node-red/editor-client/src/sass/flow.scss b/packages/node_modules/@node-red/editor-client/src/sass/flow.scss index be8db6c93..3e5be0645 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/flow.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/flow.scss @@ -68,6 +68,9 @@ stroke: var(--red-ui-node-border); cursor: move; stroke-width: 1; + .red-ui-workspace-locked & { + cursor: pointer; + } } .red-ui-workspace-select-mode { g.red-ui-flow-node.red-ui-flow-node-hovered * { @@ -287,9 +290,11 @@ g.red-ui-flow-node-selected { text-anchor:start; } -.red-ui-flow-port-hovered { - stroke: var(--red-ui-port-selected-color); - fill: var(--red-ui-port-selected-color); +#red-ui-workspace:not(.red-ui-workspace-locked) { + .red-ui-flow-port-hovered { + stroke: var(--red-ui-port-selected-color); + fill: var(--red-ui-port-selected-color); + } } .red-ui-flow-subflow-port { diff --git a/packages/node_modules/@node-red/editor-client/src/sass/tab-info.scss b/packages/node_modules/@node-red/editor-client/src/sass/tab-info.scss index ed526b263..f6bf2473c 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/tab-info.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/tab-info.scss @@ -514,6 +514,14 @@ div.red-ui-info-table { display: none; } } + // If the parent is locked, do not show the display/action buttons when + // hovering in the outline + .red-ui-info-outline-item-locked .red-ui-info-outline-item & { + .red-ui-info-outline-item-control-disable, + .red-ui-info-outline-item-control-action { + display: none; + } + } button { margin-right: 3px } @@ -531,8 +539,6 @@ div.red-ui-info-table { } } - - .red-ui-icons { display: inline-block; width: 18px; From ce94226c3c82ea505332c9ba01eb6c3de77ed0ac Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 1 Nov 2022 11:29:23 +0000 Subject: [PATCH 101/253] Disable subflow/flow menu options if active is locked --- .../@node-red/editor-client/src/js/ui/subflow.js | 2 +- .../@node-red/editor-client/src/js/ui/view.js | 4 ++-- .../@node-red/editor-client/src/js/ui/workspaces.js | 12 +++++++----- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js b/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js index de987e468..9ba4cb0bf 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js @@ -554,7 +554,7 @@ RED.subflow = (function() { } }); RED.events.on("view:selection-changed",function(selection) { - if (!selection.nodes) { + if (!selection.nodes || RED.workspaces.isActiveLocked()) { RED.menu.setDisabled("menu-item-subflow-convert",true); } else { RED.menu.setDisabled("menu-item-subflow-convert",false); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index d783ce941..1520471fd 100755 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -423,8 +423,8 @@ RED.view = (function() { } } - RED.menu.setDisabled("menu-item-workspace-edit", activeSubflow || event.workspace === 0); - RED.menu.setDisabled("menu-item-workspace-delete",event.workspace === 0 || RED.workspaces.count() == 1 || activeSubflow); + RED.menu.setDisabled("menu-item-workspace-edit", activeFlowLocked || activeSubflow || event.workspace === 0); + RED.menu.setDisabled("menu-item-workspace-delete",activeFlowLocked || event.workspace === 0 || RED.workspaces.count() == 1 || activeSubflow); if (workspaceScrollPositions[event.workspace]) { chart.scrollLeft(workspaceScrollPositions[event.workspace].left); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js b/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js index 79f361a39..f127b7662 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js @@ -329,8 +329,8 @@ RED.workspaces = (function() { $("#red-ui-workspace-chart").show(); activeWorkspace = tab.id; window.location.hash = 'flow/'+tab.id; - $("#red-ui-workspace").toggleClass("red-ui-workspace-disabled",!!tab.disabled); - $("#red-ui-workspace").toggleClass("red-ui-workspace-locked",!!tab.locked); + $("#red-ui-workspace").toggleClass("red-ui-workspace-disabled", !!tab.disabled); + $("#red-ui-workspace").toggleClass("red-ui-workspace-locked", !!tab.locked); } else { $("#red-ui-workspace-chart").hide(); activeWorkspace = 0; @@ -724,11 +724,13 @@ RED.workspaces = (function() { } function removeWorkspace(ws) { - if (ws.locked) { return } - if (!ws) { - deleteWorkspace(RED.nodes.workspace(activeWorkspace)); + ws = RED.nodes.workspace(activeWorkspace) + if (ws && !ws.locked) { + deleteWorkspace(RED.nodes.workspace(activeWorkspace)); + } } else { + if (ws.locked) { return } if (workspace_tabs.contains(ws.id)) { workspace_tabs.removeTab(ws.id); } From fe9c630572fe9432fd6de6ff968c5a1905f79e2d Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 1 Nov 2022 11:42:40 +0000 Subject: [PATCH 102/253] Prevent deleting subflow if instance on locked tab --- packages/node_modules/@node-red/editor-client/src/js/nodes.js | 2 +- .../node_modules/@node-red/editor-client/src/js/ui/subflow.js | 3 +++ 2 files changed, 4 insertions(+), 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 715ae9c49..bbb6eb82f 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 @@ -616,7 +616,7 @@ RED.nodes = (function() { var subflowId = n.type.substring(8); var sf = RED.nodes.subflow(subflowId); if (sf) { - sf.instances.push(sf); + sf.instances.push(newNode); } n["_"] = RED._; } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js b/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js index 9ba4cb0bf..110533c1e 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js @@ -450,6 +450,9 @@ RED.subflow = (function() { return } if (subflow.instances.length > 0) { + if (subflow.instances.some(sf => { const ws = RED.nodes.workspace(sf.z); return ws?ws.locked:false })) { + return + } const msg = $('
    ') $('

    ').text(RED._("subflow.subflowInstances",{count: subflow.instances.length})).appendTo(msg); $('

    ').text(RED._("subflow.confirmDelete")).appendTo(msg); From f23d0480e4bb30c09e1881ce7545159ee8453fca Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Fri, 4 Nov 2022 18:42:51 +0900 Subject: [PATCH 103/253] 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 = $("
      From 1191574e07132fd4abe05a5c1a08eaff3a64bebe Mon Sep 17 00:00:00 2001 From: GogoVega Date: Wed, 30 Nov 2022 13:22:10 +0100 Subject: [PATCH 122/253] fix: Typos --- .../@node-red/nodes/locales/fr/common/21-debug.html | 2 +- .../@node-red/nodes/locales/fr/common/25-catch.html | 2 +- .../@node-red/nodes/locales/fr/common/25-status.html | 2 +- .../node_modules/@node-red/nodes/locales/fr/common/60-link.html | 2 +- .../@node-red/nodes/locales/fr/function/10-switch.html | 2 +- .../@node-red/nodes/locales/fr/function/15-change.html | 2 +- .../node_modules/@node-red/nodes/locales/fr/function/rbe.html | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/locales/fr/common/21-debug.html b/packages/node_modules/@node-red/nodes/locales/fr/common/21-debug.html index 47b8ffeda..90a4c07d8 100644 --- a/packages/node_modules/@node-red/nodes/locales/fr/common/21-debug.html +++ b/packages/node_modules/@node-red/nodes/locales/fr/common/21-debug.html @@ -15,7 +15,7 @@ --> diff --git a/packages/node_modules/@node-red/nodes/locales/fr/network/06-httpproxy.html b/packages/node_modules/@node-red/nodes/locales/fr/network/06-httpproxy.html new file mode 100644 index 000000000..6a12dc379 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/fr/network/06-httpproxy.html @@ -0,0 +1,22 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/fr/network/10-mqtt.html b/packages/node_modules/@node-red/nodes/locales/fr/network/10-mqtt.html new file mode 100644 index 000000000..4d2e2e720 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/fr/network/10-mqtt.html @@ -0,0 +1,160 @@ + + + + + + + \ No newline at end of file diff --git a/packages/node_modules/@node-red/nodes/locales/fr/network/21-httpin.html b/packages/node_modules/@node-red/nodes/locales/fr/network/21-httpin.html new file mode 100644 index 000000000..f9f0f4c2e --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/fr/network/21-httpin.html @@ -0,0 +1,100 @@ + + + + + diff --git a/packages/node_modules/@node-red/nodes/locales/fr/network/21-httprequest.html b/packages/node_modules/@node-red/nodes/locales/fr/network/21-httprequest.html new file mode 100644 index 000000000..87ccbd134 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/fr/network/21-httprequest.html @@ -0,0 +1,96 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/fr/network/22-websocket.html b/packages/node_modules/@node-red/nodes/locales/fr/network/22-websocket.html new file mode 100644 index 000000000..c355b94ee --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/fr/network/22-websocket.html @@ -0,0 +1,43 @@ + + + + + + + + + diff --git a/packages/node_modules/@node-red/nodes/locales/fr/network/31-tcpin.html b/packages/node_modules/@node-red/nodes/locales/fr/network/31-tcpin.html new file mode 100644 index 000000000..0d2ebd0ff --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/fr/network/31-tcpin.html @@ -0,0 +1,45 @@ + + + + + + + \ No newline at end of file diff --git a/packages/node_modules/@node-red/nodes/locales/fr/network/32-udp.html b/packages/node_modules/@node-red/nodes/locales/fr/network/32-udp.html new file mode 100644 index 000000000..54b028b42 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/fr/network/32-udp.html @@ -0,0 +1,31 @@ + + + + + From b4a12edc612fcdbf28e886452ce499632a7db98a Mon Sep 17 00:00:00 2001 From: GogoVega Date: Wed, 30 Nov 2022 15:38:49 +0100 Subject: [PATCH 124/253] Add French translation of `parsers` nodes --- .../nodes/locales/fr/parsers/70-CSV.html | 51 ++++++++++++++++++ .../nodes/locales/fr/parsers/70-HTML.html | 36 +++++++++++++ .../nodes/locales/fr/parsers/70-JSON.html | 54 +++++++++++++++++++ .../nodes/locales/fr/parsers/70-XML.html | 51 ++++++++++++++++++ .../nodes/locales/fr/parsers/70-YAML.html | 34 ++++++++++++ 5 files changed, 226 insertions(+) create mode 100644 packages/node_modules/@node-red/nodes/locales/fr/parsers/70-CSV.html create mode 100644 packages/node_modules/@node-red/nodes/locales/fr/parsers/70-HTML.html create mode 100644 packages/node_modules/@node-red/nodes/locales/fr/parsers/70-JSON.html create mode 100644 packages/node_modules/@node-red/nodes/locales/fr/parsers/70-XML.html create mode 100644 packages/node_modules/@node-red/nodes/locales/fr/parsers/70-YAML.html diff --git a/packages/node_modules/@node-red/nodes/locales/fr/parsers/70-CSV.html b/packages/node_modules/@node-red/nodes/locales/fr/parsers/70-CSV.html new file mode 100644 index 000000000..2bde1640d --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/fr/parsers/70-CSV.html @@ -0,0 +1,51 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/fr/parsers/70-HTML.html b/packages/node_modules/@node-red/nodes/locales/fr/parsers/70-HTML.html new file mode 100644 index 000000000..59dc25ea9 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/fr/parsers/70-HTML.html @@ -0,0 +1,36 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/fr/parsers/70-JSON.html b/packages/node_modules/@node-red/nodes/locales/fr/parsers/70-JSON.html new file mode 100644 index 000000000..39c15671e --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/fr/parsers/70-JSON.html @@ -0,0 +1,54 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/fr/parsers/70-XML.html b/packages/node_modules/@node-red/nodes/locales/fr/parsers/70-XML.html new file mode 100644 index 000000000..10b2941be --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/fr/parsers/70-XML.html @@ -0,0 +1,51 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/fr/parsers/70-YAML.html b/packages/node_modules/@node-red/nodes/locales/fr/parsers/70-YAML.html new file mode 100644 index 000000000..eebd101a7 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/fr/parsers/70-YAML.html @@ -0,0 +1,34 @@ + + + From e440694987cae54d41ea2440c7b110065bd094b1 Mon Sep 17 00:00:00 2001 From: GogoVega Date: Wed, 30 Nov 2022 17:35:22 +0100 Subject: [PATCH 125/253] Use English names for nodes (better) --- .../nodes/locales/fr/common/24-complete.html | 2 +- .../nodes/locales/fr/common/25-catch.html | 4 +-- .../nodes/locales/fr/common/60-link.html | 28 +++++++++---------- .../locales/fr/function/10-function.html | 2 +- .../nodes/locales/fr/function/90-exec.html | 2 +- .../nodes/locales/fr/network/10-mqtt.html | 2 +- .../nodes/locales/fr/network/31-tcpin.html | 2 +- .../nodes/locales/fr/parsers/70-JSON.html | 4 +-- 8 files changed, 23 insertions(+), 23 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/locales/fr/common/24-complete.html b/packages/node_modules/@node-red/nodes/locales/fr/common/24-complete.html index cae216d1e..a2b956051 100644 --- a/packages/node_modules/@node-red/nodes/locales/fr/common/24-complete.html +++ b/packages/node_modules/@node-red/nodes/locales/fr/common/24-complete.html @@ -22,7 +22,7 @@

      Par exemple, cela peut être utilisé avec un noeud sans port de sortie, comme le noeud d'envoi d'e-mails, pour continuer le flux.

      Ce noeud doit être configuré pour gérer l'événement pour les noeuds sélectionnés dans le - flux. Contrairement au noeud Capturer (Catch), il ne fournit pas automatiquement un mode "gérer tout" + flux. Contrairement au noeud Catch, il ne fournit pas automatiquement un mode "gérer tout" qui s'applique à tous les noeuds du flux.

      Tous les noeuds ne déclencheront pas cet événement - cela dépendra s'ils ont été implémentés pour prendre en charge cette fonctionnalité telle qu'introduite dans Node-RED 1.0.

      diff --git a/packages/node_modules/@node-red/nodes/locales/fr/common/25-catch.html b/packages/node_modules/@node-red/nodes/locales/fr/common/25-catch.html index 737b7fba3..c4117abc5 100644 --- a/packages/node_modules/@node-red/nodes/locales/fr/common/25-catch.html +++ b/packages/node_modules/@node-red/nodes/locales/fr/common/25-catch.html @@ -34,9 +34,9 @@

      Par défaut, le noeud interceptera les erreurs générées par n'importe quel noeud sur le même onglet. Alternativement il peut être ciblé sur des noeuds spécifiques ou configuré pour ne détecter que les erreurs qui n'ont pas déjà été capturés par un noeud de capture "ciblé".

      -

      Lorsqu'une erreur est générée, tous les noeuds Capturer correspondants recevront le message.

      +

      Lorsqu'une erreur est générée, tous les noeuds Catch correspondants recevront le message.

      Si une erreur est générée dans un sous-flux, l'erreur sera gérée par n'importe quel - noeud Capturer dans le sous-flux. S'il n'en existe pas, l'erreur sera propagée + noeud Catch dans le sous-flux. S'il n'en existe pas, l'erreur sera propagée jusqu'à l'onglet sur lequel se trouve l'instance de sous-flux.

      Si le message a déjà une propriété error, il est copié dans _error.

      diff --git a/packages/node_modules/@node-red/nodes/locales/fr/common/60-link.html b/packages/node_modules/@node-red/nodes/locales/fr/common/60-link.html index 49955ec48..788ebcc40 100644 --- a/packages/node_modules/@node-red/nodes/locales/fr/common/60-link.html +++ b/packages/node_modules/@node-red/nodes/locales/fr/common/60-link.html @@ -17,7 +17,7 @@ \ No newline at end of file diff --git a/packages/node_modules/@node-red/nodes/locales/fr/function/10-function.html b/packages/node_modules/@node-red/nodes/locales/fr/function/10-function.html index 7e41c436c..8877ce9bb 100644 --- a/packages/node_modules/@node-red/nodes/locales/fr/function/10-function.html +++ b/packages/node_modules/@node-red/nodes/locales/fr/function/10-function.html @@ -49,7 +49,7 @@
    1. node.error("Erreur")
    2. -

      Le noeud Capturer peut également être utilisé pour gérer les erreurs. Pour invoquer un noeud Capturer, +

      Le noeud Catch peut également être utilisé pour gérer les erreurs. Pour invoquer un noeud Catch, passer msg comme deuxième argument à node.error :

      node.error("Erreur",msg);

      Accéder aux informations sur les noeuds

      diff --git a/packages/node_modules/@node-red/nodes/locales/fr/function/90-exec.html b/packages/node_modules/@node-red/nodes/locales/fr/function/90-exec.html index 9402ea982..892791445 100644 --- a/packages/node_modules/@node-red/nodes/locales/fr/function/90-exec.html +++ b/packages/node_modules/@node-red/nodes/locales/fr/function/90-exec.html @@ -72,7 +72,7 @@

      Les commandes ou les paramètres avec des espaces doivent être placés entre guillemets - "Ceci est un paramètre unique"

      La charge utile payload renvoyée est généralement une chaîne, sauf si des caractères non UTF8 sont détectés, dans ce cas, il s'agit d'un tampon.

      -

      L'icône d'état et le PID du noeud seront visibles tant que le noeud est actif. Les modifications apportées à cela peuvent être lues par le noeud Statut.

      +

      L'icône d'état et le PID du noeud seront visibles tant que le noeud est actif. Les modifications apportées à cela peuvent être lues par le noeud Status.

      L'option Masquer la console masquera la console de processus normalement affichée sur les systèmes Windows.

      Tuer les processus

      L'envoi de msg.kill tuera un seul processus actif. msg.kill doit être une chaîne contenant diff --git a/packages/node_modules/@node-red/nodes/locales/fr/network/10-mqtt.html b/packages/node_modules/@node-red/nodes/locales/fr/network/10-mqtt.html index 4d2e2e720..8706a616d 100644 --- a/packages/node_modules/@node-red/nodes/locales/fr/network/10-mqtt.html +++ b/packages/node_modules/@node-red/nodes/locales/fr/network/10-mqtt.html @@ -139,7 +139,7 @@ + + diff --git a/packages/node_modules/@node-red/nodes/locales/fr/sequence/18-sort.html b/packages/node_modules/@node-red/nodes/locales/fr/sequence/18-sort.html new file mode 100644 index 000000000..9329769f8 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/fr/sequence/18-sort.html @@ -0,0 +1,41 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/fr/sequence/19-batch.html b/packages/node_modules/@node-red/nodes/locales/fr/sequence/19-batch.html new file mode 100644 index 000000000..ff6a1be94 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/fr/sequence/19-batch.html @@ -0,0 +1,43 @@ + + + From 1004ce564f264bff7e88c2c4db03d30fe0a72d38 Mon Sep 17 00:00:00 2001 From: GogoVega Date: Fri, 2 Dec 2022 14:21:34 +0100 Subject: [PATCH 129/253] Add French translation of `storage` nodes --- .../nodes/locales/fr/storage/10-file.html | 69 +++++++++++++++++++ .../nodes/locales/fr/storage/23-watch.html | 30 ++++++++ 2 files changed, 99 insertions(+) create mode 100644 packages/node_modules/@node-red/nodes/locales/fr/storage/10-file.html create mode 100644 packages/node_modules/@node-red/nodes/locales/fr/storage/23-watch.html diff --git a/packages/node_modules/@node-red/nodes/locales/fr/storage/10-file.html b/packages/node_modules/@node-red/nodes/locales/fr/storage/10-file.html new file mode 100644 index 000000000..a8f969957 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/fr/storage/10-file.html @@ -0,0 +1,69 @@ + + + + + diff --git a/packages/node_modules/@node-red/nodes/locales/fr/storage/23-watch.html b/packages/node_modules/@node-red/nodes/locales/fr/storage/23-watch.html new file mode 100644 index 000000000..2240ef98b --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/fr/storage/23-watch.html @@ -0,0 +1,30 @@ + + + From f4309f5af628106cb1bf774fc3019d47b4cddf27 Mon Sep 17 00:00:00 2001 From: GogoVega Date: Fri, 2 Dec 2022 18:07:39 +0100 Subject: [PATCH 130/253] fix: Typos (infinitif) --- .../editor-client/locales/fr/editor.json | 42 +++++++++---------- .../editor-client/locales/fr/infotips.json | 16 +++---- .../editor-client/locales/fr/jsonata.json | 2 +- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/locales/fr/editor.json b/packages/node_modules/@node-red/editor-client/locales/fr/editor.json index 576ed8307..2796e5587 100644 --- a/packages/node_modules/@node-red/editor-client/locales/fr/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/fr/editor.json @@ -52,7 +52,7 @@ "editFlow": "Modifier le flux : __name__", "confirmDelete": "Confirmation de la suppression", "delete": "Etes-vous sûr de vouloir supprimer '__label__'?", - "dropFlowHere": "Déposez le flux ici", + "dropFlowHere": "Déposer le flux ici", "addFlow": "Ajouter un flux", "addFlowToRight": "Ajouter un flux à droite", "hideFlow": "Masquer le flux", @@ -68,7 +68,7 @@ "enabled": "Activé", "disabled": "Désactivé", "info": "Description", - "selectNodes": "Cliquez sur les noeuds pour sélectionner" + "selectNodes": "Cliquer sur les noeuds pour sélectionner" }, "menu": { "label": { @@ -188,13 +188,13 @@ "missing_package_file": "

      Fichier de package de projet introuvable.

      Il manque au projet un fichier package.json.

      ", "project_empty": "

      Le projet est vide.

      Voulez-vous créer un ensemble de fichiers de projet par défaut ?
      Sinon, vous devrez ajouter manuellement des fichiers au projet (en dehors de l'éditeur).

      ", "project_not_found": "

      Le projet '__project__' est introuvable.

      ", - "git_merge_conflict": "

      La fusion automatique des modifications a échoué.

      Corrigez les conflits non fusionnés, puis validez le résultat.

      " + "git_merge_conflict": "

      La fusion automatique des modifications a échoué.

      Corriger les conflits non fusionnés, puis valider le résultat.

      " }, "error": "Erreur : __message__", "errors": { - "lostConnection": "Perte de connexion au serveur, reconnexion...", - "lostConnectionReconnect": "Perte de connexion au serveur, reconnexion dans __time__s.", - "lostConnectionTry": "Essayez maintenant", + "lostConnection": "Connexion avec le serveur perdu, reconnexion...", + "lostConnectionReconnect": "Connexion avec le serveur perdu, reconnexion dans __time__s.", + "lostConnectionTry": "Essayer maintenant", "cannotAddSubflowToItself": "Impossible d'ajouter un sous-flux à lui-même", "cannotAddCircularReference": "Impossible d'ajouter un sous-flux - référence circulaire détectée", "unsupportedVersion": "

      Utilisation d'une version non prise en charge de Node.js

      Vous devez effectuer une mise à jour vers la dernière version de Node.js LTS

      ", @@ -616,16 +616,16 @@ "upload": "Charger le fichier tgz du module", "refresh": "Actualiser la liste des modules", "errors": { - "catalogLoadFailed": "

      Échec du chargement du catalogue de noeuds.

      Vérifiez la console du navigateur pour plus d'informations

      ", - "installFailed": "

      Échec lors de l'installation : __module__

      __message__

      Consultez le journal pour plus d'informations

      ", - "removeFailed": "

      Échec lors de la suppression : __module__

      __message__

      Consultez le journal pour plus d'informations

      ", - "updateFailed": "

      Échec lors de la mise à jour : __module__

      __message__

      Consultez le journal pour plus d'informations

      ", - "enableFailed": "

      Échec lors de l'activation : __module__

      __message__

      Consultez le journal pour plus d'informations

      ", - "disableFailed": "

      Échec lors de la désactivation : __module__

      __message__

      Consultez le journal pour plus d'informations

      " + "catalogLoadFailed": "

      Échec du chargement du catalogue de noeuds.

      Vérifier la console du navigateur pour plus d'informations

      ", + "installFailed": "

      Échec lors de l'installation : __module__

      __message__

      Consulter le journal pour plus d'informations

      ", + "removeFailed": "

      Échec lors de la suppression : __module__

      __message__

      Consulter le journal pour plus d'informations

      ", + "updateFailed": "

      Échec lors de la mise à jour : __module__

      __message__

      Consulter le journal pour plus d'informations

      ", + "enableFailed": "

      Échec lors de l'activation : __module__

      __message__

      Consulter le journal pour plus d'informations

      ", + "disableFailed": "

      Échec lors de la désactivation : __module__

      __message__

      Consulter le journal pour plus d'informations

      " }, "confirm": { "install": { - "body": "

      Installation de '__module__'

      Avant l'installation, veuillez lire la documentation du noeud. Certains noeuds ont des dépendances qui ne peuvent pas être résolues automatiquement et peuvent nécessiter un redémarrage de Node-RED.

      ", + "body": "

      Installation de '__module__'

      Avant l'installation, veuiller lire la documentation du noeud. Certains noeuds ont des dépendances qui ne peuvent pas être résolues automatiquement et peuvent nécessiter un redémarrage de Node-RED.

      ", "title": "Installer les noeuds" }, "remove": { @@ -637,7 +637,7 @@ "title": "Mettre à jour les noeuds" }, "cannotUpdate": { - "body": "Une mise à jour pour ce noeud est disponible, mais il n'est pas installé dans un emplacement que le gestionnaire de palette peut mettre à jour.

      Veuillez vous référer à la documentation pour savoir comment mettre à jour ce noeud." + "body": "Une mise à jour pour ce noeud est disponible, mais il n'est pas installé dans un emplacement que le gestionnaire de palette peut mettre à jour.

      Veuiller vous référer à la documentation pour savoir comment mettre à jour ce noeud." }, "button": { "review": "Ouvrir les informations sur ce noeud", @@ -775,7 +775,7 @@ "nameRule": "Doit contenir uniquement A-Z 0-9 _ -", "url": "URL", "urlRule": "https://, ssh:// or file://", - "urlRule2": "N'incluez pas le nom d'utilisateur/mot de passe dans l'URL", + "urlRule2": "N'incluer pas le nom d'utilisateur/mot de passe dans l'URL", "noRemotes": "Pas distant", "deleteRemoteConfrim": "Êtes-vous sûr de vouloir supprimer '__name__' distant ?", "deleteRemote": "Supprimer distant" @@ -786,7 +786,7 @@ "userName": "Nom d'utilisateur", "email": "Email", "workflow": "Flux de travail", - "workfowTip": "Choisissez votre flux de travail git préféré", + "workfowTip": "Choisisser votre flux de travail git préféré", "workflowManual": "Manuel", "workflowManualTip": "Toutes les modifications doivent être validées manuellement dans la barre latérale 'historique'", "workflowAuto": "Automatique", @@ -834,7 +834,7 @@ "abortMerge": "abandonner la fusion", "commit": "commit", "changeToCommit": "Modifications à valider", - "commitPlaceholder": "Entrez votre message de validation", + "commitPlaceholder": "Entrer votre message de validation", "cancelCapital": "Annuler", "commitCapital": "Commit", "commitHistory": "Historique des commits", @@ -930,7 +930,7 @@ "result": "Resultat", "format": "format", "compatMode": "Mode de compatibilité activé", - "compatModeDesc": "

      Mode de compatibilité JSONata

      L'expression actuelle semble toujours faire référence à msg et sera donc évaluée en mode de compatibilité. Veuillez mettre à jour l'expression pour ne pas utiliser msg car ce mode sera supprimé à l'avenir.

      Lorsque la prise en charge de JSONata a été ajoutée pour la première fois à Node-RED, il fallait que l'expression référence le Objet msg. Par exemple, msg.payload serait utilisé pour accéder à la charge utile.

      Cela n'est plus nécessaire car l'expression sera évaluée directement par rapport au message. Pour accéder à la charge utile, l'expression doit être simplement charge utile.

      ", + "compatModeDesc": "

      Mode de compatibilité JSONata

      L'expression actuelle semble toujours faire référence à msg et sera donc évaluée en mode de compatibilité. Veuiller mettre à jour l'expression pour ne pas utiliser msg car ce mode sera supprimé à l'avenir.

      Lorsque la prise en charge de JSONata a été ajoutée pour la première fois à Node-RED, il fallait que l'expression référence le Objet msg. Par exemple, msg.payload serait utilisé pour accéder à la charge utile.

      Cela n'est plus nécessaire car l'expression sera évaluée directement par rapport au message. Pour accéder à la charge utile, l'expression doit être simplement charge utile.

      ", "noMatch": "Aucun résultat correspondant", "errors": { "invalid-expr": "Expression JSONata non valide :\n __message__", @@ -1005,7 +1005,7 @@ "not-right-now": "Pas maintenant" }, "git-config": { - "setup": "Configurez votre version du contrôle de client", + "setup": "Configurer votre version du contrôle de client", "desc0": "Node-RED utilise l'outil open source Git pour le contrôle de version. Il suit les modifications apportées à vos fichiers de projet et vous permet de les transférer vers des référentiels distants.", "desc1": "Lorsque vous validez un ensemble de modifications, Git enregistre l'auteur qui a effectué les modifications avec un nom d'utilisateur et une adresse e-mail. Le nom d'utilisateur peut être ce que vous voulez - il n'est pas nécessaire que ce soit votre vrai nom.", "desc2": "Votre client Git est déjà configuré avec les détails ci-dessous.", @@ -1014,7 +1014,7 @@ "email": "Email" }, "project-details": { - "create": "Créez votre projet", + "create": "Créer votre projet", "desc0": "Un projet est maintenu en tant que référentiel Git. Il est beaucoup plus facile de partager vos flux et de collaborer avec les autres grâce à ce référentiel.", "desc1": "Vous pouvez créer plusieurs projets et basculer rapidement entre eux depuis l'éditeur.", "desc2": "Pour commencer, votre projet a besoin d'un nom et facultativement d'une description.", @@ -1049,7 +1049,7 @@ "repo-not-found": "Référentiel introuvable" }, "default-files": { - "create": "Créez vos fichiers de projet", + "create": "Créer vos fichiers de projet", "desc0": "Un projet contient vos fichiers de flux, un fichier README et un fichier package.json.", "desc1": "Il peut contenir tous les autres fichiers que vous souhaitez conserver dans le référentiel Git.", "desc2": "Vos fichiers de flux et identifiants existants seront copiés dans le projet.", diff --git a/packages/node_modules/@node-red/editor-client/locales/fr/infotips.json b/packages/node_modules/@node-red/editor-client/locales/fr/infotips.json index 9d7b54451..4a4dc1eb4 100755 --- a/packages/node_modules/@node-red/editor-client/locales/fr/infotips.json +++ b/packages/node_modules/@node-red/editor-client/locales/fr/infotips.json @@ -5,18 +5,18 @@ "tip2": "{{core:toggle-sidebar}} basculera l'affichage de cette barre latérale", "tip3": "Vous pouvez gérer votre palette de noeuds avec {{core:manage-palette}}", "tip4": "Vos noeuds de configuration de flux sont répertoriés dans le panneau de la barre latérale. Ils sont accessibles depuis le menu ou avec {{core:show-config-tab}}", - "tip5": "Activez ou désactivez ces conseils à partir de l'option dans les paramètres", - "tip6": "Déplacez les noeuds sélectionnés à l'aide des touches [gauche] [haut] [bas] et [droite]. Maintenez [shift] pour les pousser plus loin", + "tip5": "Activer ou désactiver ces conseils à partir de l'option dans les paramètres", + "tip6": "Déplacer les noeuds sélectionnés à l'aide des touches [gauche] [haut] [bas] et [droite]. Maintener [shift] pour les pousser plus loin", "tip7": "Faire glisser un noeud sur un fil le raccordera au lien", "tip8": "Exporter les noeuds sélectionnés, ou l'onglet actuel avec {{core:show-export-dialog}}", - "tip9": "Importez un flux en faisant glisser son JSON dans l'éditeur, ou avec {{core:show-import-dialog}}", + "tip9": "Importer un flux en faisant glisser son JSON dans l'éditeur, ou avec {{core:show-import-dialog}}", "tip10": "[majuscule] [clic] et faites glisser sur un port de noeud pour déplacer tous les fils attachés ou seulement celui sélectionné", - "tip11": "Affichez l'onglet Infos avec {{core:show-info-tab}} ou l'onglet Débogage avec {{core:show-debug-tab}}", + "tip11": "Afficher l'onglet Infos avec {{core:show-info-tab}} ou l'onglet Débogage avec {{core:show-debug-tab}}", "tip12": "[ctrl] [clic] dans l'espace de travail pour ouvrir la boîte de dialogue d'ajout rapide", - "tip13": "Maintenez [ctrl] enfoncé lorsque vous [cliquez] sur un port de noeud pour activer le câblage rapide", - "tip14": "Maintenez [shift] enfoncé lorsque vous [cliquez] sur un noeud pour sélectionner également tous ses noeuds connectés", - "tip15": "Maintenez [ctrl] enfoncé lorsque vous [cliquez] sur un noeud pour l'ajouter ou le supprimer de la sélection actuelle", - "tip16": "Changez d'onglet de flux avec {{core:show-previous-tab}} et {{core:show-next-tab}}", + "tip13": "Maintener [ctrl] enfoncé lorsque vous [cliquez] sur un port de noeud pour activer le câblage rapide", + "tip14": "Maintener [shift] enfoncé lorsque vous [cliquez] sur un noeud pour sélectionner également tous ses noeuds connectés", + "tip15": "Maintener [ctrl] enfoncé lorsque vous [cliquez] sur un noeud pour l'ajouter ou le supprimer de la sélection actuelle", + "tip16": "Changer d'onglet de flux avec {{core:show-previous-tab}} et {{core:show-next-tab}}", "tip17": "Vous pouvez confirmer vos modifications dans le panneau d'édition du noeud avec {{core:confirm-edit-tray}} ou les annuler avec {{core:cancel-edit-tray}}", "tip18": "Appuyer sur {{core:edit-selected-node}} modifiera le premier noeud de la sélection actuelle" } diff --git a/packages/node_modules/@node-red/editor-client/locales/fr/jsonata.json b/packages/node_modules/@node-red/editor-client/locales/fr/jsonata.json index efccd0693..7682d70a5 100755 --- a/packages/node_modules/@node-red/editor-client/locales/fr/jsonata.json +++ b/packages/node_modules/@node-red/editor-client/locales/fr/jsonata.json @@ -201,7 +201,7 @@ }, "$fromMillis": { "args": "number, [, picture [, timezone]]", - "desc": "Convertissez le « nombre » représentant les millisecondes depuis l'époque Unix (1er janvier 1970 UTC) en une représentation sous forme de chaîne formatée de l'horodatage tel que spécifié par la chaîne d'image.\n\nSi le paramètre facultatif « image » est omis, l'horodatage est formaté au format ISO 8601.\n\nSi la chaîne facultative `image` est fournie, l'horodatage est formaté selon la représentation spécifiée dans cette chaîne. Le comportement de cette fonction est cohérent avec la version à deux arguments de la fonction XPath/XQuery `format-dateTime` telle que définie dans la spécification XPath F&O 3.1. Le paramètre de chaîne d'image définit la façon dont l'horodatage est formaté et a la même syntaxe que `format-dateTime`.\n\nSi la chaîne facultative `timezone` est fournie, alors l'horodatage formaté sera dans ce fuseau horaire. La chaîne `timezone` doit être au format '±HHMM', où ± est le signe plus ou moins et HHMM est le décalage en heures et minutes par rapport à UTC. Décalage positif pour les fuseaux horaires à l'est de UTC, décalage négatif pour les fuseaux horaires à l'ouest de UTC." + "desc": "Convertisser le « nombre » représentant les millisecondes depuis l'époque Unix (1er janvier 1970 UTC) en une représentation sous forme de chaîne formatée de l'horodatage tel que spécifié par la chaîne d'image.\n\nSi le paramètre facultatif « image » est omis, l'horodatage est formaté au format ISO 8601.\n\nSi la chaîne facultative `image` est fournie, l'horodatage est formaté selon la représentation spécifiée dans cette chaîne. Le comportement de cette fonction est cohérent avec la version à deux arguments de la fonction XPath/XQuery `format-dateTime` telle que définie dans la spécification XPath F&O 3.1. Le paramètre de chaîne d'image définit la façon dont l'horodatage est formaté et a la même syntaxe que `format-dateTime`.\n\nSi la chaîne facultative `timezone` est fournie, alors l'horodatage formaté sera dans ce fuseau horaire. La chaîne `timezone` doit être au format '±HHMM', où ± est le signe plus ou moins et HHMM est le décalage en heures et minutes par rapport à UTC. Décalage positif pour les fuseaux horaires à l'est de UTC, décalage négatif pour les fuseaux horaires à l'ouest de UTC." }, "$formatNumber": { "args": "number, picture [, options]", From 01f9ce0015aaf9429a1acf636c7d89a4d12ab128 Mon Sep 17 00:00:00 2001 From: GogoVega Date: Fri, 2 Dec 2022 18:09:06 +0100 Subject: [PATCH 131/253] Add French translation of `runtime.json` file --- .../@node-red/runtime/locales/fr/runtime.json | 193 ++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100644 packages/node_modules/@node-red/runtime/locales/fr/runtime.json diff --git a/packages/node_modules/@node-red/runtime/locales/fr/runtime.json b/packages/node_modules/@node-red/runtime/locales/fr/runtime.json new file mode 100644 index 000000000..0a133736f --- /dev/null +++ b/packages/node_modules/@node-red/runtime/locales/fr/runtime.json @@ -0,0 +1,193 @@ +{ + "runtime": { + "welcome": "Bienvenue sur Node-RED", + "version": "__component__ version: __version__", + "unsupported_version": "Version non prise en charge de __component__. Requiert : __requires__ Trouvé : __version__", + "paths": { + "settings": "Fichier de paramètres : __path__", + "httpStatic": "HTTP Statique : __path__" + } + }, + "server": { + "loading": "Chargement des noeuds de la palette", + "palette-editor": { + "disabled": "Éditeur de la palette désactivé : paramètres utilisateur", + "npm-not-found": "Éditeur de la palette désactivé : commande npm introuvable", + "npm-too-old": "Éditeur de la palette désactivé : version npm trop ancienne. Nécessite npm >= 3.x" + }, + "errors": "Échec de l'enregistrement de __count__ type de noeud", + "errors_plural": "Échec de l'enregistrement de __count__ types de noeud", + "errors-help": "Exécuter avec -v pour plus de détails", + "missing-modules": "Modules de noeud manquants :", + "node-version-mismatch": "Le module de noeud ne peut pas être chargé sur cette version. Nécessite : __version__ ", + "type-already-registered": "'__type__' déjà enregistré par le module __module__", + "removing-modules": "Suppression de modules de la configuration", + "added-types": "Types de noeuds ajoutés :", + "removed-types": "Types de noeuds supprimés :", + "install": { + "invalid": "Nom de module invalide", + "installing": "Installation du module : __nom__, version : __version__", + "installed": "Module installé : __nom__", + "install-failed": "L'installation a échoué", + "install-failed-long": "L'installation du module __name__ a échoué :", + "install-failed-not-found": "Module $t(server.install.install-failed-long) introuvable", + "install-failed-name": "$t(server.install.install-failed-long) nom de module invalide : __name__", + "install-failed-url": "URL invalide $t(server.install.install-failed-long) : __url__", + "post-install-error": "Erreur lors de l'exécution du hook 'postInstall' :", + "upgrading": "Mettre à jour le module : __name__ vers la version : __version__", + "upgraded": "Module mis à jour : __name__. Redémarrer Node-RED pour utiliser la nouvelle version", + "upgrade-failed-not-found": "Version $t(server.install.install-failed-long) introuvable", + "uninstalling": "Désinstallation du module : __name__", + "uninstall-failed": "La désinstallation a échoué", + "uninstall-failed-long": "La désinstallation du module __name__ a échoué :", + "uninstalled": "Module désinstallé : __name__", + "old-ext-mod-dir-warning": "\n\n---------------------------------------------------------------------\nRépertoire des modules externes Node-RED 1.3 détecté :\n __oldDir__\nCe répertoire n'est plus utilisé. Les modules externes seront\nréinstallés dans votre répertoire utilisateur Node-RED :\n __newDir__\nSupprimer l'ancien répertoire externalModules pour arrêter ce message.\n---------------------------------------------------------------------\n" + }, + "deprecatedOption": "L'utilisation de l'option __old__ est DÉCONSEILLÉE. Utiliser __new__ à la place", + "unable-to-listen": "Impossible d'écouter sur __listenpath__", + "port-in-use": "Erreur : port utilisé", + "uncaught-exception": "Exception non reconnu :", + "admin-ui-disabled": "Interface d'administration désactivée", + "now-running": "Le serveur tourne maintenant sur __listenpath__", + "failed-to-start": "Échec lors du démarrage du serveur :", + "headless-mode": "Fonctionne en mode sans bureau (headless)", + "httpadminauth-deprecated": "L'utilisation de httpAdminAuth est DÉCONSEILLÉE. Utiliser adminAuth à la place", + "https": { + "refresh-interval": "Actualisation des paramètres https toutes les __interval__ heures", + "settings-refreshed": "Les paramètres https du serveur ont été actualisés", + "refresh-failed": "Échec de l'actualisation des paramètres https : __message__", + "nodejs-version": "httpsRefreshInterval nécessite Node.js 11 ou version ultérieure", + "function-required": "httpsRefreshInterval nécessite que la propriété https soit une fonction" + } + }, + "api": { + "flows": { + "error-save": "Erreur lors de l'enregistrement des flux : __message__", + "error-reload": "Erreur lors du rechargement des flux : __message__" + }, + "library": { + "error-load-entry": "Erreur lors du chargement de l'entrée de la bibliothèque '__path__' : __message__", + "error-save-entry": "Erreur lors de l'enregistrement de l'entrée de la bibliothèque '__path__' : __message__", + "error-load-flow": "Erreur lors du chargement du flux '__path__' : __message__", + "error-save-flow": "Erreur lors de l'enregistrement du flux '__path__' : __message__" + }, + "nodes": { + "enabled": "Types de noeuds activés :", + "disabled": "Types de noeuds désactivés :", + "error-enable": "Échec de l'activation du noeud :" + } + }, + "comms": { + "error": "Erreur de canal de communication: __message__", + "error-server": "Erreur de communication avec le serveur : __message__", + "error-send": "Erreur d'envoi de communication : __message__" + }, + "settings": { + "user-not-available": "Impossible d'enregistrer les paramètres utilisateur : __message__", + "not-available": "Paramètres non disponibles", + "property-read-only": "La propriété '__prop__' est en lecture seule", + "readonly-mode": "Exécution en mode lecture seule. Les modifications ne seront pas enregistrées." + }, + "library": { + "unknownLibrary": "Bibliothèque inconnue : __library__", + "unknownType": "Type de bibliothèque inconnu : __type__", + "readOnly": "La bibliothèque __library__ est en lecture seule", + "failedToInit": "Échec de l'initialisation de la bibliothèque __library__ : __error__", + "invalidProperty": "Propriété invalide __prop__ : '__value__'" + }, + "nodes": { + "credentials": { + "error": "Erreur lors du chargement des identifiants : __message__", + "error-saving": "Erreur lors de l'enregistrement des identifiants : __message__", + "not-registered": "Le type d'identifiant '__type__' n'a pas été enregistré", + "system-key-warning": "\n\n---------------------------------------------------------------------\nVotre fichier contenant les identifiants de flux est chiffré à l'aide d'une clé générée par le système.\n\nSi la clé générée par le système est perdue pour une raison quelconque, votre fichier contenant\nles identifiants ne sera pas récupérable, vous devrez le supprimer et ressaisir vos identifiants.\n\nVous pouvez définir votre propre clé en utilisant l'option 'credentialSecret' dans\nvotre fichier de paramètres. Node-RED rechiffrera alors votre fichier contenant les identifiants\nà l'aide de la clé que vous avez choisie la prochaine fois que vous déploierez une modification.\n---------------------------------------------------------------------\n", + "unencrypted": "Utilisation d'identifiants non chiffrés", + "encryptedNotFound": "Identifiants chiffrés introuvables" + }, + "flows": { + "safe-mode": "Les flux se sont arrêtés en mode sans échec. Déployer les pour commencer.", + "registered-missing": "Type manquant enregistré : __type__", + "error": "Erreur lors du chargement des flux : __message__", + "starting-modified-nodes": "Démarrage des noeuds modifiés", + "starting-modified-flows": "Démarrage des flux modifiés", + "starting-flows": "Démarrage des flux", + "started-modified-nodes": "noeuds modifiés démarrés", + "started-modified-flows": "Flux modifiés démarrés", + "started-flows": "Flux démarrés", + "stopping-modified-nodes": "Arrêt des noeuds modifiés", + "stopping-modified-flows": "Arrêt des flux modifiés", + "stopping-flows": "Arrêt des flux", + "stopped-modified-nodes": "noeuds modifiés arrêtés", + "stopped-modified-flows": "Flux modifiés arrêtés", + "stopped-flows": "Flux arrêtés", + "stopped": "Arrêté", + "stopping-error": "Erreur lors de l'arrêt du noeud : __message__", + "updated-flows": "Flux mis à jour", + "added-flow": "Ajout du flux : __label__", + "updated-flow": "Flux mis à jour : __label__", + "removed-flow": "Flux supprimé : __label__", + "missing-types": "En attente d'enregistrement des types manquants :", + "missing-type-provided": " - __type__ (fourni par le module npm __module__)", + "missing-type-install-1": "Pour installer l'un des modules manquants, exécuter :", + "missing-type-install-2": "dans le répertoire :" + }, + "flow": { + "unknown-type": "Type inconnu : __type__", + "missing-types": "types manquants", + "error-loop": "Le message a dépassé le nombre maximum de captures (catches)" + }, + "index": { + "unrecognised-id": "Identifiant non reconnu : __id__", + "type-in-use": "Type en cours d'utilisation : __msg__", + "unrecognised-module": "Module non reconnu : __module__" + }, + "registry": { + "localfilesystem": { + "module-not-found": "Impossible de trouver le module '__module__'" + } + } + }, + "storage": { + "index": { + "forbidden-flow-name": "nom du flux interdit" + }, + "localfilesystem": { + "user-dir": "Répertoire utilisateur : __path__", + "flows-file": "Fichier des flux : __path__", + "create": "Création d'un nouveau fichier __type__", + "empty": "Le fichier __type__ existant est vide", + "invalid": "Le fichier __type__ existant n'est pas un json valide", + "restore": "Restauration de la sauvegarde du fichier __type__ : __path__", + "restore-fail": "La restauration de la sauvegarde du fichier __type__ a échoué : __message__", + "fsync-fail": "Échec du vidage du fichier __path__ sur le disque : __message__", + "warn_name": "Le nom du fichier de flux n'est pas défini. Génération du nom à l'aide du nom d'hôte.", + "projects": { + "changing-project": "Définition du projet actif : __project__", + "active-project": "Projet actif : __project__", + "projects-directory": "Répertoire des projets : __projectsDirectory__", + "project-not-found": "Projet introuvable : __project__", + "no-active-project": "Aucun projet actif : utilisation du fichier de flux par défaut", + "disabled": "Projets désactivés : editorTheme.projects.enabled=false", + "disabledNoFlag": "Projets désactivés : définisser editorTheme.projects.enabled=true pour activer", + "git-not-found": "Projets désactivés : commande git introuvable", + "git-version-old": "Projets désactivés : git __version__ non pris en charge. Nécessite 2.x", + "summary": "Un projet Node-RED", + "readme": "### À propos\n\nCeci est le fichier README.md de votre projet. Il aide les utilisateurs à comprendre ce que fait votre\nprojet, comment l'utiliser et tout ce qu'ils peuvent avoir besoin de savoir." + } + } + }, + "context": { + "log-store-init": "Stockage contextuel : '__name__' [__info__]", + "error-loading-module": "Erreur lors du chargement du stockage contextuel : __message__", + "error-loading-module2": "Erreur lors du chargement du stockage contextuel '__module__' : __message__", + "error-module-not-defined": "Option 'module' manquante dans le stockage contextuel '__storage__'", + "error-invalid-module-name": "Nom du stockage contextuel invalide : '__name__'", + "error-invalid-default-module": "Stockage contextuel par défaut inconnu : '__storage__'", + "unknown-store": "Stockage contextuel inconnu '__name__' spécifié. Utilisation du stockage par défaut.", + "localfilesystem": { + "invalid-json": "JSON non valide dans le fichier de contexte '__file__'", + "error-circular": "Le contexte __scope__ contient une référence circulaire qui ne peut pas être persistante", + "error-write": "Erreur d'écriture du contexte : __message__" + } + } +} From a9b6eaa31fb76e008d37d09f654d860d03f459ad Mon Sep 17 00:00:00 2001 From: GogoVega Date: Fri, 2 Dec 2022 18:15:06 +0100 Subject: [PATCH 132/253] Add French option in other languages --- .../node_modules/@node-red/editor-client/locales/de/editor.json | 1 + .../@node-red/editor-client/locales/en-US/editor.json | 1 + .../node_modules/@node-red/editor-client/locales/ja/editor.json | 1 + .../node_modules/@node-red/editor-client/locales/ru/editor.json | 1 + .../@node-red/editor-client/locales/zh-CN/editor.json | 1 + .../@node-red/editor-client/locales/zh-TW/editor.json | 1 + 6 files changed, 6 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/locales/de/editor.json b/packages/node_modules/@node-red/editor-client/locales/de/editor.json index 93a2f5946..f38119456 100755 --- a/packages/node_modules/@node-red/editor-client/locales/de/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/de/editor.json @@ -1175,6 +1175,7 @@ "languages": { "de": "Deutsch", "en-US": "Englisch", + "fr": "Französisch", "ja": "Japanisch", "ko": "Koreanisch", "ru": "Russisch", 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 0300a220f..6e1d52f94 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 @@ -1179,6 +1179,7 @@ "languages": { "de": "German", "en-US": "English", + "fr": "French", "ja": "Japanese", "ko": "Korean", "ru": "Russian", 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 b07b8e583..4f0135959 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 @@ -1179,6 +1179,7 @@ "languages": { "de": "ドイツ語", "en-US": "英語", + "fr": "フランス語", "ja": "日本語", "ko": "韓国語", "ru": "ロシア語", diff --git a/packages/node_modules/@node-red/editor-client/locales/ru/editor.json b/packages/node_modules/@node-red/editor-client/locales/ru/editor.json index d669b3f09..69108711a 100755 --- a/packages/node_modules/@node-red/editor-client/locales/ru/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/ru/editor.json @@ -1133,6 +1133,7 @@ "languages" : { "de": "Немецкий", "en-US": "Английский", + "fr": "Французский", "ja": "Японский", "ko": "Корейский", "ru": "Русский", diff --git a/packages/node_modules/@node-red/editor-client/locales/zh-CN/editor.json b/packages/node_modules/@node-red/editor-client/locales/zh-CN/editor.json index eca5878ae..10f06bc89 100644 --- a/packages/node_modules/@node-red/editor-client/locales/zh-CN/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/zh-CN/editor.json @@ -1087,6 +1087,7 @@ "languages": { "de": "德语", "en-US": "英文", + "fr": "法语", "ja": "日语", "ko": "韩文", "zh-CN": "简体中文", diff --git a/packages/node_modules/@node-red/editor-client/locales/zh-TW/editor.json b/packages/node_modules/@node-red/editor-client/locales/zh-TW/editor.json index 42316176f..6bce82048 100644 --- a/packages/node_modules/@node-red/editor-client/locales/zh-TW/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/zh-TW/editor.json @@ -1088,6 +1088,7 @@ "languages": { "de": "德語", "en-US": "英語", + "fr": "法語", "ja": "日語", "ko": "韓語", "zh-CN": "簡體中文", From 5be378e2661a1c62fc88bf3c7c6965430ef36349 Mon Sep 17 00:00:00 2001 From: GogoVega Date: Fri, 2 Dec 2022 18:27:36 +0100 Subject: [PATCH 133/253] fix: Typos (infinitif) --- .../nodes/locales/fr/common/20-inject.html | 2 +- .../nodes/locales/fr/common/60-link.html | 2 +- .../nodes/locales/fr/common/98-unknown.html | 4 ++-- .../nodes/locales/fr/function/80-template.html | 8 ++++---- .../@node-red/nodes/locales/fr/messages.json | 18 +++++++++--------- .../nodes/locales/fr/network/10-mqtt.html | 8 ++++---- .../nodes/locales/fr/network/21-httpin.html | 2 +- .../locales/fr/network/21-httprequest.html | 2 +- .../nodes/locales/fr/network/31-tcpin.html | 2 +- .../nodes/locales/fr/network/32-udp.html | 2 +- .../nodes/locales/fr/sequence/17-split.html | 4 ++-- .../nodes/locales/fr/storage/10-file.html | 2 +- 12 files changed, 28 insertions(+), 28 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/locales/fr/common/20-inject.html b/packages/node_modules/@node-red/nodes/locales/fr/common/20-inject.html index a506f584e..94f3d4ec1 100644 --- a/packages/node_modules/@node-red/nodes/locales/fr/common/20-inject.html +++ b/packages/node_modules/@node-red/nodes/locales/fr/common/20-inject.html @@ -35,6 +35,6 @@ supérieur à un jour, vous devriez envisager d'utiliser un noeud de planificateur capable de faire face aux pannes de courant et aux redémarrages.

      Remarque : Les options "Intervalle entre les heures" et "à une heure précise" utilisent le système cron standard. Cela signifie que pour la première option, vous pouvez envoyer un message à intervalle régulier entre les heures voulues. - Si vous voulez envoyer un message toutes les minutes à partir de maintenant, utilisez l'option "intervalle".

      + Si vous voulez envoyer un message toutes les minutes à partir de maintenant, utiliser l'option "intervalle".

      Remarque : Pour inclure une nouvelle ligne dans une chaîne, vous devez utiliser un noeud de fonction pour créer la charge utile.

      diff --git a/packages/node_modules/@node-red/nodes/locales/fr/common/60-link.html b/packages/node_modules/@node-red/nodes/locales/fr/common/60-link.html index 788ebcc40..1f53d8027 100644 --- a/packages/node_modules/@node-red/nodes/locales/fr/common/60-link.html +++ b/packages/node_modules/@node-red/nodes/locales/fr/common/60-link.html @@ -42,7 +42,7 @@

      Entrées

      targetchaîne de caractères
      -
      Lorsque l'option Type de lien est définie sur 'Cible dynamique', définissez msg.target sur le nom du +
      Lorsque l'option Type de lien est définie sur 'Cible dynamique', définisser msg.target sur le nom du noeud Link in que vous souhaitez appeler.

      Détails

      diff --git a/packages/node_modules/@node-red/nodes/locales/fr/common/98-unknown.html b/packages/node_modules/@node-red/nodes/locales/fr/common/98-unknown.html index 2854c7c42..ae2f7889e 100644 --- a/packages/node_modules/@node-red/nodes/locales/fr/common/98-unknown.html +++ b/packages/node_modules/@node-red/nodes/locales/fr/common/98-unknown.html @@ -19,10 +19,10 @@

      Détails

      Si vous déployez avec le noeud dans cet état, sa configuration sera préservée, mais le flux ne démarrera pas tant que le type manquant ne sera pas installé.

      -

      Utilisez l'option Menu - Gérer la palette +

      Utiliser l'option Menu - Gérer la palette pour rechercher et installer des noeuds, ou npm install <module> pour installer, tous les modules manquants et redémarrer Node-RED et réimporter les noeuds.

      -

      Il est possible que ce type de noeud soit déjà installé, mais qu'il manque une dépendance. Vérifiez au démarrage de Node-RED +

      Il est possible que ce type de noeud soit déjà installé, mais qu'il manque une dépendance. Vérifier au démarrage de Node-RED le log pour tous les messages d'erreurs associés au type de noeud manquant.

      Sinon, vous devez contacter l'auteur du flux pour obtenir une copie du type de noeud manquant.

      diff --git a/packages/node_modules/@node-red/nodes/locales/fr/function/80-template.html b/packages/node_modules/@node-red/nodes/locales/fr/function/80-template.html index 98945684d..e18121eb7 100644 --- a/packages/node_modules/@node-red/nodes/locales/fr/function/80-template.html +++ b/packages/node_modules/@node-red/nodes/locales/fr/function/80-template.html @@ -43,14 +43,14 @@ }

    La propriété résultante sera :

    Bonjour Kevin. Aujourd'hui nous sommes le lundi
    -

    Il est possible d'utiliser une propriété du contexte de flux ou du contexte global. Utilisez simplement {{flow.name}} ou - {{global.name}}, ou pour le stockage persistant store, utilisez {{flow[store].name}} ou +

    Il est possible d'utiliser une propriété du contexte de flux ou du contexte global. Utiliser simplement {{flow.name}} ou + {{global.name}}, ou pour le stockage persistant store, utiliser {{flow[store].name}} ou {{global[store].name}}.

    Remarque : Par défaut, moustache échappera toutes les entités non alphanumériques ou HTML dans les valeurs qu'il remplace. - Pour éviter cela, utilisez des accolades {{{triple}}}.

    + Pour éviter cela, utiliser des accolades {{{triple}}}.

    Si vous devez utiliser {{ }} dans votre contenu, vous pouvez modifier les caractères utilisé pour marquer les sections de modèle. Par exemple, pour utiliser [[ ]] - à la place, ajoutez la ligne suivante en haut du modèle :

    + à la place, ajouter la ligne suivante en haut du modèle :

    {{=[[ ]]=}}

    Utilisation des variables d'environnement

    Le noeud de modèle peut accéder aux variables d'environnement en utilisant la syntaxe :

    diff --git a/packages/node_modules/@node-red/nodes/locales/fr/messages.json b/packages/node_modules/@node-red/nodes/locales/fr/messages.json index 0f20c485c..e83ef5171 100644 --- a/packages/node_modules/@node-red/nodes/locales/fr/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/fr/messages.json @@ -382,7 +382,7 @@ "trigger": "déclencher", "trigger-block": "déclencher et bloquer", "trigger-loop": "renvoyer chaque", - "reset": "Réinitialisez le déclencheur si :", + "reset": "Réinitialiser le déclencheur si :", "resetMessage": "msg.reset est défini", "resetPayload": "msg.payload est le même", "resetprompt": "facultatif", @@ -397,7 +397,7 @@ "label": { "unknown": "inconnu" }, - "tip": "

    Ce noeud est un type inconnu de votre installation Node-RED.

    Si vous déployez avec le noeud dans cet état, sa configuration sera préservée, mais le flux ne démarrera pas avant que le type manquant soit installé.

    Consultez la barre latérale d'informations pour plus d'aide

    " + "tip": "

    Ce noeud est un type inconnu de votre installation Node-RED.

    Si vous déployez avec le noeud dans cet état, sa configuration sera préservée, mais le flux ne démarrera pas avant que le type manquant soit installé.

    Consulter la barre latérale d'informations pour plus d'aide

    " }, "mqtt": { "label": { @@ -446,7 +446,7 @@ "staticTopic": "S'abonner à un seul sujet", "dynamicTopic": "Abonnement dynamique", "auto-connect": "Se connecter automatiquement", - "auto-mode-depreciated": "Cette option est dépréciée. Veuillez utiliser le nouveau mode de détection automatique.", + "auto-mode-depreciated": "Cette option est dépréciée. Veuiller utiliser le nouveau mode de détection automatique.", "none": "aucun", "other": "autre" }, @@ -463,9 +463,9 @@ "placeholder": { "clientid": "Laisser vide pour s'auto générer", "clientid-nonclean": "Doit être défini pour les sessions non propres", - "will-topic": "Laissez vide pour désactiver le message perte de connexion", - "birth-topic": "Laissez vide pour désactiver le message au démarrage", - "close-topic": "Laissez vide pour désactiver le message de fermeture" + "will-topic": "Laisser vide pour désactiver le message perte de connexion", + "birth-topic": "Laisser vide pour désactiver le message au démarrage", + "close-topic": "Laisser vide pour désactiver le message de fermeture" }, "state": { "connected": "Connecté au courtier : __broker__", @@ -484,7 +484,7 @@ }, "true": "vraie", "false": "faux", - "tip": "Conseil : laissez le sujet, le qos ou le contenu vide si vous souhaitez les définir via les propriétés du msg.", + "tip": "Conseil : laisser le sujet, le qos ou le contenu vide si vous souhaitez les définir via les propriétés du msg.", "errors": { "not-defined": "sujet non défini", "missing-config": "configuration du courtier manquante", @@ -699,7 +699,7 @@ }, "tip": { "in": "Conseil : Assurez-vous que votre pare-feu autorise l'entrée des données.", - "out": "Conseil : laissez l'adresse et le port vides si vous souhaitez définir à l'aide de msg.ip et msg.port.", + "out": "Conseil : laisser l'adresse et le port vides si vous souhaitez définir à l'aide de msg.ip et msg.port.", "port": "Ports déjà utilisés : " }, "status": { @@ -981,7 +981,7 @@ }, "errors": { "nofilename": "Aucun nom de fichier spécifié", - "invaliddelete": "Attention : suppression non valide. Veuillez utiliser une option de suppression spécifique dans la boîte de dialogue de configuration.", + "invaliddelete": "Attention : suppression non valide. Veuiller utiliser une option de suppression spécifique dans la boîte de dialogue de configuration.", "deletefail": "échec de la suppression du fichier : __error__", "writefail": "échec de l'écriture dans le fichier : __error__", "appendfail": "échec de l'ajout au fichier : __error__", diff --git a/packages/node_modules/@node-red/nodes/locales/fr/network/10-mqtt.html b/packages/node_modules/@node-red/nodes/locales/fr/network/10-mqtt.html index 8706a616d..cc93a007f 100644 --- a/packages/node_modules/@node-red/nodes/locales/fr/network/10-mqtt.html +++ b/packages/node_modules/@node-red/nodes/locales/fr/network/10-mqtt.html @@ -68,7 +68,7 @@

    Si cette propriété est définie et que le courtier est déjà connecté, une erreur sera enregistré à moins qu'il n'ait la propriété force définie - auquel cas il sera - déconnecté du courtier, appliquez les nouveaux paramètres et reconnectez-vous.

    + déconnecté du courtier, appliquer les nouveaux paramètres et reconnectez-vous.

    @@ -79,7 +79,7 @@

    Entrées

    payload chaîne de caractères | tampon
    -
    la charge utile à publier. Si cette propriété n'est pas définie, aucun message ne sera envoyé. Pour envoyer un message vide, définissez cette propriété sur une chaîne vide.
    +
    la charge utile à publier. Si cette propriété n'est pas définie, aucun message ne sera envoyé. Pour envoyer un message vide, définisser cette propriété sur une chaîne vide.
    topic chaîne de caractères
    le sujet MQTT dans laquelle publier.
    qos numéro
    @@ -106,7 +106,7 @@

    Le sujet utilisé peut être configuré dans le noeud ou, s'il est laissé vide, peut être défini dans le msg.topic.

    De même, la QoS et les valeurs de conservation peuvent être configurées dans le noeud ou, si elles sont laissées vide, défini dans msg.qos et msg.retain respectivement. Pour effacer un - sujet retenu du courtier, envoyez un message vide à ce sujet avec l'indicateur de conservation défini.

    + sujet retenu du courtier, envoyer un message vide à ce sujet avec l'indicateur de conservation défini.

    Ce noeud nécessite une connexion à un courtier MQTT pour être configuré. Pour configurer cliquer sur l'icône du crayon.

    Plusieurs noeuds MQTT (entrant ou sortant) peuvent partager la même connexion de courtier si nécessaire.

    @@ -130,7 +130,7 @@

    Si cette propriété est définie et que le courtier est déjà connecté, une erreur sera enregistré à moins qu'il n'ait la propriété force définie - auquel cas il sera - déconnecté du courtier, appliquez les nouveaux paramètres et reconnectez-vous.

    + déconnecté du courtier, appliquer les nouveaux paramètres et reconnectez-vous.

    diff --git a/packages/node_modules/@node-red/nodes/locales/fr/network/21-httpin.html b/packages/node_modules/@node-red/nodes/locales/fr/network/21-httpin.html index f9f0f4c2e..7de4532ce 100644 --- a/packages/node_modules/@node-red/nodes/locales/fr/network/21-httpin.html +++ b/packages/node_modules/@node-red/nodes/locales/fr/network/21-httpin.html @@ -95,6 +95,6 @@ msg.cookies = {
  • path - (Chaîne) chemin du cookie. Par défaut à /
  • value - (Chaîne) la valeur à utiliser pour le cookie
  • -

    Pour supprimer un cookie, définissez sa valeur value sur null.

    +

    Pour supprimer un cookie, définisser sa valeur value sur null.

    diff --git a/packages/node_modules/@node-red/nodes/locales/fr/network/21-httprequest.html b/packages/node_modules/@node-red/nodes/locales/fr/network/21-httprequest.html index 87ccbd134..b757ba31a 100644 --- a/packages/node_modules/@node-red/nodes/locales/fr/network/21-httprequest.html +++ b/packages/node_modules/@node-red/nodes/locales/fr/network/21-httprequest.html @@ -42,7 +42,7 @@
    payload chaîne de caractères | objet | tampon
    Le corps de la réponse. Le noeud peut être configuré pour renvoyer le corps - en tant que chaîne, essayez de l'analyser en tant que chaîne JSON ou laissez-le en tant que + en tant que chaîne, essayer de l'analyser en tant que chaîne JSON ou laisser-le en tant que tampon binaire.
    statusCode nombre
    Le code d'état de la réponse, ou le code d'erreur si la demande n'a pas pu être complétée.
    diff --git a/packages/node_modules/@node-red/nodes/locales/fr/network/31-tcpin.html b/packages/node_modules/@node-red/nodes/locales/fr/network/31-tcpin.html index 02a4bb959..435a14b06 100644 --- a/packages/node_modules/@node-red/nodes/locales/fr/network/31-tcpin.html +++ b/packages/node_modules/@node-red/nodes/locales/fr/network/31-tcpin.html @@ -38,7 +38,7 @@

    Un simple noeud de requête TCP - envoie le msg.payload à un port tcp du serveur et attend une réponse.

    Se connecte, envoie la "requête" et lit la "réponse". Il peut soit compter un certain nombre de caractères renvoyés dans un tampon fixe, correspondant à un caractère spécifié avant de revenir, - attendre un délai fixe à partir de la première réponse, puis revenir, s'installer et attendez les données, ou envoie puis ferme la connexion + attendre un délai fixe à partir de la première réponse, puis revenir, s'installer et attender les données, ou envoie puis ferme la connexion immédiatement, sans attendre de réponse.

    La réponse sortira dans msg.payload en tant que tampon, vous pouvez alors utiliser la fonction .toString().

    Si vous laissez l'hôte ou le port tcp vide, ils doivent être définis à l'aide des propriétés msg.host et msg.port dans chaque message envoyé au noeud. diff --git a/packages/node_modules/@node-red/nodes/locales/fr/network/32-udp.html b/packages/node_modules/@node-red/nodes/locales/fr/network/32-udp.html index 54b028b42..c4486370c 100644 --- a/packages/node_modules/@node-red/nodes/locales/fr/network/32-udp.html +++ b/packages/node_modules/@node-red/nodes/locales/fr/network/32-udp.html @@ -26,6 +26,6 @@ diff --git a/packages/node_modules/@node-red/nodes/locales/fr/sequence/17-split.html b/packages/node_modules/@node-red/nodes/locales/fr/sequence/17-split.html index a93e8ab31..514bfacc9 100644 --- a/packages/node_modules/@node-red/nodes/locales/fr/sequence/17-split.html +++ b/packages/node_modules/@node-red/nodes/locales/fr/sequence/17-split.html @@ -72,7 +72,7 @@

    manuel
    Joindre des séquences de messages de différentes manières.
    réduire la séquence
    -
    Appliquez une expression à tous les messages d'une séquence pour la réduire à un seul message.
    +
    Appliquer une expression à tous les messages d'une séquence pour la réduire à un seul message.

    Entrées

    @@ -92,7 +92,7 @@
    complete
    S'il est défini, le noeud ajoutera la charge utile, puis enverra le message de sortie dans son état actuel. - Si vous ne souhaitez pas ajouter la charge utile, supprimez-la du msg.
    + Si vous ne souhaitez pas ajouter la charge utile, supprimer-la du msg.
    reset
    S'il est défini, le noeud effacera tout message partiellement terminé et ne l'enverra pas.
    restartTimeout
    diff --git a/packages/node_modules/@node-red/nodes/locales/fr/storage/10-file.html b/packages/node_modules/@node-red/nodes/locales/fr/storage/10-file.html index a8f969957..15c378a13 100644 --- a/packages/node_modules/@node-red/nodes/locales/fr/storage/10-file.html +++ b/packages/node_modules/@node-red/nodes/locales/fr/storage/10-file.html @@ -32,7 +32,7 @@

    Chaque charge utile du message sera ajoutée à la fin du fichier, en ajoutant éventuellement un caractère de saut de ligne (\n) entre chacun.

    Si msg.filename est utilisé, le fichier sera fermé après chaque écriture. - Pour de meilleures performances, utilisez un nom de fichier fixe.

    + Pour de meilleures performances, utiliser un nom de fichier fixe.

    Il peut être configuré pour écraser l'intégralité du fichier plutôt que de l'ajouter. Par exemple, lors de l'écriture de données binaires dans un fichier, comme une image, cette option doit être utilisée et l'option d'ajout d'une nouvelle ligne doit être désactivée.

    From a6934b3cba0dead36e54b44758dbe41fbb7ba7e6 Mon Sep 17 00:00:00 2001 From: GogoVega Date: Sat, 3 Dec 2022 09:37:08 +0100 Subject: [PATCH 134/253] fix: Typos (grammar) --- .../@node-red/editor-client/locales/fr/editor.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/locales/fr/editor.json b/packages/node_modules/@node-red/editor-client/locales/fr/editor.json index 2796e5587..4d0c811b2 100644 --- a/packages/node_modules/@node-red/editor-client/locales/fr/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/fr/editor.json @@ -192,8 +192,8 @@ }, "error": "Erreur : __message__", "errors": { - "lostConnection": "Connexion avec le serveur perdu, reconnexion...", - "lostConnectionReconnect": "Connexion avec le serveur perdu, reconnexion dans __time__s.", + "lostConnection": "Connexion avec le serveur perdue, reconnexion...", + "lostConnectionReconnect": "Connexion avec le serveur perdue, reconnexion dans __time__s.", "lostConnectionTry": "Essayer maintenant", "cannotAddSubflowToItself": "Impossible d'ajouter un sous-flux à lui-même", "cannotAddCircularReference": "Impossible d'ajouter un sous-flux - référence circulaire détectée", From 71db79ba53ea3090981fcc13afc975ae1da01be3 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 17 Nov 2022 12:55:57 +0000 Subject: [PATCH 135/253] More context menu options --- .../@node-red/editor-client/src/js/red.js | 12 +- .../editor-client/src/js/ui/contextMenu.js | 186 +++++++++++------- .../editor-client/src/js/ui/tab-help.js | 16 +- 3 files changed, 137 insertions(+), 77 deletions(-) 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..114066d91 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 @@ -668,11 +668,6 @@ var RED = (function() { ]}); menuOptions.push({id:"menu-item-arrange-menu", label:RED._("menu.label.arrange"), options: [ - {id: "menu-item-view-tools-move-to-back", label:RED._("menu.label.moveToBack"), disabled: true, onselect: "core:move-selection-to-back"}, - {id: "menu-item-view-tools-move-to-front", label:RED._("menu.label.moveToFront"), disabled: true, onselect: "core:move-selection-to-front"}, - {id: "menu-item-view-tools-move-backwards", label:RED._("menu.label.moveBackwards"), disabled: true, onselect: "core:move-selection-backwards"}, - {id: "menu-item-view-tools-move-forwards", label:RED._("menu.label.moveForwards"), disabled: true, onselect: "core:move-selection-forwards"}, - null, {id: "menu-item-view-tools-align-left", label:RED._("menu.label.alignLeft"), disabled: true, onselect: "core:align-selection-to-left"}, {id: "menu-item-view-tools-align-center", label:RED._("menu.label.alignCenter"), disabled: true, onselect: "core:align-selection-to-center"}, {id: "menu-item-view-tools-align-right", label:RED._("menu.label.alignRight"), disabled: true, onselect: "core:align-selection-to-right"}, @@ -682,7 +677,12 @@ var RED = (function() { {id: "menu-item-view-tools-align-bottom", label:RED._("menu.label.alignBottom"), disabled: true, onselect: "core:align-selection-to-bottom"}, null, {id: "menu-item-view-tools-distribute-horizontally", label:RED._("menu.label.distributeHorizontally"), disabled: true, onselect: "core:distribute-selection-horizontally"}, - {id: "menu-item-view-tools-distribute-veritcally", label:RED._("menu.label.distributeVertically"), disabled: true, onselect: "core:distribute-selection-vertically"} + {id: "menu-item-view-tools-distribute-veritcally", label:RED._("menu.label.distributeVertically"), disabled: true, onselect: "core:distribute-selection-vertically"}, + null, + {id: "menu-item-view-tools-move-to-back", label:RED._("menu.label.moveToBack"), disabled: true, onselect: "core:move-selection-to-back"}, + {id: "menu-item-view-tools-move-to-front", label:RED._("menu.label.moveToFront"), disabled: true, onselect: "core:move-selection-to-front"}, + {id: "menu-item-view-tools-move-backwards", label:RED._("menu.label.moveBackwards"), disabled: true, onselect: "core:move-selection-backwards"}, + {id: "menu-item-view-tools-move-forwards", label:RED._("menu.label.moveForwards"), disabled: true, onselect: "core:move-selection-forwards"} ]}); menuOptions.push(null); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js b/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js index f1b95c324..ef69ea330 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js @@ -30,7 +30,8 @@ RED.contextMenu = (function () { const isGroup = hasSelection && selection.nodes.length === 1 && selection.nodes[0].type === 'group' const canEdit = !RED.workspaces.isActiveLocked() const canRemoveFromGroup = hasSelection && !!selection.nodes[0].g - + const isAllGroups = hasSelection && selection.nodes.filter(n => n.type !== 'group').length === 0 + const hasGroup = hasSelection && selection.nodes.filter(n => n.type === 'group' ).length > 0 const offset = $("#red-ui-workspace-chart").offset() let addX = options.x - offset.left + $("#red-ui-workspace-chart").scrollLeft() @@ -43,64 +44,121 @@ RED.contextMenu = (function () { } menuItems.push( - { onselect: 'core:show-action-list', onpostselect: function () { } }, + { onselect: 'core:show-action-list', onpostselect: function () { } } + ) + + const insertOptions = [] + menuItems.push({ label: RED._("contextMenu.insert"), options: insertOptions }) + insertOptions.push( { - label: RED._("contextMenu.insert"), - options: [ - { - label: RED._("contextMenu.node"), - onselect: function () { - RED.view.showQuickAddDialog({ - position: [addX, addY], - touchTrigger: true, - splice: isSingleLink ? selection.links[0] : undefined, - // spliceMultiple: isMultipleLinks - }) - }, - disabled: !canEdit - }, - (hasLinks) ? { // has least 1 wire selected - label: RED._("contextMenu.junction"), - onselect: 'core:split-wires-with-junctions', - disabled: !canEdit || !hasLinks - } : { - label: RED._("contextMenu.junction"), - onselect: function () { - const nn = { - _def: { defaults: {} }, - type: 'junction', - z: RED.workspaces.active(), - id: RED.nodes.id(), - x: addX, - y: addY, - w: 0, h: 0, - outputs: 1, - inputs: 1, - dirty: true - } - const historyEvent = { - dirty: RED.nodes.dirty(), - t: 'add', - junctions: [nn] - } - RED.nodes.addJunction(nn); - RED.history.push(historyEvent); - RED.nodes.dirty(true); - RED.view.select({nodes: [nn] }); - RED.view.redraw(true) - }, - disabled: !canEdit - }, - { - label: RED._("contextMenu.linkNodes"), - onselect: 'core:split-wire-with-link-nodes', - disabled: !canEdit || !hasLinks - } - ] - - - + label: RED._("contextMenu.node"), + onselect: function () { + RED.view.showQuickAddDialog({ + position: [addX, addY], + touchTrigger: true, + splice: isSingleLink ? selection.links[0] : undefined, + // spliceMultiple: isMultipleLinks + }) + }, + disabled: !canEdit }, + (hasLinks) ? { // has least 1 wire selected + label: RED._("contextMenu.junction"), + onselect: 'core:split-wires-with-junctions', + disabled: !canEdit || !hasLinks + } : { + label: RED._("contextMenu.junction"), + onselect: function () { + const nn = { + _def: { defaults: {} }, + type: 'junction', + z: RED.workspaces.active(), + id: RED.nodes.id(), + x: addX, + y: addY, + w: 0, h: 0, + outputs: 1, + inputs: 1, + dirty: true + } + const historyEvent = { + dirty: RED.nodes.dirty(), + t: 'add', + junctions: [nn] + } + RED.nodes.addJunction(nn); + RED.history.push(historyEvent); + RED.nodes.dirty(true); + RED.view.select({nodes: [nn] }); + RED.view.redraw(true) + }, + disabled: !canEdit + }, + { + label: RED._("contextMenu.linkNodes"), + onselect: 'core:split-wire-with-link-nodes', + disabled: !canEdit || !hasLinks + }, + null, + { onselect: 'core:show-import-dialog', label: RED._('common.label.import')}, + { onselect: 'core:show-examples-import-dialog', label: 'Import Example Flow' } + ) + if (hasSelection && canEdit) { + const nodeOptions = [] + if (!hasMultipleSelection && !isGroup) { + nodeOptions.push( + { onselect: 'core:show-node-help' }, + null + ) + } + nodeOptions.push( + { onselect: 'core:enable-selected-nodes' }, + { onselect: 'core:disable-selected-nodes' }, + null, + { onselect: 'core:show-selected-node-labels' }, + { onselect: 'core:hide-selected-node-labels' } + ) + menuItems.push({ + label: 'Node', + options: nodeOptions + }) + menuItems.push({ + label: 'Group', + options: [ + { onselect: 'core:group-selection' }, + { onselect: 'core:ungroup-selection', disabled: !hasGroup }, + null, + { onselect: 'core:copy-group-style', disabled: !hasGroup }, + { onselect: 'core:paste-group-style', disabled: !hasGroup} + ] + }) + if (canRemoveFromGroup) { + menuItems[menuItems.length - 1].options.push( + null, + { onselect: 'core:remove-selection-from-group', label: RED._("menu.label.groupRemoveSelection") } + ) + } + } + if (canEdit && hasMultipleSelection) { + menuItems.push({ + label: 'Arrange', + options: [ + { label:RED._("menu.label.alignLeft"), onselect: "core:align-selection-to-left"}, + { label:RED._("menu.label.alignCenter"), onselect: "core:align-selection-to-center"}, + { label:RED._("menu.label.alignRight"), onselect: "core:align-selection-to-right"}, + null, + { label:RED._("menu.label.alignTop"), onselect: "core:align-selection-to-top"}, + { label:RED._("menu.label.alignMiddle"), onselect: "core:align-selection-to-middle"}, + { label:RED._("menu.label.alignBottom"), onselect: "core:align-selection-to-bottom"}, + null, + { label:RED._("menu.label.distributeHorizontally"), onselect: "core:distribute-selection-horizontally"}, + { label:RED._("menu.label.distributeVertically"), onselect: "core:distribute-selection-vertically"} + ] + }) + } + + + menuItems.push( null, { onselect: 'core:undo', disabled: RED.history.list().length === 0 }, { onselect: 'core:redo', disabled: RED.history.listRedo().length === 0 }, @@ -109,22 +167,10 @@ RED.contextMenu = (function () { { onselect: 'core:copy-selection-to-internal-clipboard', label: RED._("keyboard.copyNode"), disabled: !hasSelection }, { onselect: 'core:paste-from-internal-clipboard', label: RED._("keyboard.pasteNode"), disabled: !canEdit || !RED.view.clipboard() }, { onselect: 'core:delete-selection', disabled: !canEdit || !canDelete }, + { onselect: 'core:delete-selection-and-reconnect', label: 'Delete and Reconnect', disabled: !canEdit || !canDelete }, { onselect: 'core:show-export-dialog', label: RED._("menu.label.export") }, { onselect: 'core:select-all-nodes' }, ) - - if (hasSelection && canEdit) { - menuItems.push( - null, - isGroup ? - { onselect: 'core:ungroup-selection', disabled: !canEdit || !isGroup } - : { onselect: 'core:group-selection', disabled: !canEdit || !hasSelection } - ) - if (canRemoveFromGroup && canEdit) { - menuItems.push({ onselect: 'core:remove-selection-from-group', label: RED._("menu.label.groupRemoveSelection") }) - } - - } } var direction = "right"; diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-help.js b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-help.js index e5199b5bc..ebd3d4220 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-help.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-help.js @@ -141,7 +141,8 @@ RED.sidebar.help = (function() { RED.events.on('registry:node-type-removed', queueRefresh); RED.events.on('subflows:change', refreshSubflow); - RED.actions.add("core:show-help-tab",show); + RED.actions.add("core:show-help-tab", show); + RED.actions.add("core:show-node-help", showNodeHelp) } @@ -338,6 +339,19 @@ RED.sidebar.help = (function() { resizeStack(); } + function showNodeHelp(node) { + if (!node) { + const selection = RED.view.selection() + if (selection.nodes && selection.nodes.length > 0) { + node = selection.nodes.find(n => n.type !== 'group' && n.type !== 'junction') + } + } + if (node) { + show(node.type, true) + } + } + + // TODO: DRY - projects.js function addTargetToExternalLinks(el) { $(el).find("a").each(function(el) { From 2d6e1d7089583501c95a773d576520e8c637f007 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Sat, 3 Dec 2022 21:29:27 +0000 Subject: [PATCH 136/253] NLS updates for context menu --- .../@node-red/editor-client/locales/en-US/editor.json | 2 ++ .../@node-red/editor-client/src/js/ui/contextMenu.js | 10 +++++----- 2 files changed, 7 insertions(+), 5 deletions(-) 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 e74dbdbaa..6dcbd1d75 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 @@ -107,6 +107,7 @@ "displayStatus": "Show node status", "displayConfig": "Configuration nodes", "import": "Import", + "importExample": "Import Example Flow", "export": "Export", "search": "Search flows", "searchInput": "search your flows", @@ -503,6 +504,7 @@ "addRemoveNode": "Add/remove node from selection", "editSelected": "Edit selected node", "deleteSelected": "Delete selected nodes or link", + "deleteReconnect": "Delete and Reconnect", "importNode": "Import nodes", "exportNode": "Export nodes", "nudgeNode": "Move selected nodes (1px)", diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js b/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js index ef69ea330..57d5bbcf9 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js @@ -101,7 +101,7 @@ RED.contextMenu = (function () { }, null, { onselect: 'core:show-import-dialog', label: RED._('common.label.import')}, - { onselect: 'core:show-examples-import-dialog', label: 'Import Example Flow' } + { onselect: 'core:show-examples-import-dialog', label: RED._('menu.label.importExample') } ) if (hasSelection && canEdit) { const nodeOptions = [] @@ -119,11 +119,11 @@ RED.contextMenu = (function () { { onselect: 'core:hide-selected-node-labels' } ) menuItems.push({ - label: 'Node', + label: RED._('sidebar.info.node'), options: nodeOptions }) menuItems.push({ - label: 'Group', + label: RED._('sidebar.info.group'), options: [ { onselect: 'core:group-selection' }, { onselect: 'core:ungroup-selection', disabled: !hasGroup }, @@ -141,7 +141,7 @@ RED.contextMenu = (function () { } if (canEdit && hasMultipleSelection) { menuItems.push({ - label: 'Arrange', + label: RED._('menu.label.arrange'), options: [ { label:RED._("menu.label.alignLeft"), onselect: "core:align-selection-to-left"}, { label:RED._("menu.label.alignCenter"), onselect: "core:align-selection-to-center"}, @@ -167,7 +167,7 @@ RED.contextMenu = (function () { { onselect: 'core:copy-selection-to-internal-clipboard', label: RED._("keyboard.copyNode"), disabled: !hasSelection }, { onselect: 'core:paste-from-internal-clipboard', label: RED._("keyboard.pasteNode"), disabled: !canEdit || !RED.view.clipboard() }, { onselect: 'core:delete-selection', disabled: !canEdit || !canDelete }, - { onselect: 'core:delete-selection-and-reconnect', label: 'Delete and Reconnect', disabled: !canEdit || !canDelete }, + { onselect: 'core:delete-selection-and-reconnect', label: RED._('keyboard.deleteReconnect'), disabled: !canEdit || !canDelete }, { onselect: 'core:show-export-dialog', label: RED._("menu.label.export") }, { onselect: 'core:select-all-nodes' }, ) From 3630056ed8ad7020299fb39e3f47651503460053 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Sat, 3 Dec 2022 21:44:33 +0000 Subject: [PATCH 137/253] Fix RED.nodes.clear() when handling locked flows --- .../node_modules/@node-red/editor-client/src/js/nodes.js | 8 +++++++- 1 file changed, 7 insertions(+), 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 cdaf0e00a..a7bfc1191 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 @@ -2560,11 +2560,17 @@ RED.nodes = (function() { junctions = {}; junctionsByZ = {}; + var workspaceIds = Object.keys(workspaces); + // Ensure all workspaces are unlocked so we don't get any edit-protection + // preventing removal + workspaceIds.forEach(function(id) { + workspaces[id].locked = false + }); + var subflowIds = Object.keys(subflows); subflowIds.forEach(function(id) { RED.subflow.removeSubflow(id) }); - var workspaceIds = Object.keys(workspaces); workspaceIds.forEach(function(id) { RED.workspaces.remove(workspaces[id]); }); From dce1cccbdeff405a890fc6d8b684d51f138f27f1 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Sat, 3 Dec 2022 22:30:35 +0000 Subject: [PATCH 138/253] Allow subflow to be edited if instance exists on locked flow --- .../@node-red/editor-client/src/js/ui/palette.js | 2 +- .../@node-red/editor-client/src/js/ui/subflow.js | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js index ceaa33775..11ec82772 100755 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js @@ -290,7 +290,7 @@ RED.palette = (function() { revertDuration: 200, containment:'#red-ui-main-container', start: function() { - dropEnabled = !RED.nodes.workspace(RED.workspaces.active()).locked; + dropEnabled = !(RED.nodes.workspace(RED.workspaces.active())?.locked); paletteWidth = $("#red-ui-palette").width(); paletteTop = $("#red-ui-palette").parent().position().top + $("#red-ui-palette-container").position().top; hoverGroup = null; diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js b/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js index 110533c1e..106e1a72a 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js @@ -273,6 +273,11 @@ RED.subflow = (function() { var subflowInstances = []; if (activeSubflow) { RED.nodes.filterNodes({type:"subflow:"+activeSubflow.id}).forEach(function(n) { + const parentFlow = RED.nodes.workspace(n.z) + const wasLocked = parentFlow && parentFlow.locked + if (wasLocked) { + parentFlow.locked = false + } subflowInstances.push({ id: n.id, changed: n.changed @@ -285,6 +290,9 @@ RED.subflow = (function() { n.resize = true; n.dirty = true; RED.editor.updateNodeProperties(n); + if (wasLocked) { + parentFlow.locked = true + } }); RED.editor.validateNode(activeSubflow); return { From b3f761776d79dbb730714486a799ce30be9780a4 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Sat, 3 Dec 2022 22:43:03 +0000 Subject: [PATCH 139/253] Update dependencies --- package.json | 36 +++++++++---------- .../@node-red/editor-api/package.json | 6 ++-- .../node_modules/@node-red/nodes/package.json | 12 +++---- .../@node-red/registry/package.json | 6 ++-- .../@node-red/runtime/package.json | 4 +-- .../node_modules/@node-red/util/package.json | 4 +-- packages/node_modules/node-red/package.json | 6 ++-- 7 files changed, 37 insertions(+), 37 deletions(-) diff --git a/package.json b/package.json index b596e10b6..ad65edd90 100644 --- a/package.json +++ b/package.json @@ -26,13 +26,13 @@ } ], "dependencies": { - "acorn": "8.7.1", + "acorn": "8.8.1", "acorn-walk": "8.2.0", - "ajv": "8.11.0", - "async-mutex": "0.3.2", + "ajv": "8.11.2", + "async-mutex": "0.4.0", "basic-auth": "2.0.1", "bcryptjs": "2.4.3", - "body-parser": "1.20.0", + "body-parser": "1.20.1", "cheerio": "1.0.0-rc.10", "clone": "2.1.2", "content-type": "1.0.4", @@ -40,16 +40,16 @@ "cookie-parser": "1.4.6", "cors": "2.8.5", "cronosjs": "1.7.1", - "denque": "2.0.1", - "express": "4.18.1", + "denque": "2.1.0", + "express": "4.18.2", "express-session": "1.17.3", "form-data": "4.0.0", "fs-extra": "10.1.0", "got": "11.8.5", "hash-sum": "2.0.0", - "hpagent": "1.0.0", + "hpagent": "1.2.0", "https-proxy-agent": "5.0.1", - "i18next": "21.8.14", + "i18next": "21.10.0", "iconv-lite": "0.6.3", "is-utf8": "0.2.1", "js-yaml": "4.1.0", @@ -60,7 +60,7 @@ "memorystore": "1.6.7", "mime": "3.0.0", "moment": "2.29.4", - "moment-timezone": "0.5.34", + "moment-timezone": "0.5.39", "mqtt": "4.3.7", "multer": "1.4.5-lts.1", "mustache": "4.2.0", @@ -73,19 +73,19 @@ "passport-http-bearer": "1.0.1", "passport-oauth2-client-password": "0.1.2", "raw-body": "2.5.1", - "semver": "7.3.7", - "tar": "6.1.11", - "tough-cookie": "4.0.0", - "uglify-js": "3.16.2", + "semver": "7.3.8", + "tar": "6.1.12", + "tough-cookie": "4.1.2", + "uglify-js": "3.17.4", "uuid": "8.3.2", "ws": "7.5.6", "xml2js": "0.4.23" }, "optionalDependencies": { - "bcrypt": "5.0.1" + "bcrypt": "5.1.0" }, "devDependencies": { - "dompurify": "2.3.9", + "dompurify": "2.4.1", "grunt": "1.5.3", "grunt-chmod": "~1.1.1", "grunt-cli": "~1.4.3", @@ -108,13 +108,13 @@ "i18next-http-backend": "1.4.1", "jquery-i18next": "1.2.1", "jsdoc-nr-template": "github:node-red/jsdoc-nr-template", - "marked": "4.0.18", + "marked": "4.2.3", "minami": "1.2.3", "mocha": "9.2.2", "node-red-node-test-helper": "^0.3.0", - "nodemon": "2.0.19", + "nodemon": "2.0.20", "proxy": "^1.0.2", - "sass": "1.53.0", + "sass": "1.56.1", "should": "13.2.3", "sinon": "11.1.2", "stoppable": "^1.1.0", diff --git a/packages/node_modules/@node-red/editor-api/package.json b/packages/node_modules/@node-red/editor-api/package.json index dd7020e75..01fcb0ec8 100644 --- a/packages/node_modules/@node-red/editor-api/package.json +++ b/packages/node_modules/@node-red/editor-api/package.json @@ -19,11 +19,11 @@ "@node-red/util": "3.1.0-beta.0", "@node-red/editor-client": "3.1.0-beta.0", "bcryptjs": "2.4.3", - "body-parser": "1.20.0", + "body-parser": "1.20.1", "clone": "2.1.2", "cors": "2.8.5", "express-session": "1.17.3", - "express": "4.18.1", + "express": "4.18.2", "memorystore": "1.6.7", "mime": "3.0.0", "multer": "1.4.5-lts.1", @@ -35,6 +35,6 @@ "ws": "7.5.6" }, "optionalDependencies": { - "bcrypt": "5.0.1" + "bcrypt": "5.1.0" } } diff --git a/packages/node_modules/@node-red/nodes/package.json b/packages/node_modules/@node-red/nodes/package.json index 9db16efc0..c4b7023dd 100644 --- a/packages/node_modules/@node-red/nodes/package.json +++ b/packages/node_modules/@node-red/nodes/package.json @@ -15,22 +15,22 @@ } ], "dependencies": { - "acorn": "8.7.1", + "acorn": "8.8.1", "acorn-walk": "8.2.0", - "ajv": "8.11.0", - "body-parser": "1.20.0", + "ajv": "8.11.2", + "body-parser": "1.20.1", "cheerio": "1.0.0-rc.10", "content-type": "1.0.4", "cookie-parser": "1.4.6", "cookie": "0.5.0", "cors": "2.8.5", "cronosjs": "1.7.1", - "denque": "2.0.1", + "denque": "2.1.0", "form-data": "4.0.0", "fs-extra": "10.1.0", "got": "11.8.5", "hash-sum": "2.0.0", - "hpagent": "1.0.0", + "hpagent": "1.2.0", "https-proxy-agent": "5.0.1", "is-utf8": "0.2.1", "js-yaml": "4.1.0", @@ -41,7 +41,7 @@ "node-watch": "0.7.3", "on-headers": "1.0.2", "raw-body": "2.5.1", - "tough-cookie": "4.0.0", + "tough-cookie": "4.1.2", "uuid": "8.3.2", "ws": "7.5.6", "xml2js": "0.4.23", diff --git a/packages/node_modules/@node-red/registry/package.json b/packages/node_modules/@node-red/registry/package.json index 088bba36a..8dbe03d5b 100644 --- a/packages/node_modules/@node-red/registry/package.json +++ b/packages/node_modules/@node-red/registry/package.json @@ -19,8 +19,8 @@ "@node-red/util": "3.1.0-beta.0", "clone": "2.1.2", "fs-extra": "10.1.0", - "semver": "7.3.7", - "tar": "6.1.11", - "uglify-js": "3.16.2" + "semver": "7.3.8", + "tar": "6.1.12", + "uglify-js": "3.17.4" } } diff --git a/packages/node_modules/@node-red/runtime/package.json b/packages/node_modules/@node-red/runtime/package.json index 14171f1d6..f3c58ee71 100644 --- a/packages/node_modules/@node-red/runtime/package.json +++ b/packages/node_modules/@node-red/runtime/package.json @@ -18,9 +18,9 @@ "dependencies": { "@node-red/registry": "3.1.0-beta.0", "@node-red/util": "3.1.0-beta.0", - "async-mutex": "0.3.2", + "async-mutex": "0.4.0", "clone": "2.1.2", - "express": "4.18.1", + "express": "4.18.2", "fs-extra": "10.1.0", "json-stringify-safe": "5.0.1" } diff --git a/packages/node_modules/@node-red/util/package.json b/packages/node_modules/@node-red/util/package.json index aa82273f6..a02b99711 100644 --- a/packages/node_modules/@node-red/util/package.json +++ b/packages/node_modules/@node-red/util/package.json @@ -16,11 +16,11 @@ ], "dependencies": { "fs-extra": "10.1.0", - "i18next": "21.8.14", + "i18next": "21.10.0", "json-stringify-safe": "5.0.1", "jsonata": "1.8.6", "lodash.clonedeep": "^4.5.0", "moment": "2.29.4", - "moment-timezone": "0.5.34" + "moment-timezone": "0.5.39" } } diff --git a/packages/node_modules/node-red/package.json b/packages/node_modules/node-red/package.json index b4c4e53f0..e87a14c97 100644 --- a/packages/node_modules/node-red/package.json +++ b/packages/node_modules/node-red/package.json @@ -37,14 +37,14 @@ "@node-red/nodes": "3.1.0-beta.0", "basic-auth": "2.0.1", "bcryptjs": "2.4.3", - "express": "4.18.1", + "express": "4.18.2", "fs-extra": "10.1.0", "node-red-admin": "^3.0.0", "nopt": "5.0.0", - "semver": "7.3.7" + "semver": "7.3.8" }, "optionalDependencies": { - "bcrypt": "5.0.1" + "bcrypt": "5.1.0" }, "engines": { "node": ">=14" From e804addf0ae5179b076048af80911b4e26f380bf Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Sat, 3 Dec 2022 23:13:44 +0000 Subject: [PATCH 140/253] Prevent dbl-click opening node edit dialog with text selected Fixes #3958 --- .../node_modules/@node-red/editor-client/src/js/ui/view.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 17e1e87e3..03e4d3cd9 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -3369,6 +3369,9 @@ RED.view = (function() { } if (dblClickPrimed && mousedown_node == d && clickElapsed > 0 && clickElapsed < dblClickInterval) { mouse_mode = RED.state.DEFAULT; + // Avoid dbl click causing text selection. + d3.event.preventDefault() + document.getSelection().removeAllRanges() if (d.type != "subflow") { if (/^subflow:/.test(d.type) && (d3.event.ctrlKey || d3.event.metaKey)) { RED.workspaces.show(d.type.substring(8)); From c18018f0175be51b54375f20e86b167cea8c48e6 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Sat, 3 Dec 2022 23:33:33 +0000 Subject: [PATCH 141/253] Ensure credentials object is removed before returning node in getFlow request Fixes #3953 --- .../@node-red/runtime/lib/flows/index.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/node_modules/@node-red/runtime/lib/flows/index.js b/packages/node_modules/@node-red/runtime/lib/flows/index.js index 1b5476a3f..f37b922fc 100644 --- a/packages/node_modules/@node-red/runtime/lib/flows/index.js +++ b/packages/node_modules/@node-red/runtime/lib/flows/index.js @@ -641,6 +641,7 @@ function getFlow(id) { if (node.type === 'link out') { delete node.wires; } + delete node.credentials; return node; }) } @@ -648,7 +649,10 @@ function getFlow(id) { if (flow.configs) { var configIds = Object.keys(flow.configs); result.configs = configIds.map(function(configId) { - return clone(flow.configs[configId]); + const node = clone(flow.configs[configId]); + delete node.credentials; + return node + }) if (result.configs.length === 0) { delete result.configs; @@ -660,12 +664,16 @@ function getFlow(id) { var subflow = clone(flow.subflows[subflowId]); var nodeIds = Object.keys(subflow.nodes); subflow.nodes = nodeIds.map(function(id) { - return subflow.nodes[id]; + const node = clone(subflow.nodes[id]) + delete node.credentials + return node }); if (subflow.configs) { var configIds = Object.keys(subflow.configs); subflow.configs = configIds.map(function(id) { - return subflow.configs[id]; + const node = clone(subflow.configs[id]) + delete node.credentials + return node }) } delete subflow.instances; From a479b8a5d74079f1aec326074f7a8c60e0be42b9 Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Mon, 5 Dec 2022 11:15:32 +0900 Subject: [PATCH 142/253] Update packages/node_modules/@node-red/nodes/core/common/91-global-config.html Co-authored-by: Nick O'Leary --- .../@node-red/nodes/core/common/91-global-config.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/core/common/91-global-config.html b/packages/node_modules/@node-red/nodes/core/common/91-global-config.html index 8ef9cc4a7..a2f857961 100644 --- a/packages/node_modules/@node-red/nodes/core/common/91-global-config.html +++ b/packages/node_modules/@node-red/nodes/core/common/91-global-config.html @@ -1,6 +1,6 @@ From e61cdff6558f3f8ea4ca01c7ce3ba101b35ec4f3 Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Mon, 5 Dec 2022 11:15:43 +0900 Subject: [PATCH 143/253] Update packages/node_modules/@node-red/editor-client/src/js/ui/env-var.js Co-authored-by: Nick O'Leary --- .../@node-red/editor-client/src/js/ui/env-var.js | 16 ---------------- 1 file changed, 16 deletions(-) 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 index a8f852307..f3d2bcfa7 100644 --- 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 @@ -1,19 +1,3 @@ -/** - * 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") From c9664cc42580d34a1b87d793e1906173fd191618 Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Mon, 5 Dec 2022 11:16:35 +0900 Subject: [PATCH 144/253] Update packages/node_modules/@node-red/nodes/locales/en-US/common/91-global-config.html Co-authored-by: Nick O'Leary --- .../locales/en-US/common/91-global-config.html | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/locales/en-US/common/91-global-config.html b/packages/node_modules/@node-red/nodes/locales/en-US/common/91-global-config.html index 397bdcb8a..0a3021762 100644 --- a/packages/node_modules/@node-red/nodes/locales/en-US/common/91-global-config.html +++ b/packages/node_modules/@node-red/nodes/locales/en-US/common/91-global-config.html @@ -1,19 +1,3 @@ - - From 169fa940e43d52eafbd3bac6f8c1990ac01bb677 Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Mon, 5 Dec 2022 11:16:53 +0900 Subject: [PATCH 145/253] Update packages/node_modules/@node-red/nodes/locales/en-US/messages.json Co-authored-by: Nick O'Leary --- .../node_modules/@node-red/nodes/locales/en-US/messages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json index ad7c5567b..dac3a3071 100644 --- a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json @@ -1125,6 +1125,6 @@ } }, "global-config": { - "tip": "

    This node holds global configuration of flows.

    Do not delete this node unless you understand underlying mechanism.

    " + "tip": "

    This node holds the global configuration of flows, including global environment variables.

    " } } From 0fb739f7cd700d8ed4aa72c924fdb0c9c3a08818 Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Mon, 5 Dec 2022 11:17:04 +0900 Subject: [PATCH 146/253] Update packages/node_modules/@node-red/nodes/locales/ja/common/91-global-config.html Co-authored-by: Nick O'Leary --- .../locales/ja/common/91-global-config.html | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/locales/ja/common/91-global-config.html b/packages/node_modules/@node-red/nodes/locales/ja/common/91-global-config.html index 6d0602f86..267cf86a0 100644 --- a/packages/node_modules/@node-red/nodes/locales/ja/common/91-global-config.html +++ b/packages/node_modules/@node-red/nodes/locales/ja/common/91-global-config.html @@ -1,19 +1,3 @@ - - p From 1674bbbde964c836dbd370a282bf95124102e128 Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Mon, 5 Dec 2022 11:17:20 +0900 Subject: [PATCH 147/253] Update packages/node_modules/@node-red/nodes/locales/ja/messages.json Co-authored-by: Nick O'Leary --- packages/node_modules/@node-red/nodes/locales/ja/messages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/locales/ja/messages.json b/packages/node_modules/@node-red/nodes/locales/ja/messages.json index c5773972d..fe8d1b1fe 100644 --- a/packages/node_modules/@node-red/nodes/locales/ja/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/ja/messages.json @@ -1125,6 +1125,6 @@ } }, "global-config": { - "tip": "

    このノードはフローの大域的な設定を保持するために利用されます。

    実装の詳細を理解していない場合、このノードの削除は推奨しません。

    " + "tip": "

    このノードはフローの大域的な設定を保持するために利用されます。

    " } } From 41ef9ae01046e09003984813a6a5072e7837b03e Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Mon, 5 Dec 2022 11:17:29 +0900 Subject: [PATCH 148/253] Update test/nodes/core/common/91-global-config_spec.js Co-authored-by: Nick O'Leary --- test/nodes/core/common/91-global-config_spec.js | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/test/nodes/core/common/91-global-config_spec.js b/test/nodes/core/common/91-global-config_spec.js index c9e7a78e6..8cc5658cf 100644 --- a/test/nodes/core/common/91-global-config_spec.js +++ b/test/nodes/core/common/91-global-config_spec.js @@ -1,19 +1,3 @@ -/** - * 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. - **/ - var should = require("should"); var config = require("nr-test-utils").require("@node-red/nodes/core/common/91-global-config.js"); var inject = require("nr-test-utils").require("@node-red/nodes/core/common/20-inject.js"); From 9eb8cf121c03f3fdf106ba51fcd7626c6473f183 Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Mon, 5 Dec 2022 11:29:37 +0900 Subject: [PATCH 149/253] Update Japanese message reflecting English message update --- .../@node-red/nodes/locales/ja/common/91-global-config.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/locales/ja/common/91-global-config.html b/packages/node_modules/@node-red/nodes/locales/ja/common/91-global-config.html index 267cf86a0..2eda840ec 100644 --- a/packages/node_modules/@node-red/nodes/locales/ja/common/91-global-config.html +++ b/packages/node_modules/@node-red/nodes/locales/ja/common/91-global-config.html @@ -1,3 +1,3 @@ p From c24b123917188f142038b7c4d5431f9f1c89edd4 Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Mon, 5 Dec 2022 23:11:56 +0900 Subject: [PATCH 150/253] Add Japanese translation for editor actions --- .../@node-red/editor-client/locales/ja/editor.json | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) 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 53979a965..5ea5a28dd 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 @@ -68,7 +68,11 @@ "enabled": "有効", "disabled": "無効", "info": "詳細", - "selectNodes": "ノードをクリックして選択" + "selectNodes": "ノードをクリックして選択", + "enableFlow": "フローを有効化", + "disableFlow": "フローを無効化", + "moveToStart": "フローを先頭へ移動", + "moveToEnd": "フローを最後へ移動" }, "menu": { "label": { @@ -1350,7 +1354,7 @@ "show-version-control-tab": "バージョンコントロールタブを表示", "start-flows": "フローを開始", "stop-flows": "フローを停止", - "copy-item-url": "要素のURLをコピー", - "copy-item-edit-url": "要素の編集URLをコピー" + "copy-item-url": "要素のURLをコピー", + "copy-item-edit-url": "要素の編集URLをコピー" } } From 7117472e73b95beb0c06cb2fa6313fa45466c524 Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Mon, 5 Dec 2022 23:13:50 +0900 Subject: [PATCH 151/253] Add Japanese translation for range node --- packages/node_modules/@node-red/nodes/locales/ja/messages.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/locales/ja/messages.json b/packages/node_modules/@node-red/nodes/locales/ja/messages.json index 124dd4f09..cc4a07b4e 100644 --- a/packages/node_modules/@node-red/nodes/locales/ja/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/ja/messages.json @@ -813,7 +813,8 @@ "scale": { "payload": "msg.payloadの値を拡大/縮小", "limit": "入力値の範囲外の値を最小値/最大値とし拡大/縮小", - "wrap": "入力値の範囲外の値を範囲幅で割った余りとし拡大/縮小" + "wrap": "入力値の範囲外の値を範囲幅で割った余りとし拡大/縮小", + "drop": "値を拡大/縮小(入力範囲外の時はメッセージを削除)" }, "tip": "注釈: 本ノードは、数値のみ扱うことができます。", "errors": { From 7b52ef34beec0175ed6808794be86ccad9ea2b3b Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Mon, 5 Dec 2022 22:17:05 +0000 Subject: [PATCH 152/253] Remember compact/pretty flow export user choice closes #3849 --- .../@node-red/editor-client/src/js/ui/clipboard.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js b/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js index 61435f6ad..53a908c67 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js @@ -656,7 +656,12 @@ RED.clipboard = (function() { $("#red-ui-clipboard-dialog-tab-library-name").val("flows.json").select(); dialogContainer.i18n(); + var format = RED.settings.flowFilePretty ? "red-ui-clipboard-dialog-export-fmt-full" : "red-ui-clipboard-dialog-export-fmt-mini"; + const userFormat = RED.settings.get("editor.dialog.export.pretty") + if (userFormat === false || userFormat === true) { + format = userFormat ? "red-ui-clipboard-dialog-export-fmt-full" : "red-ui-clipboard-dialog-export-fmt-mini"; + } $("#red-ui-clipboard-dialog-export-fmt-group > a").on("click", function(evt) { evt.preventDefault(); @@ -672,7 +677,8 @@ RED.clipboard = (function() { var nodes = JSON.parse(flow); format = $(this).attr('id'); - if (format === 'red-ui-clipboard-dialog-export-fmt-full') { + const pretty = format === "red-ui-clipboard-dialog-export-fmt-full"; + if (pretty) { flow = JSON.stringify(nodes,null,4); } else { flow = JSON.stringify(nodes); @@ -681,6 +687,7 @@ RED.clipboard = (function() { setTimeout(function() { $("#red-ui-clipboard-dialog-export-text").scrollTop(0); },50); $("#red-ui-clipboard-dialog-export-text").trigger("focus"); + RED.settings.set("editor.dialog.export.pretty", pretty) } }); From 192e537e5ddc55a1eba977499b6f093c603ece54 Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Tue, 6 Dec 2022 09:27:02 +0900 Subject: [PATCH 153/253] Update packages/node_modules/@node-red/editor-client/locales/ja/editor.json Co-authored-by: Nick O'Leary --- .../node_modules/@node-red/editor-client/locales/ja/editor.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 2b438050e..fdd29c16a 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 @@ -1353,6 +1353,6 @@ "env-var": { "environment": "環境変数", "header": "大域環境変数", - "revert": "破棄" + "revert": "破棄" } } From 6d09c81f11557221e9322013b0836bada314e17a Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Tue, 6 Dec 2022 09:27:17 +0900 Subject: [PATCH 154/253] Update packages/node_modules/@node-red/editor-client/locales/en-US/editor.json Co-authored-by: Nick O'Leary --- .../@node-red/editor-client/locales/en-US/editor.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 fe5120302..c7c14c955 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 @@ -1208,6 +1208,6 @@ "env-var": { "environment": "Environment", "header": "Global Environment Variables", - "revert": "Revert" + "revert": "Revert" } } From a8c820f558cfa952e8922f46659e4508866ba2d9 Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Tue, 6 Dec 2022 09:29:45 +0900 Subject: [PATCH 155/253] Update packages/node_modules/@node-red/nodes/locales/ja/messages.json Co-authored-by: Nick O'Leary --- packages/node_modules/@node-red/nodes/locales/ja/messages.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/locales/ja/messages.json b/packages/node_modules/@node-red/nodes/locales/ja/messages.json index fe8d1b1fe..6e16daa6f 100644 --- a/packages/node_modules/@node-red/nodes/locales/ja/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/ja/messages.json @@ -1123,8 +1123,5 @@ "warn": { "nonumber": "ペイロードに数値が含まれていません" } - }, - "global-config": { - "tip": "

    このノードはフローの大域的な設定を保持するために利用されます。

    " } } From 817db23146ddefa4df90612a784f55afa41563c9 Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Tue, 6 Dec 2022 09:29:51 +0900 Subject: [PATCH 156/253] Update packages/node_modules/@node-red/nodes/locales/en-US/messages.json Co-authored-by: Nick O'Leary --- .../node_modules/@node-red/nodes/locales/en-US/messages.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json index dac3a3071..62d5f351f 100644 --- a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json @@ -1123,8 +1123,5 @@ "warn": { "nonumber": "no number found in payload" } - }, - "global-config": { - "tip": "

    This node holds the global configuration of flows, including global environment variables.

    " } } From 3c1ddb5c9d428428e2c3581b2aa7a4bfdcab7582 Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Tue, 6 Dec 2022 09:32:04 +0900 Subject: [PATCH 157/253] Update packages/node_modules/@node-red/editor-client/src/js/ui/env-var.js Co-authored-by: Nick O'Leary --- .../node_modules/@node-red/editor-client/src/js/ui/env-var.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 index f3d2bcfa7..ab071a1d4 100644 --- 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 @@ -98,7 +98,8 @@ RED.envVar = (function() { } var pane = $("
    ", { - id: "red-ui-settings-tab-envvar" + id: "red-ui-settings-tab-envvar", + class: "form-horizontal" }); var content = $("
    ", { class: "form-row node-input-env-container-row" From 72ae375e44ab81ee6fc70d777b99314f638929dc Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Tue, 6 Dec 2022 10:25:25 +0900 Subject: [PATCH 158/253] Update packages/node_modules/@node-red/nodes/core/common/91-global-config.html Co-authored-by: Nick O'Leary --- .../@node-red/nodes/core/common/91-global-config.html | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/common/91-global-config.html b/packages/node_modules/@node-red/nodes/core/common/91-global-config.html index a2f857961..d749153d4 100644 --- a/packages/node_modules/@node-red/nodes/core/common/91-global-config.html +++ b/packages/node_modules/@node-red/nodes/core/common/91-global-config.html @@ -1,7 +1,6 @@ - @@ -14,6 +13,11 @@ }, credentials: { map: { type: "map" } + }, + oneditprepare: function() { + $('#node-input-edit-env-var').on('click', function(evt) { + RED.actions.invoke('core:show-user-settings', 'envvar') + }) } }); From 707b831c301cb28c54c4491e6c6894a6b64ed12f Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Tue, 6 Dec 2022 10:25:38 +0900 Subject: [PATCH 159/253] Update packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js Co-authored-by: Nick O'Leary --- .../node_modules/@node-red/editor-client/src/js/ui/deploy.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 254ade55f..8a8df6837 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) && (node.type !== "global-config")) { + if ((node._def.hasUsers !== false) && (node.users.length === 0)) { unusedConfigNodes.push(getNodeInfo(node)); hasUnusedConfig = true; } From 601a4ec70d5ff7b9346108a763f3b5a0823bf940 Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Tue, 6 Dec 2022 10:33:10 +0900 Subject: [PATCH 160/253] Add hasUsers to global-config --- .../@node-red/nodes/core/common/91-global-config.html | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/common/91-global-config.html b/packages/node_modules/@node-red/nodes/core/common/91-global-config.html index d749153d4..d3112d586 100644 --- a/packages/node_modules/@node-red/nodes/core/common/91-global-config.html +++ b/packages/node_modules/@node-red/nodes/core/common/91-global-config.html @@ -17,7 +17,8 @@ oneditprepare: function() { $('#node-input-edit-env-var').on('click', function(evt) { RED.actions.invoke('core:show-user-settings', 'envvar') - }) - } + }); + }, + hasUsers: false }); From 2ab8121a4a55866024ea59b7c40f9df474bd2d8e Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Tue, 6 Dec 2022 21:12:52 +0900 Subject: [PATCH 161/253] add description to global-config settings --- .../@node-red/nodes/core/common/91-global-config.html | 5 ++++- .../node_modules/@node-red/nodes/locales/en-US/messages.json | 5 +++++ .../node_modules/@node-red/nodes/locales/ja/messages.json | 5 +++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/core/common/91-global-config.html b/packages/node_modules/@node-red/nodes/core/common/91-global-config.html index d3112d586..3240d315d 100644 --- a/packages/node_modules/@node-red/nodes/core/common/91-global-config.html +++ b/packages/node_modules/@node-red/nodes/core/common/91-global-config.html @@ -1,6 +1,9 @@ diff --git a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json index 62d5f351f..979bb7f87 100644 --- a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json @@ -1123,5 +1123,10 @@ "warn": { "nonumber": "no number found in payload" } + }, + "global-config": { + "label": { + "open-conf": "Open Configuration" + } } } diff --git a/packages/node_modules/@node-red/nodes/locales/ja/messages.json b/packages/node_modules/@node-red/nodes/locales/ja/messages.json index 6e16daa6f..0068cd20d 100644 --- a/packages/node_modules/@node-red/nodes/locales/ja/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/ja/messages.json @@ -1123,5 +1123,10 @@ "warn": { "nonumber": "ペイロードに数値が含まれていません" } + }, + "global-config": { + "label": { + "open-conf": "設定を開く" + } } } From 2274319274a13fac6e8bad2880ec873d007c20e2 Mon Sep 17 00:00:00 2001 From: GogoVega Date: Wed, 7 Dec 2022 02:08:29 +0100 Subject: [PATCH 162/253] fix: Typos --- .../editor-client/locales/fr/editor.json | 276 +++++++++--------- .../editor-client/locales/fr/infotips.json | 8 +- .../@node-red/runtime/locales/fr/runtime.json | 16 +- 3 files changed, 150 insertions(+), 150 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/locales/fr/editor.json b/packages/node_modules/@node-red/editor-client/locales/fr/editor.json index 4d0c811b2..9b39ec09f 100644 --- a/packages/node_modules/@node-red/editor-client/locales/fr/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/fr/editor.json @@ -16,7 +16,7 @@ "clone": "Cloner", "cont": "Continuer", "style": "Style", - "line": "Présenter", + "line": "Contour", "fill": "Remplir", "label": "Etiquette", "color": "Couleur", @@ -38,7 +38,7 @@ } }, "event": { - "loadPlugins": "Chargement des plugins", + "loadPlugins": "Chargement des extensions", "loadPalette": "Chargement de la palette", "loadNodeCatalogs": "Chargement des catalogues de noeuds", "loadNodes": "Chargement des noeuds __count__", @@ -97,7 +97,7 @@ "edit": "Éditer", "settings": "Paramètres", "userSettings": "Paramètres de l'utilisateur", - "nodes": "Neuds", + "nodes": "Noeuds", "displayStatus": "Afficher l'état du noeud", "displayConfig": "Noeuds de configuration", "import": "Importer", @@ -141,8 +141,8 @@ "distributeVertically": "Distribuer verticalement", "moveToBack": "Déplacer vers l'arrière", "moveToFront": "Déplacer vers l'avant", - "moveBackwards": "Déplacer vers l'arrière", - "moveForwards": "Déplacer vers l'avant" + "moveBackwards": "Reculer", + "moveForwards": "Avancer" } }, "actions": { @@ -150,7 +150,7 @@ "zoom-out": "Dézoomer", "zoom-reset": "Réinitialiser le zoom", "zoom-in": "Agrandir", - "search-flows": "Rechercher le fux", + "search-flows": "Rechercher le flux", "search-prev": "Précédent", "search-next": "Suivant", "search-counter": "\"__term__\" __result__ de __count__" @@ -185,7 +185,7 @@ "credentials_load_failed": "

    Les flux se sont arrêtés car les informations d'identification n'ont pas pu être déchiffrées.

    Le fichier d'informations d'identification du flux est chiffré, mais la clé de chiffrement du projet est manquante ou invalide.

    ", "credentials_load_failed_reset": "

    Les informations d'identification n'ont pas pu être déchiffrées

    Le fichier d'informations d'identification du flux est chiffré, mais la clé de chiffrement du projet est manquante ou invalide.

    Le fichier d'informations d'identification du flux sera réinitialisé lors du prochain déploiement. Toutes les informations d'identification de flux existantes seront perdues.

    ", "missing_flow_file": "

    Fichier contenant les flux introuvable.

    Le projet n'est pas configuré avec un fichier de flux.

    ", - "missing_package_file": "

    Fichier de package de projet introuvable.

    Il manque au projet un fichier package.json.

    ", + "missing_package_file": "

    Fichier de paquetage du projet introuvable.

    Il manque au projet un fichier package.json.

    ", "project_empty": "

    Le projet est vide.

    Voulez-vous créer un ensemble de fichiers de projet par défaut ?
    Sinon, vous devrez ajouter manuellement des fichiers au projet (en dehors de l'éditeur).

    ", "project_not_found": "

    Le projet '__project__' est introuvable.

    ", "git_merge_conflict": "

    La fusion automatique des modifications a échoué.

    Corriger les conflits non fusionnés, puis valider le résultat.

    " @@ -201,7 +201,7 @@ "failedToAppendNode": "

    Échec du chargement du module '__module__'

    __error__

    " }, "project": { - "change-branch": "Changer pour une succursale (branche) locale '__project__'", + "change-branch": "Changer pour une branche locale '__project__'", "merge-abort": "Git fusion abandonnée", "loaded": "Projet '__project__' chargé", "updated": "Projet '__project__' mis à jour", @@ -218,7 +218,7 @@ "manage-project-dep": "Gérer les dépendances du projet", "setup-cred": "Configuration des identifiants", "setup-project": "Configuration des fichiers du projet", - "create-default-package": "Créer un fichier de package par défaut", + "create-default-package": "Créer un fichier de paquetage par défaut", "no-thanks": "Non merci", "create-default-project": "Créer des fichiers de projet par défaut", "show-merge-conflicts": "Afficher les conflits de fusion", @@ -240,16 +240,16 @@ "subflow_plural": "__count__ sous-flux", "replacedNodes": "__count__ noeud remplacé", "replacedNodes_plural": "__count__ noeuds remplacés", - "pasteNodes": "Coller le flux json ou", - "selectFile": "sélectionner un fichier à importer", + "pasteNodes": "Coller le flux JSON ou", + "selectFile": "Sélectionner un fichier à importer", "importNodes": "Importer des noeuds", "exportNodes": "Exporter des noeuds", "download": "Télécharger", "importUnrecognised": "Importation d'un type inconnu :", "importUnrecognised_plural": "Importation de plusieurs types inconnus :", - "importDuplicate": "noeud en double importé :", - "importDuplicate_plural": "noeuds en double importés :", - "nodesExported": "noeuds exportés vers le presse-papiers", + "importDuplicate": "Noeud en double importé :", + "importDuplicate_plural": "Noeuds en double importés :", + "nodesExported": "Noeuds exportés vers le presse-papiers", "nodesImported": "Noeuds importés :", "nodeCopied": "__count__ noeud copié", "nodeCopied_plural": "__count__ noeuds copiés", @@ -257,9 +257,9 @@ "groupCopied_plural": "__count__ groupes copiés", "groupStyleCopied": "Style de groupe copié", "invalidFlow": "Flux invalide : __message__", - "recoveredNodes": "noeuds récupérés", + "recoveredNodes": "Noeuds récupérés", "recoveredNodesInfo": "Les noeuds importés sur ce flux contiennent un mauvais identifiant de flux. Ces noeuds ont été ajoutés à ce flux afin que vous puissiez les restaurer ou les supprimer.", - "recoveredNodesNotification": "

    noeuds importés sans identifiant de flux valide

    Ils ont été ajoutés à un nouveau flux appelé '__flowName__'.

    ", + "recoveredNodesNotification": "

    Noeuds importés sans identifiant de flux valide

    Ils ont été ajoutés à un nouveau flux appelé '__flowName__'.

    ", "export": { "selected": "noeuds sélectionnés", "current": "flux actuel", @@ -277,8 +277,8 @@ "importSelected": "Importation sélectionnée", "importCopy": "Importer une copie", "viewNodes": "Afficher les noeuds...", - "newFlow": "nouveau flux", - "replace": "remplacer", + "newFlow": "Nouveau flux", + "replace": "Remplacer", "errors": { "notArray": "L'entrée n'est pas un tableau JSON", "itemNotObject": "L'entrée n'est pas un flux valide - l'élément '__index__' n'est pas un objet du noeud", @@ -314,7 +314,7 @@ "unknownNodesButton": "Rechercher les noeuds inconnus", "invalidNodesButton": "Rechercher les noeuds invalides", "errors": { - "noResponse": "pas de réponse du serveur" + "noResponse": "Pas de réponse du serveur" }, "confirm": { "button": { @@ -329,7 +329,7 @@ "improperlyConfigured": "L'espace de travail contient des noeuds qui ne sont pas correctement configurés :", "unknown": "L'espace de travail contient des types de noeuds inconnus :", "confirm": "Êtes-vous sûr de vouloir déployer ?", - "doNotWarn": "ne plus m'avertir à ce sujet", + "doNotWarn": "Ne plus m'avertir à ce sujet", "conflict": "Le serveur exécute un ensemble de flux plus récent.", "backgroundUpdate": "Les flux sur le serveur ont été mis à jour.", "conflictChecking": "Vérifier si les modifications peuvent être fusionnées automatiquement", @@ -384,10 +384,10 @@ "deleteSubflow": "supprimer le sous-flux", "confirmDelete": "Voulez-vous vraiment supprimer ce sous-flux ?", "info": "Description", - "category": "Categorie", + "category": "Catégorie", "module": "Module", - "license": "License", - "licenseNone": "aucune", + "license": "Licence", + "licenseNone": "Aucune", "licenseOther": "Autre", "type": "Type de noeud", "version": "Version", @@ -424,31 +424,31 @@ "editNode": "Modifier le noeud __type__", "editConfig": "Modifier le noeud de configuration __type__", "addNewType": "Ajouter un nouveau __type__...", - "nodeProperties": "propriétés du noeud", - "label": "Etiquette", + "nodeProperties": "Propriétés du noeud", + "label": "Étiquette", "color": "Couleur", "portLabels": "Étiquettes des ports", "labelInputs": "Entrées", "labelOutputs": "Sorties", "settingIcon": "Icône", - "default": "défaut", - "noDefaultLabel": "aucune", - "defaultLabel": "utiliser l'étiquette par défaut", + "default": "Par défaut", + "noDefaultLabel": "Aucune", + "defaultLabel": "Utiliser l'étiquette par défaut", "searchIcons": "Icônes de recherche", - "useDefault": "utilisation par défaut", + "useDefault": "Utilisation par défaut", "description": "Description", "show": "Afficher", "hide": "Masquer", "locale": "Sélectionner la langue", "icon": "Icône", "inputType": "Type d'entrée", - "selectType": "sélectionner les types...", + "selectType": "Sélectionner les types...", "loadCredentials": "Chargement des identifiants du noeud", "inputs": { "input": "entrée", "select": "sélection", "checkbox": "case à cocher", - "spinner": "spinner", + "spinner": "valeurs à défiler", "none": "aucune", "hidden": "masquer la propriété" }, @@ -465,7 +465,7 @@ "input": "entrée", "select": "sélection", "checkbox": "case à cocher", - "spinner": "spinner", + "spinner": "valeurs à défiler", "hidden": "étiquette seulement" }, "select": { @@ -485,7 +485,7 @@ "keyboard": { "title": "Raccourcis clavier", "keyboard": "Clavier", - "filterActions": "actions de filtrage", + "filterActions": "Actions de filtrage", "shortcut": "raccourci", "scope": "portée", "unassigned": "Non attribué", @@ -493,7 +493,7 @@ "workspace": "espace de travail", "selectAll": "Tout sélectionner", "selectNone": "Ne rien sélectionner", - "selectAllConnected": "Sélectionner tous les connectés", + "selectAllConnected": "Sélectionner tous les éléments connectés", "addRemoveNode": "Ajouter/supprimer un noeud de la sélection", "editSelected": "Modifier le noeud sélectionné", "deleteSelected": "Supprimer les noeuds ou le lien sélectionné(s)", @@ -521,10 +521,10 @@ "saveToLibrary": "Enregistrer dans la bibliothèque...", "typeLibrary": "__type__ bibliothèque", "unnamedType": "Innomé __type__", - "exportedToLibrary": "noeuds exportés vers la bibliothèque", + "exportedToLibrary": "Noeuds exportés vers la bibliothèque", "dialogSaveOverwrite": "Une __libraryType__ appelée __libraryName__ existe déjà. Écraser ?", "invalidFilename": "Nom de fichier non valide", - "savedNodes": "noeuds enregistrés", + "savedNodes": "Noeuds enregistrés", "savedType": "__type__ enregistré", "saveFailed": "Échec de la sauvegarde : __message__", "newFolder": "Nouveau dossier", @@ -535,8 +535,8 @@ }, "palette": { "noInfo": "Pas d'information disponible", - "filter": "filtrer les noeuds", - "search": "rechercher les modules", + "filter": "Filtrer les noeuds", + "search": "Rechercher les modules", "addCategory": "Ajouter un nouveau...", "label": { "subflows": "sous-flux", @@ -558,13 +558,13 @@ }, "event": { "nodeAdded": "Noeud ajouté à la palette :", - "nodeAdded_plural": "noeuds ajoutés à la palette :", + "nodeAdded_plural": "Noeuds ajoutés à la palette :", "nodeRemoved": "Noeud supprimé de la palette :", "nodeRemoved_plural": "Noeuds supprimés de la palette :", - "nodeEnabled": "noeud activé :", - "nodeEnabled_plural": "noeuds activés :", - "nodeDisabled": "noeud désactivé :", - "nodeDisabled_plural": "noeuds désactivés :", + "nodeEnabled": "Noeud activé :", + "nodeEnabled_plural": "Noeuds activés :", + "nodeDisabled": "Noeud désactivé :", + "nodeDisabled_plural": "Noeuds désactivés :", "nodeUpgraded": "Les noeuds du module __module__ ont été mis à jour vers la version __version__", "unknownNodeRegistered": "Erreur lors du chargement du noeud :
    • __type__
      __error__
    " }, @@ -572,23 +572,23 @@ "title": "Gérer la palette", "palette": "Palette", "times": { - "seconds": "il y'a quelques secondes", - "minutes": "il y'a quelques minutes", - "minutesV": "il y'a __count__ minutes", - "hoursV": "il y'a __count__ heure", - "hoursV_plural": "il y'a __count__ heures", - "daysV": "il y'a __count__ jour", - "daysV_plural": "il y'a __count__ jours", - "weeksV": "il y'a __count__ semaine", - "weeksV_plural": "il y'a __count__ semaines", - "monthsV": "il y'a __count__ mois", - "monthsV_plural": "il y'a __count__ mois", - "yearsV": "il y'a __count__ an", - "yearsV_plural": "il y'a __count__ ans", - "yearMonthsV": "il y'a __y__ an, __count__ mois", - "yearMonthsV_plural": "il y'a __y__ an, __count__ mois", - "yearsMonthsV": "il y'a __y__ ans, __count__ mois", - "yearsMonthsV_plural": "il y'a __y__ ans, __count__ mois" + "seconds": "il y a quelques secondes", + "minutes": "il y a quelques minutes", + "minutesV": "il y a __count__ minutes", + "hoursV": "il y a __count__ heure", + "hoursV_plural": "il y a __count__ heures", + "daysV": "il y a __count__ jour", + "daysV_plural": "il y a __count__ jours", + "weeksV": "il y a __count__ semaine", + "weeksV_plural": "il y a __count__ semaines", + "monthsV": "il y a __count__ mois", + "monthsV_plural": "il y a __count__ mois", + "yearsV": "il y a __count__ an", + "yearsV_plural": "il y a __count__ ans", + "yearMonthsV": "il y a __y__ an, __count__ mois", + "yearMonthsV_plural": "il y a __y__ an, __count__ mois", + "yearsMonthsV": "il y a __y__ ans, __count__ mois", + "yearsMonthsV_plural": "il y a __y__ ans, __count__ mois" }, "nodeCount": "__label__ noeud", "nodeCount_plural": "__label__ noeuds", @@ -601,7 +601,7 @@ "disable": "désactiver", "remove": "supprimer", "update": "mettre à jour vers __version__", - "updated": "mise à jour", + "updated": "mis à jour", "install": "installer", "installed": "installé", "conflict": "conflit", @@ -657,7 +657,7 @@ "type": "Type", "group": "Groupe", "module": "Module", - "id": "ID", + "id": "ID (identifiant)", "status": "Statut", "enabled": "Activé", "disabled": "Désactivé", @@ -671,7 +671,7 @@ "showMore": "afficher en plus", "showLess": "afficher en moins", "flow": "Flux", - "selection": "Selection", + "selection": "Sélection", "nodes": "__count__ noeuds", "flowDesc": "Description du flux", "subflowDesc": "Description du sous-flux", @@ -731,7 +731,7 @@ "label": "projet", "name": "Projet", "description": "Description", - "dependencies": "Dependencies", + "dependencies": "Dépendances", "settings": "Paramètres", "noSummaryAvailable": "Aucun résumé disponible", "editDescription": "Modifier la description du projet", @@ -774,53 +774,53 @@ "remoteName": "Nom distant", "nameRule": "Doit contenir uniquement A-Z 0-9 _ -", "url": "URL", - "urlRule": "https://, ssh:// or file://", - "urlRule2": "N'incluer pas le nom d'utilisateur/mot de passe dans l'URL", + "urlRule": "https://, ssh:// ou file://", + "urlRule2": "Ne pas inclure le nom d'utilisateur/mot de passe dans l'URL", "noRemotes": "Pas distant", "deleteRemoteConfrim": "Êtes-vous sûr de vouloir supprimer '__name__' distant ?", "deleteRemote": "Supprimer distant" }, "userSettings": { - "committerDetail": "Détails de l'auteur de l'engagement (commit)", + "committerDetail": "Détails de l'auteur de la validation (commit)", "committerTip": "Laisser vide pour utiliser la valeur par défaut du système", "userName": "Nom d'utilisateur", - "email": "Email", + "email": "e-mail", "workflow": "Flux de travail", - "workfowTip": "Choisisser votre flux de travail git préféré", + "workfowTip": "Choisisser votre flux de travail Git préféré", "workflowManual": "Manuel", "workflowManualTip": "Toutes les modifications doivent être validées manuellement dans la barre latérale 'historique'", "workflowAuto": "Automatique", "workflowAutoTip": "Les modifications sont validées automatiquement à chaque déploiement", "sshKeys": "Clés SSH", - "sshKeysTip": "Vous permet de créer des connexions sécurisées aux référentiels git distants.", + "sshKeysTip": "Vous permet de créer des connexions sécurisées aux référentiels Git distants.", "add": "ajouter une clé", "addSshKey": "Ajouter une clé SSH", "addSshKeyTip": "Générer une nouvelle paire de clés publique/privée", "name": "Nom", "nameRule": "Doit contenir uniquement A-Z 0-9 _ -", - "passphrase": "Phrase de passe", - "passphraseShort": "Phrase de passe trop court", + "passphrase": "Phrase de mot de passe", + "passphraseShort": "Phrase de mot de passe trop courte", "optional": "Facultatif", "cancel": "Annuler", "generate": "Générer une clé", "noSshKeys": "Pas de clé SSH", "copyPublicKey": "Copier la clé publique dans le presse-papiers", "delete": "Supprimer une clé", - "gitConfig": "Git config", + "gitConfig": "Configuration Git", "deleteConfirm": "Êtes-vous sûr de vouloir supprimer la clé SSH __nom__ ? Ça ne peut pas être annulé." }, "versionControl": { - "unstagedChanges": "Changement pas mis en place", + "unstagedChanges": "Abandon des changements", "stagedChanges": "Changement mis en place", "unstageChange": "Ne pas mettre en place le changement", "stageChange": "Mettre en place le changement", "unstageAllChange": "Ne pas mettre en place tous les changements", "stageAllChange": "Mettre en place tous les changements", - "commitChanges": "Commit changes", - "resolveConflicts": "Resolve conflicts", - "head": "HEAD", + "commitChanges": "Valider les changements", + "resolveConflicts": "Résoudre les conflits", + "head": "En-tête", "staged": "Mis en place", - "unstaged": "Pas mis en place", + "unstaged": "Non mis en place", "local": "Local", "remote": "Distant", "revert": "Voulez-vous vraiment annuler les modifications apportées à '__file__' ? Ça ne peut pas être annulé.", @@ -841,7 +841,7 @@ "branch": "Branche :", "moreCommits": " plus de commit(s)", "changeLocalBranch": "Changer de branche locale", - "createBranchPlaceholder": "Trouver ou créer une branche", + "createBranchPlaceholder": "Trouver où créer une branche", "upstream": "en amont", "localOverwrite": "Vous avez des modifications locales qui seraient écrasées en changeant la branche. Vous devez d'abord valider ou annuler ces modifications.", "manageRemoteBranch": "Gérer une branche distante", @@ -861,12 +861,12 @@ "pullChanges": "Tirer les changements", "history": "historique", "projectHistory": "Historique du projet", - "daysAgo": "il y'a __count__ jour", - "daysAgo_plural": "il y'a __count__ jours", - "hoursAgo": "il y'a __count__ heure", - "hoursAgo_plural": "il y'a __count__ heures", - "minsAgo": "il y'a __count__ minute", - "minsAgo_plural": "il y'a __count__ minutes", + "daysAgo": "il y a __count__ jour", + "daysAgo_plural": "il y a __count__ jours", + "hoursAgo": "il y a __count__ heure", + "hoursAgo_plural": "il y a __count__ heures", + "minsAgo": "il y a __count__ minute", + "minsAgo_plural": "il y a __count__ minutes", "secondsAgo": "Il y a quelques instants", "notTracking": "Votre branche locale ne suit pas actuellement une branche distante.", "statusUnmergedChanged": "Votre référentiel contient des modifications non fusionnées. Vous devez résoudre les conflits et valider le résultat.", @@ -876,7 +876,7 @@ "commitsBehind": "Votre référentiel a __count__ commit de retard sur le distant. Vous pouvez pousser ce commit maintenant.", "commitsBehind_plural": "Votre référentiel a __count__ commits de retard sur le distant. Vous pouvez pousser ce commit maintenant.", "commitsAheadAndBehind1": "Votre référentiel a __count__ commit derrière et ", - "commitsAheadAndBehind1_plural": "YVotre référentiel est __count__ commits derrière et ", + "commitsAheadAndBehind1_plural": "Votre référentiel est __count__ commits derrière et ", "commitsAheadAndBehind2": "__count__ commit avant le distant. ", "commitsAheadAndBehind2_plural": "__count__ commits avant le distant. ", "commitsAheadAndBehind3": "Vous devez retirer le commit à distance avant de pousser.", @@ -901,36 +901,36 @@ } }, "editableList": { - "add": "ajouter", - "addTitle": "ajouter un élément" + "add": "Ajouter", + "addTitle": "Ajouter un élément" }, "search": { "history": "Historique des recherches", - "clear": "tout effacer", + "clear": "Tout effacer", "empty": "Aucun résultat", - "addNode": "ajouter un noeud...", + "addNode": "Ajouter un noeud...", "options": { - "configNodes": "noeuds de configuration", - "unusedConfigNodes": "noeuds de configuration inutilisés", - "invalidNodes": "noeuds invalides", - "uknownNodes": "noeuds inconnus", + "configNodes": "Noeuds de configuration", + "unusedConfigNodes": "Noeuds de configuration inutilisés", + "invalidNodes": "Noeuds invalides", + "uknownNodes": "Noeuds inconnus", "unusedSubflows": "Sous-flux inutilisés", "hiddenFlows": "Flux cachés", - "modifiedNodes": "noeuds et flux modifiés", + "modifiedNodes": "Noeuds et flux modifiés", "thisFlow": "Flux courant" } }, "expressionEditor": { "functions": "Fonctions", - "functionReference": "Fonction de réference", + "functionReference": "Fonction de référence", "insert": "Insérer", "title": "Éditeur d'expressions JSONata", "test": "Test", "data": "Exemple de message", - "result": "Resultat", - "format": "format", + "result": "Résultat", + "format": "Format", "compatMode": "Mode de compatibilité activé", - "compatModeDesc": "

    Mode de compatibilité JSONata

    L'expression actuelle semble toujours faire référence à msg et sera donc évaluée en mode de compatibilité. Veuiller mettre à jour l'expression pour ne pas utiliser msg car ce mode sera supprimé à l'avenir.

    Lorsque la prise en charge de JSONata a été ajoutée pour la première fois à Node-RED, il fallait que l'expression référence le Objet msg. Par exemple, msg.payload serait utilisé pour accéder à la charge utile.

    Cela n'est plus nécessaire car l'expression sera évaluée directement par rapport au message. Pour accéder à la charge utile, l'expression doit être simplement charge utile.

    ", + "compatModeDesc": "

    Mode de compatibilité JSONata

    L'expression actuelle semble toujours faire référence à msg et sera donc évaluée en mode de compatibilité. Veuiller mettre à jour l'expression pour ne pas utiliser msg car ce mode sera supprimé à l'avenir.

    Lorsque la prise en charge de JSONata a été ajoutée pour la première fois à Node-RED, il fallait que l'expression référencie l'objet msg. Par exemple, msg.payload serait utilisé pour accéder à la charge utile.

    Cela n'est plus nécessaire car l'expression sera évaluée directement par rapport au message. Pour accéder à la charge utile, l'expression doit être simplement charge utile.

    ", "noMatch": "Aucun résultat correspondant", "errors": { "invalid-expr": "Expression JSONata non valide :\n __message__", @@ -953,9 +953,9 @@ }, "jsonEditor": { "title": "Éditeur JSON", - "format": "format JSON", + "format": "Format JSON", "rawMode": "Modifier JSON", - "uiMode": "Visualiser editor", + "uiMode": "Afficher l'éditeur", "rawMode-readonly": "JSON", "uiMode-readonly": "Visualiser", "insertAbove": "Insérer ci-dessus", @@ -996,7 +996,7 @@ "config-git": "Configurer le client Git", "welcome": { "hello": "Bonjour! Nous avons introduit des 'projets' dans Node-RED.", - "desc0": "Il s'agit d'une nouvelle façon pour vous de gérer vos fichiers de flux et inclut le contrôle de version de vos flux.", + "desc0": "Il s'agit d'une nouvelle façon pour vous de gérer vos fichiers de flux, cela inclut le contrôle de version de vos flux.", "desc1": "Pour commencer, vous pouvez créer votre premier projet ou cloner un projet existant à partir d'un référentiel git.", "desc2": "Si vous n'êtes pas sûr, vous pouvez ignorer ceci pour le moment. Vous pourrez toujours créer votre premier projet à partir du menu 'Projets' à tout moment.", "create": "Créer un projet", @@ -1005,13 +1005,13 @@ "not-right-now": "Pas maintenant" }, "git-config": { - "setup": "Configurer votre version du contrôle de client", + "setup": "Configurer votre version du client Git", "desc0": "Node-RED utilise l'outil open source Git pour le contrôle de version. Il suit les modifications apportées à vos fichiers de projet et vous permet de les transférer vers des référentiels distants.", "desc1": "Lorsque vous validez un ensemble de modifications, Git enregistre l'auteur qui a effectué les modifications avec un nom d'utilisateur et une adresse e-mail. Le nom d'utilisateur peut être ce que vous voulez - il n'est pas nécessaire que ce soit votre vrai nom.", "desc2": "Votre client Git est déjà configuré avec les détails ci-dessous.", "desc3": "Vous pouvez modifier ces paramètres ultérieurement sous l'onglet 'Configuration Git' de la boîte de dialogue des paramètres.", "username": "Nom d'utilisateur", - "email": "Email" + "email": "e-mail" }, "project-details": { "create": "Créer votre projet", @@ -1026,26 +1026,26 @@ }, "clone-project": { "clone": "Cloner un projet", - "desc0": "Si vous avez déjà un dépôt git contenant un projet, vous pouvez le cloner pour commencer.", + "desc0": "Si vous avez déjà un dépôt Git contenant un projet, vous pouvez le cloner pour commencer.", "already-exists": "Le projet existe déjà", "must-contain": "Doit contenir uniquement A-Z 0-9 _ -", "project-name": "Nom du projet", - "no-info-in-url": "Ne pas inclure le nom d'utilisateur/mot de passe dans l'url", + "no-info-in-url": "Ne pas inclure le nom d'utilisateur/mot de passe dans l'URL", "git-url": "URL du dépôt Git", - "protocols": "https://, ssh:// or file://", - "auth-failed": "L'Authentification a échouée", + "protocols": "https://, ssh:// ou file://", + "auth-failed": "L'authentification a échouée", "username": "Nom d'utilisateur", "passwd": "Mot de passe", "ssh-key": "Clé SSH", - "passphrase": "Phrase de passe", + "passphrase": "Phrase de mot de passe", "ssh-key-desc": "Avant de pouvoir cloner un référentiel avec ssh, vous devez ajouter une clé SSH pour y accéder.", "ssh-key-add": "Ajouter une clé ssh", "credential-key": "Clé de chiffrement des identifiants", - "cant-get-ssh-key": "Erreur! Impossible d'obtenir le chemin de clé SSH sélectionné.", - "already-exists2": "existe déjà", - "git-error": "erreur git", + "cant-get-ssh-key": "Erreur! Impossible d'obtenir le chemin de la clé SSH sélectionnée.", + "already-exists2": "Existe déjà", + "git-error": "Erreur git", "connection-failed": "La connexion a échoué", - "not-git-repo": "Ce n'est pas un dépôt git", + "not-git-repo": "Ce n'est pas un dépôt Git", "repo-not-found": "Référentiel introuvable" }, "default-files": { @@ -1061,23 +1061,23 @@ "desc0": "Votre fichier d'informations d'identification de flux peut être chiffré pour sécuriser son contenu.", "desc1": "Si vous souhaitez stocker ces identifiants dans un référentiel Git public, vous devez les chiffrer en fournissant une phrase clé secrète.", "desc2": "Votre fichier d'identifiants de flux n'est actuellement pas chiffré.", - "desc3": "Cela signifie que son contenu, tel que les mots de passe et les jetons d'accès, peut être lu par toute personne ayant accès au fichier..", - "desc4": "Si vous souhaitez stocker ces identifiants dans un référentiel Git public, vous devez les chiffrer en fournissant une phrase clé secrète..", + "desc3": "Cela signifie que son contenu, tel que les mots de passe et les jetons d'accès, peut être lu par toute personne ayant accès au fichier.", + "desc4": "Si vous souhaitez stocker ces identifiants dans un référentiel Git public, vous devez les chiffrer en fournissant une phrase clé secrète.", "desc5": "Votre fichier contenant les identifiants de flux est actuellement chiffré à l'aide de la propriété credentialSecret de votre fichier de paramètres comme clé.", "desc6": "Votre fichier contenant les identifiants de flux est actuellement chiffré à l'aide d'une clé générée par le système. Vous devez fournir une nouvelle clé secrète pour ce projet.", "desc7": "La clé sera stockée séparément de vos fichiers de projet. Vous devrez fournir la clé pour utiliser ce projet dans une autre instance de Node-RED.", "credentials": "Identifiants", "enable": "Activer le chiffrement", "disable": "Désactiver le chiffrement", - "disabled": "désactivé", - "copy": "Copier sur la clé existante", + "disabled": "Désactivé", + "copy": "Remplacer la clé existante", "use-custom": "Utiliser la clé personnalisée", - "desc8": "Le fichier contenant les identifiants ne sera pas crypté et son contenu sera facilement lu", + "desc8": "Le fichier contenant les identifiants ne sera pas crypté et son contenu sera facilement lisible", "create-project-files": "Créer des fichiers de projet", "create-project": "Créer un projet", "already-exists": "existe déjà", - "git-error": "erreur git", - "git-auth-error": "erreur d'authentification git" + "git-error": "Erreur Git", + "git-auth-error": "erreur d'authentification Git" }, "create-success": { "success": "Vous avez créé avec succès votre premier projet !", @@ -1089,7 +1089,7 @@ "projects": "Projets", "already-exists": "Le projet existe déjà", "must-contain": "Doit contenir uniquement A-Z 0-9 _ -", - "no-info-in-url": "Ne pas inclure le nom d'utilisateur/mot de passe dans l'url", + "no-info-in-url": "Ne pas inclure le nom d'utilisateur/mot de passe dans l'URL", "open": "Projet ouvert", "create": "Créer un projet", "clone": "Cloner un référentiel", @@ -1101,15 +1101,15 @@ "enable-encryption": "Activer le chiffrement", "disable-encryption": "Désactiver le chiffrement", "encryption-key": "Clé de chiffrement", - "desc0": "Une phrase pour sécuriser vos identifiants avec", - "desc1": "Le fichier contenant les identifiants ne sera pas crypté et son contenu sera facilement lu", + "desc0": "Une phrase pour sécuriser vos identifiants", + "desc1": "Le fichier contenant les identifiants ne sera pas crypté et son contenu sera facilement lisible", "git-url": "URL du dépôt Git", - "protocols": "https://, ssh:// or file://", + "protocols": "https://, ssh:// ou file://", "auth-failed": "L'authentification a échouée", "username": "Nom d'utilisateur", "password": "Mot de passe", "ssh-key": "Clé SSH", - "passphrase": "Phrase de passe", + "passphrase": "Phrase de mot de passe", "desc2": "Avant de pouvoir cloner un référentiel sur ssh, vous devez ajouter une clé SSH pour y accéder.", "add-ssh-key": "Ajouter une clé ssh", "credentials-encryption-key": "Clé de chiffrement des identifiants", @@ -1118,8 +1118,8 @@ "con-failed": "La connexion a échoué", "not-git": "Ce n'est pas un dépôt git", "no-resource": "Référentiel introuvable", - "cant-get-ssh-key-path": "Erreur! Impossible d'obtenir le chemin de clé SSH sélectionné.", - "unexpected_error": "erreur inattendue", + "cant-get-ssh-key-path": "Erreur! Impossible d'obtenir le chemin de la clé SSH sélectionnée.", + "unexpected_error": "Erreur inattendue", "clearContext": "Effacer le contexte lors du changement de projet" }, "delete": { @@ -1130,32 +1130,32 @@ "current": "actuel" }, "require-clean": { - "confirm": "

    Vous avez des modifications non déployées qui seront perdues.

    Voulez-vous continuer?

    " + "confirm": "

    Vous avez des modifications non déployées qui seront perdues.

    Voulez-vous continuer ?

    " }, "send-req": { "auth-req": "Authentification requise pour le référentiel", "username": "Nom d'utilisateur", "password": "Mot de passe", - "passphrase": "Phrase de passe", + "passphrase": "Phrase de mot de passe", "retry": "Recommencer", - "update-failed": "La mise à jour a échouée", - "unhandled": "Réponse d'erreur non gérée", + "update-failed": "La mise à jour a échoué", + "unhandled": "Code d'erreur non géré", "host-key-verify-failed": "

    La vérification de la clé d'hôte a échoué.

    La clé d'hôte du référentiel n'a pas pu être vérifiée. Veuillez mettre à jour votre fichier known_hosts et réessayer.

    " }, "create-branch-list": { "invalid": "Branche invalide", "create": "Créer une branche", - "current": "actuel" + "current": "Actuel" }, "create-default-file-set": { "no-active": "Impossible de créer un ensemble de fichiers par défaut sans projet actif", "no-empty": "Impossible de créer un ensemble de fichiers par défaut sur un projet non vide", - "git-error": "erreur git" + "git-error": "Erreur Git" }, "errors": { "no-username-email": "Votre client Git n'est pas configuré avec un nom d'utilisateur/e-mail.", - "unexpected": "une erreur inattendue est apparue", - "code": "code" + "unexpected": "Une erreur inattendue est apparue", + "code": "Code" } }, "editor-tab": { @@ -1163,13 +1163,13 @@ "envProperties": "Variables d'environnement", "module": "Propriétés des modules", "description": "Description", - "appearance": "Apparance", + "appearance": "Apparence", "preview": "Aperçu de l'interface utilisateur", "defaultValue": "Valeur par défaut" }, "tourGuide": { "takeATour": "Faire un tour", - "start": "Commencé", + "start": "Commencer", "next": "Suivant", "welcomeTours": "Visite de bienvenue" }, @@ -1181,7 +1181,7 @@ "en-US": "Anglais", "fr": "Français", "ja": "Japonais", - "ko": "Korean", + "ko": "Coréen", "ru": "Russe", "zh-CN": "Chinois (Simplifié)", "zh-TW": "Chinois (Traditionnel)" diff --git a/packages/node_modules/@node-red/editor-client/locales/fr/infotips.json b/packages/node_modules/@node-red/editor-client/locales/fr/infotips.json index 4a4dc1eb4..b45c70231 100755 --- a/packages/node_modules/@node-red/editor-client/locales/fr/infotips.json +++ b/packages/node_modules/@node-red/editor-client/locales/fr/infotips.json @@ -6,16 +6,16 @@ "tip3": "Vous pouvez gérer votre palette de noeuds avec {{core:manage-palette}}", "tip4": "Vos noeuds de configuration de flux sont répertoriés dans le panneau de la barre latérale. Ils sont accessibles depuis le menu ou avec {{core:show-config-tab}}", "tip5": "Activer ou désactiver ces conseils à partir de l'option dans les paramètres", - "tip6": "Déplacer les noeuds sélectionnés à l'aide des touches [gauche] [haut] [bas] et [droite]. Maintener [shift] pour les pousser plus loin", + "tip6": "Déplacer les noeuds sélectionnés à l'aide des touches [gauche] [haut] [bas] et [droite]. Maintenir la touche [shift] pour les pousser plus loin", "tip7": "Faire glisser un noeud sur un fil le raccordera au lien", "tip8": "Exporter les noeuds sélectionnés, ou l'onglet actuel avec {{core:show-export-dialog}}", "tip9": "Importer un flux en faisant glisser son JSON dans l'éditeur, ou avec {{core:show-import-dialog}}", "tip10": "[majuscule] [clic] et faites glisser sur un port de noeud pour déplacer tous les fils attachés ou seulement celui sélectionné", "tip11": "Afficher l'onglet Infos avec {{core:show-info-tab}} ou l'onglet Débogage avec {{core:show-debug-tab}}", "tip12": "[ctrl] [clic] dans l'espace de travail pour ouvrir la boîte de dialogue d'ajout rapide", - "tip13": "Maintener [ctrl] enfoncé lorsque vous [cliquez] sur un port de noeud pour activer le câblage rapide", - "tip14": "Maintener [shift] enfoncé lorsque vous [cliquez] sur un noeud pour sélectionner également tous ses noeuds connectés", - "tip15": "Maintener [ctrl] enfoncé lorsque vous [cliquez] sur un noeud pour l'ajouter ou le supprimer de la sélection actuelle", + "tip13": "Maintenir la touche [ctrl] enfoncée lorsque vous [cliquez] sur un port de noeud pour activer le câblage rapide", + "tip14": "Maintenir la touche [shift] enfoncée lorsque vous [cliquez] sur un noeud pour sélectionner également tous ses noeuds connectés", + "tip15": "Maintenir la touche [ctrl] enfoncée lorsque vous [cliquez] sur un noeud pour l'ajouter ou le supprimer de la sélection actuelle", "tip16": "Changer d'onglet de flux avec {{core:show-previous-tab}} et {{core:show-next-tab}}", "tip17": "Vous pouvez confirmer vos modifications dans le panneau d'édition du noeud avec {{core:confirm-edit-tray}} ou les annuler avec {{core:cancel-edit-tray}}", "tip18": "Appuyer sur {{core:edit-selected-node}} modifiera le premier noeud de la sélection actuelle" diff --git a/packages/node_modules/@node-red/runtime/locales/fr/runtime.json b/packages/node_modules/@node-red/runtime/locales/fr/runtime.json index 0a133736f..6a341e3e0 100644 --- a/packages/node_modules/@node-red/runtime/locales/fr/runtime.json +++ b/packages/node_modules/@node-red/runtime/locales/fr/runtime.json @@ -46,7 +46,7 @@ "deprecatedOption": "L'utilisation de l'option __old__ est DÉCONSEILLÉE. Utiliser __new__ à la place", "unable-to-listen": "Impossible d'écouter sur __listenpath__", "port-in-use": "Erreur : port utilisé", - "uncaught-exception": "Exception non reconnu :", + "uncaught-exception": "Exception non reconnue :", "admin-ui-disabled": "Interface d'administration désactivée", "now-running": "Le serveur tourne maintenant sur __listenpath__", "failed-to-start": "Échec lors du démarrage du serveur :", @@ -111,13 +111,13 @@ "starting-modified-nodes": "Démarrage des noeuds modifiés", "starting-modified-flows": "Démarrage des flux modifiés", "starting-flows": "Démarrage des flux", - "started-modified-nodes": "noeuds modifiés démarrés", + "started-modified-nodes": "Noeuds modifiés démarrés", "started-modified-flows": "Flux modifiés démarrés", "started-flows": "Flux démarrés", "stopping-modified-nodes": "Arrêt des noeuds modifiés", "stopping-modified-flows": "Arrêt des flux modifiés", "stopping-flows": "Arrêt des flux", - "stopped-modified-nodes": "noeuds modifiés arrêtés", + "stopped-modified-nodes": "Noeuds modifiés arrêtés", "stopped-modified-flows": "Flux modifiés arrêtés", "stopped-flows": "Flux arrêtés", "stopped": "Arrêté", @@ -133,7 +133,7 @@ }, "flow": { "unknown-type": "Type inconnu : __type__", - "missing-types": "types manquants", + "missing-types": "Types manquants", "error-loop": "Le message a dépassé le nombre maximum de captures (catches)" }, "index": { @@ -149,14 +149,14 @@ }, "storage": { "index": { - "forbidden-flow-name": "nom du flux interdit" + "forbidden-flow-name": "Nom du flux interdit" }, "localfilesystem": { "user-dir": "Répertoire utilisateur : __path__", "flows-file": "Fichier des flux : __path__", "create": "Création d'un nouveau fichier __type__", "empty": "Le fichier __type__ existant est vide", - "invalid": "Le fichier __type__ existant n'est pas un json valide", + "invalid": "Le fichier __type__ existant n'est pas un JSON valide", "restore": "Restauration de la sauvegarde du fichier __type__ : __path__", "restore-fail": "La restauration de la sauvegarde du fichier __type__ a échoué : __message__", "fsync-fail": "Échec du vidage du fichier __path__ sur le disque : __message__", @@ -168,11 +168,11 @@ "project-not-found": "Projet introuvable : __project__", "no-active-project": "Aucun projet actif : utilisation du fichier de flux par défaut", "disabled": "Projets désactivés : editorTheme.projects.enabled=false", - "disabledNoFlag": "Projets désactivés : définisser editorTheme.projects.enabled=true pour activer", + "disabledNoFlag": "Projets désactivés : définir editorTheme.projects.enabled=true pour activer", "git-not-found": "Projets désactivés : commande git introuvable", "git-version-old": "Projets désactivés : git __version__ non pris en charge. Nécessite 2.x", "summary": "Un projet Node-RED", - "readme": "### À propos\n\nCeci est le fichier README.md de votre projet. Il aide les utilisateurs à comprendre ce que fait votre\nprojet, comment l'utiliser et tout ce qu'ils peuvent avoir besoin de savoir." + "readme": "### À propos\n\nCeci est le fichier README.md de votre projet. Il aide les utilisateurs à comprendre ce que fait votre\nprojet, comment l'utiliser et tout ce dont ils peuvent avoir besoin de savoir." } } }, From 6cbfe3d7368fb5231923468255c5a21f94c5bcd8 Mon Sep 17 00:00:00 2001 From: GogoVega Date: Wed, 7 Dec 2022 12:28:02 +0100 Subject: [PATCH 163/253] Last adjustment and translation of `commit` --- .../editor-client/locales/fr/editor.json | 48 +++++++++---------- .../editor-client/locales/fr/infotips.json | 2 +- .../@node-red/runtime/locales/fr/runtime.json | 2 +- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/locales/fr/editor.json b/packages/node_modules/@node-red/editor-client/locales/fr/editor.json index 9b39ec09f..647a614d4 100644 --- a/packages/node_modules/@node-red/editor-client/locales/fr/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/fr/editor.json @@ -286,7 +286,7 @@ "missingType": "L'entrée n'est pas un flux valide - l'élément '__index__' n'a pas de propriété 'type'" }, "conflictNotification1": "Certains des noeuds que vous avez importés existent déjà dans votre espace de travail.", - "conflictNotification2": "Sélectionner les noeuds à importer et choisisser s'il faut remplacer les noeuds existants ou en importer une copie." + "conflictNotification2": "Sélectionner les noeuds à importer et choisir s'il faut remplacer les noeuds existants ou en importer une copie." }, "copyMessagePath": "Chemin copié", "copyMessageValue": "Valeur copiée", @@ -319,7 +319,7 @@ "confirm": { "button": { "ignore": "Ignorer", - "confirm": "Confirmer le déploiement", + "confirm": "Confirmer", "review": "Examiner les modifications", "cancel": "Annuler", "merge": "Fusionner", @@ -831,15 +831,15 @@ "localFiles": "Fichiers locaux", "all": "tout", "unmergedChanges": "Modifications non fusionnées", - "abortMerge": "abandonner la fusion", - "commit": "commit", + "abortMerge": "Abandonner la fusion", + "commit": "Valider", "changeToCommit": "Modifications à valider", "commitPlaceholder": "Entrer votre message de validation", "cancelCapital": "Annuler", - "commitCapital": "Commit", - "commitHistory": "Historique des commits", + "commitCapital": "Valider", + "commitHistory": "Historique des validations", "branch": "Branche :", - "moreCommits": " plus de commit(s)", + "moreCommits": "Davantage de validations", "changeLocalBranch": "Changer de branche locale", "createBranchPlaceholder": "Trouver où créer une branche", "upstream": "en amont", @@ -851,15 +851,15 @@ "createRemoteBranchPlaceholder": "Trouver ou créer une branche distante", "trackedUpstreamBranch": "La branche créée sera définie comme la branche en amont suivie.", "selectUpstreamBranch": "La branche sera créée. Sélectionner ci-dessous pour la définir comme branche en amont suivie.", - "pushFailed": "L'envoi a échoué car la branche a des commits plus récents. Tirer et fusionner d'abord, puis envoyer à nouveau.", - "push": "envoyer", - "pull": "tirer", + "pushFailed": "L'envoi a échoué car la branche a des validations plus récentes. Tirer et fusionner d'abord, puis envoyer à nouveau.", + "push": "Envoyer", + "pull": "Tirer", "unablePull": "

    Impossible d'extraire les modifications à distance ; vos modifications locales non mises en place seraient écrasées.

    Valider vos modifications et réessayer.

    ", "showUnstagedChanges": "Afficher les modifications non mise en place", "connectionFailed": "Impossible de se connecter au référentiel distant: ", "pullUnrelatedHistory": "

    Le réferentiel distant a un historique de validations sans rapport.

    Êtes-vous sûr de vouloir extraire les modifications dans votre référentiel local ?

    ", "pullChanges": "Tirer les changements", - "history": "historique", + "history": "Historique", "projectHistory": "Historique du projet", "daysAgo": "il y a __count__ jour", "daysAgo_plural": "il y a __count__ jours", @@ -871,17 +871,17 @@ "notTracking": "Votre branche locale ne suit pas actuellement une branche distante.", "statusUnmergedChanged": "Votre référentiel contient des modifications non fusionnées. Vous devez résoudre les conflits et valider le résultat.", "repositoryUpToDate": "Votre référentiel est à jour.", - "commitsAhead": "Votre référentiel a __count__ commit d'avance sur le distant. Vous pouvez pousser ce commit maintenant.", - "commitsAhead_plural": "Votre référentiel a __count__ commits d'avance sur le distant. Vous pouvez pousser ce commit maintenant.", - "commitsBehind": "Votre référentiel a __count__ commit de retard sur le distant. Vous pouvez pousser ce commit maintenant.", - "commitsBehind_plural": "Votre référentiel a __count__ commits de retard sur le distant. Vous pouvez pousser ce commit maintenant.", - "commitsAheadAndBehind1": "Votre référentiel a __count__ commit derrière et ", - "commitsAheadAndBehind1_plural": "Votre référentiel est __count__ commits derrière et ", - "commitsAheadAndBehind2": "__count__ commit avant le distant. ", - "commitsAheadAndBehind2_plural": "__count__ commits avant le distant. ", - "commitsAheadAndBehind3": "Vous devez retirer le commit à distance avant de pousser.", - "commitsAheadAndBehind3_plural": "Vous devez retirer les commits à distance avant de pousser.", - "refreshCommitHistory": "Actualiser l'historique des commits", + "commitsAhead": "Votre référentiel a __count__ validation d'avance sur le référentiel distant. Vous pouvez pousser cette validation maintenant.", + "commitsAhead_plural": "Votre référentiel a __count__ validations d'avance sur le référentiel distant. Vous pouvez pousser ces validations maintenant.", + "commitsBehind": "Votre référentiel a __count__ validation de retard sur le référentiel distant. Vous pouvez pousser cette validation maintenant.", + "commitsBehind_plural": "Votre référentiel a __count__ validations de retard sur le référentiel distant. Vous pouvez pousser ces validations maintenant.", + "commitsAheadAndBehind1": "Votre référentiel a __count__ validation derrière et ", + "commitsAheadAndBehind1_plural": "Votre référentiel est __count__ validations derrière et ", + "commitsAheadAndBehind2": "__count__ validation avant le référentiel distant. ", + "validationsAheadAndBehind2_plural": "__count__ commits avant le référentiel distant. ", + "commitsAheadAndBehind3": "Vous devez retirer la validation à distance avant de pousser la modification.", + "commitsAheadAndBehind3_plural": "Vous devez retirer les validations à distance avant de pousser les modifications.", + "refreshCommitHistory": "Actualiser l'historique des validations", "refreshChanges": "Actualiser les modifications" } } @@ -1083,7 +1083,7 @@ "success": "Vous avez créé avec succès votre premier projet !", "desc0": "Vous pouvez maintenant continuer à utiliser Node-RED comme vous l'avez toujours fait.", "desc1": "L'onglet 'info' dans la barre latérale vous montre quel est votre projet actif actuel. Le bouton à côté du nom peut être utilisé pour accéder à la vue des paramètres du projet.", - "desc2": "L'onglet 'historique' dans la barre latérale peut être utilisé pour afficher les fichiers qui ont changé dans votre projet et pour les valider. Il vous montre un historique complet de vos commits et vous permet de pousser vos modifications vers un référentiel distant." + "desc2": "L'onglet 'historique' dans la barre latérale peut être utilisé pour afficher les fichiers qui ont changé dans votre projet et pour les valider. Il vous montre un historique complet de vos validations (commits) et vous permet de pousser vos modifications vers un référentiel distant." }, "create": { "projects": "Projets", @@ -1168,7 +1168,7 @@ "defaultValue": "Valeur par défaut" }, "tourGuide": { - "takeATour": "Faire un tour", + "takeATour": "Aperçu", "start": "Commencer", "next": "Suivant", "welcomeTours": "Visite de bienvenue" diff --git a/packages/node_modules/@node-red/editor-client/locales/fr/infotips.json b/packages/node_modules/@node-red/editor-client/locales/fr/infotips.json index b45c70231..449be751b 100755 --- a/packages/node_modules/@node-red/editor-client/locales/fr/infotips.json +++ b/packages/node_modules/@node-red/editor-client/locales/fr/infotips.json @@ -6,7 +6,7 @@ "tip3": "Vous pouvez gérer votre palette de noeuds avec {{core:manage-palette}}", "tip4": "Vos noeuds de configuration de flux sont répertoriés dans le panneau de la barre latérale. Ils sont accessibles depuis le menu ou avec {{core:show-config-tab}}", "tip5": "Activer ou désactiver ces conseils à partir de l'option dans les paramètres", - "tip6": "Déplacer les noeuds sélectionnés à l'aide des touches [gauche] [haut] [bas] et [droite]. Maintenir la touche [shift] pour les pousser plus loin", + "tip6": "Déplacer les noeuds sélectionnés à l'aide des touches [gauche] [haut] [bas] et [droite]. Maintenir la touche [shift] enfoncée pour les pousser plus loin", "tip7": "Faire glisser un noeud sur un fil le raccordera au lien", "tip8": "Exporter les noeuds sélectionnés, ou l'onglet actuel avec {{core:show-export-dialog}}", "tip9": "Importer un flux en faisant glisser son JSON dans l'éditeur, ou avec {{core:show-import-dialog}}", diff --git a/packages/node_modules/@node-red/runtime/locales/fr/runtime.json b/packages/node_modules/@node-red/runtime/locales/fr/runtime.json index 6a341e3e0..d151b8de1 100644 --- a/packages/node_modules/@node-red/runtime/locales/fr/runtime.json +++ b/packages/node_modules/@node-red/runtime/locales/fr/runtime.json @@ -50,7 +50,7 @@ "admin-ui-disabled": "Interface d'administration désactivée", "now-running": "Le serveur tourne maintenant sur __listenpath__", "failed-to-start": "Échec lors du démarrage du serveur :", - "headless-mode": "Fonctionne en mode sans bureau (headless)", + "headless-mode": "Fonctionne en mode sans interface graphique (headless)", "httpadminauth-deprecated": "L'utilisation de httpAdminAuth est DÉCONSEILLÉE. Utiliser adminAuth à la place", "https": { "refresh-interval": "Actualisation des paramètres https toutes les __interval__ heures", From 805f8a5ee75d0960374540f213ce76faf78890e0 Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Thu, 8 Dec 2022 23:43:47 +0900 Subject: [PATCH 164/253] Hide subflow category after deleting subflow --- .../node_modules/@node-red/editor-client/src/js/ui/palette.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js index 928793610..5499cb672 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js @@ -432,6 +432,7 @@ RED.palette = (function() { categoryNode.find(".red-ui-palette-content").slideToggle(); categoryNode.find("i").toggleClass("expanded"); } + categoryNode.hide(); } } @@ -510,6 +511,7 @@ RED.palette = (function() { currentCategoryNode.find(".red-ui-palette-content").slideToggle(); currentCategoryNode.find("i").toggleClass("expanded"); } + currentCategoryNode.hide(); } } From 19b5eda98cab1b8f0a4f753aedb6b680bd6e4659 Mon Sep 17 00:00:00 2001 From: GogoVega Date: Thu, 8 Dec 2022 16:47:25 +0100 Subject: [PATCH 165/253] fix: Double line in popup --- .../node_modules/@node-red/editor-client/locales/fr/editor.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/locales/fr/editor.json b/packages/node_modules/@node-red/editor-client/locales/fr/editor.json index 647a614d4..5f6947144 100644 --- a/packages/node_modules/@node-red/editor-client/locales/fr/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/fr/editor.json @@ -640,7 +640,7 @@ "body": "Une mise à jour pour ce noeud est disponible, mais il n'est pas installé dans un emplacement que le gestionnaire de palette peut mettre à jour.

    Veuiller vous référer à la documentation pour savoir comment mettre à jour ce noeud." }, "button": { - "review": "Ouvrir les informations sur ce noeud", + "review": "Ouvrir la documentation", "install": "Installer", "remove": "Supprimer", "update": "Mettre à jour" From 91ae0206ac1cfabf216bf1277efcf3be5e3b7015 Mon Sep 17 00:00:00 2001 From: GogoVega Date: Thu, 8 Dec 2022 21:53:16 +0100 Subject: [PATCH 166/253] fix: Typos --- .../node_modules/@node-red/nodes/locales/fr/common/60-link.html | 2 +- .../@node-red/nodes/locales/fr/common/90-comment.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/locales/fr/common/60-link.html b/packages/node_modules/@node-red/nodes/locales/fr/common/60-link.html index 1f53d8027..30c097702 100644 --- a/packages/node_modules/@node-red/nodes/locales/fr/common/60-link.html +++ b/packages/node_modules/@node-red/nodes/locales/fr/common/60-link.html @@ -26,7 +26,7 @@ From c3f13eb4288270b21432a793c769f0aaaee7043f Mon Sep 17 00:00:00 2001 From: GogoVega Date: Thu, 8 Dec 2022 22:31:27 +0100 Subject: [PATCH 167/253] A few more minor fixes --- .../@node-red/editor-client/locales/fr/editor.json | 6 +++--- .../@node-red/editor-client/locales/fr/jsonata.json | 10 +++++----- .../@node-red/runtime/locales/fr/runtime.json | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/locales/fr/editor.json b/packages/node_modules/@node-red/editor-client/locales/fr/editor.json index 5f6947144..c59f4d269 100644 --- a/packages/node_modules/@node-red/editor-client/locales/fr/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/fr/editor.json @@ -1033,7 +1033,7 @@ "no-info-in-url": "Ne pas inclure le nom d'utilisateur/mot de passe dans l'URL", "git-url": "URL du dépôt Git", "protocols": "https://, ssh:// ou file://", - "auth-failed": "L'authentification a échouée", + "auth-failed": "L'authentification a échoué", "username": "Nom d'utilisateur", "passwd": "Mot de passe", "ssh-key": "Clé SSH", @@ -1105,7 +1105,7 @@ "desc1": "Le fichier contenant les identifiants ne sera pas crypté et son contenu sera facilement lisible", "git-url": "URL du dépôt Git", "protocols": "https://, ssh:// ou file://", - "auth-failed": "L'authentification a échouée", + "auth-failed": "L'authentification a échoué", "username": "Nom d'utilisateur", "password": "Mot de passe", "ssh-key": "Clé SSH", @@ -1145,7 +1145,7 @@ "create-branch-list": { "invalid": "Branche invalide", "create": "Créer une branche", - "current": "Actuel" + "current": "Actuelle" }, "create-default-file-set": { "no-active": "Impossible de créer un ensemble de fichiers par défaut sans projet actif", diff --git a/packages/node_modules/@node-red/editor-client/locales/fr/jsonata.json b/packages/node_modules/@node-red/editor-client/locales/fr/jsonata.json index 7682d70a5..8fd65bf72 100755 --- a/packages/node_modules/@node-red/editor-client/locales/fr/jsonata.json +++ b/packages/node_modules/@node-red/editor-client/locales/fr/jsonata.json @@ -1,7 +1,7 @@ { "$string": { "args": "arg[, prettify]", - "desc": "Convertit le paramètre `arg` en une chaîne de caractères en utilisant les règles de typage suivantes :\n\n - Les chaînes e caractères sont inchangées\n - Les fonctions sont converties en une chaîne vide\n - L'infini numérique et NaN renvoient une erreur car ils ne peuvent pas être représentés comme un Numéro JSON\n - Toutes les autres valeurs sont converties en une chaîne JSON à l'aide de la fonction `JSON.stringify`. Si `prettify` est vrai, alors le JSON \"prettified\" est produit. c'est-à-dire une ligne par champ et les lignes seront en retrait en fonction de la profondeur du champ." + "desc": "Convertit le paramètre `arg` en une chaîne de caractères en utilisant les règles de typage suivantes :\n\n - Les chaînes de caractères sont inchangées\n - Les fonctions sont converties en une chaîne vide\n - L'infini numérique et NaN renvoient une erreur car ils ne peuvent pas être représentés comme un Numéro JSON\n - Toutes les autres valeurs sont converties en une chaîne JSON à l'aide de la fonction `JSON.stringify`. Si `prettify` est vrai, alors le JSON \"prettified\" est produit. c'est-à-dire une ligne par champ et les lignes seront en retrait en fonction de la profondeur du champ." }, "$length": { "args": "str", @@ -97,7 +97,7 @@ }, "$millis": { "args": "", - "desc": "Renvoie le nombre de millisecondes depuis l'époque Unix (1er janvier 1970 UTC) sous forme de nombre. Toutes les invocations de `$millis()` dans une évaluation d'une expression renverront toutes la même valeur." + "desc": "Renvoie le nombre de millisecondes depuis l'époque Unix (1er janvier 1970 UTC) sous forme de nombre. Tous les appels de `$millis()` dans une évaluation d'une expression renverront toutes la même valeur." }, "$sum": { "args": "array", @@ -117,11 +117,11 @@ }, "$boolean": { "args": "arg", - "desc": "Transforme l'argument en booléen en utilisant les règles suivantes :\n\n - `Boolean` : inchangé\n - `string` : vide : `false`\n - `string` : non vide : `true`\n - `number` : `0` : `false`\n - `number` : non nul : `true`\n - `null` : `false`\n - `array` : vide : `false`\n - `array` : contient un membre qui convertit en `true` : `true`\n - `array` : tous les membres transtypent en `false` : `false`\n - `object` : vide : `false`\n - `object` : non vide : `true`\n - `function` : `false`" + "desc": "Transforme l'argument en booléen en utilisant les règles suivantes :\n\n - `Boolean` : inchangé\n - `string` : vide : `false`\n - `string` : non vide : `true`\n - `number` : `0` : `false`\n - `number` : non nul : `true`\n - `null` : `false`\n - `array` : vide : `false`\n - `array` : contient un membre qui convertit en `true` : `true`\n - `array` : tous les membres sont transformés en `false` : `false`\n - `object` : vide : `false`\n - `object` : non vide : `true`\n - `function` : `false`" }, "$not": { "args": "arg", - "desc": "Renvoie le booléen PAS sur l'argument. `arg` est d'abord converti en booléen" + "desc": "Renvoie un booléen résultat de la négation logique de l'argument" }, "$exists": { "args": "arg", @@ -133,7 +133,7 @@ }, "$append": { "args": "array, array", - "desc": "Ajoute deux tableaux" + "desc": "Combine deux tableaux" }, "$sort": { "args": "array [, function]", diff --git a/packages/node_modules/@node-red/runtime/locales/fr/runtime.json b/packages/node_modules/@node-red/runtime/locales/fr/runtime.json index d151b8de1..dc91e7b4d 100644 --- a/packages/node_modules/@node-red/runtime/locales/fr/runtime.json +++ b/packages/node_modules/@node-red/runtime/locales/fr/runtime.json @@ -172,7 +172,7 @@ "git-not-found": "Projets désactivés : commande git introuvable", "git-version-old": "Projets désactivés : git __version__ non pris en charge. Nécessite 2.x", "summary": "Un projet Node-RED", - "readme": "### À propos\n\nCeci est le fichier README.md de votre projet. Il aide les utilisateurs à comprendre ce que fait votre\nprojet, comment l'utiliser et tout ce dont ils peuvent avoir besoin de savoir." + "readme": "### À propos\n\nCeci est le fichier README.md de votre projet. Il aide les utilisateurs à comprendre ce que fait votre\nprojet, comment l'utiliser et tout ce qu'il est utile de savoir." } } }, From f91af2153ab7b94537ba0518f5f1a31c09182903 Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Sat, 10 Dec 2022 00:33:40 +0900 Subject: [PATCH 168/253] Fix typo in 25-status.html --- .../node_modules/@node-red/nodes/core/common/25-status.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/core/common/25-status.html b/packages/node_modules/@node-red/nodes/core/common/25-status.html index 6a0ef4e3b..16a318833 100644 --- a/packages/node_modules/@node-red/nodes/core/common/25-status.html +++ b/packages/node_modules/@node-red/nodes/core/common/25-status.html @@ -4,7 +4,7 @@
    From 156c3984a7ea43520da4bf6c2fa9939f476a3485 Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Mon, 12 Dec 2022 01:23:00 +0900 Subject: [PATCH 169/253] Ignore commit error in project feature --- .../runtime/lib/storage/localfilesystem/projects/git/index.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/git/index.js b/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/git/index.js index 111365307..8aabcebe2 100644 --- a/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/git/index.js +++ b/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/git/index.js @@ -71,6 +71,8 @@ function runGitCommand(args,cwd,env,emit) { err.code = "git_missing_user"; } else if (/name consists only of disallowed characters/i.test(stderr)) { err.code = "git_missing_user"; + } else if (/nothing (add )?to commit/i.test(stdout)) { + return stdout; } throw err; }) From f6901cd19f774d26cb3ad7187302e4acce304a31 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Mon, 19 Dec 2022 09:50:29 +0000 Subject: [PATCH 170/253] CSV node replace replace with replaceAll just in case mentioned in Issue #3989 --- packages/node_modules/@node-red/nodes/core/parsers/70-CSV.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/parsers/70-CSV.js b/packages/node_modules/@node-red/nodes/core/parsers/70-CSV.js index 9c55fa2b6..504e184d2 100644 --- a/packages/node_modules/@node-red/nodes/core/parsers/70-CSV.js +++ b/packages/node_modules/@node-red/nodes/core/parsers/70-CSV.js @@ -19,9 +19,9 @@ module.exports = function(RED) { function CSVNode(n) { RED.nodes.createNode(this,n); this.template = (n.temp || ""); - this.sep = (n.sep || ',').replace("\\t","\t").replace("\\n","\n").replace("\\r","\r"); + this.sep = (n.sep || ',').replaceAll("\\t","\t").replaceAll("\\n","\n").replaceAll("\\r","\r"); this.quo = '"'; - this.ret = (n.ret || "\n").replace("\\n","\n").replace("\\r","\r"); + this.ret = (n.ret || "\n").replaceAll("\\n","\n").replaceAll("\\r","\r"); this.winflag = (this.ret === "\r\n"); this.lineend = "\n"; this.multi = n.multi || "one"; From 24291918386c9fbef309a6ff8caeffb99ecb6ec8 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Mon, 19 Dec 2022 13:48:21 +0000 Subject: [PATCH 171/253] CSV - swap to regex replace for node14 support --- packages/node_modules/@node-red/nodes/core/parsers/70-CSV.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/parsers/70-CSV.js b/packages/node_modules/@node-red/nodes/core/parsers/70-CSV.js index 504e184d2..04f2bb71f 100644 --- a/packages/node_modules/@node-red/nodes/core/parsers/70-CSV.js +++ b/packages/node_modules/@node-red/nodes/core/parsers/70-CSV.js @@ -19,9 +19,9 @@ module.exports = function(RED) { function CSVNode(n) { RED.nodes.createNode(this,n); this.template = (n.temp || ""); - this.sep = (n.sep || ',').replaceAll("\\t","\t").replaceAll("\\n","\n").replaceAll("\\r","\r"); + this.sep = (n.sep || ',').replace(/\\t/g,"\t").replace(/\\n/g,"\n").replace(/\\r/g,"\r"); this.quo = '"'; - this.ret = (n.ret || "\n").replaceAll("\\n","\n").replaceAll("\\r","\r"); + this.ret = (n.ret || "\n").replace(/\\n/g,"\n").replace(/\\r/g,"\r"); this.winflag = (this.ret === "\r\n"); this.lineend = "\n"; this.multi = n.multi || "one"; From 93a191123210251b104adac35d1ec38c5aab941a Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Mon, 19 Dec 2022 21:26:20 +0000 Subject: [PATCH 172/253] CSV - Add note about msg.reset to info page to close #3976 --- .../@node-red/nodes/locales/en-US/parsers/70-CSV.html | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/node_modules/@node-red/nodes/locales/en-US/parsers/70-CSV.html b/packages/node_modules/@node-red/nodes/locales/en-US/parsers/70-CSV.html index dc4dd98ff..baa3b036b 100644 --- a/packages/node_modules/@node-red/nodes/locales/en-US/parsers/70-CSV.html +++ b/packages/node_modules/@node-red/nodes/locales/en-US/parsers/70-CSV.html @@ -47,5 +47,6 @@

    If 'include null values' option is checked, null values will be returned in result, ie. middle value '"1",,3'.

    The node can accept a multi-part input as long as the parts property is set correctly, for example from a file-in node or split node.

    If outputting multiple messages they will have their parts property set and form a complete message sequence.

    +

    If the node is set to only send column headers once, then setting msg.reset to any value will cause the node to resend the headers.

    Note: the column template must be comma separated - even if a different separator is chosen for the data.

    From 5670bd82658b15378320b2d49ce92f93e42a2c6f Mon Sep 17 00:00:00 2001 From: Ben Hardill Date: Sat, 24 Dec 2022 19:32:33 +0000 Subject: [PATCH 173/253] Support form-data arrays --- .../@node-red/nodes/core/network/21-httprequest.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/node_modules/@node-red/nodes/core/network/21-httprequest.js b/packages/node_modules/@node-red/nodes/core/network/21-httprequest.js index 9eac4da91..ad283657d 100644 --- a/packages/node_modules/@node-red/nodes/core/network/21-httprequest.js +++ b/packages/node_modules/@node-red/nodes/core/network/21-httprequest.js @@ -435,6 +435,10 @@ in your Node-RED user directory (${RED.settings.userDir}). formData.append(opt, val); } else if (typeof val === 'object' && val.hasOwnProperty('value')) { formData.append(opt,val.value,val.options || {}); + } else if (Array.isArray(val)) { + for (var i=0; i Date: Sat, 24 Dec 2022 20:35:51 +0000 Subject: [PATCH 174/253] Add tests --- .../nodes/core/network/21-httprequest_spec.js | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/test/nodes/core/network/21-httprequest_spec.js b/test/nodes/core/network/21-httprequest_spec.js index 0348dcea1..7584c5a54 100644 --- a/test/nodes/core/network/21-httprequest_spec.js +++ b/test/nodes/core/network/21-httprequest_spec.js @@ -2322,7 +2322,7 @@ describe('HTTP Request Node', function() { var n2 = helper.getNode("n2"); n2.on('input', function(msg) { try{ - msg.payload.should.equal(`RequestError: Parse Error: Missing expected CR after header value : http://localhost:${port}/`) + msg.payload.should.startWith(`RequestError: Parse Error:`) done() } catch (err) { done(err) @@ -2334,4 +2334,38 @@ describe('HTTP Request Node', function() { }); } }); + + describe('multipart form posts', function() { + it('should send arrays as multiple entries', function (done) { + const flow = [ + { + id: 'n1', type: 'http request', wires: [['n2']], method: 'POST', ret: 'obj', url: getTestURL('/file-upload'), headers: [ + ] + }, + { id: "n2", type: "helper" } + ]; + helper.load(httpRequestNode, flow, function() { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + n2.on('input', function(msg){ + try { + msg.payload.body.should.have.property('foo') + msg.payload.body.list.should.deepEqual(['a','b','c']) + done() + } catch (e) { + done(e) + } + }); + n1.receive({ + headers: { + 'content-type': 'multipart/form-data' + }, + payload: { + foo: 'bar', + list: [ 'a', 'b', 'c' ] + } + }); + }) + }); + }) }); From ce57ba80ebe635755dd1f97db61529c18bb9a63c Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 27 Dec 2022 14:56:32 +0000 Subject: [PATCH 175/253] Fix mqtt nodes not reconnected on modified-flows deploy --- .../@node-red/nodes/core/network/10-mqtt.js | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/network/10-mqtt.js b/packages/node_modules/@node-red/nodes/core/network/10-mqtt.js index 3e789be7f..0a7ed6dfa 100644 --- a/packages/node_modules/@node-red/nodes/core/network/10-mqtt.js +++ b/packages/node_modules/@node-red/nodes/core/network/10-mqtt.js @@ -295,7 +295,7 @@ module.exports = function(RED) { /* mute error - it simply isnt JSON, just leave payload as a string */ } } - } //else { + } //else { //leave as buffer //} } @@ -357,7 +357,7 @@ module.exports = function(RED) { return; } done(err); - }); + }); } else { done(); } @@ -718,9 +718,10 @@ module.exports = function(RED) { node.deregister = function(mqttNode, done, autoDisconnect) { delete node.users[mqttNode.id]; if (autoDisconnect && !node.closing && node.connected && Object.keys(node.users).length === 0) { - node.disconnect(); + node.disconnect(done); + } else { + done(); } - done(); }; node.canConnect = function() { return !node.connected && !node.connecting; @@ -854,7 +855,7 @@ module.exports = function(RED) { let waitEnd = (client, ms) => { return new Promise( (resolve, reject) => { node.closing = true; - if(!client) { + if(!client) { resolve(); } else { const t = setTimeout(() => { @@ -1033,7 +1034,7 @@ module.exports = function(RED) { /** * Add event handlers to the MQTT.js client and track them so that - * we do not remove any handlers that the MQTT client uses internally. + * we do not remove any handlers that the MQTT client uses internally. * Use {@link node._clientRemoveListeners `node._clientRemoveListeners`} to remove handlers * @param {string} event The name of the event * @param {function} handler The handler for this event @@ -1041,11 +1042,11 @@ module.exports = function(RED) { node._clientOn = function(event, handler) { node.clientListeners.push({event, handler}) node.client.on(event, handler) - } + } /** - * Remove event handlers from the MQTT.js client & only the events - * that we attached in {@link node._clientOn `node._clientOn`}. + * Remove event handlers from the MQTT.js client & only the events + * that we attached in {@link node._clientOn `node._clientOn`}. * * If `event` is omitted, then all events matching `handler` are removed * * If `handler` is omitted, then all events named `event` are removed * * If both parameters are omitted, then all events are removed From f7371626973bbaf4cb84713179ff0b4248020fba Mon Sep 17 00:00:00 2001 From: Mauricio Bonani Date: Thu, 29 Dec 2022 09:47:05 -0500 Subject: [PATCH 176/253] Let themes change radialMenu text colors --- .../@node-red/editor-client/src/sass/radialMenu.scss | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/sass/radialMenu.scss b/packages/node_modules/@node-red/editor-client/src/sass/radialMenu.scss index 3348e945a..db1bba3bb 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/radialMenu.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/radialMenu.scss @@ -41,6 +41,7 @@ height: 50px; background: var(--red-ui-secondary-background); border: 2px solid var(--red-ui-primary-border-color); + color: var(--red-ui-primary-text-color); text-align: center; line-height:50px; @@ -51,7 +52,7 @@ .red-ui-editor-radial-menu-opt-disabled { border-color: var(--red-ui-tertiary-border-color); - color: var(--red-ui-tertiary-border-color); + color: var(--red-ui-secondary-text-color-disabled); } .red-ui-editor-radial-menu-opt-active { background: var(--red-ui-secondary-background-hover); From a661bc1d237987850d3398b1a5739933cd022cfe Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Sat, 31 Dec 2022 00:41:35 +0900 Subject: [PATCH 177/253] Add Japanese translation for v3.1.0-beta.0 --- .../@node-red/editor-client/locales/ja/editor.json | 4 +++- .../@node-red/nodes/locales/ja/parsers/70-CSV.html | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) 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 5ea5a28dd..d515eb557 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 @@ -1355,6 +1355,8 @@ "start-flows": "フローを開始", "stop-flows": "フローを停止", "copy-item-url": "要素のURLをコピー", - "copy-item-edit-url": "要素の編集URLをコピー" + "copy-item-edit-url": "要素の編集URLをコピー", + "move-flow-to-start": "フローを先頭に移動", + "move-flow-to-end": "フローを末尾に移動" } } diff --git a/packages/node_modules/@node-red/nodes/locales/ja/parsers/70-CSV.html b/packages/node_modules/@node-red/nodes/locales/ja/parsers/70-CSV.html index a7f144907..60645e4cc 100644 --- a/packages/node_modules/@node-red/nodes/locales/ja/parsers/70-CSV.html +++ b/packages/node_modules/@node-red/nodes/locales/ja/parsers/70-CSV.html @@ -43,5 +43,6 @@

    「null値を含む」オプションがチェックされている場合、null値が結果に返されます。つまり「"1",,3」の真ん中の値がnullになります。

    file-inノードやsplitノードが出力するメッセージの様に、partsプロパティが正しく設定されている場合、メッセージ列を入力として受け付けます。

    CSVを複数のメッセージに変換して出力する場合、出力がメッセージ列となるようpartsプロパティを設定します。

    +

    ヘッダを一度だけ送信するよう設定している場合、任意の値を持つmsg.resetを渡すと、再度ヘッダを含めて送信できるようになります。

    注: カンマ以外の区切り文字を設定した場合であっても、「列名」はカンマ区切りとしてください。

    From 1efd1a52a7337733b80b334d0bbf196f1006a05b Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Sun, 1 Jan 2023 19:36:49 +0000 Subject: [PATCH 178/253] Ensure modules containing plugins and nodes are loaded properly Fixes #3523 --- .../@node-red/registry/lib/loader.js | 28 +++++-------------- 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/packages/node_modules/@node-red/registry/lib/loader.js b/packages/node_modules/@node-red/registry/lib/loader.js index 3f0487750..d125156ab 100644 --- a/packages/node_modules/@node-red/registry/lib/loader.js +++ b/packages/node_modules/@node-red/registry/lib/loader.js @@ -126,38 +126,24 @@ function loadModuleFiles(modules) { } var pluginList; var nodeList; - return Promise.all(pluginPromises).then(function(results) { pluginList = results.filter(r => !!r); - // Initial plugin load has happened. Ensure modules that provide - // plugins are in the registry now. - for (var module in modules) { - if (modules.hasOwnProperty(module)) { - if (modules[module].plugins && Object.keys(modules[module].plugins).length > 0) { - // Add the modules for plugins - if (!modules[module].err) { - registry.addModule(modules[module]); - } - } - } - } - return loadNodeSetList(pluginList); - }).then(function() { - return Promise.all(nodePromises); + return Promise.all(nodePromises) }).then(function(results) { nodeList = results.filter(r => !!r); // Initial node load has happened. Ensure remaining modules are in the registry for (var module in modules) { if (modules.hasOwnProperty(module)) { - if (!modules[module].plugins || Object.keys(modules[module].plugins).length === 0) { - if (!modules[module].err) { - registry.addModule(modules[module]); - } + if (!modules[module].err) { + registry.addModule(modules[module]); } } } + }).then(function() { + return loadNodeSetList(pluginList); + }).then(function() { return loadNodeSetList(nodeList); - }); + }) } async function loadPluginTemplate(plugin) { From 74794fea099f8ff511deb0fd8ece84cc2e095dc7 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Sun, 1 Jan 2023 22:21:49 +0000 Subject: [PATCH 179/253] Split node: avoid duplicate done call for buffer split Fixes #3982 --- .../node_modules/@node-red/nodes/core/sequence/17-split.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/core/sequence/17-split.js b/packages/node_modules/@node-red/nodes/core/sequence/17-split.js index 325cf85b5..4e71fe6c7 100644 --- a/packages/node_modules/@node-red/nodes/core/sequence/17-split.js +++ b/packages/node_modules/@node-red/nodes/core/sequence/17-split.js @@ -251,7 +251,9 @@ module.exports = function(RED) { } else { node.buffer = buff.slice(p,buff.length); - node.pendingDones.push(done); + if (node.buffer.length > 0) { + node.pendingDones.push(done); + } } if (node.buffer.length == 0) { done(); From 7c306a84302837eb089dcde80d0b4058afc98e4d Mon Sep 17 00:00:00 2001 From: Dirk-Jan Faber Date: Tue, 3 Jan 2023 13:41:31 +0100 Subject: [PATCH 180/253] Comment node: Clarify where the text will appear The text will appear in the information tab of the side panel and not in the help tab of the side panel. --- .../@node-red/nodes/locales/en-US/common/90-comment.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/locales/en-US/common/90-comment.html b/packages/node_modules/@node-red/nodes/locales/en-US/common/90-comment.html index 56735d51f..e3ae5e782 100644 --- a/packages/node_modules/@node-red/nodes/locales/en-US/common/90-comment.html +++ b/packages/node_modules/@node-red/nodes/locales/en-US/common/90-comment.html @@ -18,5 +18,5 @@

    A node you can use to add comments to your flows.

    Details

    The edit panel will accept Markdown syntax. The text will be rendered into - this information side panel.

    + the information side panel.

    From 7e8b7602b41f6fe34f01169b1438668d3b28675a Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Thu, 5 Jan 2023 10:28:48 +0900 Subject: [PATCH 181/253] add support for inline image drag and drop to markdown editor --- .../editor-client/locales/en-US/editor.json | 1 + .../editor-client/locales/ja/editor.json | 1 + .../src/js/ui/editors/code-editor.js | 12 +++- .../src/js/ui/editors/markdown.js | 67 +++++++++++++++++-- .../editor-client/src/sass/dragdrop.scss | 24 +++++++ 5 files changed, 98 insertions(+), 7 deletions(-) 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 8de24c3c9..237a2e0ed 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 @@ -53,6 +53,7 @@ "confirmDelete": "Confirm delete", "delete": "Are you sure you want to delete '__label__'?", "dropFlowHere": "Drop the flow here", + "dropImageHere": "Drop the image here", "addFlow": "Add flow", "addFlowToRight": "Add flow to the right", "hideFlow": "Hide flow", 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 5ea5a28dd..cdc650117 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 @@ -53,6 +53,7 @@ "confirmDelete": "削除の確認", "delete": "本当に '__label__' を削除しますか?", "dropFlowHere": "ここにフローをドロップしてください", + "dropImageHere": "ここに画像ファイルをドロップしてください", "addFlow": "フローの追加", "addFlowToRight": "右側にフローを追加", "hideFlow": "フローを非表示", diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/code-editor.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/code-editor.js index 7cee2026b..b92881764 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/code-editor.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/code-editor.js @@ -45,6 +45,9 @@ selectedCodeEditor = RED.editor.codeEditor[defaultEditor]; initialised = selectedCodeEditor.init(); } + + $('

    ').appendTo('#red-ui-editor'); + $("#red-ui-image-drop-target").hide(); } function create(options) { @@ -64,6 +67,7 @@ options = {}; } + var editor = null; if (this.editor.type === MONACO) { // compatibility (see above note) if (!options.element && !options.id) { @@ -74,10 +78,14 @@ console.warn("createEditor() options.element or options.id is not valid", options); $("#dialog-form").append('