mirror of
https://github.com/node-red/node-red.git
synced 2025-03-01 10:36:34 +00:00
Compare commits
167 Commits
fix-auto-c
...
4133-mqtt-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a790136164 | ||
|
|
32a49a1ef1 | ||
|
|
4b88775183 | ||
|
|
29db82625f | ||
|
|
2b6c9e3439 | ||
|
|
9ea4853c89 | ||
|
|
3b5e21761b | ||
|
|
2d76bf29cf | ||
|
|
c21f7abe4e | ||
|
|
8c191263c0 | ||
|
|
2679ff277c | ||
|
|
9e3f148273 | ||
|
|
7e9042e9f7 | ||
|
|
67c5a248ad | ||
|
|
e8ddee24a9 | ||
|
|
be4eab65f6 | ||
|
|
c0650cc0f5 | ||
|
|
02c7d014cb | ||
|
|
67dd7e30fa | ||
|
|
e9a08af73b | ||
|
|
08b1ef2766 | ||
|
|
667d8673d4 | ||
|
|
d44ea9d558 | ||
|
|
86dfe86813 | ||
|
|
246409970d | ||
|
|
841f1849c8 | ||
|
|
00e7e4d43c | ||
|
|
ee43a845aa | ||
|
|
a7cc66af93 | ||
|
|
f8701cfed0 | ||
|
|
6b205bf303 | ||
|
|
6fbcec8b98 | ||
|
|
c30e57c31d | ||
|
|
df3dc36874 | ||
|
|
7b71d8d212 | ||
|
|
2eaae4b83f | ||
|
|
3c66af9506 | ||
|
|
e5d579c1bb | ||
|
|
ee811ca89b | ||
|
|
8e4933041d | ||
|
|
1f3559e14f | ||
|
|
f1fa1bbe4e | ||
|
|
5eb46c570d | ||
|
|
24178beafc | ||
|
|
e30df544db | ||
|
|
6044871438 | ||
|
|
e612bb6a38 | ||
|
|
81ea67d6da | ||
|
|
06e35baeaa | ||
|
|
c9d72d7a1d | ||
|
|
62e9572070 | ||
|
|
fea68c8acc | ||
|
|
929f0e90ac | ||
|
|
81331e68d2 | ||
|
|
4fda59a585 | ||
|
|
ede3ac4282 | ||
|
|
16f8b78b39 | ||
|
|
892d21fb77 | ||
|
|
adfc5b3e98 | ||
|
|
f3d7016ab2 | ||
|
|
8382665bbb | ||
|
|
e799cfc16a | ||
|
|
055d0081e1 | ||
|
|
1824108d09 | ||
|
|
149e8ce9b0 | ||
|
|
f4661eec75 | ||
|
|
0f7a1a42e4 | ||
|
|
5bda221f9d | ||
|
|
fd42becbdc | ||
|
|
7dca148349 | ||
|
|
ffff8aeb91 | ||
|
|
ae92ea9476 | ||
|
|
c7017ee84b | ||
|
|
0346294c59 | ||
|
|
8d240ca797 | ||
|
|
7dbbafec1b | ||
|
|
c49330f9d1 | ||
|
|
10324d8260 | ||
|
|
8f27dae7ea | ||
|
|
7c306a8430 | ||
|
|
74794fea09 | ||
|
|
1efd1a52a7 | ||
|
|
4d202a7a37 | ||
|
|
e0d71abdc6 | ||
|
|
550eb6ee2f | ||
|
|
f737162697 | ||
|
|
ce57ba80eb | ||
|
|
b3ce0c0079 | ||
|
|
4adc6b269c | ||
|
|
920b0178ec | ||
|
|
7870830367 | ||
|
|
4c1d7ad2d2 | ||
|
|
661b07c856 | ||
|
|
5670bd8265 | ||
|
|
156c3984a7 | ||
|
|
f91af2153a | ||
|
|
805f8a5ee7 | ||
|
|
113d42ef35 | ||
|
|
c18018f017 | ||
|
|
e804addf0a | ||
|
|
4bb2b91ee6 | ||
|
|
5bb66ed7d4 | ||
|
|
95a7980ada | ||
|
|
281e9d1357 | ||
|
|
14e74afb07 | ||
|
|
742f05f59d | ||
|
|
79db4f8aa1 | ||
|
|
c4e216f839 | ||
|
|
2a49e7c8ef | ||
|
|
02af01d2ca | ||
|
|
ee4af4c7bf | ||
|
|
3d565e74a5 | ||
|
|
3cb84222f8 | ||
|
|
1b013bb73b | ||
|
|
fd54e625d5 | ||
|
|
77f6412d3b | ||
|
|
c81cd5450f | ||
|
|
0b663abe50 | ||
|
|
14c362d4ba | ||
|
|
fce43b4e1d | ||
|
|
1d547500e8 | ||
|
|
94690fad7a | ||
|
|
d693af9615 | ||
|
|
8b398f49c0 | ||
|
|
902ce68164 | ||
|
|
cd0474ce7b | ||
|
|
946def022f | ||
|
|
c62a101635 | ||
|
|
69a575097d | ||
|
|
b40551a8fa | ||
|
|
5b27bcd781 | ||
|
|
75725a38df | ||
|
|
24b055b1b8 | ||
|
|
32999ffa84 | ||
|
|
f06c53f1f1 | ||
|
|
a9eec28360 | ||
|
|
5cda972872 | ||
|
|
087946876b | ||
|
|
318f0f1b7e | ||
|
|
f4d7b71984 | ||
|
|
6d1a12af4b | ||
|
|
a40e5dbcd4 | ||
|
|
7c79ca7878 | ||
|
|
93c1600980 | ||
|
|
c3d1e6181f | ||
|
|
87e7f3a61c | ||
|
|
e724f216bf | ||
|
|
e6b379358a | ||
|
|
b0abba15a6 | ||
|
|
81b4874a7c | ||
|
|
f11b9c1e18 | ||
|
|
e15ecc00ce | ||
|
|
3e4c45ac6a | ||
|
|
4115c13a65 | ||
|
|
f872e2ab80 | ||
|
|
a81b1aa0cb | ||
|
|
efc0f1ab91 | ||
|
|
ce31edc803 | ||
|
|
199caccbc3 | ||
|
|
f060309002 | ||
|
|
fc3d86e6ff | ||
|
|
7507a7b459 | ||
|
|
d657817211 | ||
|
|
954649007c | ||
|
|
7bd7c99dd4 | ||
|
|
6a19d8246c | ||
|
|
d6bb3a558f |
3
.github/workflows/release.yml
vendored
3
.github/workflows/release.yml
vendored
@@ -5,6 +5,9 @@ on:
|
|||||||
release:
|
release:
|
||||||
types: [published]
|
types: [published]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
generate:
|
generate:
|
||||||
name: 'Update node-red-docker image'
|
name: 'Update node-red-docker image'
|
||||||
|
|||||||
20
.github/workflows/tests.yml
vendored
20
.github/workflows/tests.yml
vendored
@@ -6,16 +6,22 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
branches: [ master, dev ]
|
branches: [ master, dev ]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
|
permissions:
|
||||||
|
checks: write # for coverallsapp/github-action to create new checks
|
||||||
|
contents: read # for actions/checkout to fetch code
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
node-version: [14, 16]
|
node-version: [14, 16]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
uses: actions/setup-node@v2
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version: ${{ matrix.node-version }}
|
||||||
- name: Install Dependencies
|
- name: Install Dependencies
|
||||||
@@ -23,8 +29,8 @@ jobs:
|
|||||||
- name: Run tests
|
- name: Run tests
|
||||||
run: |
|
run: |
|
||||||
npm run test
|
npm run test
|
||||||
- name: Publish to coveralls.io
|
# - name: Publish to coveralls.io
|
||||||
if: ${{ matrix.node-version == 14 }}
|
# if: ${{ matrix.node-version == 14 }}
|
||||||
uses: coverallsapp/github-action@v1.1.2
|
# uses: coverallsapp/github-action@v1.1.2
|
||||||
with:
|
# with:
|
||||||
github-token: ${{ github.token }}
|
# github-token: ${{ github.token }}
|
||||||
|
|||||||
@@ -2,8 +2,7 @@
|
|||||||
|
|
||||||
http://nodered.org
|
http://nodered.org
|
||||||
|
|
||||||
[](https://travis-ci.org/node-red/node-red)
|
[](https://github.com/node-red/node-red/actions?query=branch%3Amaster)
|
||||||
[](https://coveralls.io/r/node-red/node-red?branch=master)
|
|
||||||
|
|
||||||
Low-code programming for event-driven applications.
|
Low-code programming for event-driven applications.
|
||||||
|
|
||||||
|
|||||||
0
packages/node_modules/@node-red/editor-client/locales/de/editor.json
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/editor-client/locales/de/editor.json
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/editor-client/locales/de/infotips.json
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/editor-client/locales/de/infotips.json
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/editor-client/locales/de/jsonata.json
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/editor-client/locales/de/jsonata.json
vendored
Executable file → Normal file
3
packages/node_modules/@node-red/editor-client/locales/en-US/editor.json
vendored
Executable file → Normal file
3
packages/node_modules/@node-red/editor-client/locales/en-US/editor.json
vendored
Executable file → Normal file
@@ -491,6 +491,7 @@
|
|||||||
"unassigned": "Unassigned",
|
"unassigned": "Unassigned",
|
||||||
"global": "global",
|
"global": "global",
|
||||||
"workspace": "workspace",
|
"workspace": "workspace",
|
||||||
|
"editor": "edit dialog",
|
||||||
"selectAll": "Select all",
|
"selectAll": "Select all",
|
||||||
"selectNone": "Select none",
|
"selectNone": "Select none",
|
||||||
"selectAllConnected": "Select connected",
|
"selectAllConnected": "Select connected",
|
||||||
@@ -683,6 +684,8 @@
|
|||||||
"empty": "empty",
|
"empty": "empty",
|
||||||
"globalConfig": "Global Configuration Nodes",
|
"globalConfig": "Global Configuration Nodes",
|
||||||
"triggerAction": "Trigger action",
|
"triggerAction": "Trigger action",
|
||||||
|
"showFlow": "Show",
|
||||||
|
"hideFlow": "Hide",
|
||||||
"find": "Find in workspace"
|
"find": "Find in workspace"
|
||||||
},
|
},
|
||||||
"help": {
|
"help": {
|
||||||
|
|||||||
0
packages/node_modules/@node-red/editor-client/locales/en-US/infotips.json
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/editor-client/locales/en-US/infotips.json
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/editor-client/locales/en-US/jsonata.json
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/editor-client/locales/en-US/jsonata.json
vendored
Executable file → Normal file
@@ -491,6 +491,7 @@
|
|||||||
"unassigned": "未割当",
|
"unassigned": "未割当",
|
||||||
"global": "グローバル",
|
"global": "グローバル",
|
||||||
"workspace": "ワークスペース",
|
"workspace": "ワークスペース",
|
||||||
|
"editor": "編集ダイアログ",
|
||||||
"selectAll": "全てのノードを選択",
|
"selectAll": "全てのノードを選択",
|
||||||
"selectNone": "選択を外す",
|
"selectNone": "選択を外す",
|
||||||
"selectAllConnected": "接続されたノードを選択",
|
"selectAllConnected": "接続されたノードを選択",
|
||||||
@@ -683,6 +684,8 @@
|
|||||||
"empty": "空",
|
"empty": "空",
|
||||||
"globalConfig": "グローバル設定ノード",
|
"globalConfig": "グローバル設定ノード",
|
||||||
"triggerAction": "アクションを実行",
|
"triggerAction": "アクションを実行",
|
||||||
|
"showFlow": "表示",
|
||||||
|
"hideFlow": "非表示",
|
||||||
"find": "ワークスペース内を検索"
|
"find": "ワークスペース内を検索"
|
||||||
},
|
},
|
||||||
"help": {
|
"help": {
|
||||||
@@ -935,11 +938,11 @@
|
|||||||
"errors": {
|
"errors": {
|
||||||
"invalid-expr": "不正なJSONata式:\n __message__",
|
"invalid-expr": "不正なJSONata式:\n __message__",
|
||||||
"invalid-msg": "不正なJSONメッセージ例:\n __message__",
|
"invalid-msg": "不正なJSONメッセージ例:\n __message__",
|
||||||
"context-unsupported": "$flowContext や $globalContextの\nコンテキスト機能をテストできません",
|
"context-unsupported": "$flowContext や $globalContextの\nコンテキスト関数をテストできません",
|
||||||
"env-unsupported": "$env関数はテストできません",
|
"env-unsupported": "$env関数はテストできません",
|
||||||
"moment-unsupported": "$moment関数はテストできません",
|
"moment-unsupported": "$moment関数はテストできません",
|
||||||
"clone-unsupported": "$clone関数はテストできません",
|
"clone-unsupported": "$clone関数はテストできません",
|
||||||
"eval": "表現評価エラー:\n __message__"
|
"eval": "式評価エラー:\n __message__"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"monaco": {
|
"monaco": {
|
||||||
|
|||||||
0
packages/node_modules/@node-red/editor-client/locales/ko/editor.json
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/editor-client/locales/ko/editor.json
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/editor-client/locales/ko/infotips.json
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/editor-client/locales/ko/infotips.json
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/editor-client/locales/ko/jsonata.json
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/editor-client/locales/ko/jsonata.json
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/editor-client/locales/ru/editor.json
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/editor-client/locales/ru/editor.json
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/editor-client/locales/ru/infotips.json
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/editor-client/locales/ru/infotips.json
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/editor-client/locales/ru/jsonata.json
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/editor-client/locales/ru/jsonata.json
vendored
Executable file → Normal file
@@ -1965,7 +1965,7 @@ RED.nodes = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const keepNodesCurrentZ = reimport && n.z && RED.workspaces.contains(n.z)
|
const keepNodesCurrentZ = reimport && n.z && (RED.workspaces.contains(n.z) || RED.nodes.subflow(n.z))
|
||||||
if (!keepNodesCurrentZ && n.z && !workspace_map[n.z] && !subflow_map[n.z]) {
|
if (!keepNodesCurrentZ && n.z && !workspace_map[n.z] && !subflow_map[n.z]) {
|
||||||
n.z = activeWorkspace;
|
n.z = activeWorkspace;
|
||||||
}
|
}
|
||||||
@@ -2067,7 +2067,7 @@ RED.nodes = (function() {
|
|||||||
node.id = getID();
|
node.id = getID();
|
||||||
} else {
|
} else {
|
||||||
node.id = n.id;
|
node.id = n.id;
|
||||||
const keepNodesCurrentZ = reimport && node.z && RED.workspaces.contains(node.z)
|
const keepNodesCurrentZ = reimport && node.z && (RED.workspaces.contains(node.z) || RED.nodes.subflow(node.z))
|
||||||
if (!keepNodesCurrentZ && (node.z == null || (!workspace_map[node.z] && !subflow_map[node.z]))) {
|
if (!keepNodesCurrentZ && (node.z == null || (!workspace_map[node.z] && !subflow_map[node.z]))) {
|
||||||
if (createMissingWorkspace) {
|
if (createMissingWorkspace) {
|
||||||
if (missingWorkspace === null) {
|
if (missingWorkspace === null) {
|
||||||
@@ -2095,16 +2095,27 @@ RED.nodes = (function() {
|
|||||||
} else if (n.type.substring(0,7) === "subflow") {
|
} else if (n.type.substring(0,7) === "subflow") {
|
||||||
var parentId = n.type.split(":")[1];
|
var parentId = n.type.split(":")[1];
|
||||||
var subflow = subflow_denylist[parentId]||subflow_map[parentId]||getSubflow(parentId);
|
var subflow = subflow_denylist[parentId]||subflow_map[parentId]||getSubflow(parentId);
|
||||||
if (createNewIds || options.importMap[n.id] === "copy") {
|
if (!subflow){
|
||||||
parentId = subflow.id;
|
node._def = {
|
||||||
node.type = "subflow:"+parentId;
|
color:"#fee",
|
||||||
node._def = registry.getNodeType(node.type);
|
defaults: {},
|
||||||
delete node.i;
|
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') {
|
} else if (n.type === 'junction') {
|
||||||
node._def = {defaults:{}}
|
node._def = {defaults:{}}
|
||||||
node._config.x = node.x
|
node._config.x = node.x
|
||||||
@@ -2740,6 +2751,7 @@ RED.nodes = (function() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const nodeGroupMap = {}
|
||||||
var replaceNodeIds = Object.keys(replaceNodes);
|
var replaceNodeIds = Object.keys(replaceNodes);
|
||||||
if (replaceNodeIds.length > 0) {
|
if (replaceNodeIds.length > 0) {
|
||||||
var reimportList = [];
|
var reimportList = [];
|
||||||
@@ -2750,6 +2762,12 @@ RED.nodes = (function() {
|
|||||||
} else {
|
} else {
|
||||||
allNodes.removeNode(n);
|
allNodes.removeNode(n);
|
||||||
}
|
}
|
||||||
|
if (n.g) {
|
||||||
|
// reimporting a node *without* including its group object
|
||||||
|
// will cause the g property to be cleared. Cache it
|
||||||
|
// here so we can restore it
|
||||||
|
nodeGroupMap[n.id] = n.g
|
||||||
|
}
|
||||||
reimportList.push(convertNode(n));
|
reimportList.push(convertNode(n));
|
||||||
RED.events.emit('nodes:remove',n);
|
RED.events.emit('nodes:remove',n);
|
||||||
});
|
});
|
||||||
@@ -2771,6 +2789,18 @@ RED.nodes = (function() {
|
|||||||
var newNodeMap = {};
|
var newNodeMap = {};
|
||||||
result.nodes.forEach(function(n) {
|
result.nodes.forEach(function(n) {
|
||||||
newNodeMap[n.id] = n;
|
newNodeMap[n.id] = n;
|
||||||
|
if (nodeGroupMap[n.id]) {
|
||||||
|
// This node is in a group - need to substitute the
|
||||||
|
// node reference inside the group
|
||||||
|
n.g = nodeGroupMap[n.id]
|
||||||
|
const group = RED.nodes.group(n.g)
|
||||||
|
if (group) {
|
||||||
|
var index = group.nodes.findIndex(gn => gn.id === n.id)
|
||||||
|
if (index > -1) {
|
||||||
|
group.nodes[index] = n
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
RED.nodes.eachLink(function(l) {
|
RED.nodes.eachLink(function(l) {
|
||||||
if (newNodeMap.hasOwnProperty(l.source.id)) {
|
if (newNodeMap.hasOwnProperty(l.source.id)) {
|
||||||
|
|||||||
@@ -321,6 +321,8 @@ var RED = (function() {
|
|||||||
loader.end()
|
loader.end()
|
||||||
RED.notify($("<p>").text(message));
|
RED.notify($("<p>").text(message));
|
||||||
RED.sidebar.info.refresh()
|
RED.sidebar.info.refresh()
|
||||||
|
RED.menu.setDisabled('menu-item-projects-open',false);
|
||||||
|
RED.menu.setDisabled('menu-item-projects-settings',false);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ RED.actionList = (function() {
|
|||||||
var searchDiv = $("<div>",{class:"red-ui-search-container"}).appendTo(dialog);
|
var searchDiv = $("<div>",{class:"red-ui-search-container"}).appendTo(dialog);
|
||||||
searchInput = $('<input type="text" data-i18n="[placeholder]keyboard.filterActions">').appendTo(searchDiv).searchBox({
|
searchInput = $('<input type="text" data-i18n="[placeholder]keyboard.filterActions">').appendTo(searchDiv).searchBox({
|
||||||
change: function() {
|
change: function() {
|
||||||
filterTerm = $(this).val().trim();
|
filterTerm = $(this).val().trim().toLowerCase();
|
||||||
filterTerms = filterTerm.split(" ");
|
filterTerms = filterTerm.split(" ");
|
||||||
searchResults.editableList('filter');
|
searchResults.editableList('filter');
|
||||||
searchResults.find("li.selected").removeClass("selected");
|
searchResults.find("li.selected").removeClass("selected");
|
||||||
|
|||||||
@@ -37,13 +37,13 @@ RED.clipboard = (function() {
|
|||||||
// IE11 workaround
|
// IE11 workaround
|
||||||
// IE does not support data uri scheme for downloading data
|
// IE does not support data uri scheme for downloading data
|
||||||
var blob = new Blob([data], {
|
var blob = new Blob([data], {
|
||||||
type: "data:text/plain;charset=utf-8"
|
type: "data:application/json;charset=utf-8"
|
||||||
});
|
});
|
||||||
navigator.msSaveBlob(blob, file);
|
navigator.msSaveBlob(blob, file);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
var element = document.createElement('a');
|
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.setAttribute('download', file);
|
||||||
element.style.display = 'none';
|
element.style.display = 'none';
|
||||||
document.body.appendChild(element);
|
document.body.appendChild(element);
|
||||||
|
|||||||
@@ -45,11 +45,13 @@ RED.editor = (function() {
|
|||||||
var hasChanged;
|
var hasChanged;
|
||||||
if (node.type.indexOf("subflow:")===0) {
|
if (node.type.indexOf("subflow:")===0) {
|
||||||
subflow = RED.nodes.subflow(node.type.substring(8));
|
subflow = RED.nodes.subflow(node.type.substring(8));
|
||||||
isValid = subflow.valid;
|
if (subflow){
|
||||||
hasChanged = subflow.changed;
|
isValid = subflow.valid;
|
||||||
if (isValid === undefined) {
|
|
||||||
isValid = validateNode(subflow);
|
|
||||||
hasChanged = subflow.changed;
|
hasChanged = subflow.changed;
|
||||||
|
if (isValid === undefined) {
|
||||||
|
isValid = validateNode(subflow);
|
||||||
|
hasChanged = subflow.changed;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
validationErrors = validateNodeProperties(node, node._def.defaults, node);
|
validationErrors = validateNodeProperties(node, node._def.defaults, node);
|
||||||
node.valid = isValid && validationErrors.length === 0;
|
node.valid = isValid && validationErrors.length === 0;
|
||||||
@@ -238,6 +240,7 @@ RED.editor = (function() {
|
|||||||
var valid = validateNodeProperty(node, defaults, property,value);
|
var valid = validateNodeProperty(node, defaults, property,value);
|
||||||
if (((typeof valid) === "string") || !valid) {
|
if (((typeof valid) === "string") || !valid) {
|
||||||
input.addClass("input-error");
|
input.addClass("input-error");
|
||||||
|
input.next(".red-ui-typedInput-container").addClass("input-error");
|
||||||
if ((typeof valid) === "string") {
|
if ((typeof valid) === "string") {
|
||||||
var tooltip = input.data("tooltip");
|
var tooltip = input.data("tooltip");
|
||||||
if (tooltip) {
|
if (tooltip) {
|
||||||
@@ -250,6 +253,7 @@ RED.editor = (function() {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
input.removeClass("input-error");
|
input.removeClass("input-error");
|
||||||
|
input.next(".red-ui-typedInput-container").removeClass("input-error");
|
||||||
var tooltip = input.data("tooltip");
|
var tooltip = input.data("tooltip");
|
||||||
if (tooltip) {
|
if (tooltip) {
|
||||||
input.data("tooltip", null);
|
input.data("tooltip", null);
|
||||||
|
|||||||
@@ -491,7 +491,11 @@ RED.keyboard = (function() {
|
|||||||
okButton.attr("disabled",!valid);
|
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();
|
scopeSelect.i18n();
|
||||||
if (object.scope === "workspace") {
|
if (object.scope === "workspace") {
|
||||||
object.scope = "red-ui-workspace";
|
object.scope = "red-ui-workspace";
|
||||||
|
|||||||
0
packages/node_modules/@node-red/editor-client/src/js/ui/library.js
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/editor-client/src/js/ui/library.js
vendored
Executable file → Normal file
2
packages/node_modules/@node-red/editor-client/src/js/ui/palette.js
vendored
Executable file → Normal file
2
packages/node_modules/@node-red/editor-client/src/js/ui/palette.js
vendored
Executable file → Normal file
@@ -432,6 +432,7 @@ RED.palette = (function() {
|
|||||||
categoryNode.find(".red-ui-palette-content").slideToggle();
|
categoryNode.find(".red-ui-palette-content").slideToggle();
|
||||||
categoryNode.find("i").toggleClass("expanded");
|
categoryNode.find("i").toggleClass("expanded");
|
||||||
}
|
}
|
||||||
|
categoryNode.hide();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -510,6 +511,7 @@ RED.palette = (function() {
|
|||||||
currentCategoryNode.find(".red-ui-palette-content").slideToggle();
|
currentCategoryNode.find(".red-ui-palette-content").slideToggle();
|
||||||
currentCategoryNode.find("i").toggleClass("expanded");
|
currentCategoryNode.find("i").toggleClass("expanded");
|
||||||
}
|
}
|
||||||
|
currentCategoryNode.hide();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
6
packages/node_modules/@node-red/editor-client/src/js/ui/projects/projects.js
vendored
Executable file → Normal file
6
packages/node_modules/@node-red/editor-client/src/js/ui/projects/projects.js
vendored
Executable file → Normal file
@@ -747,14 +747,14 @@ RED.projects = (function() {
|
|||||||
var row = $('<div class="form-row"></div>').appendTo(body);
|
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);
|
$('<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 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)
|
projectFlowFileInput = $('<input id="red-ui-projects-dialog-screen-create-project-file" type="text">').val(defaultFlowFile)
|
||||||
.on("change keyup paste",validateForm)
|
.on("change keyup paste",validateForm)
|
||||||
.appendTo(subrow);
|
.appendTo(subrow);
|
||||||
$('<div class="red-ui-projects-dialog-screen-input-status"></div>').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);
|
$('<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);
|
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);
|
$('<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);
|
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);
|
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);
|
$('<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);
|
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)
|
.on("change keyup paste",validateForm)
|
||||||
.appendTo(subrow);
|
.appendTo(subrow);
|
||||||
$('<div class="red-ui-projects-dialog-screen-input-status"></div>').appendTo(subrow);
|
$('<div class="red-ui-projects-dialog-screen-input-status"></div>').appendTo(subrow);
|
||||||
|
|||||||
@@ -663,24 +663,23 @@ RED.subflow = (function() {
|
|||||||
var candidateOutputs = [];
|
var candidateOutputs = [];
|
||||||
var candidateInputNodes = {};
|
var candidateInputNodes = {};
|
||||||
|
|
||||||
var boundingBox = [nodeList[0].x,
|
var boundingBox = [nodeList[0].x-(nodeList[0].w/2),
|
||||||
nodeList[0].y,
|
nodeList[0].y-(nodeList[0].h/2),
|
||||||
nodeList[0].x,
|
nodeList[0].x+(nodeList[0].w/2),
|
||||||
nodeList[0].y];
|
nodeList[0].y+(nodeList[0].h/2)];
|
||||||
|
|
||||||
for (i=0;i<nodeList.length;i++) {
|
for (i=0;i<nodeList.length;i++) {
|
||||||
n = nodeList[i];
|
n = nodeList[i];
|
||||||
nodes[n.id] = {n:n,outputs:{}};
|
nodes[n.id] = {n:n,outputs:{}};
|
||||||
boundingBox = [
|
boundingBox = [
|
||||||
Math.min(boundingBox[0],n.x),
|
Math.min(boundingBox[0],n.x-(n.w/2)),
|
||||||
Math.min(boundingBox[1],n.y),
|
Math.min(boundingBox[1],n.y-(n.h/2)),
|
||||||
Math.max(boundingBox[2],n.x),
|
Math.max(boundingBox[2],n.x+(n.w/2)),
|
||||||
Math.max(boundingBox[3],n.y)
|
Math.max(boundingBox[3],n.y+(n.h/2))
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
var offsetX = snapToGrid(boundingBox[0] - 200);
|
var offsetX = snapToGrid(boundingBox[0] - 140);
|
||||||
var offsetY = snapToGrid(boundingBox[1] - 80);
|
var offsetY = snapToGrid(boundingBox[1] - 60);
|
||||||
|
|
||||||
|
|
||||||
var center = [
|
var center = [
|
||||||
snapToGrid((boundingBox[2]+boundingBox[0]) / 2),
|
snapToGrid((boundingBox[2]+boundingBox[0]) / 2),
|
||||||
|
|||||||
@@ -135,6 +135,10 @@ RED.sidebar.info.outliner = (function() {
|
|||||||
RED.workspaces.show(n.id, null, true);
|
RED.workspaces.show(n.id, null, true);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
RED.popover.tooltip(toggleVisibleButton, function () {
|
||||||
|
var isHidden = !div.hasClass("red-ui-info-outline-item-hidden");
|
||||||
|
return RED._("sidebar.info." + (isHidden ? "hideFlow" : "showFlow"));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
if (n.type !== 'subflow') {
|
if (n.type !== 'subflow') {
|
||||||
var toggleButton = $('<button type="button" class="red-ui-info-outline-item-control-disable red-ui-button red-ui-button-small"><i class="fa fa-circle-thin"></i><i class="fa fa-ban"></i></button>').appendTo(controls).on("click",function(evt) {
|
var toggleButton = $('<button type="button" class="red-ui-info-outline-item-control-disable red-ui-button red-ui-button-small"><i class="fa fa-circle-thin"></i><i class="fa fa-ban"></i></button>').appendTo(controls).on("click",function(evt) {
|
||||||
@@ -613,6 +617,9 @@ RED.sidebar.info.outliner = (function() {
|
|||||||
objects[n.id].children = missingParents[n.id];
|
objects[n.id].children = missingParents[n.id];
|
||||||
delete missingParents[n.id]
|
delete missingParents[n.id]
|
||||||
}
|
}
|
||||||
|
if (objects[n.id].children.length === 0) {
|
||||||
|
objects[n.id].children.push(getEmptyItem(n.id));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
var parent = n.g||n.z||"__global__";
|
var parent = n.g||n.z||"__global__";
|
||||||
|
|
||||||
|
|||||||
98
packages/node_modules/@node-red/editor-client/src/js/ui/view.js
vendored
Executable file → Normal file
98
packages/node_modules/@node-red/editor-client/src/js/ui/view.js
vendored
Executable file → Normal file
@@ -586,11 +586,28 @@ RED.view = (function() {
|
|||||||
|
|
||||||
var group = $(ui.helper).data("group");
|
var group = $(ui.helper).data("group");
|
||||||
if (group) {
|
if (group) {
|
||||||
|
var oldX = group.x;
|
||||||
|
var oldY = group.y;
|
||||||
RED.group.addToGroup(group, nn);
|
RED.group.addToGroup(group, nn);
|
||||||
|
var moveEvent = null;
|
||||||
|
if ((group.x !== oldX) ||
|
||||||
|
(group.y !== oldY)) {
|
||||||
|
moveEvent = {
|
||||||
|
t: "move",
|
||||||
|
nodes: [{n: group,
|
||||||
|
ox: oldX, oy: oldY,
|
||||||
|
dx: group.x -oldX,
|
||||||
|
dy: group.y -oldY}],
|
||||||
|
dirty: true
|
||||||
|
};
|
||||||
|
}
|
||||||
historyEvent = {
|
historyEvent = {
|
||||||
t: 'multi',
|
t: 'multi',
|
||||||
events: [historyEvent],
|
events: [historyEvent],
|
||||||
|
|
||||||
|
};
|
||||||
|
if (moveEvent) {
|
||||||
|
historyEvent.events.push(moveEvent)
|
||||||
}
|
}
|
||||||
historyEvent.events.push({
|
historyEvent.events.push({
|
||||||
t: "addToGroup",
|
t: "addToGroup",
|
||||||
@@ -1350,19 +1367,35 @@ RED.view = (function() {
|
|||||||
RED.editor.validateNode(nn);
|
RED.editor.validateNode(nn);
|
||||||
|
|
||||||
if (targetGroup) {
|
if (targetGroup) {
|
||||||
|
var oldX = targetGroup.x;
|
||||||
|
var oldY = targetGroup.y;
|
||||||
RED.group.addToGroup(targetGroup, nn);
|
RED.group.addToGroup(targetGroup, nn);
|
||||||
|
var moveEvent = null;
|
||||||
|
if ((targetGroup.x !== oldX) ||
|
||||||
|
(targetGroup.y !== oldY)) {
|
||||||
|
moveEvent = {
|
||||||
|
t: "move",
|
||||||
|
nodes: [{n: targetGroup,
|
||||||
|
ox: oldX, oy: oldY,
|
||||||
|
dx: targetGroup.x -oldX,
|
||||||
|
dy: targetGroup.y -oldY}],
|
||||||
|
dirty: true
|
||||||
|
};
|
||||||
|
}
|
||||||
if (historyEvent.t !== "multi") {
|
if (historyEvent.t !== "multi") {
|
||||||
historyEvent = {
|
historyEvent = {
|
||||||
t:'multi',
|
t:'multi',
|
||||||
events: [historyEvent]
|
events: [historyEvent]
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
historyEvent.events.push({
|
historyEvent.events.push({
|
||||||
t: "addToGroup",
|
t: "addToGroup",
|
||||||
group: targetGroup,
|
group: targetGroup,
|
||||||
nodes: nn
|
nodes: nn
|
||||||
})
|
});
|
||||||
|
if (moveEvent) {
|
||||||
|
historyEvent.events.push(moveEvent);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spliceLink) {
|
if (spliceLink) {
|
||||||
@@ -1698,6 +1731,7 @@ RED.view = (function() {
|
|||||||
|
|
||||||
// Check link splice or group-add
|
// Check link splice or group-add
|
||||||
if (movingSet.length() === 1 && movingSet.get(0).n.type !== "group") {
|
if (movingSet.length() === 1 && movingSet.get(0).n.type !== "group") {
|
||||||
|
//}{//NIS
|
||||||
node = movingSet.get(0);
|
node = movingSet.get(0);
|
||||||
if (spliceActive) {
|
if (spliceActive) {
|
||||||
if (!spliceTimer) {
|
if (!spliceTimer) {
|
||||||
@@ -2057,11 +2091,25 @@ RED.view = (function() {
|
|||||||
if (mouse_mode == RED.state.MOVING_ACTIVE) {
|
if (mouse_mode == RED.state.MOVING_ACTIVE) {
|
||||||
if (movingSet.length() > 0) {
|
if (movingSet.length() > 0) {
|
||||||
var addedToGroup = null;
|
var addedToGroup = null;
|
||||||
|
var moveEvent = null;
|
||||||
if (activeHoverGroup) {
|
if (activeHoverGroup) {
|
||||||
|
var oldX = activeHoverGroup.x;
|
||||||
|
var oldY = activeHoverGroup.y;
|
||||||
for (var j=0;j<movingSet.length();j++) {
|
for (var j=0;j<movingSet.length();j++) {
|
||||||
var n = movingSet.get(j);
|
var n = movingSet.get(j);
|
||||||
RED.group.addToGroup(activeHoverGroup,n.n);
|
RED.group.addToGroup(activeHoverGroup,n.n);
|
||||||
}
|
}
|
||||||
|
if ((activeHoverGroup.x !== oldX) ||
|
||||||
|
(activeHoverGroup.y !== oldY)) {
|
||||||
|
moveEvent = {
|
||||||
|
t: "move",
|
||||||
|
nodes: [{n: activeHoverGroup,
|
||||||
|
ox: oldX, oy: oldY,
|
||||||
|
dx: activeHoverGroup.x -oldX,
|
||||||
|
dy: activeHoverGroup.y -oldY}],
|
||||||
|
dirty: true
|
||||||
|
};
|
||||||
|
}
|
||||||
addedToGroup = activeHoverGroup;
|
addedToGroup = activeHoverGroup;
|
||||||
|
|
||||||
activeHoverGroup.hovered = false;
|
activeHoverGroup.hovered = false;
|
||||||
@@ -2107,6 +2155,12 @@ RED.view = (function() {
|
|||||||
historyEvent.addToGroup = addedToGroup;
|
historyEvent.addToGroup = addedToGroup;
|
||||||
}
|
}
|
||||||
RED.nodes.dirty(true);
|
RED.nodes.dirty(true);
|
||||||
|
if (moveEvent) {
|
||||||
|
historyEvent = {
|
||||||
|
t: "multi",
|
||||||
|
events: [moveEvent, historyEvent]
|
||||||
|
};
|
||||||
|
}
|
||||||
RED.history.push(historyEvent);
|
RED.history.push(historyEvent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2592,6 +2646,16 @@ RED.view = (function() {
|
|||||||
var result = RED.nodes.removeJunction(node)
|
var result = RED.nodes.removeJunction(node)
|
||||||
removedJunctions.push(node);
|
removedJunctions.push(node);
|
||||||
removedLinks = removedLinks.concat(result.links);
|
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 {
|
} else {
|
||||||
if (node.direction === "out") {
|
if (node.direction === "out") {
|
||||||
removedSubflowOutputs.push(node);
|
removedSubflowOutputs.push(node);
|
||||||
@@ -3369,6 +3433,9 @@ RED.view = (function() {
|
|||||||
}
|
}
|
||||||
if (dblClickPrimed && mousedown_node == d && clickElapsed > 0 && clickElapsed < dblClickInterval) {
|
if (dblClickPrimed && mousedown_node == d && clickElapsed > 0 && clickElapsed < dblClickInterval) {
|
||||||
mouse_mode = RED.state.DEFAULT;
|
mouse_mode = RED.state.DEFAULT;
|
||||||
|
// Avoid dbl click causing text selection.
|
||||||
|
d3.event.preventDefault()
|
||||||
|
document.getSelection().removeAllRanges()
|
||||||
if (d.type != "subflow") {
|
if (d.type != "subflow") {
|
||||||
if (/^subflow:/.test(d.type) && (d3.event.ctrlKey || d3.event.metaKey)) {
|
if (/^subflow:/.test(d.type) && (d3.event.ctrlKey || d3.event.metaKey)) {
|
||||||
RED.workspaces.show(d.type.substring(8));
|
RED.workspaces.show(d.type.substring(8));
|
||||||
@@ -3463,11 +3530,25 @@ RED.view = (function() {
|
|||||||
updateActiveNodes();
|
updateActiveNodes();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var moveEvent = null;
|
||||||
if (activeHoverGroup) {
|
if (activeHoverGroup) {
|
||||||
|
var oldX = activeHoverGroup.x;
|
||||||
|
var oldY = activeHoverGroup.y;
|
||||||
for (var j=0;j<movingSet.length();j++) {
|
for (var j=0;j<movingSet.length();j++) {
|
||||||
var n = movingSet.get(j);
|
var n = movingSet.get(j);
|
||||||
RED.group.addToGroup(activeHoverGroup,n.n);
|
RED.group.addToGroup(activeHoverGroup,n.n);
|
||||||
}
|
}
|
||||||
|
if ((activeHoverGroup.x !== oldX) ||
|
||||||
|
(activeHoverGroup.y !== oldY)) {
|
||||||
|
moveEvent = {
|
||||||
|
t: "move",
|
||||||
|
nodes: [{n: activeHoverGroup,
|
||||||
|
ox: oldX, oy: oldY,
|
||||||
|
dx: activeHoverGroup.x -oldX,
|
||||||
|
dy: activeHoverGroup.y -oldY}],
|
||||||
|
dirty: true
|
||||||
|
};
|
||||||
|
}
|
||||||
historyEvent.addedToGroup = activeHoverGroup;
|
historyEvent.addedToGroup = activeHoverGroup;
|
||||||
|
|
||||||
activeHoverGroup.hovered = false;
|
activeHoverGroup.hovered = false;
|
||||||
@@ -3476,7 +3557,6 @@ RED.view = (function() {
|
|||||||
activeGroup.selected = true;
|
activeGroup.selected = true;
|
||||||
activeHoverGroup = null;
|
activeHoverGroup = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mouse_mode == RED.state.DETACHED_DRAGGING) {
|
if (mouse_mode == RED.state.DETACHED_DRAGGING) {
|
||||||
var ns = [];
|
var ns = [];
|
||||||
for (var j=0;j<movingSet.length();j++) {
|
for (var j=0;j<movingSet.length();j++) {
|
||||||
@@ -3487,7 +3567,15 @@ RED.view = (function() {
|
|||||||
n.n.moved = true;
|
n.n.moved = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
RED.history.replace({t:"multi",events:[historyEvent,{t:"move",nodes:ns}],dirty: historyEvent.dirty})
|
var event = {t:"multi",events:[historyEvent,{t:"move",nodes:ns}],dirty: historyEvent.dirty};
|
||||||
|
if (moveEvent) {
|
||||||
|
event.events.push(moveEvent);
|
||||||
|
}
|
||||||
|
RED.history.replace(event)
|
||||||
|
}
|
||||||
|
else if(moveEvent) {
|
||||||
|
var event = {t:"multi", events:[historyEvent, moveEvent], dirty: true};
|
||||||
|
RED.history.replace(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
updateSelection();
|
updateSelection();
|
||||||
|
|||||||
@@ -124,7 +124,7 @@
|
|||||||
list-style-type: none;
|
list-style-type: none;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding:0;
|
padding:0;
|
||||||
|
overflow-wrap: anywhere;
|
||||||
li {
|
li {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
padding:0;
|
padding:0;
|
||||||
|
|||||||
@@ -32,7 +32,8 @@
|
|||||||
color: var(--red-ui-primary-text-color);
|
color: var(--red-ui-primary-text-color);
|
||||||
border: 1px solid var(--red-ui-notification-border-default);
|
border: 1px solid var(--red-ui-notification-border-default);
|
||||||
border-left-width: 16px;
|
border-left-width: 16px;
|
||||||
overflow: hidden;
|
overflow: auto;
|
||||||
|
max-height: 80vh;
|
||||||
.ui-dialog-buttonset {
|
.ui-dialog-buttonset {
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
|
|||||||
@@ -55,7 +55,7 @@
|
|||||||
.red-ui-palette-search {
|
.red-ui-palette-search {
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
background: var(--red-ui-secondary-background);
|
background: var(--red-ui-form-input-background);
|
||||||
text-align: center;
|
text-align: center;
|
||||||
height: 35px;
|
height: 35px;
|
||||||
padding: 3px;
|
padding: 3px;
|
||||||
|
|||||||
@@ -35,6 +35,7 @@
|
|||||||
padding: 8px;
|
padding: 8px;
|
||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
background: var(--red-ui-popover-background);
|
background: var(--red-ui-popover-background);
|
||||||
|
overflow-wrap: anywhere;
|
||||||
}
|
}
|
||||||
.red-ui-popover:after, .red-ui-popover:before {
|
.red-ui-popover:after, .red-ui-popover:before {
|
||||||
border: solid transparent;
|
border: solid transparent;
|
||||||
|
|||||||
@@ -41,6 +41,7 @@
|
|||||||
height: 50px;
|
height: 50px;
|
||||||
background: var(--red-ui-secondary-background);
|
background: var(--red-ui-secondary-background);
|
||||||
border: 2px solid var(--red-ui-primary-border-color);
|
border: 2px solid var(--red-ui-primary-border-color);
|
||||||
|
color: var(--red-ui-primary-text-color);
|
||||||
text-align: center;
|
text-align: center;
|
||||||
line-height:50px;
|
line-height:50px;
|
||||||
|
|
||||||
@@ -51,7 +52,7 @@
|
|||||||
|
|
||||||
.red-ui-editor-radial-menu-opt-disabled {
|
.red-ui-editor-radial-menu-opt-disabled {
|
||||||
border-color: var(--red-ui-tertiary-border-color);
|
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 {
|
.red-ui-editor-radial-menu-opt-active {
|
||||||
background: var(--red-ui-secondary-background-hover);
|
background: var(--red-ui-secondary-background-hover);
|
||||||
|
|||||||
@@ -108,6 +108,8 @@
|
|||||||
}
|
}
|
||||||
.red-ui-search-result-node-label {
|
.red-ui-search-result-node-label {
|
||||||
color: var(--red-ui-secondary-text-color);
|
color: var(--red-ui-secondary-text-color);
|
||||||
|
width: 240px;
|
||||||
|
overflow-wrap: anywhere;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,6 +31,7 @@
|
|||||||
> span {
|
> span {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
margin-left: 5px;
|
margin-left: 5px;
|
||||||
|
overflow-wrap: anywhere;
|
||||||
}
|
}
|
||||||
border-bottom: 1px solid var(--red-ui-secondary-border-color);
|
border-bottom: 1px solid var(--red-ui-secondary-border-color);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -95,45 +95,64 @@ module.exports = function(RED) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.on("input", function(msg, send, done) {
|
this.on("input", function(msg, send, done) {
|
||||||
var errors = [];
|
const errors = [];
|
||||||
var props = this.props;
|
let props = this.props;
|
||||||
if (msg.__user_inject_props__ && Array.isArray(msg.__user_inject_props__)) {
|
if (msg.__user_inject_props__ && Array.isArray(msg.__user_inject_props__)) {
|
||||||
props = msg.__user_inject_props__;
|
props = msg.__user_inject_props__;
|
||||||
}
|
}
|
||||||
delete msg.__user_inject_props__;
|
delete msg.__user_inject_props__;
|
||||||
props.forEach(p => {
|
props = [...props]
|
||||||
var property = p.p;
|
function evaluateProperty(doneEvaluating) {
|
||||||
var value = p.v ? p.v : '';
|
if (props.length === 0) {
|
||||||
var valueType = p.vt ? p.vt : 'str';
|
doneEvaluating()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const p = props.shift()
|
||||||
|
const property = p.p;
|
||||||
|
const value = p.v ? p.v : '';
|
||||||
|
const valueType = p.vt ? p.vt : 'str';
|
||||||
|
|
||||||
if (!property) return;
|
if (property) {
|
||||||
|
if (valueType === "jsonata") {
|
||||||
if (valueType === "jsonata") {
|
if (p.v) {
|
||||||
if (p.v) {
|
try {
|
||||||
try {
|
var exp = RED.util.prepareJSONataExpression(p.v, node);
|
||||||
var exp = RED.util.prepareJSONataExpression(p.v, node);
|
var val = RED.util.evaluateJSONataExpression(exp, msg);
|
||||||
var val = RED.util.evaluateJSONataExpression(exp, msg);
|
RED.util.setMessageProperty(msg, property, val, true);
|
||||||
RED.util.setMessageProperty(msg, property, val, true);
|
}
|
||||||
|
catch (err) {
|
||||||
|
errors.push(err.message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (err) {
|
evaluateProperty(doneEvaluating)
|
||||||
errors.push(err.message);
|
} else {
|
||||||
|
try {
|
||||||
|
RED.util.evaluateNodeProperty(value, valueType, node, msg, (err, newValue) => {
|
||||||
|
if (err) {
|
||||||
|
errors.push(err.toString())
|
||||||
|
} else {
|
||||||
|
RED.util.setMessageProperty(msg,property,newValue,true);
|
||||||
|
}
|
||||||
|
evaluateProperty(doneEvaluating)
|
||||||
|
})
|
||||||
|
} catch (err) {
|
||||||
|
errors.push(err.toString());
|
||||||
|
evaluateProperty(doneEvaluating)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
} else {
|
||||||
|
evaluateProperty(doneEvaluating)
|
||||||
}
|
}
|
||||||
try {
|
|
||||||
RED.util.setMessageProperty(msg,property,RED.util.evaluateNodeProperty(value, valueType, this, msg),true);
|
|
||||||
} catch (err) {
|
|
||||||
errors.push(err.toString());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (errors.length) {
|
|
||||||
done(errors.join('; '));
|
|
||||||
} else {
|
|
||||||
send(msg);
|
|
||||||
done();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
evaluateProperty(() => {
|
||||||
|
if (errors.length) {
|
||||||
|
done(errors.join('; '));
|
||||||
|
} else {
|
||||||
|
send(msg);
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
})
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,16 @@
|
|||||||
color:"#c0edc0",
|
color:"#c0edc0",
|
||||||
defaults: {
|
defaults: {
|
||||||
name: {value:""},
|
name: {value:""},
|
||||||
scope: {value:[], type:"*[]"},
|
scope: {
|
||||||
|
value: [],
|
||||||
|
type: "*[]",
|
||||||
|
validate: function (v, opt) {
|
||||||
|
if (v.length > 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return RED._("node-red:complete.errors.scopeUndefined");
|
||||||
|
}
|
||||||
|
},
|
||||||
uncaught: {value:false}
|
uncaught: {value:false}
|
||||||
},
|
},
|
||||||
inputs:0,
|
inputs:0,
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<label style="width: auto" for="node-input-scope" data-i18n="catch.label.source"></label>
|
<label style="width: auto" for="node-input-scope" data-i18n="catch.label.source"></label>
|
||||||
<select id="node-input-scope-select">
|
<select id="node-input-scope-select">
|
||||||
<option value="all" data-i18n="catch.scope.all"></option>
|
<option value="all" data-i18n="catch.scope.all"></option>
|
||||||
<option value="target" data-i18n="catch.scope.selected"></options>
|
<option value="target" data-i18n="catch.scope.selected"></option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-row node-input-uncaught-row">
|
<div class="form-row node-input-uncaught-row">
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<label style="width: auto" for="node-input-scope" data-i18n="status.label.source"></label>
|
<label style="width: auto" for="node-input-scope" data-i18n="status.label.source"></label>
|
||||||
<select id="node-input-scope-select">
|
<select id="node-input-scope-select">
|
||||||
<option value="all" data-i18n="status.scope.all"></option>
|
<option value="all" data-i18n="status.scope.all"></option>
|
||||||
<option value="target" data-i18n="status.scope.selected"></options>
|
<option value="target" data-i18n="status.scope.selected"></option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-row node-input-target-row">
|
<div class="form-row node-input-target-row">
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
<script type="text/html" data-template-name="link in">
|
<script type="text/html" data-template-name="link in">
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="common.label.name"></span></label>
|
<label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="common.label.name"></span></label>
|
||||||
@@ -272,7 +271,17 @@
|
|||||||
color:"#ddd",//"#87D8CF",
|
color:"#ddd",//"#87D8CF",
|
||||||
defaults: {
|
defaults: {
|
||||||
name: { value: "" },
|
name: { value: "" },
|
||||||
links: { value: [], type:"link in[]" },
|
links: {
|
||||||
|
value: [],
|
||||||
|
type: "link in[]",
|
||||||
|
validate: function (v, opt) {
|
||||||
|
if ((this.linkType === "static" && v.length > 0)
|
||||||
|
|| this.linkType === "dynamic") {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return RED._("node-red:link.errors.linkUndefined");
|
||||||
|
}
|
||||||
|
},
|
||||||
linkType: { value:"static" },
|
linkType: { value:"static" },
|
||||||
timeout: {
|
timeout: {
|
||||||
value: "30",
|
value: "30",
|
||||||
|
|||||||
@@ -164,10 +164,10 @@ module.exports = function(RED) {
|
|||||||
if (returnNode && returnNode.returnLinkMessage) {
|
if (returnNode && returnNode.returnLinkMessage) {
|
||||||
returnNode.returnLinkMessage(messageEvent.id, msg);
|
returnNode.returnLinkMessage(messageEvent.id, msg);
|
||||||
} else {
|
} else {
|
||||||
node.warn(RED._("link.error.missingReturn"))
|
node.warn(RED._("link.errors.missingReturn"));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
node.warn(RED._("link.error.missingReturn"))
|
node.warn(RED._("link.errors.missingReturn"));
|
||||||
}
|
}
|
||||||
done();
|
done();
|
||||||
} else if (mode === "link") {
|
} else if (mode === "link") {
|
||||||
|
|||||||
@@ -17,6 +17,8 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
background: var(--red-ui-tertiary-background);
|
background: var(--red-ui-tertiary-background);
|
||||||
padding-right: 75px;
|
padding-right: 75px;
|
||||||
|
border-top-left-radius: 3px;
|
||||||
|
border-top-right-radius: 3px;
|
||||||
}
|
}
|
||||||
#node-input-libs-container-row .red-ui-editableList-header > div {
|
#node-input-libs-container-row .red-ui-editableList-header > div {
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
@@ -451,11 +453,13 @@
|
|||||||
tabs.activateTab("func-tab-body");
|
tabs.activateTab("func-tab-body");
|
||||||
|
|
||||||
$( "#node-input-outputs" ).spinner({
|
$( "#node-input-outputs" ).spinner({
|
||||||
min:0,
|
min: 0,
|
||||||
|
max: 500,
|
||||||
change: function(event, ui) {
|
change: function(event, ui) {
|
||||||
var value = this.value;
|
var value = parseInt(this.value);
|
||||||
if (!value.match(/^\d+$/)) { value = 1; }
|
value = isNaN(value) ? 1 : value;
|
||||||
else if (value < this.min) { value = this.min; }
|
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); }
|
if (value !== this.value) { $(this).spinner("value", value); }
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -318,7 +318,7 @@ module.exports = function(RED) {
|
|||||||
}
|
}
|
||||||
var r = node.rules[currentRule];
|
var r = node.rules[currentRule];
|
||||||
if (r.t === "move") {
|
if (r.t === "move") {
|
||||||
if ((r.tot !== r.pt) || (r.p.indexOf(r.to) !== -1)) {
|
if ((r.tot !== r.pt) || (r.p.indexOf(r.to) !== -1) && (r.p !== r.to)) {
|
||||||
applyRule(msg,{t:"set", p:r.to, pt:r.tot, to:r.p, tot:r.pt},(err,msg) => {
|
applyRule(msg,{t:"set", p:r.to, pt:r.tot, to:r.p, tot:r.pt},(err,msg) => {
|
||||||
applyRule(msg,{t:"delete", p:r.p, pt:r.pt}, (err,msg) => {
|
applyRule(msg,{t:"delete", p:r.p, pt:r.pt}, (err,msg) => {
|
||||||
completeApplyingRules(msg,currentRule,done);
|
completeApplyingRules(msg,currentRule,done);
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
<option value="javascript">JavaScript</option>
|
<option value="javascript">JavaScript</option>
|
||||||
<option value="css">CSS</option>
|
<option value="css">CSS</option>
|
||||||
<option value="markdown">Markdown</option>
|
<option value="markdown">Markdown</option>
|
||||||
|
<option value="php">PHP</option>
|
||||||
<option value="python">Python</option>
|
<option value="python">Python</option>
|
||||||
<option value="sql">SQL</option>
|
<option value="sql">SQL</option>
|
||||||
<option value="yaml">YAML</option>
|
<option value="yaml">YAML</option>
|
||||||
|
|||||||
@@ -35,7 +35,11 @@ module.exports = function(RED) {
|
|||||||
}
|
}
|
||||||
else { node.previous = {}; }
|
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) {
|
if (value !== undefined) {
|
||||||
var t = "_no_topic";
|
var t = "_no_topic";
|
||||||
if (node.septopics) { t = topic || t; }
|
if (node.septopics) { t = topic || t; }
|
||||||
|
|||||||
@@ -421,7 +421,11 @@
|
|||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
(function() {
|
(function() {
|
||||||
|
|
||||||
var typedInputNoneOpt = { value: 'none', label: '', hasValue: false };
|
var typedInputNoneOpt = {
|
||||||
|
value: 'none',
|
||||||
|
label: RED._("node-red:mqtt.label.none"),
|
||||||
|
hasValue: false
|
||||||
|
};
|
||||||
var makeTypedInputOpt = function(value){
|
var makeTypedInputOpt = function(value){
|
||||||
return {
|
return {
|
||||||
value: value,
|
value: value,
|
||||||
@@ -436,7 +440,11 @@
|
|||||||
makeTypedInputOpt("text/csv"),
|
makeTypedInputOpt("text/csv"),
|
||||||
makeTypedInputOpt("text/html"),
|
makeTypedInputOpt("text/html"),
|
||||||
makeTypedInputOpt("text/plain"),
|
makeTypedInputOpt("text/plain"),
|
||||||
{value:"other", label:""}
|
{
|
||||||
|
value: "other",
|
||||||
|
label: RED._("node-red:mqtt.label.other"),
|
||||||
|
icon: "red/images/typedInput/az.svg"
|
||||||
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
function getDefaultContentType(value) {
|
function getDefaultContentType(value) {
|
||||||
@@ -499,17 +507,17 @@
|
|||||||
cleansession: {value: true},
|
cleansession: {value: true},
|
||||||
birthTopic: {value:"", validate:validateMQTTPublishTopic},
|
birthTopic: {value:"", validate:validateMQTTPublishTopic},
|
||||||
birthQos: {value:"0"},
|
birthQos: {value:"0"},
|
||||||
birthRetain: {value:false},
|
birthRetain: {value:"false"},
|
||||||
birthPayload: {value:""},
|
birthPayload: {value:""},
|
||||||
birthMsg: { value: {}},
|
birthMsg: { value: {}},
|
||||||
closeTopic: {value:"", validate:validateMQTTPublishTopic},
|
closeTopic: {value:"", validate:validateMQTTPublishTopic},
|
||||||
closeQos: {value:"0"},
|
closeQos: {value:"0"},
|
||||||
closeRetain: {value:false},
|
closeRetain: {value:"false"},
|
||||||
closePayload: {value:""},
|
closePayload: {value:""},
|
||||||
closeMsg: { value: {}},
|
closeMsg: { value: {}},
|
||||||
willTopic: {value:"", validate:validateMQTTPublishTopic},
|
willTopic: {value:"", validate:validateMQTTPublishTopic},
|
||||||
willQos: {value:"0"},
|
willQos: {value:"0"},
|
||||||
willRetain: {value:false},
|
willRetain: {value:"false"},
|
||||||
willPayload: {value:""},
|
willPayload: {value:""},
|
||||||
willMsg: { value: {}},
|
willMsg: { value: {}},
|
||||||
userProps: { value: ""},
|
userProps: { value: ""},
|
||||||
|
|||||||
@@ -295,7 +295,7 @@ module.exports = function(RED) {
|
|||||||
/* mute error - it simply isnt JSON, just leave payload as a string */
|
/* mute error - it simply isnt JSON, just leave payload as a string */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} //else {
|
} //else {
|
||||||
//leave as buffer
|
//leave as buffer
|
||||||
//}
|
//}
|
||||||
}
|
}
|
||||||
@@ -357,7 +357,7 @@ module.exports = function(RED) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
done(err);
|
done(err);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
done();
|
done();
|
||||||
}
|
}
|
||||||
@@ -366,6 +366,16 @@ module.exports = function(RED) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function updateStatus(node, allNodes) {
|
||||||
|
let setStatus = setStatusDisconnected
|
||||||
|
if(node.connecting) {
|
||||||
|
setStatus = setStatusConnecting
|
||||||
|
} else if(node.connected) {
|
||||||
|
setStatus = setStatusConnected
|
||||||
|
}
|
||||||
|
setStatus(node, allNodes)
|
||||||
|
}
|
||||||
|
|
||||||
function setStatusDisconnected(node, allNodes) {
|
function setStatusDisconnected(node, allNodes) {
|
||||||
if(allNodes) {
|
if(allNodes) {
|
||||||
for (var id in node.users) {
|
for (var id in node.users) {
|
||||||
@@ -459,7 +469,6 @@ module.exports = function(RED) {
|
|||||||
if(!opts || typeof opts !== "object") {
|
if(!opts || typeof opts !== "object") {
|
||||||
return; //nothing to change, simply return
|
return; //nothing to change, simply return
|
||||||
}
|
}
|
||||||
const originalBrokerURL = node.brokerurl;
|
|
||||||
|
|
||||||
//apply property changes (only if the property exists in the opts object)
|
//apply property changes (only if the property exists in the opts object)
|
||||||
setIfHasProperty(opts, node, "url", init);
|
setIfHasProperty(opts, node, "url", init);
|
||||||
@@ -468,7 +477,6 @@ module.exports = function(RED) {
|
|||||||
setIfHasProperty(opts, node, "clientid", init);
|
setIfHasProperty(opts, node, "clientid", init);
|
||||||
setIfHasProperty(opts, node, "autoConnect", init);
|
setIfHasProperty(opts, node, "autoConnect", init);
|
||||||
setIfHasProperty(opts, node, "usetls", init);
|
setIfHasProperty(opts, node, "usetls", init);
|
||||||
setIfHasProperty(opts, node, "usews", init);
|
|
||||||
setIfHasProperty(opts, node, "verifyservercert", init);
|
setIfHasProperty(opts, node, "verifyservercert", init);
|
||||||
setIfHasProperty(opts, node, "compatmode", init);
|
setIfHasProperty(opts, node, "compatmode", init);
|
||||||
setIfHasProperty(opts, node, "protocolVersion", init);
|
setIfHasProperty(opts, node, "protocolVersion", init);
|
||||||
@@ -571,9 +579,6 @@ module.exports = function(RED) {
|
|||||||
if (typeof node.usetls === 'undefined') {
|
if (typeof node.usetls === 'undefined') {
|
||||||
node.usetls = false;
|
node.usetls = false;
|
||||||
}
|
}
|
||||||
if (typeof node.usews === 'undefined') {
|
|
||||||
node.usews = false;
|
|
||||||
}
|
|
||||||
if (typeof node.verifyservercert === 'undefined') {
|
if (typeof node.verifyservercert === 'undefined') {
|
||||||
node.verifyservercert = false;
|
node.verifyservercert = false;
|
||||||
}
|
}
|
||||||
@@ -692,7 +697,8 @@ module.exports = function(RED) {
|
|||||||
node.options.rejectUnauthorized = (node.verifyservercert == "true" || node.verifyservercert === true);
|
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;
|
n.autoConnect = n.autoConnect === "false" || n.autoConnect === false ? false : true;
|
||||||
node.setOptions(n, true);
|
node.setOptions(n, true);
|
||||||
|
|
||||||
@@ -702,16 +708,21 @@ module.exports = function(RED) {
|
|||||||
if (Object.keys(node.users).length === 1) {
|
if (Object.keys(node.users).length === 1) {
|
||||||
if(node.autoConnect) {
|
if(node.autoConnect) {
|
||||||
node.connect();
|
node.connect();
|
||||||
|
//update nodes status
|
||||||
|
setTimeout(function() {
|
||||||
|
updateStatus(node, true)
|
||||||
|
}, 1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
node.deregister = function(mqttNode,done) {
|
node.deregister = function(mqttNode, done, autoDisconnect) {
|
||||||
delete node.users[mqttNode.id];
|
delete node.users[mqttNode.id];
|
||||||
if (!node.closing && node.connected && Object.keys(node.users).length === 0) {
|
if (autoDisconnect && !node.closing && node.connected && Object.keys(node.users).length === 0) {
|
||||||
node.disconnect();
|
node.disconnect(done);
|
||||||
|
} else {
|
||||||
|
done();
|
||||||
}
|
}
|
||||||
done();
|
|
||||||
};
|
};
|
||||||
node.canConnect = function() {
|
node.canConnect = function() {
|
||||||
return !node.connected && !node.connecting;
|
return !node.connected && !node.connecting;
|
||||||
@@ -845,7 +856,7 @@ module.exports = function(RED) {
|
|||||||
let waitEnd = (client, ms) => {
|
let waitEnd = (client, ms) => {
|
||||||
return new Promise( (resolve, reject) => {
|
return new Promise( (resolve, reject) => {
|
||||||
node.closing = true;
|
node.closing = true;
|
||||||
if(!client) {
|
if(!client) {
|
||||||
resolve();
|
resolve();
|
||||||
} else {
|
} else {
|
||||||
const t = setTimeout(() => {
|
const t = setTimeout(() => {
|
||||||
@@ -910,7 +921,12 @@ module.exports = function(RED) {
|
|||||||
};
|
};
|
||||||
node.subscriptions[topic][ref] = sub;
|
node.subscriptions[topic][ref] = sub;
|
||||||
if (node.connected) {
|
if (node.connected) {
|
||||||
|
const subIdsAvailable = node.subscriptionIdentifiersAvailable()
|
||||||
node._clientOn('message',sub.handler);
|
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);
|
node.client.subscribe(topic, options);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -1000,7 +1016,7 @@ module.exports = function(RED) {
|
|||||||
node.client.publish(msg.topic, msg.payload, options, function (err) {
|
node.client.publish(msg.topic, msg.payload, options, function (err) {
|
||||||
if (done) {
|
if (done) {
|
||||||
done(err)
|
done(err)
|
||||||
} else {
|
} else if(err) {
|
||||||
node.error(err, msg)
|
node.error(err, msg)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -1024,7 +1040,7 @@ module.exports = function(RED) {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Add event handlers to the MQTT.js client and track them so that
|
* 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
|
* Use {@link node._clientRemoveListeners `node._clientRemoveListeners`} to remove handlers
|
||||||
* @param {string} event The name of the event
|
* @param {string} event The name of the event
|
||||||
* @param {function} handler The handler for this event
|
* @param {function} handler The handler for this event
|
||||||
@@ -1032,11 +1048,11 @@ module.exports = function(RED) {
|
|||||||
node._clientOn = function(event, handler) {
|
node._clientOn = function(event, handler) {
|
||||||
node.clientListeners.push({event, handler})
|
node.clientListeners.push({event, handler})
|
||||||
node.client.on(event, handler)
|
node.client.on(event, handler)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove event handlers from the MQTT.js client & only the events
|
* Remove event handlers from the MQTT.js client & only the events
|
||||||
* that we attached in {@link node._clientOn `node._clientOn`}.
|
* that we attached in {@link node._clientOn `node._clientOn`}.
|
||||||
* * If `event` is omitted, then all events matching `handler` are removed
|
* * If `event` is omitted, then all events matching `handler` are removed
|
||||||
* * If `handler` is omitted, then all events named `event` are removed
|
* * If `handler` is omitted, then all events named `event` are removed
|
||||||
* * If both parameters are omitted, then all events are removed
|
* * If both parameters are omitted, then all events are removed
|
||||||
@@ -1225,7 +1241,7 @@ module.exports = function(RED) {
|
|||||||
} else {
|
} else {
|
||||||
node.brokerConn.unsubscribe(node.topic,node.id, removed);
|
node.brokerConn.unsubscribe(node.topic,node.id, removed);
|
||||||
}
|
}
|
||||||
node.brokerConn.deregister(node, done);
|
node.brokerConn.deregister(node, done, removed);
|
||||||
node.brokerConn = null;
|
node.brokerConn = null;
|
||||||
} else {
|
} else {
|
||||||
done();
|
done();
|
||||||
@@ -1288,9 +1304,9 @@ module.exports = function(RED) {
|
|||||||
node.status({fill:"green",shape:"dot",text:"node-red:common.status.connected"});
|
node.status({fill:"green",shape:"dot",text:"node-red:common.status.connected"});
|
||||||
}
|
}
|
||||||
node.brokerConn.register(node);
|
node.brokerConn.register(node);
|
||||||
node.on('close', function(done) {
|
node.on('close', function(removed, done) {
|
||||||
if (node.brokerConn) {
|
if (node.brokerConn) {
|
||||||
node.brokerConn.deregister(node,done);
|
node.brokerConn.deregister(node, done, removed)
|
||||||
node.brokerConn = null;
|
node.brokerConn = null;
|
||||||
} else {
|
} else {
|
||||||
done();
|
done();
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ module.exports = function(RED) {
|
|||||||
isText = true;
|
isText = true;
|
||||||
} else if (parsedType.type !== "application") {
|
} else if (parsedType.type !== "application") {
|
||||||
isText = false;
|
isText = false;
|
||||||
} else if ((parsedType.subtype !== "octet-stream")
|
} else if ((parsedType.subtype !== "octet-stream")
|
||||||
&& (parsedType.subtype !== "cbor")
|
&& (parsedType.subtype !== "cbor")
|
||||||
&& (parsedType.subtype !== "x-protobuf")) {
|
&& (parsedType.subtype !== "x-protobuf")) {
|
||||||
checkUTF = true;
|
checkUTF = true;
|
||||||
@@ -200,6 +200,15 @@ module.exports = function(RED) {
|
|||||||
this.callback = function(req,res) {
|
this.callback = function(req,res) {
|
||||||
var msgid = RED.util.generateId();
|
var msgid = RED.util.generateId();
|
||||||
res._msgid = msgid;
|
res._msgid = msgid;
|
||||||
|
// Since Node 15, req.headers are lazily computed and the property
|
||||||
|
// marked as non-enumerable.
|
||||||
|
// That means it doesn't show up in the Debug sidebar.
|
||||||
|
// This redefines the property causing it to be evaluated *and*
|
||||||
|
// marked as enumerable again.
|
||||||
|
Object.defineProperty(req, 'headers', {
|
||||||
|
value: req.headers,
|
||||||
|
enumerable: true
|
||||||
|
})
|
||||||
if (node.method.match(/^(post|delete|put|options|patch)$/)) {
|
if (node.method.match(/^(post|delete|put|options|patch)$/)) {
|
||||||
node.send({_msgid:msgid,req:req,res:createResponseWrapper(node,res),payload:req.body});
|
node.send({_msgid:msgid,req:req,res:createResponseWrapper(node,res),payload:req.body});
|
||||||
} else if (node.method == "get") {
|
} else if (node.method == "get") {
|
||||||
@@ -282,7 +291,7 @@ module.exports = function(RED) {
|
|||||||
RED.nodes.createNode(this,n);
|
RED.nodes.createNode(this,n);
|
||||||
var node = this;
|
var node = this;
|
||||||
this.headers = n.headers||{};
|
this.headers = n.headers||{};
|
||||||
this.statusCode = n.statusCode;
|
this.statusCode = parseInt(n.statusCode);
|
||||||
this.on("input",function(msg,_send,done) {
|
this.on("input",function(msg,_send,done) {
|
||||||
if (msg.res) {
|
if (msg.res) {
|
||||||
var headers = RED.util.cloneMessage(node.headers);
|
var headers = RED.util.cloneMessage(node.headers);
|
||||||
@@ -323,7 +332,7 @@ module.exports = function(RED) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var statusCode = node.statusCode || msg.statusCode || 200;
|
var statusCode = node.statusCode || parseInt(msg.statusCode) || 200;
|
||||||
if (typeof msg.payload == "object" && !Buffer.isBuffer(msg.payload)) {
|
if (typeof msg.payload == "object" && !Buffer.isBuffer(msg.payload)) {
|
||||||
msg.res._res.status(statusCode).jsonp(msg.payload);
|
msg.res._res.status(statusCode).jsonp(msg.payload);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -435,6 +435,10 @@ in your Node-RED user directory (${RED.settings.userDir}).
|
|||||||
formData.append(opt, val);
|
formData.append(opt, val);
|
||||||
} else if (typeof val === 'object' && val.hasOwnProperty('value')) {
|
} else if (typeof val === 'object' && val.hasOwnProperty('value')) {
|
||||||
formData.append(opt,val.value,val.options || {});
|
formData.append(opt,val.value,val.options || {});
|
||||||
|
} else if (Array.isArray(val)) {
|
||||||
|
for (var i=0; i<val.length; i++) {
|
||||||
|
formData.append(opt, val[i])
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
formData.append(opt,JSON.stringify(val));
|
formData.append(opt,JSON.stringify(val));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -110,7 +110,12 @@ module.exports = function(RED) {
|
|||||||
if (msg.payload[s].hasOwnProperty(p)) {
|
if (msg.payload[s].hasOwnProperty(p)) {
|
||||||
/* istanbul ignore else */
|
/* istanbul ignore else */
|
||||||
if (typeof msg.payload[s][p] !== "object") {
|
if (typeof msg.payload[s][p] !== "object") {
|
||||||
var q = "" + msg.payload[s][p];
|
// Fix to honour include null values flag
|
||||||
|
//if (typeof msg.payload[s][p] !== "object" || (node.include_null_values === true && msg.payload[s][p] === null)) {
|
||||||
|
var q = "";
|
||||||
|
if (msg.payload[s][p] !== undefined) {
|
||||||
|
q += msg.payload[s][p];
|
||||||
|
}
|
||||||
if (q.indexOf(node.quo) !== -1) { // add double quotes if any quotes
|
if (q.indexOf(node.quo) !== -1) { // add double quotes if any quotes
|
||||||
q = q.replace(/"/g, '""');
|
q = q.replace(/"/g, '""');
|
||||||
ou += node.quo + q + node.quo + node.sep;
|
ou += node.quo + q + node.quo + node.sep;
|
||||||
@@ -130,9 +135,15 @@ module.exports = function(RED) {
|
|||||||
ou += node.sep;
|
ou += node.sep;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
var p = RED.util.ensureString(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 */
|
/* istanbul ignore else */
|
||||||
if (p === "undefined") { p = ""; }
|
if (p === undefined) { p = ""; }
|
||||||
|
// fix to honour include null values flag
|
||||||
|
//if (p === null && node.include_null_values !== true) { p = "";}
|
||||||
|
p = RED.util.ensureString(p);
|
||||||
if (p.indexOf(node.quo) !== -1) { // add double quotes if any quotes
|
if (p.indexOf(node.quo) !== -1) { // add double quotes if any quotes
|
||||||
p = p.replace(/"/g, '""');
|
p = p.replace(/"/g, '""');
|
||||||
ou += node.quo + p + node.quo + node.sep;
|
ou += node.quo + p + node.quo + node.sep;
|
||||||
|
|||||||
@@ -251,7 +251,9 @@ module.exports = function(RED) {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
node.buffer = buff.slice(p,buff.length);
|
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) {
|
if (node.buffer.length == 0) {
|
||||||
done();
|
done();
|
||||||
|
|||||||
0
packages/node_modules/@node-red/nodes/core/storage/10-file.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/core/storage/10-file.html
vendored
Executable file → Normal file
@@ -117,7 +117,9 @@ module.exports = function(RED) {
|
|||||||
}
|
}
|
||||||
if (typeof data === "boolean") { data = data.toString(); }
|
if (typeof data === "boolean") { data = data.toString(); }
|
||||||
if (typeof data === "number") { data = data.toString(); }
|
if (typeof data === "number") { data = data.toString(); }
|
||||||
if ((node.appendNewline) && (!Buffer.isBuffer(data))) { data += os.EOL; }
|
var aflg = true;
|
||||||
|
if (msg.hasOwnProperty("parts") && msg.parts.type === "string" && (msg.parts.count === msg.parts.index + 1)) { aflg = false; }
|
||||||
|
if ((node.appendNewline) && (!Buffer.isBuffer(data)) && aflg) { data += os.EOL; }
|
||||||
var buf;
|
var buf;
|
||||||
if (node.encoding === "setbymsg") {
|
if (node.encoding === "setbymsg") {
|
||||||
buf = encode(data, msg.encoding || "none");
|
buf = encode(data, msg.encoding || "none");
|
||||||
@@ -314,7 +316,6 @@ module.exports = function(RED) {
|
|||||||
});
|
});
|
||||||
filename = filename || "";
|
filename = filename || "";
|
||||||
var fullFilename = filename;
|
var fullFilename = filename;
|
||||||
var filePath = "";
|
|
||||||
if (filename && RED.settings.fileWorkingDirectory && !path.isAbsolute(filename)) {
|
if (filename && RED.settings.fileWorkingDirectory && !path.isAbsolute(filename)) {
|
||||||
fullFilename = path.resolve(path.join(RED.settings.fileWorkingDirectory,filename));
|
fullFilename = path.resolve(path.join(RED.settings.fileWorkingDirectory,filename));
|
||||||
}
|
}
|
||||||
|
|||||||
0
packages/node_modules/@node-red/nodes/locales/de/common/20-inject.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/common/20-inject.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/common/21-debug.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/common/21-debug.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/common/25-catch.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/common/25-catch.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/common/25-status.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/common/25-status.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/common/60-link.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/common/60-link.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/common/90-comment.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/common/90-comment.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/common/98-unknown.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/common/98-unknown.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/function/10-function.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/function/10-function.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/function/10-switch.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/function/10-switch.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/function/15-change.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/function/15-change.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/function/16-range.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/function/16-range.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/function/80-template.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/function/80-template.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/function/89-delay.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/function/89-delay.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/function/89-trigger.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/function/89-trigger.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/function/90-exec.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/function/90-exec.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/messages.json
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/messages.json
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/network/05-tls.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/network/05-tls.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/network/06-httpproxy.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/network/06-httpproxy.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/network/10-mqtt.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/network/10-mqtt.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/network/21-httpin.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/network/21-httpin.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/network/21-httprequest.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/network/21-httprequest.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/network/22-websocket.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/network/22-websocket.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/network/31-tcpin.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/network/31-tcpin.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/network/32-udp.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/network/32-udp.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/parsers/70-CSV.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/parsers/70-CSV.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/parsers/70-HTML.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/parsers/70-HTML.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/parsers/70-JSON.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/parsers/70-JSON.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/parsers/70-XML.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/parsers/70-XML.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/parsers/70-YAML.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/parsers/70-YAML.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/sequence/17-split.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/sequence/17-split.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/sequence/18-sort.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/sequence/18-sort.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/sequence/19-batch.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/sequence/19-batch.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/storage/10-file.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/storage/10-file.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/storage/23-watch.html
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/de/storage/23-watch.html
vendored
Executable file → Normal file
@@ -18,5 +18,5 @@
|
|||||||
<p>A node you can use to add comments to your flows.</p>
|
<p>A node you can use to add comments to your flows.</p>
|
||||||
<h3>Details</h3>
|
<h3>Details</h3>
|
||||||
<p>The edit panel will accept Markdown syntax. The text will be rendered into
|
<p>The edit panel will accept Markdown syntax. The text will be rendered into
|
||||||
this information side panel.</p>
|
the information side panel.</p>
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -52,4 +52,7 @@
|
|||||||
used to mark the templated sections. For example, to use <code>[[ ]]</code>
|
used to mark the templated sections. For example, to use <code>[[ ]]</code>
|
||||||
instead, add the following line to the top of the template:</p>
|
instead, add the following line to the top of the template:</p>
|
||||||
<pre>{{=[[ ]]=}}</pre>
|
<pre>{{=[[ ]]=}}</pre>
|
||||||
|
<h4>Using environment variables</h4>
|
||||||
|
<p>The template node can access environment variables using the syntax:</p>
|
||||||
|
<pre>My favourite colour is {{env.COLOUR}}.</pre>
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -119,7 +119,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"complete": {
|
"complete": {
|
||||||
"completeNodes": "complete: __number__"
|
"completeNodes": "complete: __number__",
|
||||||
|
"errors": {
|
||||||
|
"scopeUndefined": "scope undefined"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"debug": {
|
"debug": {
|
||||||
"output": "Output",
|
"output": "Output",
|
||||||
@@ -181,8 +184,9 @@
|
|||||||
"staticLinkCall": "Fixed target",
|
"staticLinkCall": "Fixed target",
|
||||||
"dynamicLinkCall": "Dynamic target (msg.target)",
|
"dynamicLinkCall": "Dynamic target (msg.target)",
|
||||||
"dynamicLinkLabel": "Dynamic",
|
"dynamicLinkLabel": "Dynamic",
|
||||||
"error": {
|
"errors": {
|
||||||
"missingReturn": "Missing return node information"
|
"missingReturn": "Missing return node information",
|
||||||
|
"linkUndefined": "link undefined"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tls": {
|
"tls": {
|
||||||
@@ -446,7 +450,9 @@
|
|||||||
"staticTopic": "Subscribe to single topic",
|
"staticTopic": "Subscribe to single topic",
|
||||||
"dynamicTopic": "Dynamic subscription",
|
"dynamicTopic": "Dynamic subscription",
|
||||||
"auto-connect": "Connect automatically",
|
"auto-connect": "Connect automatically",
|
||||||
"auto-mode-depreciated": "This option is depreciated. Please use the new auto-detect mode."
|
"auto-mode-depreciated": "This option is depreciated. Please use the new auto-detect mode.",
|
||||||
|
"none": "none",
|
||||||
|
"other": "other"
|
||||||
},
|
},
|
||||||
"sections-label": {
|
"sections-label": {
|
||||||
"birth-message": "Message sent on connection (birth message)",
|
"birth-message": "Message sent on connection (birth message)",
|
||||||
|
|||||||
@@ -48,4 +48,7 @@
|
|||||||
<p><b>注: </b>デフォルトでは、<i>mustache</i>形式は置換対象のHTML要素をエスケープします。これを抑止するには<code>{{{三重}}}</code>括弧形式を使います。</p>
|
<p><b>注: </b>デフォルトでは、<i>mustache</i>形式は置換対象のHTML要素をエスケープします。これを抑止するには<code>{{{三重}}}</code>括弧形式を使います。</p>
|
||||||
<p>もし、コンテンツの中で<code>{{ }}</code>を出力する必要がある場合は、テンプレートで使われる記号文字を変えることもできます。例えば、<code>[[ ]]</code>を代わりに用いるには、テンプレートの先頭に以下の行を追加します。</p>
|
<p>もし、コンテンツの中で<code>{{ }}</code>を出力する必要がある場合は、テンプレートで使われる記号文字を変えることもできます。例えば、<code>[[ ]]</code>を代わりに用いるには、テンプレートの先頭に以下の行を追加します。</p>
|
||||||
<pre>{{=[[ ]]=}}</pre>
|
<pre>{{=[[ ]]=}}</pre>
|
||||||
|
<h4>環境変数の利用</h4>
|
||||||
|
<p>templateノードでは、次の構文を用いると環境変数にアクセスできます:</p>
|
||||||
|
<pre>私の好きな色は{{env.COLOUR}}です。</pre>
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -119,7 +119,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"complete": {
|
"complete": {
|
||||||
"completeNodes": "complete: __number__"
|
"completeNodes": "complete: __number__",
|
||||||
|
"errors": {
|
||||||
|
"scopeUndefined": "スコープが未定義"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"debug": {
|
"debug": {
|
||||||
"output": "対象",
|
"output": "対象",
|
||||||
@@ -181,8 +184,9 @@
|
|||||||
"staticLinkCall": "対象を固定で指定",
|
"staticLinkCall": "対象を固定で指定",
|
||||||
"dynamicLinkCall": "対象を動的に指定 (msg.target)",
|
"dynamicLinkCall": "対象を動的に指定 (msg.target)",
|
||||||
"dynamicLinkLabel": "動的",
|
"dynamicLinkLabel": "動的",
|
||||||
"error": {
|
"errors": {
|
||||||
"missingReturn": "返却するノードの情報が存在しません"
|
"missingReturn": "返却するノードの情報が存在しません",
|
||||||
|
"linkUndefined": "リンクが未定義"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tls": {
|
"tls": {
|
||||||
@@ -446,7 +450,9 @@
|
|||||||
"staticTopic": "1つのトピックを購読",
|
"staticTopic": "1つのトピックを購読",
|
||||||
"dynamicTopic": "動的な購読",
|
"dynamicTopic": "動的な購読",
|
||||||
"auto-connect": "自動接続",
|
"auto-connect": "自動接続",
|
||||||
"auto-mode-depreciated": "本オプションは非推奨になりました。新しい自動判定モードを使用してください。"
|
"auto-mode-depreciated": "本オプションは非推奨になりました。新しい自動判定モードを使用してください。",
|
||||||
|
"none": "なし",
|
||||||
|
"other": "その他"
|
||||||
},
|
},
|
||||||
"sections-label": {
|
"sections-label": {
|
||||||
"birth-message": "接続時の送信メッセージ(Birthメッセージ)",
|
"birth-message": "接続時の送信メッセージ(Birthメッセージ)",
|
||||||
|
|||||||
0
packages/node_modules/@node-red/nodes/locales/ko/messages.json
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/ko/messages.json
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/ru/messages.json
vendored
Executable file → Normal file
0
packages/node_modules/@node-red/nodes/locales/ru/messages.json
vendored
Executable file → Normal file
@@ -43,37 +43,40 @@ function load(disableNodePathScan) {
|
|||||||
return loadModuleFiles(modules);
|
return loadModuleFiles(modules);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function splitPath(p) {
|
||||||
|
return path.posix.normalize((p || '').replace(/\\/g, path.sep)).split(path.sep)
|
||||||
|
}
|
||||||
|
|
||||||
function loadModuleTypeFiles(module, type) {
|
function loadModuleTypeFiles(module, type) {
|
||||||
const things = module[type];
|
const things = module[type];
|
||||||
var first = true;
|
let first = true;
|
||||||
var promises = [];
|
const promises = [];
|
||||||
for (var thingName in things) {
|
for (let thingName in things) {
|
||||||
/* istanbul ignore else */
|
/* istanbul ignore else */
|
||||||
if (things.hasOwnProperty(thingName)) {
|
if (things.hasOwnProperty(thingName)) {
|
||||||
if (module.name != "node-red" && first) {
|
if (module.name != "node-red" && first) {
|
||||||
// Check the module directory exists
|
// Check the module directory exists
|
||||||
first = false;
|
first = false;
|
||||||
var fn = things[thingName].file;
|
let moduleFn = module.path
|
||||||
var parts = fn.split("/");
|
const fn = things[thingName].file
|
||||||
var i = parts.length-1;
|
const parts = splitPath(fn)
|
||||||
for (;i>=0;i--) {
|
const nmi = parts.indexOf('node_modules')
|
||||||
if (parts[i] == "node_modules") {
|
if(nmi > -1) {
|
||||||
break;
|
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 {
|
try {
|
||||||
var stat = fs.statSync(moduleFn);
|
const stat = fs.statSync(moduleFn);
|
||||||
} catch(err) {
|
} catch(err) {
|
||||||
// Module not found, don't attempt to load its nodes
|
break; // Module not found, don't attempt to load its nodes
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
var promise;
|
let promise;
|
||||||
if (type === "nodes") {
|
if (type === "nodes") {
|
||||||
promise = loadNodeConfig(things[thingName]);
|
promise = loadNodeConfig(things[thingName]);
|
||||||
} else if (type === "plugins") {
|
} else if (type === "plugins") {
|
||||||
@@ -82,8 +85,7 @@ function loadModuleTypeFiles(module, type) {
|
|||||||
promises.push(
|
promises.push(
|
||||||
promise.then(
|
promise.then(
|
||||||
(function() {
|
(function() {
|
||||||
var m = module.name;
|
const n = thingName;
|
||||||
var n = thingName;
|
|
||||||
return function(nodeSet) {
|
return function(nodeSet) {
|
||||||
things[n] = nodeSet;
|
things[n] = nodeSet;
|
||||||
return nodeSet;
|
return nodeSet;
|
||||||
@@ -93,7 +95,6 @@ function loadModuleTypeFiles(module, type) {
|
|||||||
);
|
);
|
||||||
} catch(err) {
|
} catch(err) {
|
||||||
console.log(err)
|
console.log(err)
|
||||||
//
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -125,38 +126,24 @@ function loadModuleFiles(modules) {
|
|||||||
}
|
}
|
||||||
var pluginList;
|
var pluginList;
|
||||||
var nodeList;
|
var nodeList;
|
||||||
|
|
||||||
return Promise.all(pluginPromises).then(function(results) {
|
return Promise.all(pluginPromises).then(function(results) {
|
||||||
pluginList = results.filter(r => !!r);
|
pluginList = results.filter(r => !!r);
|
||||||
// Initial plugin load has happened. Ensure modules that provide
|
return Promise.all(nodePromises)
|
||||||
// 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);
|
|
||||||
}).then(function(results) {
|
}).then(function(results) {
|
||||||
nodeList = results.filter(r => !!r);
|
nodeList = results.filter(r => !!r);
|
||||||
// Initial node load has happened. Ensure remaining modules are in the registry
|
// Initial node load has happened. Ensure remaining modules are in the registry
|
||||||
for (var module in modules) {
|
for (var module in modules) {
|
||||||
if (modules.hasOwnProperty(module)) {
|
if (modules.hasOwnProperty(module)) {
|
||||||
if (!modules[module].plugins || Object.keys(modules[module].plugins).length === 0) {
|
if (!modules[module].err) {
|
||||||
if (!modules[module].err) {
|
registry.addModule(modules[module]);
|
||||||
registry.addModule(modules[module]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}).then(function() {
|
||||||
|
return loadNodeSetList(pluginList);
|
||||||
|
}).then(function() {
|
||||||
return loadNodeSetList(nodeList);
|
return loadNodeSetList(nodeList);
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
async function loadPluginTemplate(plugin) {
|
async function loadPluginTemplate(plugin) {
|
||||||
|
|||||||
@@ -106,8 +106,8 @@ function getLocalNodeFiles(dir, skipValidNodeRedModules) {
|
|||||||
// when loading local files, if the path is a valid node-red module
|
// when loading local files, if the path is a valid node-red module
|
||||||
// dont include it (will be picked up in scanTreeForNodesModules)
|
// dont include it (will be picked up in scanTreeForNodesModules)
|
||||||
if(skipValidNodeRedModules && files.indexOf("package.json") >= 0) {
|
if(skipValidNodeRedModules && files.indexOf("package.json") >= 0) {
|
||||||
const package = getPackageDetails(dir)
|
const packageDetails = getPackageDetails(dir)
|
||||||
if(package.isNodeRedModule) {
|
if(packageDetails.isNodeRedModule) {
|
||||||
return {files: [], icons: []};
|
return {files: [], icons: []};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -135,17 +135,17 @@ function getLocalNodeFiles(dir, skipValidNodeRedModules) {
|
|||||||
return {files: result, icons: icons}
|
return {files: result, icons: icons}
|
||||||
}
|
}
|
||||||
|
|
||||||
function scanDirForNodesModules(dir,moduleName,package) {
|
function scanDirForNodesModules(dir,moduleName,packageDetails) {
|
||||||
let results = [];
|
let results = [];
|
||||||
let scopeName;
|
let scopeName;
|
||||||
let files
|
let files
|
||||||
try {
|
try {
|
||||||
let isNodeRedModule = false
|
let isNodeRedModule = false
|
||||||
if(package) {
|
if(packageDetails) {
|
||||||
dir = path.join(package.moduleDir,'..')
|
dir = path.join(packageDetails.moduleDir,'..')
|
||||||
files = [path.basename(package.moduleDir)]
|
files = [path.basename(packageDetails.moduleDir)]
|
||||||
moduleName = (package.package ? package.package.name : null) || moduleName
|
moduleName = (packageDetails.package ? packageDetails.package.name : null) || moduleName
|
||||||
isNodeRedModule = package.isNodeRedModule
|
isNodeRedModule = packageDetails.isNodeRedModule
|
||||||
} else {
|
} else {
|
||||||
files = fs.readdirSync(dir);
|
files = fs.readdirSync(dir);
|
||||||
if (moduleName) {
|
if (moduleName) {
|
||||||
@@ -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) {
|
||||||
|
packageDetails = getPackageDetails(dir) // get package details
|
||||||
|
if(packageDetails && packageDetails.isNodeRedModule) {
|
||||||
|
isNodeRedModule = true
|
||||||
|
files = ['package.json'] // shortcut the file scan
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (let i=0;i<files.length;i++) {
|
for (let i=0;i<files.length;i++) {
|
||||||
let fn = files[i];
|
let fn = files[i];
|
||||||
if (!isNodeRedModule && /^@/.test(fn)) {
|
if (!isNodeRedModule && /^@/.test(fn)) {
|
||||||
@@ -169,8 +179,8 @@ function scanDirForNodesModules(dir,moduleName,package) {
|
|||||||
} else {
|
} else {
|
||||||
if ((isNodeRedModule || (!moduleName || fn == moduleName)) && (isIncluded(fn) && !isExcluded(fn))) {
|
if ((isNodeRedModule || (!moduleName || fn == moduleName)) && (isIncluded(fn) && !isExcluded(fn))) {
|
||||||
try {
|
try {
|
||||||
const moduleDir = isNodeRedModule ? package.moduleDir : path.join(dir,fn);
|
const moduleDir = isNodeRedModule ? packageDetails.moduleDir : path.join(dir,fn);
|
||||||
const pkg = package || getPackageDetails(moduleDir)
|
const pkg = packageDetails || getPackageDetails(moduleDir)
|
||||||
if(pkg.error) {
|
if(pkg.error) {
|
||||||
throw pkg.error
|
throw pkg.error
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -185,10 +185,17 @@ function loadNodeConfigs() {
|
|||||||
function addModule(module) {
|
function addModule(module) {
|
||||||
moduleNodes[module.name] = [];
|
moduleNodes[module.name] = [];
|
||||||
moduleConfigs[module.name] = module;
|
moduleConfigs[module.name] = module;
|
||||||
// console.log("registry.js.addModule",module.name,"user?",module.user,"usedBy",module.usedBy,"dependencies",module.dependencies)
|
for (const setName in module.nodes) {
|
||||||
for (var setName in module.nodes) {
|
|
||||||
if (module.nodes.hasOwnProperty(setName)) {
|
if (module.nodes.hasOwnProperty(setName)) {
|
||||||
var set = module.nodes[setName];
|
const set = module.nodes[setName];
|
||||||
|
if (!set.types) {
|
||||||
|
const err = new Error("Set has no types")
|
||||||
|
err.code = "set_has_no_types"
|
||||||
|
err.details = {
|
||||||
|
...set
|
||||||
|
}
|
||||||
|
set.err = err
|
||||||
|
}
|
||||||
moduleNodes[module.name].push(set.name);
|
moduleNodes[module.name].push(set.name);
|
||||||
nodeList.push(set.id);
|
nodeList.push(set.id);
|
||||||
if (!set.err) {
|
if (!set.err) {
|
||||||
|
|||||||
@@ -818,6 +818,16 @@ function handlePreRoute(flow, sendEvent, reportError) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function deliverMessageToDestination(sendEvent) {
|
||||||
|
if (sendEvent?.destination?.node) {
|
||||||
|
try {
|
||||||
|
sendEvent.destination.node.receive(sendEvent.msg);
|
||||||
|
} catch(err) {
|
||||||
|
Log.error(`Error delivering message to node:${sendEvent.destination.node._path} [${sendEvent.destination.node.type}]`)
|
||||||
|
Log.error(err.stack)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
function handlePreDeliver(flow,sendEvent, reportError) {
|
function handlePreDeliver(flow,sendEvent, reportError) {
|
||||||
// preDeliver - the local router has identified the node it is going to send to. At this point, the message has been cloned if needed.
|
// preDeliver - the local router has identified the node it is going to send to. At this point, the message has been cloned if needed.
|
||||||
hooks.trigger("preDeliver",sendEvent,(err) => {
|
hooks.trigger("preDeliver",sendEvent,(err) => {
|
||||||
@@ -827,15 +837,10 @@ function handlePreDeliver(flow,sendEvent, reportError) {
|
|||||||
} else if (err !== false) {
|
} else if (err !== false) {
|
||||||
if (asyncMessageDelivery) {
|
if (asyncMessageDelivery) {
|
||||||
setImmediate(function() {
|
setImmediate(function() {
|
||||||
if (sendEvent.destination.node) {
|
deliverMessageToDestination(sendEvent)
|
||||||
sendEvent.destination.node.receive(sendEvent.msg);
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
if (sendEvent.destination.node) {
|
deliverMessageToDestination(sendEvent)
|
||||||
sendEvent.destination.node.receive(sendEvent.msg);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// postDeliver - the message has been dispatched to be delivered asynchronously (unless the sync delivery flag is set, in which case it would be continue as synchronous delivery)
|
// postDeliver - the message has been dispatched to be delivered asynchronously (unless the sync delivery flag is set, in which case it would be continue as synchronous delivery)
|
||||||
hooks.trigger("postDeliver", sendEvent, function(err) {
|
hooks.trigger("postDeliver", sendEvent, function(err) {
|
||||||
|
|||||||
@@ -641,6 +641,7 @@ function getFlow(id) {
|
|||||||
if (node.type === 'link out') {
|
if (node.type === 'link out') {
|
||||||
delete node.wires;
|
delete node.wires;
|
||||||
}
|
}
|
||||||
|
delete node.credentials;
|
||||||
return node;
|
return node;
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -648,7 +649,10 @@ function getFlow(id) {
|
|||||||
if (flow.configs) {
|
if (flow.configs) {
|
||||||
var configIds = Object.keys(flow.configs);
|
var configIds = Object.keys(flow.configs);
|
||||||
result.configs = configIds.map(function(configId) {
|
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) {
|
if (result.configs.length === 0) {
|
||||||
delete result.configs;
|
delete result.configs;
|
||||||
@@ -660,12 +664,16 @@ function getFlow(id) {
|
|||||||
var subflow = clone(flow.subflows[subflowId]);
|
var subflow = clone(flow.subflows[subflowId]);
|
||||||
var nodeIds = Object.keys(subflow.nodes);
|
var nodeIds = Object.keys(subflow.nodes);
|
||||||
subflow.nodes = nodeIds.map(function(id) {
|
subflow.nodes = nodeIds.map(function(id) {
|
||||||
return subflow.nodes[id];
|
const node = clone(subflow.nodes[id])
|
||||||
|
delete node.credentials
|
||||||
|
return node
|
||||||
});
|
});
|
||||||
if (subflow.configs) {
|
if (subflow.configs) {
|
||||||
var configIds = Object.keys(subflow.configs);
|
var configIds = Object.keys(subflow.configs);
|
||||||
subflow.configs = configIds.map(function(id) {
|
subflow.configs = configIds.map(function(id) {
|
||||||
return subflow.configs[id];
|
const node = clone(subflow.configs[id])
|
||||||
|
delete node.credentials
|
||||||
|
return node
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
delete subflow.instances;
|
delete subflow.instances;
|
||||||
|
|||||||
@@ -199,7 +199,9 @@ function parseConfig(config) {
|
|||||||
if (subflowDetails) {
|
if (subflowDetails) {
|
||||||
var subflowType = subflowDetails[1]
|
var subflowType = subflowDetails[1]
|
||||||
n.subflow = subflowType;
|
n.subflow = subflowType;
|
||||||
flow.subflows[subflowType].instances.push(n)
|
if (flow.subflows[subflowType]) {
|
||||||
|
flow.subflows[subflowType].instances.push(n)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (container) {
|
if (container) {
|
||||||
container.nodes[n.id] = n;
|
container.nodes[n.id] = n;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user