Compare commits

...

44 Commits

Author SHA1 Message Date
Nick O'Leary
a790136164 Merge branch 'master' into 4133-mqtt-v5-disconnects-when-subscribing-to-aws-core-broker 2023-05-22 15:16:58 +01:00
Nick O'Leary
32a49a1ef1 Merge pull request #4172 from wooferguy/Zombie-Junctions-Fix
Check for group
2023-05-22 12:51:46 +01:00
Nick O'Leary
4b88775183 Merge pull request #4166 from node-red/fix-RBE-for-missing-payload
Fix RBE for missing "payload"
2023-05-22 12:49:07 +01:00
Nick O'Leary
29db82625f Merge pull request #4162 from kazuhitoyokoi/master-fixdownload4ipad
Fix content type for downloading flows.json
2023-05-22 12:48:05 +01:00
Nick O'Leary
2b6c9e3439 Merge pull request #4157 from kazuhitoyokoi/master-addjpn
Add Japanese translation for keyboard shortcut scope
2023-05-22 12:47:46 +01:00
Nick O'Leary
9ea4853c89 Merge branch 'master' into Zombie-Junctions-Fix 2023-05-22 11:29:31 +01:00
Nick O'Leary
3b5e21761b Merge branch 'master' into fix-RBE-for-missing-payload 2023-05-22 11:29:19 +01:00
Nick O'Leary
2d76bf29cf Merge branch 'master' into master-fixdownload4ipad 2023-05-22 11:29:02 +01:00
Nick O'Leary
c21f7abe4e Merge branch 'master' into master-addjpn 2023-05-22 11:28:40 +01:00
Nick O'Leary
8c191263c0 Merge branch 'master' into 4133-mqtt-v5-disconnects-when-subscribing-to-aws-core-broker 2023-05-22 11:28:24 +01:00
Nick O'Leary
2679ff277c Merge pull request #4173 from wooferguy/Inject-Node-Test-Fix
Invalid JSONata Inject node test passing condition
2023-05-22 11:26:38 +01:00
wooferguy
9e3f148273 Invalid JSONata Inject node test passing condition
This test would sometimes run twice, causing the author to increase its catch count to 2 before considering the test complete. However even one pass proves the node is behaving as expected, and it always runs at least once. I have left the conditional statement in so it can be changed in future.
2023-05-17 18:56:07 +12:00
wooferguy
7e9042e9f7 Check for group
Remove junction from groups node list if it is present.
2023-05-17 05:14:18 +12:00
Dave Conway-Jones
67c5a248ad Fix RBE for missing "payload"
To close #4165
2023-05-08 09:28:35 +01:00
Kazuhito Yokoi
e8ddee24a9 Use correct content type for downloading flows.json 2023-05-06 21:10:49 +09:00
Kazuhito Yokoi
be4eab65f6 Fix content type for downloading flows.json 2023-05-06 20:00:20 +09:00
Kazuhito Yokoi
c0650cc0f5 Add Japanese translation for keyboard shortcut scope 2023-05-01 13:53:54 +09:00
Stephen McLaughlin
02c7d014cb dont use subscriptionIdentifier no broker support 2023-04-29 21:00:26 +01:00
Nick O'Leary
67dd7e30fa Merge pull request #4154 from node-red/add-editor-scope
Add editor scope to keyboard shortcut scope select
2023-04-28 18:47:25 +01:00
Nick O'Leary
e9a08af73b Merge pull request #4148 from GerwinvBeek/Bugs/not-loading-missing-subflow
Handle missing subflow when loading flows into the editor
2023-04-28 18:47:10 +01:00
Nick O'Leary
08b1ef2766 Merge branch 'master' into add-editor-scope 2023-04-28 18:07:47 +01:00
Nick O'Leary
667d8673d4 Merge branch 'master' into Bugs/not-loading-missing-subflow 2023-04-28 18:07:28 +01:00
Nick O'Leary
d44ea9d558 Merge pull request #4152 from node-red/remove-coveralls
Remove coveralls reporting as it is failing builds
2023-04-28 18:07:10 +01:00
Nick O'Leary
86dfe86813 Add editor scope to keyboard shortcut scope select 2023-04-28 17:47:16 +01:00
Nick O'Leary
246409970d Remove coveralls reporting as it is failing builds 2023-04-28 17:17:40 +01:00
Nick O'Leary
841f1849c8 Update packages/node_modules/@node-red/runtime/lib/flows/util.js 2023-04-28 15:25:29 +01:00
Nick O'Leary
00e7e4d43c Merge pull request #4147 from kazuhitoyokoi/master-selection2subflow
Add node width and height to boundingBox
2023-04-28 15:23:02 +01:00
Nick O'Leary
ee43a845aa Merge pull request #4128 from kazuhitoyokoi/master-fixquickadddialog
Fix broken subflow icon and overflowed name in quick add dialog
2023-04-28 15:22:25 +01:00
Nick O'Leary
a7cc66af93 Merge pull request #4130 from kazuhitoyokoi/master-fixoverflow
Wrap long node name in tooltip, info sidebar, and node property
2023-04-28 15:21:37 +01:00
Nick O'Leary
f8701cfed0 Merge pull request #4135 from kazuhitoyokoi/master-fixactionlist
Support uppercase in keyword when searching action list
2023-04-28 15:20:56 +01:00
Nick O'Leary
6b205bf303 Merge pull request #4141 from bonanitech/palette-search-background
Fix palette filter background
2023-04-28 15:20:38 +01:00
Gerwin van Beek
6fbcec8b98 Solved node red not loading without error when subflow is missing 2023-04-24 11:51:06 +02:00
Kazuhito Yokoi
c30e57c31d Add node width and height to boundingBox 2023-04-23 20:47:17 +09:00
Mauricio Bonani
df3dc36874 Fix palette filter background 2023-04-17 10:57:40 -04:00
Kazuhito Yokoi
7b71d8d212 Support uppercase in keyword when searching action list 2023-04-10 01:25:34 +09:00
Kazuhito Yokoi
2eaae4b83f Wrap long node name in info sidebar 2023-04-05 00:56:27 +09:00
Kazuhito Yokoi
3c66af9506 Wrap long node name in tooltip and node property 2023-04-05 00:45:46 +09:00
Nick O'Leary
e5d579c1bb Merge pull request #4120 from kazuhitoyokoi/master-fixbuildstatus
Use build status icon of GitHub Actions
2023-04-01 17:29:41 +01:00
Kazuhito Yokoi
ee811ca89b Use build status icon of GitHub Actions 2023-04-02 00:39:33 +09:00
Kazuhito Yokoi
8e4933041d Wrap text of label in quick add dialog 2023-04-01 02:34:11 +09:00
Kazuhito Yokoi
1f3559e14f Set label width in quick add dialog to prevent broken node icon 2023-04-01 02:28:48 +09:00
Nick O'Leary
f1fa1bbe4e Merge pull request #4073 from kazuhitoyokoi/master-flowname
Change default file name to flows.json in project feature
2023-03-02 15:11:13 +00:00
Nick O'Leary
5eb46c570d Merge pull request #4075 from node-red/fix-link-to-monaco-options-4074
Update monaco docs link in settings.js
2023-03-02 15:08:33 +00:00
Kazuhito Yokoi
e30df544db Change default file name to flows.json in project feature 2023-02-26 00:27:13 +09:00
21 changed files with 87 additions and 44 deletions

