mirror of
https://github.com/node-red/node-red.git
synced 2025-12-27 15:34:26 +01:00
Merge branch 'master' into dev
This commit is contained in:
@@ -46,10 +46,20 @@ RED.contextMenu = (function () {
|
||||
hasEnabledNode = true;
|
||||
}
|
||||
}
|
||||
if (n.l === undefined || n.l) {
|
||||
hasLabeledNode = true;
|
||||
if (n.l === undefined) {
|
||||
// Check if the node sets showLabel in the defaults
|
||||
// as that determines the default behaviour for the node
|
||||
if (n._def.showLabel !== false) {
|
||||
hasLabeledNode = true;
|
||||
} else {
|
||||
hasUnlabeledNode = true;
|
||||
}
|
||||
} else {
|
||||
hasUnlabeledNode = true;
|
||||
if (n.l) {
|
||||
hasLabeledNode = true;
|
||||
} else {
|
||||
hasUnlabeledNode = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -284,37 +284,80 @@ RED.palette.editor = (function() {
|
||||
|
||||
function _refreshNodeModule(module) {
|
||||
if (!nodeEntries.hasOwnProperty(module)) {
|
||||
nodeEntries[module] = {info:RED.nodes.registry.getModule(module)};
|
||||
var index = [module];
|
||||
for (var s in nodeEntries[module].info.sets) {
|
||||
if (nodeEntries[module].info.sets.hasOwnProperty(s)) {
|
||||
index.push(s);
|
||||
index = index.concat(nodeEntries[module].info.sets[s].types)
|
||||
const nodeInfo = RED.nodes.registry.getModule(module);
|
||||
let index = [module];
|
||||
|
||||
nodeEntries[module] = {
|
||||
info: {
|
||||
name: nodeInfo.name,
|
||||
version: nodeInfo.version,
|
||||
local: nodeInfo.local,
|
||||
nodeSet: nodeInfo.sets,
|
||||
},
|
||||
};
|
||||
|
||||
if (nodeInfo.pending_version) {
|
||||
nodeEntries[module].info.pending_version = nodeInfo.pending_version;
|
||||
}
|
||||
|
||||
for (const set in nodeInfo.sets) {
|
||||
if (nodeInfo.sets.hasOwnProperty(set)) {
|
||||
index.push(set);
|
||||
index = index.concat(nodeInfo.sets[set].types);
|
||||
}
|
||||
}
|
||||
|
||||
nodeEntries[module].index = index.join(",").toLowerCase();
|
||||
nodeList.editableList('addItem', nodeEntries[module]);
|
||||
} else {
|
||||
var moduleInfo = nodeEntries[module].info;
|
||||
var nodeEntry = nodeEntries[module].elements;
|
||||
if (nodeEntry) {
|
||||
if (moduleInfo.plugin) {
|
||||
nodeEntry.enableButton.hide();
|
||||
nodeEntry.removeButton.show();
|
||||
if (nodeEntries[module].info.pluginSet && !nodeEntries[module].info.nodeSet) {
|
||||
// Since plugins are loaded before nodes, check if the module has nodes too
|
||||
const nodeInfo = RED.nodes.registry.getModule(module);
|
||||
|
||||
if (nodeInfo) {
|
||||
let index = [nodeEntries[module].index];
|
||||
|
||||
for (const set in nodeInfo.sets) {
|
||||
if (nodeInfo.sets.hasOwnProperty(set)) {
|
||||
index.push(set);
|
||||
index = index.concat(nodeInfo.sets[set].types)
|
||||
}
|
||||
}
|
||||
|
||||
nodeEntries[module].info.nodeSet = nodeInfo.sets;
|
||||
nodeEntries[module].index = index.join(",").toLowerCase();
|
||||
}
|
||||
}
|
||||
|
||||
const moduleInfo = nodeEntries[module].info;
|
||||
const nodeEntry = nodeEntries[module].elements;
|
||||
if (nodeEntry) {
|
||||
const setCount = [];
|
||||
|
||||
if (moduleInfo.pluginSet) {
|
||||
let pluginCount = 0;
|
||||
for (let setName in moduleInfo.sets) {
|
||||
if (moduleInfo.sets.hasOwnProperty(setName)) {
|
||||
let set = moduleInfo.sets[setName];
|
||||
if (set.plugins) {
|
||||
for (const setName in moduleInfo.pluginSet) {
|
||||
if (moduleInfo.pluginSet.hasOwnProperty(setName)) {
|
||||
let set = moduleInfo.pluginSet[setName];
|
||||
if (set.plugins && set.plugins.length) {
|
||||
pluginCount += set.plugins.length;
|
||||
} else if (set.plugins && !!RED.plugins.getPlugin(setName)) {
|
||||
// `registerPlugin` in runtime not called but called in editor, add it
|
||||
pluginCount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
nodeEntry.setCount.text(RED._('palette.editor.pluginCount',{count:pluginCount,label:pluginCount}));
|
||||
|
||||
} else {
|
||||
setCount.push(RED._('palette.editor.pluginCount', { count: pluginCount }));
|
||||
|
||||
if (!moduleInfo.nodeSet) {
|
||||
// Module only have plugins
|
||||
nodeEntry.enableButton.hide();
|
||||
nodeEntry.removeButton.show();
|
||||
}
|
||||
}
|
||||
|
||||
if (moduleInfo.nodeSet) {
|
||||
var activeTypeCount = 0;
|
||||
var typeCount = 0;
|
||||
var errorCount = 0;
|
||||
@@ -322,10 +365,10 @@ RED.palette.editor = (function() {
|
||||
nodeEntries[module].totalUseCount = 0;
|
||||
nodeEntries[module].setUseCount = {};
|
||||
|
||||
for (var setName in moduleInfo.sets) {
|
||||
if (moduleInfo.sets.hasOwnProperty(setName)) {
|
||||
var inUseCount = 0;
|
||||
const set = moduleInfo.sets[setName];
|
||||
for (const setName in moduleInfo.nodeSet) {
|
||||
if (moduleInfo.nodeSet.hasOwnProperty(setName)) {
|
||||
let inUseCount = 0;
|
||||
const set = moduleInfo.nodeSet[setName];
|
||||
const setElements = nodeEntry.sets[setName]
|
||||
|
||||
if (set.err) {
|
||||
@@ -342,8 +385,8 @@ RED.palette.editor = (function() {
|
||||
activeTypeCount += set.types.length;
|
||||
}
|
||||
typeCount += set.types.length;
|
||||
for (var i=0;i<moduleInfo.sets[setName].types.length;i++) {
|
||||
var t = moduleInfo.sets[setName].types[i];
|
||||
for (var i=0;i<moduleInfo.nodeSet[setName].types.length;i++) {
|
||||
var t = moduleInfo.nodeSet[setName].types[i];
|
||||
inUseCount += (typesInUse[t]||0);
|
||||
if (setElements && set.enabled) {
|
||||
var def = RED.nodes.getType(t);
|
||||
@@ -379,8 +422,8 @@ RED.palette.editor = (function() {
|
||||
nodeEntry.errorRow.show();
|
||||
}
|
||||
|
||||
var nodeCount = (activeTypeCount === typeCount)?typeCount:activeTypeCount+" / "+typeCount;
|
||||
nodeEntry.setCount.text(RED._('palette.editor.nodeCount',{count:typeCount,label:nodeCount}));
|
||||
const nodeCount = (activeTypeCount === typeCount) ? typeCount : activeTypeCount + " / " + typeCount;
|
||||
setCount.push(RED._('palette.editor.nodeCount', { count: typeCount, label: nodeCount }));
|
||||
|
||||
if (nodeEntries[module].totalUseCount > 0) {
|
||||
nodeEntry.enableButton.text(RED._('palette.editor.inuse'));
|
||||
@@ -399,6 +442,7 @@ RED.palette.editor = (function() {
|
||||
nodeEntry.container.toggleClass("disabled",(activeTypeCount === 0));
|
||||
}
|
||||
}
|
||||
nodeEntry.setCount.text(setCount.join(" & ") || RED._("sidebar.info.empty"));
|
||||
}
|
||||
if (moduleInfo.pending_version) {
|
||||
nodeEntry.versionSpan.html(moduleInfo.version+' <i class="fa fa-long-arrow-right"></i> '+moduleInfo.pending_version).appendTo(nodeEntry.metaRow)
|
||||
@@ -789,19 +833,36 @@ RED.palette.editor = (function() {
|
||||
})
|
||||
|
||||
RED.events.on("registry:plugin-module-added", function(module) {
|
||||
|
||||
if (!nodeEntries.hasOwnProperty(module)) {
|
||||
nodeEntries[module] = {info:RED.plugins.getModule(module)};
|
||||
var index = [module];
|
||||
for (var s in nodeEntries[module].info.sets) {
|
||||
if (nodeEntries[module].info.sets.hasOwnProperty(s)) {
|
||||
index.push(s);
|
||||
index = index.concat(nodeEntries[module].info.sets[s].types)
|
||||
const pluginInfo = RED.plugins.getModule(module);
|
||||
let index = [module];
|
||||
|
||||
nodeEntries[module] = {
|
||||
info: {
|
||||
name: pluginInfo.name,
|
||||
version: pluginInfo.version,
|
||||
local: pluginInfo.local,
|
||||
pluginSet: pluginInfo.sets,
|
||||
}
|
||||
};
|
||||
|
||||
if (pluginInfo.pending_version) {
|
||||
nodeEntries[module].info.pending_version = pluginInfo.pending_version;
|
||||
}
|
||||
|
||||
for (const set in pluginInfo.sets) {
|
||||
if (pluginInfo.sets.hasOwnProperty(set)) {
|
||||
index.push(set);
|
||||
// TODO: not sure plugin has `types` property
|
||||
index = index.concat(pluginInfo.sets[set].types)
|
||||
}
|
||||
}
|
||||
|
||||
nodeEntries[module].index = index.join(",").toLowerCase();
|
||||
nodeList.editableList('addItem', nodeEntries[module]);
|
||||
} else {
|
||||
// Since plugins are loaded before nodes,
|
||||
// `nodeEntries[module]` should be undefined
|
||||
_refreshNodeModule(module);
|
||||
}
|
||||
|
||||
@@ -984,12 +1045,28 @@ RED.palette.editor = (function() {
|
||||
}
|
||||
})
|
||||
const populateSetList = function () {
|
||||
var setList = Object.keys(entry.sets)
|
||||
setList.sort(function(A,B) {
|
||||
const setList = [...Object.keys(entry.nodeSet || {}), ...Object.keys(entry.pluginSet || {})];
|
||||
setList.sort(function (A, B) {
|
||||
return A.toLowerCase().localeCompare(B.toLowerCase());
|
||||
});
|
||||
setList.forEach(function(setName) {
|
||||
var set = entry.sets[setName];
|
||||
setList.forEach(function (setName) {
|
||||
const set = (entry.nodeSet && setName in entry.nodeSet) ? entry.nodeSet[setName] : entry.pluginSet[setName];
|
||||
|
||||
if (set.plugins && !set.plugins.length) {
|
||||
// `registerPlugin` in the runtime not called
|
||||
if (!!RED.plugins.getPlugin(setName)) {
|
||||
// Add plugin if registered in editor but not in runtime
|
||||
// Can happen if plugin doesn't have .js file
|
||||
set.plugins.push({ id: setName });
|
||||
} else {
|
||||
// `registerPlugin` in the editor not called - do not add this empty set
|
||||
return;
|
||||
}
|
||||
} else if (set.types && !set.types.length) {
|
||||
// `registerPlugin` in the runtime not called - do not add this empty set
|
||||
return;
|
||||
}
|
||||
|
||||
var setRow = $('<div>',{class:"red-ui-palette-module-set"}).appendTo(contentRow);
|
||||
var buttonGroup = $('<div>',{class:"red-ui-palette-module-set-button-group"}).appendTo(setRow);
|
||||
var typeSwatches = {};
|
||||
@@ -1466,7 +1543,7 @@ RED.palette.editor = (function() {
|
||||
}
|
||||
} else {
|
||||
// dedicated list management for plugins
|
||||
if (entry.plugin) {
|
||||
if (entry.pluginSet) {
|
||||
|
||||
let e = nodeEntries[entry.name];
|
||||
if (e) {
|
||||
@@ -1479,9 +1556,9 @@ RED.palette.editor = (function() {
|
||||
// cleans the editor accordingly of its left-overs.
|
||||
let found_onremove = true;
|
||||
|
||||
let keys = Object.keys(entry.sets);
|
||||
let keys = Object.keys(entry.pluginSet);
|
||||
keys.forEach((key) => {
|
||||
let set = entry.sets[key];
|
||||
let set = entry.pluginSet[key];
|
||||
for (let i=0; i<set.plugins?.length; i++) {
|
||||
let plgn = RED.plugins.getPlugin(set.plugins[i].id);
|
||||
if (plgn && plgn.onremove && typeof plgn.onremove === 'function') {
|
||||
|
||||
@@ -176,8 +176,8 @@ RED.view.tools = (function() {
|
||||
}
|
||||
nodes.forEach(function(n) {
|
||||
var modified = false;
|
||||
var oldValue = n.l === undefined?true:n.l;
|
||||
var showLabel = n._def.hasOwnProperty("showLabel")?n._def.showLabel:true;
|
||||
var showLabel = n._def.hasOwnProperty("showLabel") ? n._def.showLabel : true;
|
||||
var oldValue = n.l === undefined ? showLabel : n.l;
|
||||
|
||||
if (labelShown) {
|
||||
if (n.l === false || (!showLabel && !n.hasOwnProperty('l'))) {
|
||||
|
||||
@@ -208,12 +208,10 @@ body {
|
||||
}
|
||||
|
||||
img {
|
||||
width: auto\9;
|
||||
height: auto;
|
||||
max-width: 100%;
|
||||
vertical-align: middle;
|
||||
border: 0;
|
||||
-ms-interpolation-mode: bicubic;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
|
||||
@@ -216,14 +216,11 @@
|
||||
.uneditable-input:focus {
|
||||
border-color: var(--red-ui-form-input-focus-color);
|
||||
outline: 0;
|
||||
outline: thin dotted \9;
|
||||
}
|
||||
|
||||
input[type="radio"],
|
||||
input[type="checkbox"] {
|
||||
margin: 4px 0 0;
|
||||
margin-top: 1px \9;
|
||||
*margin-top: 0;
|
||||
line-height: normal;
|
||||
}
|
||||
|
||||
@@ -285,12 +282,6 @@
|
||||
color: var(--red-ui-form-placeholder-color);
|
||||
}
|
||||
|
||||
input:-ms-input-placeholder,
|
||||
div[contenteditable="true"]:-ms-input-placeholder,
|
||||
textarea:-ms-input-placeholder {
|
||||
color: var(--red-ui-form-placeholder-color);
|
||||
}
|
||||
|
||||
input::-webkit-input-placeholder,
|
||||
div[contenteditable="true"]::-webkit-input-placeholder,
|
||||
textarea::-webkit-input-placeholder {
|
||||
@@ -568,11 +559,7 @@
|
||||
|
||||
input.search-query {
|
||||
padding-right: 14px;
|
||||
padding-right: 4px \9;
|
||||
padding-left: 14px;
|
||||
padding-left: 4px \9;
|
||||
/* IE7-8 doesn't have border-radius, so don't indent the padding */
|
||||
|
||||
margin-bottom: 0;
|
||||
border-radius: 15px;
|
||||
}
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
-webkit-user-select: none;
|
||||
-khtml-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
@@ -26,7 +25,6 @@
|
||||
-webkit-user-select: auto;
|
||||
-khtml-user-select: auto;
|
||||
-moz-user-select: auto;
|
||||
-ms-user-select: auto;
|
||||
user-select: auto;
|
||||
}
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
|
||||
<div class="form-row">
|
||||
<label for="node-input-url"><i class="fa fa-globe"></i> <span data-i18n="httpin.label.url"></span></label>
|
||||
<input id="node-input-url" type="text" placeholder="http://">
|
||||
<input id="node-input-url" type="text" placeholder="https://">
|
||||
</div>
|
||||
|
||||
<div class="form-row node-input-paytoqs-row">
|
||||
|
||||
@@ -586,6 +586,17 @@ in your Node-RED user directory (${RED.settings.userDir}).
|
||||
opts.https.certificate = opts.https.cert;
|
||||
delete opts.https.cert;
|
||||
}
|
||||
// The got library uses a different case for some https properties compared to the
|
||||
// standard node tls options object.
|
||||
if (opts.https.ALPNProtocols) {
|
||||
opts.https.alpnProtocols = opts.https.ALPNProtocols
|
||||
delete opts.https.ALPNProtocols
|
||||
}
|
||||
// The got library doesn't support servername at this time
|
||||
// https://github.com/sindresorhus/got/issues/2320
|
||||
if (opts.https.servername) {
|
||||
delete opts.https.servername
|
||||
}
|
||||
} else {
|
||||
if (msg.hasOwnProperty('rejectUnauthorized')) {
|
||||
opts.https = { rejectUnauthorized: msg.rejectUnauthorized };
|
||||
|
||||
@@ -21,8 +21,8 @@
|
||||
<input type="text" id="node-input-name" data-i18n="[placeholder]node-red:common.label.name">
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label for="node-input-property"><i class="fa fa-forward"></i> <span data-i18n="split.splitThe"></span></label>
|
||||
<input type="text" id="node-input-property" style="width:70%;">
|
||||
<label for="node-input-property" style="padding-left:10px; margin-right:-10px;" data-i18n="split.splitThe"></label>
|
||||
<input type="text" id="node-input-property" style="width:70%;"/>
|
||||
</div>
|
||||
<div class="form-row"><span data-i18n="[html]split.strBuff"></span></div>
|
||||
<div class="form-row">
|
||||
|
||||
@@ -1017,7 +1017,7 @@
|
||||
"objectSend": "Send a message for each key/value pair",
|
||||
"strBuff": "<b>String</b> / <b>Buffer</b>",
|
||||
"array": "<b>Array</b>",
|
||||
"splitThe": "Split the",
|
||||
"splitThe": "Split property",
|
||||
"splitUsing": "Split using",
|
||||
"splitLength": "Fixed length of",
|
||||
"stream": "Handle as a stream of messages",
|
||||
|
||||
@@ -406,6 +406,7 @@ async function loadPlugin(plugin) {
|
||||
}
|
||||
try {
|
||||
var r = require(plugin.file);
|
||||
r = r.__esModule ? r.default : r
|
||||
if (typeof r === "function") {
|
||||
|
||||
var red = registryUtil.createNodeApi(plugin);
|
||||
|
||||
@@ -51,6 +51,8 @@ function runGitCommand(args,cwd,env,emit) {
|
||||
err.code = "git_auth_failed";
|
||||
} else if(/Authentication failed/i.test(stderr)) {
|
||||
err.code = "git_auth_failed";
|
||||
} else if (/The requested URL returned error: 403/i.test(stderr)) {
|
||||
err.code = "git_auth_failed";
|
||||
} else if (/commit your changes or stash/i.test(stderr)) {
|
||||
err.code = "git_local_overwrite";
|
||||
} else if (/CONFLICT/.test(err.stdout)) {
|
||||
|
||||
Reference in New Issue
Block a user