View File

@@ -29,8 +29,8 @@ jobs:
- name: Run tests
run: |
npm run test
- name: Publish to coveralls.io
if: ${{ matrix.node-version == 14 }}
uses: coverallsapp/github-action@v1.1.2
with:
github-token: ${{ github.token }}
# - name: Publish to coveralls.io
# if: ${{ matrix.node-version == 14 }}
# uses: coverallsapp/github-action@v1.1.2
# with:
# github-token: ${{ github.token }}

View File

@@ -2,8 +2,7 @@
http://nodered.org
[![Build Status](https://travis-ci.org/node-red/node-red.svg?branch=master)](https://travis-ci.org/node-red/node-red)
[![Coverage Status](https://coveralls.io/repos/node-red/node-red/badge.svg?branch=master)](https://coveralls.io/r/node-red/node-red?branch=master)
[![Build Status](https://github.com/node-red/node-red/actions/workflows/tests.yml/badge.svg?branch=master)](https://github.com/node-red/node-red/actions?query=branch%3Amaster)
Low-code programming for event-driven applications.

View File

@@ -491,6 +491,7 @@
"unassigned": "Unassigned",
"global": "global",
"workspace": "workspace",
"editor": "edit dialog",
"selectAll": "Select all",
"selectNone": "Select none",
"selectAllConnected": "Select connected",

View File

@@ -491,6 +491,7 @@
"unassigned": "未割当",
"global": "グローバル",
"workspace": "ワークスペース",
"editor": "編集ダイアログ",
"selectAll": "全てのノードを選択",
"selectNone": "選択を外す",
"selectAllConnected": "接続されたノードを選択",

View File

@@ -2095,16 +2095,27 @@ RED.nodes = (function() {
} else if (n.type.substring(0,7) === "subflow") {
var parentId = n.type.split(":")[1];
var subflow = subflow_denylist[parentId]||subflow_map[parentId]||getSubflow(parentId);
if (createNewIds || options.importMap[n.id] === "copy") {
parentId = subflow.id;
node.type = "subflow:"+parentId;
node._def = registry.getNodeType(node.type);
delete node.i;
if (!subflow){
node._def = {
color:"#fee",
defaults: {},
label: "unknown: "+n.type,
labelStyle: "red-ui-flow-node-label-italic",
outputs: n.outputs|| (n.wires && n.wires.length) || 0,
set: registry.getNodeSet("node-red/unknown")
}
} else {
if (createNewIds || options.importMap[n.id] === "copy") {
parentId = subflow.id;
node.type = "subflow:"+parentId;
node._def = registry.getNodeType(node.type);
delete node.i;
}
node.name = n.name;
node.outputs = subflow.out.length;
node.inputs = subflow.in.length;
node.env = n.env;
}
node.name = n.name;
node.outputs = subflow.out.length;
node.inputs = subflow.in.length;
node.env = n.env;
} else if (n.type === 'junction') {
node._def = {defaults:{}}
node._config.x = node.x

View File

@@ -47,7 +47,7 @@ RED.actionList = (function() {
var searchDiv = $("<div>",{class:"red-ui-search-container"}).appendTo(dialog);
searchInput = $('<input type="text" data-i18n="[placeholder]keyboard.filterActions">').appendTo(searchDiv).searchBox({
change: function() {
filterTerm = $(this).val().trim();
filterTerm = $(this).val().trim().toLowerCase();
filterTerms = filterTerm.split(" ");
searchResults.editableList('filter');
searchResults.find("li.selected").removeClass("selected");

View File

@@ -37,13 +37,13 @@ RED.clipboard = (function() {
// IE11 workaround
// IE does not support data uri scheme for downloading data
var blob = new Blob([data], {
type: "data:text/plain;charset=utf-8"
type: "data:application/json;charset=utf-8"
});
navigator.msSaveBlob(blob, file);
}
else {
var element = document.createElement('a');
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(data));
element.setAttribute('href', 'data:application/json;charset=utf-8,' + encodeURIComponent(data));
element.setAttribute('download', file);
element.style.display = 'none';
document.body.appendChild(element);

View File

@@ -45,11 +45,13 @@ RED.editor = (function() {
var hasChanged;
if (node.type.indexOf("subflow:")===0) {
subflow = RED.nodes.subflow(node.type.substring(8));
isValid = subflow.valid;
hasChanged = subflow.changed;
if (isValid === undefined) {
isValid = validateNode(subflow);
if (subflow){
isValid = subflow.valid;
hasChanged = subflow.changed;
if (isValid === undefined) {
isValid = validateNode(subflow);
hasChanged = subflow.changed;
}
}
validationErrors = validateNodeProperties(node, node._def.defaults, node);
node.valid = isValid && validationErrors.length === 0;

View File

@@ -491,7 +491,11 @@ RED.keyboard = (function() {
okButton.attr("disabled",!valid);
});
var scopeSelect = $('<select><option value="*" data-i18n="keyboard.global"></option><option value="red-ui-workspace" data-i18n="keyboard.workspace"></option></select>').appendTo(scope);
var scopeSelect = $('<select>'+
'<option value="*" data-i18n="keyboard.global"></option>'+
'<option value="red-ui-workspace" data-i18n="keyboard.workspace"></option>'+
'<option value="red-ui-editor-stack" data-i18n="keyboard.editor"></option>'+
'</select>').appendTo(scope);
scopeSelect.i18n();
if (object.scope === "workspace") {
object.scope = "red-ui-workspace";

View File

@@ -747,14 +747,14 @@ RED.projects = (function() {
var row = $('<div class="form-row"></div>').appendTo(body);
$('<label for="red-ui-projects-dialog-screen-create-project-file">'+RED._("projects.default-files.flow-file")+'</label>').appendTo(row);
var subrow = $('<div style="position:relative;"></div>').appendTo(row);
var defaultFlowFile = (createProjectOptions.files &&createProjectOptions.files.flow) || (RED.settings.files && RED.settings.files.flow)||"flow.json";
var defaultFlowFile = (createProjectOptions.files &&createProjectOptions.files.flow) || (RED.settings.files && RED.settings.files.flow) || "flows.json";
projectFlowFileInput = $('<input id="red-ui-projects-dialog-screen-create-project-file" type="text">').val(defaultFlowFile)
.on("change keyup paste",validateForm)
.appendTo(subrow);
$('<div class="red-ui-projects-dialog-screen-input-status"></div>').appendTo(subrow);
$('<label class="red-ui-projects-edit-form-sublabel"><small>*.json</small></label>').appendTo(row);
var defaultCredentialsFile = (createProjectOptions.files &&createProjectOptions.files.credentials) || (RED.settings.files && RED.settings.files.credentials)||"flow_cred.json";
var defaultCredentialsFile = (createProjectOptions.files &&createProjectOptions.files.credentials) || (RED.settings.files && RED.settings.files.credentials) || "flows_cred.json";
row = $('<div class="form-row"></div>').appendTo(body);
$('<label for="red-ui-projects-dialog-screen-create-project-credfile">'+RED._("projects.default-files.credentials-file")+'</label>').appendTo(row);
subrow = $('<div style="position:relative;"></div>').appendTo(row);
@@ -1257,7 +1257,7 @@ RED.projects = (function() {
row = $('<div class="form-row red-ui-projects-dialog-screen-create-row red-ui-projects-dialog-screen-create-row-empty"></div>').appendTo(container);
$('<label for="red-ui-projects-dialog-screen-create-project-file">'+RED._("projects.create.flow-file")+'</label>').appendTo(row);
subrow = $('<div style="position:relative;"></div>').appendTo(row);
projectFlowFileInput = $('<input id="red-ui-projects-dialog-screen-create-project-file" type="text">').val("flow.json")
projectFlowFileInput = $('<input id="red-ui-projects-dialog-screen-create-project-file" type="text">').val("flows.json")
.on("change keyup paste",validateForm)
.appendTo(subrow);
$('<div class="red-ui-projects-dialog-screen-input-status"></div>').appendTo(subrow);

View File

@@ -663,24 +663,23 @@ RED.subflow = (function() {
var candidateOutputs = [];
var candidateInputNodes = {};
var boundingBox = [nodeList[0].x,
nodeList[0].y,
nodeList[0].x,
nodeList[0].y];
var boundingBox = [nodeList[0].x-(nodeList[0].w/2),
nodeList[0].y-(nodeList[0].h/2),
nodeList[0].x+(nodeList[0].w/2),
nodeList[0].y+(nodeList[0].h/2)];
for (i=0;i<nodeList.length;i++) {
n = nodeList[i];
nodes[n.id] = {n:n,outputs:{}};
boundingBox = [
Math.min(boundingBox[0],n.x),
Math.min(boundingBox[1],n.y),
Math.max(boundingBox[2],n.x),
Math.max(boundingBox[3],n.y)
Math.min(boundingBox[0],n.x-(n.w/2)),
Math.min(boundingBox[1],n.y-(n.h/2)),
Math.max(boundingBox[2],n.x+(n.w/2)),
Math.max(boundingBox[3],n.y+(n.h/2))
]
}
var offsetX = snapToGrid(boundingBox[0] - 200);
var offsetY = snapToGrid(boundingBox[1] - 80);
var offsetX = snapToGrid(boundingBox[0] - 140);
var offsetY = snapToGrid(boundingBox[1] - 60);
var center = [
snapToGrid((boundingBox[2]+boundingBox[0]) / 2),

View File

@@ -2646,6 +2646,16 @@ RED.view = (function() {
var result = RED.nodes.removeJunction(node)
removedJunctions.push(node);
removedLinks = removedLinks.concat(result.links);
if (node.g) {
var group = RED.nodes.group(node.g);
if (selectedGroups.indexOf(group) === -1) {
// Don't use RED.group.removeFromGroup as that emits
// a change event on the node - but we're deleting it
var index = group.nodes.indexOf(node);
group.nodes.splice(index,1);
RED.group.markDirty(group);
}
}
} else {
if (node.direction === "out") {
removedSubflowOutputs.push(node);

View File

@@ -124,7 +124,7 @@
list-style-type: none;
margin: 0;
padding:0;
overflow-wrap: anywhere;
li {
display: inline-block;
padding:0;

View File

@@ -55,7 +55,7 @@
.red-ui-palette-search {
position: relative;
overflow: hidden;
background: var(--red-ui-secondary-background);
background: var(--red-ui-form-input-background);
text-align: center;
height: 35px;
padding: 3px;

View File

@@ -35,6 +35,7 @@
padding: 8px;
border-radius: 2px;
background: var(--red-ui-popover-background);
overflow-wrap: anywhere;
}
.red-ui-popover:after, .red-ui-popover:before {
border: solid transparent;

View File

@@ -108,6 +108,8 @@
}
.red-ui-search-result-node-label {
color: var(--red-ui-secondary-text-color);
width: 240px;
overflow-wrap: anywhere;
}
}

View File

@@ -31,6 +31,7 @@
> span {
display: inline-block;
margin-left: 5px;
overflow-wrap: anywhere;
}
border-bottom: 1px solid var(--red-ui-secondary-border-color);
}

View File

@@ -35,7 +35,11 @@ module.exports = function(RED) {
}
else { node.previous = {}; }
}
var value = RED.util.getMessageProperty(msg,node.property);
var value;
try {
value = RED.util.getMessageProperty(msg,node.property);
}
catch(e) { }
if (value !== undefined) {
var t = "_no_topic";
if (node.septopics) { t = topic || t; }

View File

@@ -697,7 +697,8 @@ module.exports = function(RED) {
node.options.rejectUnauthorized = (node.verifyservercert == "true" || node.verifyservercert === true);
}
}
node.v5 = () => node.options && node.options.protocolVersion == 5
node.subscriptionIdentifiersAvailable = () => node.v5() && node.serverProperties && node.serverProperties.subscriptionIdentifiersAvailable
n.autoConnect = n.autoConnect === "false" || n.autoConnect === false ? false : true;
node.setOptions(n, true);
@@ -920,7 +921,12 @@ module.exports = function(RED) {
};
node.subscriptions[topic][ref] = sub;
if (node.connected) {
const subIdsAvailable = node.subscriptionIdentifiersAvailable()
node._clientOn('message',sub.handler);
// if the broker doesn't support subscription identifiers (e.g. AWS core), then don't send them
if (options.properties && options.properties.subscriptionIdentifier && subIdsAvailable !== true) {
delete options.properties.subscriptionIdentifier
}
node.client.subscribe(topic, options);
}
};

View File

@@ -199,7 +199,9 @@ function parseConfig(config) {
if (subflowDetails) {
var subflowType = subflowDetails[1]
n.subflow = subflowType;
flow.subflows[subflowType].instances.push(n)
if (flow.subflows[subflowType]) {
flow.subflows[subflowType].instances.push(n)
}
}
if (container) {
container.nodes[n.id] = n;

View File

@@ -854,7 +854,7 @@ describe('inject node', function() {
});
n1.on("call:error", function(err) {
count++;
if (count == 2) {
if (count == 1) {
done();
}
});