Merge branch 'dev' into pr_2258
@@ -168,7 +168,7 @@
|
||||
once: {value:false},
|
||||
onceDelay: {value:0.1}
|
||||
},
|
||||
icon: "inject.png",
|
||||
icon: "inject.svg",
|
||||
inputs:0,
|
||||
outputs:1,
|
||||
outputLabels: function(index) {
|
||||
@@ -247,7 +247,7 @@
|
||||
types:['flow','global','str','num','bool','json','bin','date','env']
|
||||
});
|
||||
|
||||
$("#inject-time-type-select").change(function() {
|
||||
$("#inject-time-type-select").on("change", function() {
|
||||
$("#node-input-crontab").val('');
|
||||
var id = $("#inject-time-type-select").val();
|
||||
$(".inject-time-row").hide();
|
||||
@@ -261,7 +261,7 @@
|
||||
}
|
||||
});
|
||||
|
||||
$("#node-input-once").change(function() {
|
||||
$("#node-input-once").on("change", function() {
|
||||
$("#node-input-onceDelay").attr('disabled', !$("#node-input-once").prop('checked'));
|
||||
})
|
||||
|
||||
@@ -272,7 +272,7 @@
|
||||
}
|
||||
});
|
||||
$("<option></option>").val(24).text("00:00").appendTo("#inject-time-interval-time-end");
|
||||
$("#inject-time-interval-time-start").change(function() {
|
||||
$("#inject-time-interval-time-start").on("change", function() {
|
||||
var start = Number($("#inject-time-interval-time-start").val());
|
||||
var end = Number($("#inject-time-interval-time-end").val());
|
||||
$("#inject-time-interval-time-end option").remove();
|
||||
@@ -380,8 +380,8 @@
|
||||
|
||||
$("#node-input-payload").typedInput('type',this.payloadType);
|
||||
|
||||
$("#inject-time-type-select").change();
|
||||
$("#inject-time-interval-time-start").change();
|
||||
$("#inject-time-type-select").trigger("change");
|
||||
$("#inject-time-interval-time-start").trigger("change");
|
||||
|
||||
},
|
||||
oneditsave: function() {
|
||||
|
@@ -11,57 +11,18 @@
|
||||
<input type="checkbox" id="node-input-uncaught" style="display: inline-block; width: auto; vertical-align: top; margin-left: 30px; margin-right: 5px;">
|
||||
<label for="node-input-uncaught" style="width: auto" data-i18n="catch.label.uncaught"></label>
|
||||
</div>
|
||||
<div class="form-row node-input-target-row" style="display: none;">
|
||||
<div id="node-input-catch-target-container-div" style="min-height: 100px;position: relative; box-sizing: border-box; border-radius: 2px; height: 180px; border: 1px solid #ccc;overflow:hidden; ">
|
||||
<div style="box-sizing: border-box; line-height: 20px; font-size: 0.8em; border-bottom: 1px solid #ddd; height: 20px;">
|
||||
<input type="checkbox" data-i18n="[title]catch.label.selectAll" id="node-input-target-node-checkbox-all" style="width: 30px; margin: 0 2px 1px 2px;">
|
||||
<div style="display: inline-block;"><a id="node-input-target-sort-label" href="#" data-i18n="[title]catch.label.sortByLabel"><span data-i18n="catch.label.node"></span> <i class="node-input-catch-sort-label-a fa fa-caret-down"></i><i class="node-input-catch-sort-label-d fa fa-caret-up"></i></a></div>
|
||||
<div style="position: absolute; right: 10px; width: 50px; display: inline-block; text-align: right;"><a id="node-input-target-sort-type" href="#" data-i18n="[title]catch.label.sortByType"><i class="node-input-catch-sort-sublabel-a fa fa-caret-down"></i><i class="node-input-catch-sort-sublabel-d fa fa-caret-up"></i> <span data-i18n="catch.label.type"></span></a></div>
|
||||
</div>
|
||||
<div style="background: #fbfbfb; box-sizing: border-box; position:absolute; top:20px;bottom:0;left:0px;right:0px; overflow-y: scroll; overflow-x: hidden;">
|
||||
<ul id="node-input-catch-target-container" style=" list-style-type:none; margin: 0;"></ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-row node-input-target-row">
|
||||
<button id="node-input-catch-target-select" class="red-ui-button" data-i18n="common.label.selectNodes"></button>
|
||||
</div>
|
||||
<div class="form-row node-input-target-row node-input-target-list-row" style="min-height: 100px">
|
||||
<div id="node-input-catch-target-container-div"></div>
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="common.label.name"></span></label>
|
||||
<input type="text" id="node-input-name" data-i18n="[placeholder]common.label.name">
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<style>
|
||||
#node-input-catch-target-container {
|
||||
position: relative;
|
||||
}
|
||||
#node-input-catch-target-container li {
|
||||
padding: 2px 5px;
|
||||
background: none;
|
||||
font-size: 0.8em;
|
||||
margin:0;
|
||||
white-space: nowrap;
|
||||
}
|
||||
#node-input-catch-target-container li label {
|
||||
margin-bottom: 0;
|
||||
width: 100%;
|
||||
}
|
||||
#node-input-catch-target-container li label input {
|
||||
vertical-align: top;
|
||||
width:15px;
|
||||
margin-right: 10px;
|
||||
}
|
||||
#node-input-catch-target-container li:hover,
|
||||
#node-input-catch-target-container li:hover .node-input-target-node-sublabel {
|
||||
background: #f0f0f0;
|
||||
}
|
||||
.node-input-target-node-sublabel {
|
||||
position:absolute;
|
||||
right: 0px;
|
||||
padding-right: 10px;
|
||||
padding-left: 10px;
|
||||
font-size: 0.8em;
|
||||
background: #fbfbfb;
|
||||
}
|
||||
</style>
|
||||
<script type="text/javascript">
|
||||
RED.nodes.registerType('catch',{
|
||||
category: 'input',
|
||||
@@ -73,7 +34,7 @@
|
||||
},
|
||||
inputs:0,
|
||||
outputs:1,
|
||||
icon: "alert.png",
|
||||
icon: "alert.svg",
|
||||
label: function() {
|
||||
if (this.name) {
|
||||
return this.name;
|
||||
@@ -87,153 +48,115 @@
|
||||
return this.name?"node_label_italic":"";
|
||||
},
|
||||
oneditprepare: function() {
|
||||
var nodeList = $("#node-input-catch-target-container");
|
||||
var node = this;
|
||||
this.resize = function() {
|
||||
var rows = $("#dialog-form>div:not(.node-input-target-row)");
|
||||
var scope = node.scope || [];
|
||||
|
||||
this._resize = function() {
|
||||
var rows = $("#dialog-form>div:not(.node-input-target-list-row)");
|
||||
var height = $("#dialog-form").height();
|
||||
for (var i=0;i<rows.size();i++) {
|
||||
for (var i=0;i<rows.length;i++) {
|
||||
height -= $(rows[i]).outerHeight(true);
|
||||
}
|
||||
var editorRow = $("#dialog-form>div.node-input-target-row");
|
||||
height -= (parseInt(editorRow.css("marginTop"))+parseInt(editorRow.css("marginBottom")));
|
||||
$("#node-input-catch-target-container-div").css("height",height+"px");
|
||||
var editorRow = $("#dialog-form>div.node-input-target-list-row");
|
||||
editorRow.css("height",height+"px");
|
||||
};
|
||||
|
||||
function createNodeList() {
|
||||
var scope = node.scope || [];
|
||||
nodeList.empty();
|
||||
var dirList = $("#node-input-catch-target-container-div").css({width: "100%", height: "100%"})
|
||||
.treeList({multi:true}).on("treelistitemmouseover", function(e, item) {
|
||||
item.node.highlighted = true;
|
||||
item.node.dirty = true;
|
||||
RED.view.redraw();
|
||||
}).on("treelistitemmouseout", function(e, item) {
|
||||
item.node.highlighted = false;
|
||||
item.node.dirty = true;
|
||||
RED.view.redraw();
|
||||
})
|
||||
var candidateNodes = RED.nodes.filterNodes({z:node.z});
|
||||
var allChecked = true;
|
||||
var items = [];
|
||||
var nodeItemMap = {};
|
||||
|
||||
var candidateNodes = RED.nodes.filterNodes({z:node.z});
|
||||
var allChecked = true;
|
||||
|
||||
candidateNodes.forEach(function(n) {
|
||||
if (n.id === node.id) {
|
||||
return;
|
||||
}
|
||||
var isChecked = scope.indexOf(n.id) !== -1;
|
||||
|
||||
allChecked = allChecked && isChecked;
|
||||
|
||||
var container = $('<li/>',{class:"node-input-target-node"});
|
||||
var row = $('<label/>',{for:"node-input-target-node-"+n.id}).appendTo(container);
|
||||
$('<input>',{type:"checkbox",class:"node-input-target-node-checkbox",id:"node-input-target-node-"+n.id})
|
||||
.data('node-id',n.id)
|
||||
.prop('checked', isChecked)
|
||||
.appendTo(row);
|
||||
container.on('mouseover',function(e) {
|
||||
n.highlighted = true;
|
||||
n.dirty = true;
|
||||
RED.view.redraw();
|
||||
});
|
||||
container.on('mouseout',function(e) {
|
||||
n.highlighted = false;
|
||||
n.dirty = true;
|
||||
RED.view.redraw();
|
||||
});
|
||||
var labelSpan = $('<span>');
|
||||
var nodeDef = RED.nodes.getType(n.type);
|
||||
var label;
|
||||
var sublabel;
|
||||
if (nodeDef) {
|
||||
var l = nodeDef.label;
|
||||
label = (typeof l === "function" ? l.call(n) : l)||"";
|
||||
sublabel = n.type;
|
||||
if (sublabel.indexOf("subflow:") === 0) {
|
||||
var subflowId = sublabel.substring(8);
|
||||
var subflow = RED.nodes.subflow(subflowId);
|
||||
sublabel = "subflow : "+subflow.name;
|
||||
}
|
||||
}
|
||||
if (!nodeDef || !label) {
|
||||
label = n.type;
|
||||
}
|
||||
$('<span>',{class:"node-input-target-node-label",style:"white-space:nowrap"}).text(label).appendTo(row);
|
||||
if (sublabel) {
|
||||
$('<span>',{class:"node-input-target-node-sublabel"}).text(sublabel).appendTo(row);
|
||||
}
|
||||
|
||||
container.appendTo(nodeList);
|
||||
});
|
||||
|
||||
$(".node-input-target-node-checkbox").change(function() {
|
||||
if (!this.checked) {
|
||||
$("#node-input-target-node-checkbox-all").prop('checked',false);
|
||||
}
|
||||
});
|
||||
|
||||
$("#node-input-target-node-checkbox-all").prop('checked',allChecked);
|
||||
|
||||
sortNodeList('label');
|
||||
}
|
||||
|
||||
function sortNodeList(sortOn) {
|
||||
var currentSort = nodeList.data('currentSort');
|
||||
var currentSortOrder = nodeList.data('currentSortOrder');
|
||||
|
||||
if (!currentSort) {
|
||||
currentSort = sortOn;
|
||||
currentSortOrder = 'a';
|
||||
} else {
|
||||
if (currentSort === sortOn) {
|
||||
currentSortOrder = (currentSortOrder === 'a'?'d':'a');
|
||||
} else {
|
||||
currentSortOrder = 'a';
|
||||
}
|
||||
currentSort = sortOn;
|
||||
candidateNodes.forEach(function(n) {
|
||||
if (n.id === node.id) {
|
||||
return;
|
||||
}
|
||||
nodeList.data('currentSort',currentSort);
|
||||
nodeList.data('currentSortOrder',currentSortOrder);
|
||||
var isChecked = scope.indexOf(n.id) !== -1;
|
||||
|
||||
$("#node-input-catch-target-container-div .fa").hide();
|
||||
$(".node-input-catch-sort-"+currentSort+"-"+currentSortOrder).show();
|
||||
allChecked = allChecked && isChecked;
|
||||
|
||||
var nodeDef = RED.nodes.getType(n.type);
|
||||
var label;
|
||||
var sublabel;
|
||||
if (nodeDef) {
|
||||
var l = nodeDef.label;
|
||||
label = (typeof l === "function" ? l.call(n) : l)||"";
|
||||
sublabel = n.type;
|
||||
if (sublabel.indexOf("subflow:") === 0) {
|
||||
var subflowId = sublabel.substring(8);
|
||||
var subflow = RED.nodes.subflow(subflowId);
|
||||
sublabel = "subflow : "+subflow.name;
|
||||
}
|
||||
}
|
||||
if (!nodeDef || !label) {
|
||||
label = n.type;
|
||||
}
|
||||
nodeItemMap[n.id] = {
|
||||
node: n,
|
||||
label: label,
|
||||
sublabel: sublabel,
|
||||
selected: isChecked
|
||||
};
|
||||
items.push(nodeItemMap[n.id]);
|
||||
});
|
||||
dirList.treeList('data',items);
|
||||
|
||||
var items = nodeList.find("li").get();
|
||||
items.sort(function(a,b) {
|
||||
var labelA = $(a).find(".node-input-target-node-"+currentSort).text().toLowerCase();
|
||||
var labelB = $(b).find(".node-input-target-node-"+currentSort).text().toLowerCase();
|
||||
if (labelA < labelB) { return currentSortOrder==='a'?-1:1; }
|
||||
if (labelA > labelB) { return currentSortOrder==='a'?1:-1; }
|
||||
return 0;
|
||||
});
|
||||
$.each(items, function(i, li){
|
||||
nodeList.append(li);
|
||||
});
|
||||
}
|
||||
$("#node-input-target-sort-label").click(function(e) {
|
||||
$("#node-input-catch-target-select").on("click", function(e) {
|
||||
e.preventDefault();
|
||||
sortNodeList('label');
|
||||
});
|
||||
var preselected = dirList.treeList('selected').map(function(n) {return n.node.id});
|
||||
RED.tray.hide();
|
||||
RED.view.selectNodes({
|
||||
selected: preselected,
|
||||
onselect: function(selection) {
|
||||
RED.tray.show();
|
||||
var newlySelected = {};
|
||||
selection.forEach(function(n) {
|
||||
newlySelected[n.id] = true;
|
||||
if (nodeItemMap[n.id]) {
|
||||
nodeItemMap[n.id].treeList.select(true);
|
||||
}
|
||||
})
|
||||
preselected.forEach(function(id) {
|
||||
if (!newlySelected[id]) {
|
||||
nodeItemMap[id].treeList.select(false);
|
||||
}
|
||||
})
|
||||
},
|
||||
oncancel: function() {
|
||||
RED.tray.show();
|
||||
},
|
||||
filter: function(n) {
|
||||
return n.id !== node.id;
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
$("#node-input-target-sort-type").click(function(e) {
|
||||
e.preventDefault();
|
||||
sortNodeList('sublabel');
|
||||
});
|
||||
$("#node-input-target-node-checkbox-all").change(function() {
|
||||
$(".node-input-target-node-checkbox").prop('checked',this.checked);
|
||||
});
|
||||
|
||||
|
||||
|
||||
$("#node-input-scope-select").change(function(e) {
|
||||
$("#node-input-scope-select").on("change", function(e) {
|
||||
var scope = $(this).val();
|
||||
if (scope === "target") {
|
||||
createNodeList();
|
||||
$(".node-input-target-row").show();
|
||||
$(".node-input-uncaught-row").hide();
|
||||
} else {
|
||||
$(".node-input-target-row").hide();
|
||||
$(".node-input-uncaught-row").show();
|
||||
}
|
||||
node.resize();
|
||||
node._resize();
|
||||
});
|
||||
if (this.scope === null) {
|
||||
$("#node-input-scope-select").val("all");
|
||||
} else {
|
||||
$("#node-input-scope-select").val("target");
|
||||
}
|
||||
$("#node-input-scope-select").change();
|
||||
$("#node-input-scope-select").trigger("change");
|
||||
},
|
||||
oneditsave: function() {
|
||||
var scope = $("#node-input-scope-select").val();
|
||||
@@ -241,17 +164,11 @@
|
||||
this.scope = null;
|
||||
} else {
|
||||
$("#node-input-uncaught").prop("checked",false);
|
||||
var node = this;
|
||||
node.scope = [];
|
||||
$(".node-input-target-node-checkbox").each(function(n) {
|
||||
if ($(this).prop("checked")) {
|
||||
node.scope.push($(this).data('node-id'));
|
||||
}
|
||||
});
|
||||
this.scope = $("#node-input-catch-target-container-div").treeList('selected').map(function(i) { return i.node.id})
|
||||
}
|
||||
},
|
||||
oneditresize: function(size) {
|
||||
this.resize();
|
||||
this._resize();
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
136
packages/node_modules/@node-red/nodes/core/core/25-complete.html
vendored
Normal file
@@ -0,0 +1,136 @@
|
||||
<script type="text/x-red" data-template-name="complete">
|
||||
<div class="form-row node-input-target-row">
|
||||
<button id="node-input-complete-target-select" class="red-ui-button" data-i18n="common.label.selectNodes"></button>
|
||||
</div>
|
||||
<div class="form-row node-input-target-row node-input-target-list-row" style="min-height: 100px">
|
||||
<div id="node-input-complete-target-container-div"></div>
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="common.label.name"></span></label>
|
||||
<input type="text" id="node-input-name" data-i18n="[placeholder]common.label.name">
|
||||
</div>
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
RED.nodes.registerType('complete',{
|
||||
category: 'input',
|
||||
color:"#c0edc0",
|
||||
defaults: {
|
||||
name: {value:""},
|
||||
scope: {value:[]},
|
||||
uncaught: {value:false}
|
||||
},
|
||||
inputs:0,
|
||||
outputs:1,
|
||||
icon: "alert.svg",
|
||||
label: function() {
|
||||
if (this.name) {
|
||||
return this.name;
|
||||
}
|
||||
return this._("complete.completeNodes",{number:this.scope.length});
|
||||
},
|
||||
labelStyle: function() {
|
||||
return this.name?"node_label_italic":"";
|
||||
},
|
||||
oneditprepare: function() {
|
||||
var node = this;
|
||||
var scope = node.scope || [];
|
||||
|
||||
this._resize = function() {
|
||||
var rows = $("#dialog-form>div:not(.node-input-target-list-row)");
|
||||
var height = $("#dialog-form").height();
|
||||
for (var i=0;i<rows.length;i++) {
|
||||
height -= $(rows[i]).outerHeight(true);
|
||||
}
|
||||
var editorRow = $("#dialog-form>div.node-input-target-list-row");
|
||||
editorRow.css("height",height+"px");
|
||||
};
|
||||
|
||||
var dirList = $("#node-input-complete-target-container-div").css({width: "100%", height: "100%"})
|
||||
.treeList({multi:true}).on("treelistitemmouseover", function(e, item) {
|
||||
item.node.highlighted = true;
|
||||
item.node.dirty = true;
|
||||
RED.view.redraw();
|
||||
}).on("treelistitemmouseout", function(e, item) {
|
||||
item.node.highlighted = false;
|
||||
item.node.dirty = true;
|
||||
RED.view.redraw();
|
||||
})
|
||||
var candidateNodes = RED.nodes.filterNodes({z:node.z});
|
||||
var allChecked = true;
|
||||
var items = [];
|
||||
var nodeItemMap = {};
|
||||
|
||||
candidateNodes.forEach(function(n) {
|
||||
if (n.id === node.id) {
|
||||
return;
|
||||
}
|
||||
var isChecked = scope.indexOf(n.id) !== -1;
|
||||
|
||||
allChecked = allChecked && isChecked;
|
||||
|
||||
var nodeDef = RED.nodes.getType(n.type);
|
||||
var label;
|
||||
var sublabel;
|
||||
if (nodeDef) {
|
||||
var l = nodeDef.label;
|
||||
label = (typeof l === "function" ? l.call(n) : l)||"";
|
||||
sublabel = n.type;
|
||||
if (sublabel.indexOf("subflow:") === 0) {
|
||||
var subflowId = sublabel.substring(8);
|
||||
var subflow = RED.nodes.subflow(subflowId);
|
||||
sublabel = "subflow : "+subflow.name;
|
||||
}
|
||||
}
|
||||
if (!nodeDef || !label) {
|
||||
label = n.type;
|
||||
}
|
||||
nodeItemMap[n.id] = {
|
||||
node: n,
|
||||
label: label,
|
||||
sublabel: sublabel,
|
||||
selected: isChecked
|
||||
};
|
||||
items.push(nodeItemMap[n.id]);
|
||||
});
|
||||
dirList.treeList('data',items);
|
||||
|
||||
$("#node-input-complete-target-select").on("click", function(e) {
|
||||
e.preventDefault();
|
||||
var preselected = dirList.treeList('selected').map(function(n) {return n.node.id});
|
||||
RED.tray.hide();
|
||||
RED.view.selectNodes({
|
||||
selected: preselected,
|
||||
onselect: function(selection) {
|
||||
RED.tray.show();
|
||||
var newlySelected = {};
|
||||
selection.forEach(function(n) {
|
||||
newlySelected[n.id] = true;
|
||||
if (nodeItemMap[n.id]) {
|
||||
nodeItemMap[n.id].treeList.select(true);
|
||||
}
|
||||
})
|
||||
preselected.forEach(function(id) {
|
||||
if (!newlySelected[id]) {
|
||||
nodeItemMap[id].treeList.select(false);
|
||||
}
|
||||
})
|
||||
},
|
||||
oncancel: function() {
|
||||
RED.tray.show();
|
||||
},
|
||||
filter: function(n) {
|
||||
return n.id !== node.id;
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
},
|
||||
oneditsave: function() {
|
||||
this.scope = $("#node-input-complete-target-container-div").treeList('selected').map(function(i) { return i.node.id})
|
||||
},
|
||||
oneditresize: function(size) {
|
||||
this._resize();
|
||||
}
|
||||
});
|
||||
</script>
|
30
packages/node_modules/@node-red/nodes/core/core/25-complete.js
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
/**
|
||||
* Copyright JS Foundation and other contributors, http://js.foundation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
**/
|
||||
|
||||
module.exports = function(RED) {
|
||||
"use strict";
|
||||
|
||||
function CompleteNode(n) {
|
||||
RED.nodes.createNode(this,n);
|
||||
var node = this;
|
||||
this.scope = n.scope;
|
||||
this.on("input",function(msg) {
|
||||
this.send(msg);
|
||||
});
|
||||
}
|
||||
|
||||
RED.nodes.registerType("complete",CompleteNode);
|
||||
}
|
@@ -7,17 +7,11 @@
|
||||
<option value="target" data-i18n="status.scope.selected"></options>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-row node-input-target-row" style="display: none;">
|
||||
<div id="node-input-status-target-container-div" style=" min-height: 100px;position: relative; box-sizing: border-box; border-radius: 2px; height: 180px; border: 1px solid #ccc;overflow:hidden; ">
|
||||
<div style="box-sizing: border-box; line-height: 20px; font-size: 0.8em; border-bottom: 1px solid #ddd; height: 20px;">
|
||||
<input type="checkbox" data-i18n="[title]status.label.selectAll" id="node-input-target-node-checkbox-all" style="width: 30px; margin: 0 2px 1px 2px;">
|
||||
<div style="display: inline-block;"><a id="node-input-target-sort-label" href="#" data-i18n="[title]status.label.sortByLabel"><span data-i18n="status.label.node"></span> <i class="node-input-status-sort-label-a fa fa-caret-down"></i><i class="node-input-status-sort-label-d fa fa-caret-up"></i></a></div>
|
||||
<div style="position: absolute; right: 10px; width: 50px; display: inline-block; text-align: right;"><a id="node-input-target-sort-type" href="#" data-i18n="[title]status.label.sortByType"><i class="node-input-status-sort-sublabel-a fa fa-caret-down"></i><i class="node-input-status-sort-sublabel-d fa fa-caret-up"></i> <span data-i18n="status.label.type"></span></a></div>
|
||||
</div>
|
||||
<div style="background: #fbfbfb; box-sizing: border-box; position:absolute; top:20px;bottom:0;left:0px;right:0px; overflow-y: scroll; overflow-x: hidden;">
|
||||
<ul id="node-input-status-target-container" style=" list-style-type:none; margin: 0;"></ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-row node-input-target-row">
|
||||
<button id="node-input-status-target-select" class="red-ui-button" data-i18n="common.label.selectNodes"></button>
|
||||
</div>
|
||||
<div class="form-row node-input-target-row node-input-target-list-row" style="min-height: 100px">
|
||||
<div id="node-input-status-target-container-div"></div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="common.label.name"></span></label>
|
||||
@@ -25,50 +19,17 @@
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<style>
|
||||
#node-input-status-target-container {
|
||||
position: relative;
|
||||
}
|
||||
#node-input-status-target-container li {
|
||||
padding: 2px 5px;
|
||||
background: none;
|
||||
font-size: 0.8em;
|
||||
margin:0;
|
||||
white-space: nowrap;
|
||||
}
|
||||
#node-input-status-target-container li label {
|
||||
margin-bottom: 0;
|
||||
width: 100%;
|
||||
}
|
||||
#node-input-status-target-container li label input {
|
||||
vertical-align: top;
|
||||
width:15px;
|
||||
margin-right: 10px;
|
||||
}
|
||||
#node-input-status-target-container li:hover,
|
||||
#node-input-status-target-container li:hover .node-input-target-node-sublabel {
|
||||
background: #f0f0f0;
|
||||
}
|
||||
.node-input-target-node-sublabel {
|
||||
position:absolute;
|
||||
right: 0px;
|
||||
padding-right: 10px;
|
||||
padding-left: 10px;
|
||||
font-size: 0.8em;
|
||||
background: #fbfbfb;
|
||||
}
|
||||
</style>
|
||||
<script type="text/javascript">
|
||||
RED.nodes.registerType('status',{
|
||||
category: 'input',
|
||||
color:"#c0edc0",
|
||||
color:"#d9f4fd",
|
||||
defaults: {
|
||||
name: {value:""},
|
||||
scope: {value:null}
|
||||
},
|
||||
inputs:0,
|
||||
outputs:1,
|
||||
icon: "alert.png",
|
||||
icon: "alert.svg",
|
||||
label: function() {
|
||||
return this.name||(this.scope?this._("status.statusNodes",{number:this.scope.length}):this._("status.status"));
|
||||
},
|
||||
@@ -76,166 +37,123 @@
|
||||
return this.name?"node_label_italic":"";
|
||||
},
|
||||
oneditprepare: function() {
|
||||
var nodeList = $("#node-input-status-target-container");
|
||||
var node = this;
|
||||
this.resize = function() {
|
||||
var rows = $("#dialog-form>div:not(.node-input-target-row)");
|
||||
var scope = node.scope || [];
|
||||
this._resize = function() {
|
||||
var rows = $("#dialog-form>div:not(.node-input-target-list-row)");
|
||||
var height = $("#dialog-form").height();
|
||||
for (var i=0;i<rows.size();i++) {
|
||||
for (var i=0;i<rows.length;i++) {
|
||||
height -= $(rows[i]).outerHeight(true);
|
||||
}
|
||||
var editorRow = $("#dialog-form>div.node-input-target-row");
|
||||
height -= (parseInt(editorRow.css("marginTop"))+parseInt(editorRow.css("marginBottom")));
|
||||
$("#node-input-status-target-container-div").css("height",height+"px");
|
||||
var editorRow = $("#dialog-form>div.node-input-target-list-row");
|
||||
editorRow.css("height",height+"px");
|
||||
};
|
||||
|
||||
function createNodeList() {
|
||||
var scope = node.scope || [];
|
||||
nodeList.empty();
|
||||
var dirList = $("#node-input-status-target-container-div").css({width: "100%", height: "100%"})
|
||||
.treeList({multi:true}).on("treelistitemmouseover", function(e, item) {
|
||||
item.node.highlighted = true;
|
||||
item.node.dirty = true;
|
||||
RED.view.redraw();
|
||||
}).on("treelistitemmouseout", function(e, item) {
|
||||
item.node.highlighted = false;
|
||||
item.node.dirty = true;
|
||||
RED.view.redraw();
|
||||
})
|
||||
var candidateNodes = RED.nodes.filterNodes({z:node.z});
|
||||
var allChecked = true;
|
||||
var items = [];
|
||||
var nodeItemMap = {};
|
||||
|
||||
var candidateNodes = RED.nodes.filterNodes({z:node.z});
|
||||
var allChecked = true;
|
||||
|
||||
candidateNodes.forEach(function(n) {
|
||||
if (n.id === node.id) {
|
||||
return;
|
||||
}
|
||||
var isChecked = scope.indexOf(n.id) !== -1;
|
||||
|
||||
allChecked = allChecked && isChecked;
|
||||
|
||||
var container = $('<li/>',{class:"node-input-target-node"});
|
||||
var row = $('<label/>',{for:"node-input-target-node-"+n.id}).appendTo(container);
|
||||
$('<input>',{type:"checkbox",class:"node-input-target-node-checkbox",id:"node-input-target-node-"+n.id})
|
||||
.data('node-id',n.id)
|
||||
.prop('checked', isChecked)
|
||||
.appendTo(row);
|
||||
container.on('mouseover',function(e) {
|
||||
n.highlighted = true;
|
||||
n.dirty = true;
|
||||
RED.view.redraw();
|
||||
});
|
||||
container.on('mouseout',function(e) {
|
||||
n.highlighted = false;
|
||||
n.dirty = true;
|
||||
RED.view.redraw();
|
||||
});
|
||||
var labelSpan = $('<span>');
|
||||
var nodeDef = RED.nodes.getType(n.type);
|
||||
var label;
|
||||
var sublabel;
|
||||
if (nodeDef) {
|
||||
var l = nodeDef.label;
|
||||
label = (typeof l === "function" ? l.call(n) : l)||"";
|
||||
sublabel = n.type;
|
||||
if (sublabel.indexOf("subflow:") === 0) {
|
||||
var subflowId = sublabel.substring(8);
|
||||
var subflow = RED.nodes.subflow(subflowId);
|
||||
sublabel = "subflow : "+subflow.name;
|
||||
}
|
||||
}
|
||||
if (!nodeDef || !label) {
|
||||
label = n.type;
|
||||
}
|
||||
$('<span>',{class:"node-input-target-node-label",style:"white-space:nowrap"}).text(label).appendTo(row);
|
||||
if (sublabel) {
|
||||
$('<span>',{class:"node-input-target-node-sublabel"}).text(sublabel).appendTo(row);
|
||||
}
|
||||
|
||||
container.appendTo(nodeList);
|
||||
});
|
||||
|
||||
$(".node-input-target-node-checkbox").change(function() {
|
||||
if (!this.checked) {
|
||||
$("#node-input-target-node-checkbox-all").prop('checked',false);
|
||||
}
|
||||
});
|
||||
|
||||
$("#node-input-target-node-checkbox-all").prop('checked',allChecked);
|
||||
|
||||
sortNodeList('label');
|
||||
}
|
||||
|
||||
function sortNodeList(sortOn) {
|
||||
var currentSort = nodeList.data('currentSort');
|
||||
var currentSortOrder = nodeList.data('currentSortOrder');
|
||||
|
||||
if (!currentSort) {
|
||||
currentSort = sortOn;
|
||||
currentSortOrder = 'a';
|
||||
} else {
|
||||
if (currentSort === sortOn) {
|
||||
currentSortOrder = (currentSortOrder === 'a'?'d':'a');
|
||||
} else {
|
||||
currentSortOrder = 'a';
|
||||
}
|
||||
currentSort = sortOn;
|
||||
candidateNodes.forEach(function(n) {
|
||||
if (n.id === node.id) {
|
||||
return;
|
||||
}
|
||||
nodeList.data('currentSort',currentSort);
|
||||
nodeList.data('currentSortOrder',currentSortOrder);
|
||||
var isChecked = scope.indexOf(n.id) !== -1;
|
||||
|
||||
$("#node-input-status-target-container-div .fa").hide();
|
||||
$(".node-input-status-sort-"+currentSort+"-"+currentSortOrder).show();
|
||||
allChecked = allChecked && isChecked;
|
||||
|
||||
var nodeDef = RED.nodes.getType(n.type);
|
||||
var label;
|
||||
var sublabel;
|
||||
if (nodeDef) {
|
||||
var l = nodeDef.label;
|
||||
label = (typeof l === "function" ? l.call(n) : l)||"";
|
||||
sublabel = n.type;
|
||||
if (sublabel.indexOf("subflow:") === 0) {
|
||||
var subflowId = sublabel.substring(8);
|
||||
var subflow = RED.nodes.subflow(subflowId);
|
||||
sublabel = "subflow : "+subflow.name;
|
||||
}
|
||||
}
|
||||
if (!nodeDef || !label) {
|
||||
label = n.type;
|
||||
}
|
||||
nodeItemMap[n.id] = {
|
||||
node: n,
|
||||
label: label,
|
||||
sublabel: sublabel,
|
||||
selected: isChecked
|
||||
};
|
||||
items.push(nodeItemMap[n.id]);
|
||||
});
|
||||
dirList.treeList('data',items);
|
||||
|
||||
var items = nodeList.find("li").get();
|
||||
items.sort(function(a,b) {
|
||||
var labelA = $(a).find(".node-input-target-node-"+currentSort).text().toLowerCase();
|
||||
var labelB = $(b).find(".node-input-target-node-"+currentSort).text().toLowerCase();
|
||||
if (labelA < labelB) { return currentSortOrder==='a'?-1:1; }
|
||||
if (labelA > labelB) { return currentSortOrder==='a'?1:-1; }
|
||||
return 0;
|
||||
});
|
||||
$.each(items, function(i, li) {
|
||||
nodeList.append(li);
|
||||
});
|
||||
}
|
||||
$("#node-input-target-sort-label").click(function(e) {
|
||||
$("#node-input-status-target-select").on("click", function(e) {
|
||||
e.preventDefault();
|
||||
sortNodeList('label');
|
||||
});
|
||||
var preselected = dirList.treeList('selected').map(function(n) {return n.node.id});
|
||||
RED.tray.hide();
|
||||
RED.view.selectNodes({
|
||||
selected: preselected,
|
||||
onselect: function(selection) {
|
||||
RED.tray.show();
|
||||
var newlySelected = {};
|
||||
selection.forEach(function(n) {
|
||||
newlySelected[n.id] = true;
|
||||
if (nodeItemMap[n.id]) {
|
||||
nodeItemMap[n.id].treeList.select(true);
|
||||
}
|
||||
})
|
||||
preselected.forEach(function(id) {
|
||||
if (!newlySelected[id]) {
|
||||
nodeItemMap[id].treeList.select(false);
|
||||
}
|
||||
})
|
||||
},
|
||||
oncancel: function() {
|
||||
RED.tray.show();
|
||||
},
|
||||
filter: function(n) {
|
||||
return n.id !== node.id;
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
$("#node-input-target-sort-type").click(function(e) {
|
||||
e.preventDefault();
|
||||
sortNodeList('sublabel');
|
||||
});
|
||||
$("#node-input-target-node-checkbox-all").change(function() {
|
||||
$(".node-input-target-node-checkbox").prop('checked',this.checked);
|
||||
});
|
||||
|
||||
$("#node-input-scope-select").change(function(e) {
|
||||
$("#node-input-scope-select").on("change", function(e) {
|
||||
var scope = $(this).val();
|
||||
if (scope === "target") {
|
||||
createNodeList();
|
||||
$(".node-input-target-row").show();
|
||||
} else {
|
||||
$(".node-input-target-row").hide();
|
||||
}
|
||||
node.resize();
|
||||
node._resize();
|
||||
});
|
||||
if (this.scope === null) {
|
||||
$("#node-input-scope-select").val("all");
|
||||
} else {
|
||||
$("#node-input-scope-select").val("target");
|
||||
}
|
||||
$("#node-input-scope-select").change();
|
||||
$("#node-input-scope-select").trigger("change");
|
||||
},
|
||||
oneditsave: function() {
|
||||
var scope = $("#node-input-scope-select").val();
|
||||
if (scope === 'all') {
|
||||
this.scope = null;
|
||||
} else {
|
||||
var node = this;
|
||||
node.scope = [];
|
||||
$(".node-input-target-node-checkbox").each(function(n) {
|
||||
if ($(this).prop("checked")) {
|
||||
node.scope.push($(this).data('node-id'));
|
||||
}
|
||||
});
|
||||
this.scope = $("#node-input-status-target-container-div").treeList('selected').map(function(i) { return i.node.id})
|
||||
}
|
||||
},
|
||||
oneditresize: function(size) {
|
||||
this.resize();
|
||||
this._resize();
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
@@ -65,7 +65,7 @@
|
||||
color:"#87a980",
|
||||
inputs:1,
|
||||
outputs:0,
|
||||
icon: "debug.png",
|
||||
icon: "debug.svg",
|
||||
align: "right",
|
||||
button: {
|
||||
toggle: "active",
|
||||
@@ -205,19 +205,20 @@
|
||||
}
|
||||
};
|
||||
RED.events.on("project:change", this.clearMessageList);
|
||||
RED.actions.add("core:clear-debug-messages", function() { RED.debug.clearMessageList(true) });
|
||||
|
||||
$("#debug-tab-open").click(function(e) {
|
||||
$("#red-ui-sidebar-debug-open").on("click", function(e) {
|
||||
e.preventDefault();
|
||||
subWindow = window.open(document.location.toString().replace(/[?#].*$/,"")+"debug/view/view.html"+document.location.search,"nodeREDDebugView","menubar=no,location=no,toolbar=no,chrome,height=500,width=600");
|
||||
subWindow.onload = function() {
|
||||
subWindow.postMessage({event:"workspaceChange",activeWorkspace:RED.workspaces.active()},"*");
|
||||
};
|
||||
});
|
||||
RED.popover.tooltip($("#debug-tab-open"),RED._('node-red:debug.sidebar.openWindow'));
|
||||
RED.popover.tooltip($("#red-ui-sidebar-debug-open"),RED._('node-red:debug.sidebar.openWindow'));
|
||||
|
||||
|
||||
|
||||
$(window).unload(function() {
|
||||
$(window).on('beforeunload',function() {
|
||||
if (subWindow) {
|
||||
try {
|
||||
subWindow.close();
|
||||
@@ -246,7 +247,8 @@
|
||||
RED.sidebar.removeTab("debug");
|
||||
RED.events.off("workspace:change", this.refreshMessageList);
|
||||
window.removeEventListener("message",this.handleWindowMessage);
|
||||
RED.actions.remove("core:show-debug");
|
||||
RED.actions.remove("core:show-debug-tab");
|
||||
RED.actions.remove("core:clear-debug-messages");
|
||||
|
||||
delete RED._debug;
|
||||
},
|
||||
|
@@ -81,7 +81,7 @@ module.exports = function(RED) {
|
||||
}
|
||||
}
|
||||
|
||||
this.on("input", function(msg) {
|
||||
this.on("input", function(msg, send, done) {
|
||||
if (this.complete === "true") {
|
||||
// debug complete msg object
|
||||
if (this.console === "true") {
|
||||
@@ -90,13 +90,14 @@ module.exports = function(RED) {
|
||||
if (this.active && this.tosidebar) {
|
||||
sendDebug({id:node.id, name:node.name, topic:msg.topic, msg:msg, _path:msg._path});
|
||||
}
|
||||
done();
|
||||
} else {
|
||||
prepareValue(msg,function(err,msg) {
|
||||
prepareValue(msg,function(err,debugMsg) {
|
||||
if (err) {
|
||||
node.error(err);
|
||||
return;
|
||||
}
|
||||
var output = msg.msg;
|
||||
var output = debugMsg.msg;
|
||||
if (node.console === "true") {
|
||||
if (typeof output === "string") {
|
||||
node.log((output.indexOf("\n") !== -1 ? "\n" : "") + output);
|
||||
@@ -114,9 +115,10 @@ module.exports = function(RED) {
|
||||
}
|
||||
if (node.active) {
|
||||
if (node.tosidebar == true) {
|
||||
sendDebug(msg);
|
||||
sendDebug(debugMsg);
|
||||
}
|
||||
}
|
||||
done();
|
||||
});
|
||||
}
|
||||
})
|
||||
|
@@ -53,7 +53,7 @@
|
||||
if (activeSubflow) {
|
||||
flowMap[activeSubflow.id] = {
|
||||
id: activeSubflow.id,
|
||||
class: 'palette-header',
|
||||
class: 'red-ui-palette-header',
|
||||
label: "Subflow : "+(activeSubflow.name || activeSubflow.id),
|
||||
expanded: true,
|
||||
children: []
|
||||
@@ -63,7 +63,7 @@
|
||||
RED.nodes.eachWorkspace(function(ws) {
|
||||
flowMap[ws.id] = {
|
||||
id: ws.id,
|
||||
class: 'palette-header',
|
||||
class: 'red-ui-palette-header',
|
||||
label: (ws.label || ws.id)+(node.z===ws.id ? " *":""),
|
||||
expanded: true,
|
||||
children: []
|
||||
@@ -97,7 +97,7 @@
|
||||
function resizeNodeList() {
|
||||
var rows = $("#dialog-form>div:not(.node-input-link-row)");
|
||||
var height = $("#dialog-form").height();
|
||||
for (var i=0;i<rows.size();i++) {
|
||||
for (var i=0;i<rows.length;i++) {
|
||||
height -= $(rows[i]).outerHeight(true);
|
||||
}
|
||||
var editorRow = $("#dialog-form>div.node-input-link-row");
|
||||
@@ -170,7 +170,7 @@
|
||||
},
|
||||
inputs:0,
|
||||
outputs:1,
|
||||
icon: "link-out.png",
|
||||
icon: "link-out.svg",
|
||||
outputLabels: function(i) {
|
||||
return this.name||this._("link.linkIn");
|
||||
},
|
||||
@@ -200,7 +200,7 @@
|
||||
align:"right",
|
||||
inputs:1,
|
||||
outputs:0,
|
||||
icon: "link-out.png",
|
||||
icon: "link-out.svg",
|
||||
inputLabels: function(i) {
|
||||
return this.name||this._("link.linkOut");
|
||||
},
|
||||
|
@@ -73,7 +73,7 @@
|
||||
this._("exec.label.retcode")
|
||||
][i];
|
||||
},
|
||||
icon: "arrow-in.png",
|
||||
icon: "arrow-in.svg",
|
||||
align: "right",
|
||||
label: function() {
|
||||
return this.name||this.command||(this.useSpawn=="true"?this._("exec.spawn"):this._("exec.exec"));
|
||||
|
@@ -38,7 +38,7 @@ module.exports = function(RED) {
|
||||
//node.error("Exec node timeout");
|
||||
}
|
||||
|
||||
this.on("input", function(msg) {
|
||||
this.on("input", function(msg, nodeSend, nodeDone) {
|
||||
if (msg.hasOwnProperty("kill")) {
|
||||
if (typeof msg.kill !== "string" || msg.kill.length === 0 || !msg.kill.toUpperCase().startsWith("SIG") ) { msg.kill = "SIGTERM"; }
|
||||
if (msg.hasOwnProperty("pid")) {
|
||||
@@ -53,6 +53,7 @@ module.exports = function(RED) {
|
||||
node.status({fill:"red",shape:"dot",text:"killed"});
|
||||
}
|
||||
}
|
||||
nodeDone();
|
||||
}
|
||||
else {
|
||||
var child;
|
||||
@@ -85,14 +86,14 @@ module.exports = function(RED) {
|
||||
// console.log('[exec] stdout: ' + data,child.pid);
|
||||
if (isUtf8(data)) { msg.payload = data.toString(); }
|
||||
else { msg.payload = data; }
|
||||
node.send([RED.util.cloneMessage(msg),null,null]);
|
||||
nodeSend([RED.util.cloneMessage(msg),null,null]);
|
||||
}
|
||||
});
|
||||
child.stderr.on('data', function (data) {
|
||||
if (node.activeProcesses.hasOwnProperty(child.pid) && node.activeProcesses[child.pid] !== null) {
|
||||
if (isUtf8(data)) { msg.payload = data.toString(); }
|
||||
else { msg.payload = Buffer.from(data); }
|
||||
node.send([null,RED.util.cloneMessage(msg),null]);
|
||||
nodeSend([null,RED.util.cloneMessage(msg),null]);
|
||||
}
|
||||
});
|
||||
child.on('close', function (code,signal) {
|
||||
@@ -108,8 +109,9 @@ module.exports = function(RED) {
|
||||
if (code === null) { node.status({fill:"red",shape:"dot",text:"killed"}); }
|
||||
else if (code < 0) { node.status({fill:"red",shape:"dot",text:"rc:"+code}); }
|
||||
else { node.status({fill:"yellow",shape:"dot",text:"rc:"+code}); }
|
||||
node.send([null,null,RED.util.cloneMessage(msg)]);
|
||||
nodeSend([null,null,RED.util.cloneMessage(msg)]);
|
||||
}
|
||||
nodeDone();
|
||||
});
|
||||
child.on('error', function (code) {
|
||||
if (child.tout) { clearTimeout(child.tout); }
|
||||
@@ -154,9 +156,10 @@ module.exports = function(RED) {
|
||||
msg.rc = msg3.payload;
|
||||
if (msg2) { msg2.rc = msg3.payload; }
|
||||
}
|
||||
node.send([msg,msg2,msg3]);
|
||||
nodeSend([msg,msg2,msg3]);
|
||||
if (child.tout) { clearTimeout(child.tout); }
|
||||
delete node.activeProcesses[child.pid];
|
||||
nodeDone();
|
||||
});
|
||||
node.status({fill:"blue",shape:"dot",text:"pid:"+child.pid});
|
||||
child.on('error',function() {});
|
||||
|
@@ -10,7 +10,7 @@
|
||||
<input type="hidden" id="node-input-noerr">
|
||||
</div>
|
||||
<div class="form-row node-text-editor-row" style="position:relative">
|
||||
<div style="position: absolute; right:0; bottom:calc(100% + 3px);"><button id="node-function-expand-js" class="editor-button editor-button-small"><i class="fa fa-expand"></i></button></div>
|
||||
<div style="position: absolute; right:0; bottom:calc(100% + 3px);"><button id="node-function-expand-js" class="red-ui-button red-ui-button-small"><i class="fa fa-expand"></i></button></div>
|
||||
<div style="height: 250px; min-height:150px;" class="node-text-editor" id="node-input-func-editor" ></div>
|
||||
</div>
|
||||
<div class="form-row" style="margin-bottom: 0px">
|
||||
@@ -31,7 +31,7 @@
|
||||
},
|
||||
inputs:1,
|
||||
outputs:1,
|
||||
icon: "function.png",
|
||||
icon: "function.svg",
|
||||
label: function() {
|
||||
return this.name||this._("function.function");
|
||||
},
|
||||
@@ -75,11 +75,14 @@
|
||||
type:"function", // the type of object the library is for
|
||||
editor:this.editor, // the field name the main text body goes to
|
||||
mode:"ace/mode/nrjavascript",
|
||||
fields:['name','outputs']
|
||||
fields:['name','outputs'],
|
||||
ext:"js"
|
||||
});
|
||||
this.editor.focus();
|
||||
|
||||
$("#node-function-expand-js").click(function(e) {
|
||||
RED.popover.tooltip($("#node-function-expand-js"), RED._("node-red:common.label.expand"));
|
||||
|
||||
$("#node-function-expand-js").on("click", function(e) {
|
||||
e.preventDefault();
|
||||
var value = that.editor.getValue();
|
||||
RED.editor.editJavaScript({
|
||||
@@ -119,7 +122,7 @@
|
||||
oneditresize: function(size) {
|
||||
var rows = $("#dialog-form>div:not(.node-text-editor-row)");
|
||||
var height = $("#dialog-form").height();
|
||||
for (var i=0; i<rows.size(); i++) {
|
||||
for (var i=0; i<rows.length; i++) {
|
||||
height -= $(rows[i]).outerHeight(true);
|
||||
}
|
||||
var editorRow = $("#dialog-form>div.node-text-editor-row");
|
||||
|
@@ -19,7 +19,7 @@ module.exports = function(RED) {
|
||||
var util = require("util");
|
||||
var vm = require("vm");
|
||||
|
||||
function sendResults(node,_msgid,msgs) {
|
||||
function sendResults(node,send,_msgid,msgs) {
|
||||
if (msgs == null) {
|
||||
return;
|
||||
} else if (!util.isArray(msgs)) {
|
||||
@@ -49,7 +49,7 @@ module.exports = function(RED) {
|
||||
}
|
||||
}
|
||||
if (msgCount>0) {
|
||||
node.send(msgs);
|
||||
send(msgs);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,8 +58,17 @@ module.exports = function(RED) {
|
||||
var node = this;
|
||||
this.name = n.name;
|
||||
this.func = n.func;
|
||||
|
||||
var handleNodeDoneCall = true;
|
||||
// Check to see if the Function appears to call `node.done()`. If so,
|
||||
// we will assume it is well written and does actually call node.done().
|
||||
// Otherwise, we will call node.done() after the function returns regardless.
|
||||
if (/node\.done\s*\(\s*\)/.test(this.func)) {
|
||||
handleNodeDoneCall = false;
|
||||
}
|
||||
|
||||
var functionText = "var results = null;"+
|
||||
"results = (function(msg){ "+
|
||||
"results = (function(msg,__send__,__done__){ "+
|
||||
"var __msgid__ = msg._msgid;"+
|
||||
"var node = {"+
|
||||
"id:__node__.id,"+
|
||||
@@ -71,10 +80,11 @@ module.exports = function(RED) {
|
||||
"trace:__node__.trace,"+
|
||||
"on:__node__.on,"+
|
||||
"status:__node__.status,"+
|
||||
"send:function(msgs){ __node__.send(__msgid__,msgs);}"+
|
||||
"send:function(msgs){ __node__.send(__send__,__msgid__,msgs);},"+
|
||||
"done:__done__"+
|
||||
"};\n"+
|
||||
this.func+"\n"+
|
||||
"})(msg);";
|
||||
"})(msg,send,done);";
|
||||
this.topic = n.topic;
|
||||
this.outstandingTimers = [];
|
||||
this.outstandingIntervals = [];
|
||||
@@ -104,8 +114,8 @@ module.exports = function(RED) {
|
||||
trace: function() {
|
||||
node.trace.apply(node, arguments);
|
||||
},
|
||||
send: function(id, msgs) {
|
||||
sendResults(node, id, msgs);
|
||||
send: function(send, id, msgs) {
|
||||
sendResults(node, send, id, msgs);
|
||||
},
|
||||
on: function() {
|
||||
if (arguments[0] === "input") {
|
||||
@@ -223,12 +233,18 @@ module.exports = function(RED) {
|
||||
// lineOffset: -11, // line number offset to be used for stack traces
|
||||
// columnOffset: 0, // column number offset to be used for stack traces
|
||||
});
|
||||
this.on("input", function(msg) {
|
||||
this.on("input", function(msg,send,done) {
|
||||
try {
|
||||
var start = process.hrtime();
|
||||
context.msg = msg;
|
||||
context.send = send;
|
||||
context.done = done;
|
||||
|
||||
this.script.runInContext(context);
|
||||
sendResults(this,msg._msgid,context.results);
|
||||
sendResults(this,send,msg._msgid,context.results);
|
||||
if (handleNodeDoneCall) {
|
||||
done();
|
||||
}
|
||||
|
||||
var duration = process.hrtime(start);
|
||||
var converted = Math.floor((duration[0] * 1e9 + duration[1])/10000)/100;
|
||||
@@ -237,35 +253,43 @@ module.exports = function(RED) {
|
||||
this.status({fill:"yellow",shape:"dot",text:""+converted});
|
||||
}
|
||||
} catch(err) {
|
||||
//remove unwanted part
|
||||
var index = err.stack.search(/\n\s*at ContextifyScript.Script.runInContext/);
|
||||
err.stack = err.stack.slice(0, index).split('\n').slice(0,-1).join('\n');
|
||||
var stack = err.stack.split(/\r?\n/);
|
||||
if ((typeof err === "object") && err.hasOwnProperty("stack")) {
|
||||
//remove unwanted part
|
||||
var index = err.stack.search(/\n\s*at ContextifyScript.Script.runInContext/);
|
||||
err.stack = err.stack.slice(0, index).split('\n').slice(0,-1).join('\n');
|
||||
var stack = err.stack.split(/\r?\n/);
|
||||
|
||||
//store the error in msg to be used in flows
|
||||
msg.error = err;
|
||||
//store the error in msg to be used in flows
|
||||
msg.error = err;
|
||||
|
||||
var line = 0;
|
||||
var errorMessage;
|
||||
if (stack.length > 0) {
|
||||
while (line < stack.length && stack[line].indexOf("ReferenceError") !== 0) {
|
||||
line++;
|
||||
}
|
||||
var line = 0;
|
||||
var errorMessage;
|
||||
if (stack.length > 0) {
|
||||
while (line < stack.length && stack[line].indexOf("ReferenceError") !== 0) {
|
||||
line++;
|
||||
}
|
||||
|
||||
if (line < stack.length) {
|
||||
errorMessage = stack[line];
|
||||
var m = /:(\d+):(\d+)$/.exec(stack[line+1]);
|
||||
if (m) {
|
||||
var lineno = Number(m[1])-1;
|
||||
var cha = m[2];
|
||||
errorMessage += " (line "+lineno+", col "+cha+")";
|
||||
if (line < stack.length) {
|
||||
errorMessage = stack[line];
|
||||
var m = /:(\d+):(\d+)$/.exec(stack[line+1]);
|
||||
if (m) {
|
||||
var lineno = Number(m[1])-1;
|
||||
var cha = m[2];
|
||||
errorMessage += " (line "+lineno+", col "+cha+")";
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!errorMessage) {
|
||||
errorMessage = err.toString();
|
||||
}
|
||||
done(errorMessage);
|
||||
}
|
||||
if (!errorMessage) {
|
||||
errorMessage = err.toString();
|
||||
else if (typeof err === "string") {
|
||||
done(err);
|
||||
}
|
||||
else {
|
||||
done(JSON.stringify(err));
|
||||
}
|
||||
this.error(errorMessage, msg);
|
||||
}
|
||||
});
|
||||
this.on("close", function() {
|
||||
|
@@ -9,14 +9,6 @@
|
||||
<input type="text" id="node-input-field" placeholder="payload" style="width:250px;">
|
||||
<input type="hidden" id="node-input-fieldType">
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label for="node-input-syntax"><i class="fa fa-code"></i> <span data-i18n="template.label.syntax"></span></label>
|
||||
<select id="node-input-syntax" style="width:180px;">
|
||||
<option value="mustache" data-i18n="template.label.mustache"></option>
|
||||
<option value="plain" data-i18n="template.label.plain"></option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="form-row" style="position: relative; margin-bottom: 0px;">
|
||||
<label for="node-input-template"><i class="fa fa-file-code-o"></i> <span data-i18n="template.label.template"></span></label>
|
||||
<input type="hidden" id="node-input-template" autofocus="autofocus">
|
||||
@@ -32,11 +24,19 @@
|
||||
<option value="yaml">YAML</option>
|
||||
<option value="text" data-i18n="template.label.none"></option>
|
||||
</select>
|
||||
<button id="node-template-expand-editor" class="red-ui-button red-ui-button-small"><i class="fa fa-expand"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-row node-text-editor-row">
|
||||
<div style="height: 250px; min-height:150px;" class="node-text-editor" id="node-input-template-editor" ></div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label for="node-input-syntax"><i class="fa fa-code"></i> <span data-i18n="template.label.syntax"></span></label>
|
||||
<select id="node-input-syntax" style="width:180px;">
|
||||
<option value="mustache" data-i18n="template.label.mustache"></option>
|
||||
<option value="plain" data-i18n="template.label.plain"></option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label for="node-input-output"><i class="fa fa-long-arrow-right"></i> <span data-i18n="template.label.output"></span></label>
|
||||
<select id="node-input-output" style="width:180px;">
|
||||
@@ -63,7 +63,7 @@
|
||||
},
|
||||
inputs:1,
|
||||
outputs:1,
|
||||
icon: "template.png",
|
||||
icon: "template.svg",
|
||||
label: function() {
|
||||
return this.name||this._("template.template");;
|
||||
},
|
||||
@@ -95,20 +95,39 @@
|
||||
value: $("#node-input-template").val()
|
||||
});
|
||||
RED.library.create({
|
||||
url:"functions", // where to get the data from
|
||||
type:"function", // the type of object the library is for
|
||||
url:"templates", // where to get the data from
|
||||
type:"template", // the type of object the library is for
|
||||
editor:that.editor, // the field name the main text body goes to
|
||||
fields:['name','outputs']
|
||||
fields:['name','format','output','syntax'],
|
||||
ext: "txt"
|
||||
});
|
||||
this.editor.focus();
|
||||
|
||||
$("#node-input-format").change(function() {
|
||||
$("#node-input-format").on("change", function() {
|
||||
var mod = "ace/mode/"+$("#node-input-format").val();
|
||||
that.editor.getSession().setMode({
|
||||
path: mod,
|
||||
v: Date.now()
|
||||
});
|
||||
});
|
||||
RED.popover.tooltip($("#node-template-expand-editor"), RED._("node-red:common.label.expand"));
|
||||
$("#node-template-expand-editor").on("click", function(e) {
|
||||
e.preventDefault();
|
||||
var value = that.editor.getValue();
|
||||
RED.editor.editText({
|
||||
mode: $("#node-input-format").val(),
|
||||
value: value,
|
||||
width: "Infinity",
|
||||
cursor: that.editor.getCursorPosition(),
|
||||
complete: function(v,cursor) {
|
||||
that.editor.setValue(v, -1);
|
||||
that.editor.gotoLine(cursor.row+1,cursor.column,false);
|
||||
setTimeout(function() {
|
||||
that.editor.focus();
|
||||
},300);
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
oneditsave: function() {
|
||||
$("#node-input-template").val(this.editor.getValue());
|
||||
@@ -122,7 +141,7 @@
|
||||
oneditresize: function(size) {
|
||||
var rows = $("#dialog-form>div:not(.node-text-editor-row)");
|
||||
var height = $("#dialog-form").height();
|
||||
for (var i=0; i<rows.size(); i++) {
|
||||
for (var i=0; i<rows.length; i++) {
|
||||
height -= $(rows[i]).outerHeight(true);
|
||||
}
|
||||
var editorRow = $("#dialog-form>div.node-text-editor-row");
|
||||
|
@@ -114,7 +114,7 @@
|
||||
},
|
||||
inputs:1,
|
||||
outputs:1,
|
||||
icon: "timer.png",
|
||||
icon: "timer.svg",
|
||||
label: function() {
|
||||
if (this.name) {
|
||||
return this.name;
|
||||
@@ -161,8 +161,8 @@
|
||||
$( "#node-input-randomFirst" ).spinner({min:0});
|
||||
$( "#node-input-randomLast" ).spinner({min:1});
|
||||
|
||||
$('.ui-spinner-button').click(function() {
|
||||
$(this).siblings('input').change();
|
||||
$('.ui-spinner-button').on("click", function() {
|
||||
$(this).siblings('input').trigger("change");
|
||||
});
|
||||
|
||||
$( "#node-input-nbRateUnits" ).on('change keyup', function() {
|
||||
@@ -226,7 +226,7 @@
|
||||
$("#delay-details").hide();
|
||||
$("#rate-details").show();
|
||||
}
|
||||
}).change();
|
||||
}).trigger("change");
|
||||
|
||||
$("#node-input-delay-type").on("change", function() {
|
||||
if (this.value === "delay") {
|
||||
@@ -239,7 +239,7 @@
|
||||
$("#delay-details-for").hide();
|
||||
$("#random-details").show();
|
||||
}
|
||||
}).change();
|
||||
}).trigger("change");
|
||||
|
||||
$("#node-input-rate-type").on("change", function() {
|
||||
if (this.value === "all") {
|
||||
@@ -249,7 +249,7 @@
|
||||
$("#node-input-drop").prop('checked',true).attr('disabled',true).next().css("opacity",0.5)
|
||||
$("#rate-details-per-topic").show();
|
||||
}
|
||||
}).change();
|
||||
}).trigger("change");
|
||||
},
|
||||
oneditsave: function() {
|
||||
var action = $("#node-input-delay-action").val();
|
||||
|
@@ -87,7 +87,7 @@
|
||||
},
|
||||
inputs:1,
|
||||
outputs:1,
|
||||
icon: "trigger.png",
|
||||
icon: "trigger.svg",
|
||||
label: function() {
|
||||
if (this.duration > 0) {
|
||||
return this.name|| this._("trigger.label.trigger")+" "+this.duration+this.units;
|
||||
@@ -103,7 +103,7 @@
|
||||
return this.name?"node_label_italic":"";
|
||||
},
|
||||
oneditprepare: function() {
|
||||
$("#node-then-type").change(function() {
|
||||
$("#node-then-type").on("change", function() {
|
||||
if ($(this).val() == "block") {
|
||||
$(".node-type-wait").hide();
|
||||
$(".node-type-duration").hide();
|
||||
@@ -160,7 +160,7 @@
|
||||
} else {
|
||||
$("#node-then-type").val("wait");
|
||||
}
|
||||
$("#node-then-type").change();
|
||||
$("#node-then-type").trigger("change");
|
||||
|
||||
if (this.extend === "true" || this.extend === true) {
|
||||
$("#node-input-extend").prop("checked",true);
|
||||
|
@@ -20,7 +20,7 @@
|
||||
},
|
||||
inputs:0,
|
||||
outputs:0,
|
||||
icon: "comment.png",
|
||||
icon: "comment.svg",
|
||||
label: function() {
|
||||
return this.name||this._("comment.comment");
|
||||
},
|
||||
@@ -51,7 +51,7 @@
|
||||
oneditresize: function(size) {
|
||||
var rows = $("#dialog-form>div:not(.node-text-editor-row)");
|
||||
var height = $("#dialog-form").height();
|
||||
for (var i=0; i<rows.size(); i++) {
|
||||
for (var i=0; i<rows.length; i++) {
|
||||
height -= $(rows[i]).outerHeight(true);
|
||||
}
|
||||
var editorRow = $("#dialog-form>div.node-text-editor-row");
|
||||
|
@@ -40,36 +40,36 @@ RED.debug = (function() {
|
||||
config = _config;
|
||||
|
||||
var content = $("<div>").css({"position":"relative","height":"100%"});
|
||||
var toolbar = $('<div class="sidebar-header">'+
|
||||
'<span class="button-group"><a id="debug-tab-filter" class="sidebar-header-button" href="#"><i class="fa fa-filter"></i> <span></span></a></span>'+
|
||||
'<span class="button-group"><a id="debug-tab-clear" class="sidebar-header-button" href="#"><i class="fa fa-trash"></i></a></span></div>').appendTo(content);
|
||||
var toolbar = $('<div class="red-ui-sidebar-header">'+
|
||||
'<span class="button-group"><a id="red-ui-sidebar-debug-filter" class="red-ui-sidebar-header-button" href="#"><i class="fa fa-filter"></i> <span></span></a></span>'+
|
||||
'<span class="button-group"><a id="red-ui-sidebar-debug-clear" class="red-ui-sidebar-header-button" href="#"><i class="fa fa-trash"></i></a></span></div>').appendTo(content);
|
||||
|
||||
var footerToolbar = $('<div>'+
|
||||
// '<span class="button-group">'+
|
||||
// '<a class="sidebar-footer-button-toggle text-button selected" id="debug-tab-view-list" href="#"><span data-i18n="">list</span></a>'+
|
||||
// '<a class="sidebar-footer-button-toggle text-button" id="debug-tab-view-table" href="#"><span data-i18n="">table</span></a> '+
|
||||
// '<a class="red-ui-footer-button-toggle text-button selected" id="red-ui-sidebar-debug-view-list" href="#"><span data-i18n="">list</span></a>'+
|
||||
// '<a class="red-ui-footer-button-toggle text-button" id="red-ui-sidebar-debug-view-table" href="#"><span data-i18n="">table</span></a> '+
|
||||
// '</span>'+
|
||||
'<span class="button-group"><a id="debug-tab-open" class="sidebar-footer-button" href="#"><i class="fa fa-desktop"></i></a></span> ' +
|
||||
'<span class="button-group"><a id="red-ui-sidebar-debug-open" class="red-ui-footer-button" href="#"><i class="fa fa-desktop"></i></a></span> ' +
|
||||
'</div>');
|
||||
|
||||
messageList = $('<div class="debug-content debug-content-list"/>').appendTo(content);
|
||||
messageList = $('<div class="red-ui-debug-content red-ui-debug-content-list"/>').appendTo(content);
|
||||
sbc = messageList[0];
|
||||
messageTable = $('<div class="debug-content debug-content-table hide"/>').appendTo(content);
|
||||
messageTable = $('<div class="red-ui-debug-content red-ui-debug-content-table hide"/>').appendTo(content);
|
||||
|
||||
var filterDialog = $('<div class="debug-filter-box hide">'+
|
||||
'<div class="debug-filter-row">'+
|
||||
var filterDialog = $('<div class="red-ui-debug-filter-box hide">'+
|
||||
'<div class="red-ui-debug-filter-row">'+
|
||||
'<span class="button-group">'+
|
||||
'<a class="sidebar-header-button-toggle debug-tab-filter-option selected" id="debug-tab-filterAll" href="#"><span data-i18n="node-red:debug.sidebar.filterAll"></span></a>'+
|
||||
'<a class="sidebar-header-button-toggle debug-tab-filter-option" id="debug-tab-filterSelected" href="#"><span data-i18n="node-red:debug.sidebar.filterSelected"></span></a>'+
|
||||
'<a class="sidebar-header-button-toggle debug-tab-filter-option" id="debug-tab-filterCurrent" href="#"><span data-i18n="node-red:debug.sidebar.filterCurrent"></span></a> '+
|
||||
'<a class="red-ui-sidebar-header-button-toggle red-ui-sidebar-debug-filter-option selected" id="red-ui-sidebar-debug-filterAll" href="#"><span data-i18n="node-red:debug.sidebar.filterAll"></span></a>'+
|
||||
'<a class="red-ui-sidebar-header-button-toggle red-ui-sidebar-debug-filter-option" id="red-ui-sidebar-debug-filterSelected" href="#"><span data-i18n="node-red:debug.sidebar.filterSelected"></span></a>'+
|
||||
'<a class="red-ui-sidebar-header-button-toggle red-ui-sidebar-debug-filter-option" id="red-ui-sidebar-debug-filterCurrent" href="#"><span data-i18n="node-red:debug.sidebar.filterCurrent"></span></a> '+
|
||||
'</span>'+
|
||||
'</div>'+
|
||||
'</div>').appendTo(toolbar);//content);
|
||||
|
||||
// var filterTypeRow = $('<div class="debug-filter-row"></div>').appendTo(filterDialog);
|
||||
// var filterTypeRow = $('<div class="red-ui-debug-filter-row"></div>').appendTo(filterDialog);
|
||||
// $('<select><option>Show all debug nodes</option><option>Show selected debug nodes</option><option>Show current flow only</option></select>').appendTo(filterTypeRow);
|
||||
|
||||
var debugNodeListRow = $('<div class="debug-filter-row hide" id="debug-filter-node-list-row"></div>').appendTo(filterDialog);
|
||||
var debugNodeListRow = $('<div class="red-ui-debug-filter-row hide" id="red-ui-sidebar-debug-filter-node-list-row"></div>').appendTo(filterDialog);
|
||||
var flowCheckboxes = {};
|
||||
var debugNodeListHeader = $('<div><span data-i18n="node-red:debug.sidebar.debugNodes"></span><span></span></div>');
|
||||
var headerCheckbox = $('<input type="checkbox">').appendTo(debugNodeListHeader.find("span")[1]).checkboxSet();
|
||||
@@ -92,7 +92,7 @@ RED.debug = (function() {
|
||||
parent: headerCheckbox
|
||||
});
|
||||
flowCheckboxes[node.id] = muteControl;
|
||||
row.click(function(e) {
|
||||
row.on("click", function(e) {
|
||||
e.stopPropagation();
|
||||
debugNodeListExpandedFlows[node.id] = !debugNodeListExpandedFlows[node.id];
|
||||
row.toggleClass('expanded',debugNodeListExpandedFlows[node.id]);
|
||||
@@ -116,9 +116,9 @@ RED.debug = (function() {
|
||||
var muteControl = $('<input type="checkbox">').prop('checked',!filteredNodes[node.id]).appendTo($('<span class="meta">').appendTo(row));
|
||||
muteControl.checkboxSet({
|
||||
parent: flowCheckboxes[node.z]
|
||||
}).change(function(e) {
|
||||
}).on("change", function(e) {
|
||||
filteredNodes[node.id] = !$(this).prop('checked');
|
||||
$(".debug-message-node-"+node.id.replace(/\./g,"_")).toggleClass('hide',filteredNodes[node.id]);
|
||||
$(".red-ui-debug-msg-node-"+node.id.replace(/\./g,"_")).toggleClass('hide',filteredNodes[node.id]);
|
||||
});
|
||||
if (!node.active || RED.nodes.workspace(node.z).disabled) {
|
||||
container.addClass('disabled');
|
||||
@@ -142,13 +142,13 @@ RED.debug = (function() {
|
||||
console.log("TODO: i18n library support");
|
||||
}
|
||||
|
||||
toolbar.find('#debug-tab-filter span').text(RED._('node-red:debug.sidebar.filterAll'));
|
||||
toolbar.find('#red-ui-sidebar-debug-filter span').text(RED._('node-red:debug.sidebar.filterAll'));
|
||||
|
||||
var filterButtonHandler = function(type) {
|
||||
return function(e) {
|
||||
e.preventDefault();
|
||||
if (filterType !== type) {
|
||||
$('.debug-tab-filter-option').removeClass('selected');
|
||||
$('.red-ui-sidebar-debug-filter-option').removeClass('selected');
|
||||
$(this).addClass('selected');
|
||||
if (filterType === 'filterSelected') {
|
||||
debugNodeListRow.slideUp();
|
||||
@@ -158,29 +158,29 @@ RED.debug = (function() {
|
||||
debugNodeListRow.slideDown();
|
||||
}
|
||||
|
||||
$('#debug-tab-filter span').text(RED._('node-red:debug.sidebar.'+filterType));
|
||||
$('#red-ui-sidebar-debug-filter span').text(RED._('node-red:debug.sidebar.'+filterType));
|
||||
refreshMessageList();
|
||||
}
|
||||
}
|
||||
}
|
||||
filterDialog.find('#debug-tab-filterAll').on("click",filterButtonHandler('filterAll'));
|
||||
filterDialog.find('#debug-tab-filterSelected').on("click",filterButtonHandler('filterSelected'));
|
||||
filterDialog.find('#debug-tab-filterCurrent').on("click",filterButtonHandler('filterCurrent'));
|
||||
filterDialog.find('#red-ui-sidebar-debug-filterAll').on("click",filterButtonHandler('filterAll'));
|
||||
filterDialog.find('#red-ui-sidebar-debug-filterSelected').on("click",filterButtonHandler('filterSelected'));
|
||||
filterDialog.find('#red-ui-sidebar-debug-filterCurrent').on("click",filterButtonHandler('filterCurrent'));
|
||||
|
||||
|
||||
// $('#debug-tab-view-list').on("click",function(e) {
|
||||
// $('#red-ui-sidebar-debug-view-list').on("click",function(e) {
|
||||
// e.preventDefault();
|
||||
// if (!$(this).hasClass('selected')) {
|
||||
// $(this).addClass('selected');
|
||||
// $('#debug-tab-view-table').removeClass('selected');
|
||||
// $('#red-ui-sidebar-debug-view-table').removeClass('selected');
|
||||
// showMessageList();
|
||||
// }
|
||||
// });
|
||||
// $('#debug-tab-view-table').on("click",function(e) {
|
||||
// $('#red-ui-sidebar-debug-view-table').on("click",function(e) {
|
||||
// e.preventDefault();
|
||||
// if (!$(this).hasClass('selected')) {
|
||||
// $(this).addClass('selected');
|
||||
// $('#debug-tab-view-list').removeClass('selected');
|
||||
// $('#red-ui-sidebar-debug-view-list').removeClass('selected');
|
||||
// showMessageTable();
|
||||
// }
|
||||
// });
|
||||
@@ -188,21 +188,21 @@ RED.debug = (function() {
|
||||
|
||||
var hideFilterTimeout;
|
||||
toolbar.on('mouseleave',function() {
|
||||
if ($('#debug-tab-filter').hasClass('selected')) {
|
||||
if ($('#red-ui-sidebar-debug-filter').hasClass('selected')) {
|
||||
clearTimeout(hideFilterTimeout);
|
||||
hideFilterTimeout = setTimeout(function() {
|
||||
filterVisible = false;
|
||||
$('#debug-tab-filter').removeClass('selected');
|
||||
$('#red-ui-sidebar-debug-filter').removeClass('selected');
|
||||
filterDialog.slideUp(200);
|
||||
},300);
|
||||
}
|
||||
});
|
||||
toolbar.on('mouseenter',function() {
|
||||
if ($('#debug-tab-filter').hasClass('selected')) {
|
||||
if ($('#red-ui-sidebar-debug-filter').hasClass('selected')) {
|
||||
clearTimeout(hideFilterTimeout);
|
||||
}
|
||||
})
|
||||
toolbar.find('#debug-tab-filter').on("click",function(e) {
|
||||
toolbar.find('#red-ui-sidebar-debug-filter').on("click",function(e) {
|
||||
e.preventDefault();
|
||||
if ($(this).hasClass('selected')) {
|
||||
filterVisible = false;
|
||||
@@ -216,13 +216,13 @@ RED.debug = (function() {
|
||||
filterDialog.slideDown(200);
|
||||
}
|
||||
});
|
||||
RED.popover.tooltip(toolbar.find('#debug-tab-filter'),RED._('node-red:debug.sidebar.filterLog'));
|
||||
RED.popover.tooltip(toolbar.find('#red-ui-sidebar-debug-filter'),RED._('node-red:debug.sidebar.filterLog'));
|
||||
|
||||
toolbar.find("#debug-tab-clear").click(function(e) {
|
||||
toolbar.find("#red-ui-sidebar-debug-clear").on("click", function(e) {
|
||||
e.preventDefault();
|
||||
clearMessageList(false);
|
||||
});
|
||||
RED.popover.tooltip(toolbar.find("#debug-tab-clear"),RED._('node-red:debug.sidebar.clearLog'));
|
||||
RED.popover.tooltip(toolbar.find("#red-ui-sidebar-debug-clear"),RED._('node-red:debug.sidebar.clearLog'));
|
||||
|
||||
|
||||
|
||||
@@ -282,11 +282,11 @@ RED.debug = (function() {
|
||||
activeWorkspace = _activeWorkspace.replace(/\./g,"_");
|
||||
}
|
||||
if (filterType === "filterAll") {
|
||||
$(".debug-message").removeClass("hide");
|
||||
$(".red-ui-debug-msg").removeClass("hide");
|
||||
} else {
|
||||
$(".debug-message").each(function() {
|
||||
$(".red-ui-debug-msg").each(function() {
|
||||
if (filterType === 'filterCurrent') {
|
||||
$(this).toggleClass('hide',!$(this).hasClass('debug-message-flow-'+activeWorkspace));
|
||||
$(this).toggleClass('hide',!$(this).hasClass('red-ui-debug-msg-flow-'+activeWorkspace));
|
||||
} else if (filterType === 'filterSelected') {
|
||||
var id = $(this).data('source');
|
||||
if (id) {
|
||||
@@ -320,7 +320,7 @@ RED.debug = (function() {
|
||||
var msg = m.el;
|
||||
var sourceNode = m.source;
|
||||
if (sourceNode) {
|
||||
var wrapper = $("<div>",{id:"debug-message-source-"+sourceNode.id.replace(/\./g,"_")}).appendTo(messageTable);
|
||||
var wrapper = $("<div>",{id:"red-ui-debug-msg-source-"+sourceNode.id.replace(/\./g,"_")}).appendTo(messageTable);
|
||||
wrapper.append(msg);
|
||||
}
|
||||
});
|
||||
@@ -336,26 +336,26 @@ RED.debug = (function() {
|
||||
function showMessageMenu(button,dbgMessage,sourceId) {
|
||||
activeMenuMessage = dbgMessage;
|
||||
if (!menuOptionMenu) {
|
||||
menuOptionMenu = RED.menu.init({id:"debug-message-option-menu",
|
||||
menuOptionMenu = RED.menu.init({id:"red-ui-debug-msg-option-menu",
|
||||
options: [
|
||||
{id:"debug-message-menu-item-collapse",label:RED._("node-red:debug.messageMenu.collapseAll"),onselect:function(){
|
||||
{id:"red-ui-debug-msg-menu-item-collapse",label:RED._("node-red:debug.messageMenu.collapseAll"),onselect:function(){
|
||||
activeMenuMessage.collapse();
|
||||
}},
|
||||
{id:"debug-message-menu-item-clear-pins",label:RED._("node-red:debug.messageMenu.clearPinned"),onselect:function(){
|
||||
{id:"red-ui-debug-msg-menu-item-clear-pins",label:RED._("node-red:debug.messageMenu.clearPinned"),onselect:function(){
|
||||
activeMenuMessage.clearPinned();
|
||||
}},
|
||||
null,
|
||||
{id:"debug-message-menu-item-filter", label:RED._("node-red:debug.messageMenu.filterNode"),onselect:function(){
|
||||
{id:"red-ui-debug-msg-menu-item-filter", label:RED._("node-red:debug.messageMenu.filterNode"),onselect:function(){
|
||||
var candidateNodes = RED.nodes.filterNodes({type:'debug'});
|
||||
candidateNodes.forEach(function(n) {
|
||||
filteredNodes[n.id] = true;
|
||||
});
|
||||
delete filteredNodes[sourceId];
|
||||
$("#debug-tab-filterSelected").click();
|
||||
$("#red-ui-sidebar-debug-filterSelected").trigger("click");
|
||||
refreshMessageList();
|
||||
}},
|
||||
{id:"debug-message-menu-item-clear-filter",label:RED._("node-red:debug.messageMenu.clearFilter"),onselect:function(){
|
||||
$("#debug-tab-filterAll").click();
|
||||
{id:"red-ui-debug-msg-menu-item-clear-filter",label:RED._("node-red:debug.messageMenu.clearFilter"),onselect:function(){
|
||||
$("#red-ui-sidebar-debug-filterAll").trigger("click");
|
||||
refreshMessageList();
|
||||
}}
|
||||
]
|
||||
@@ -373,8 +373,8 @@ RED.debug = (function() {
|
||||
if (sourceNode && sourceNode.type !== 'debug') {
|
||||
filterOptionDisabled = true;
|
||||
}
|
||||
RED.menu.setDisabled('debug-message-menu-item-filter',filterOptionDisabled);
|
||||
RED.menu.setDisabled('debug-message-menu-item-clear-filter',filterOptionDisabled);
|
||||
RED.menu.setDisabled('red-ui-debug-msg-menu-item-filter',filterOptionDisabled);
|
||||
RED.menu.setDisabled('red-ui-debug-msg-menu-item-clear-filter',filterOptionDisabled);
|
||||
|
||||
var elementPos = button.offset();
|
||||
menuOptionMenu.css({
|
||||
@@ -404,7 +404,7 @@ RED.debug = (function() {
|
||||
var sourceNode = o._source;
|
||||
|
||||
msg.on("mouseenter", function() {
|
||||
msg.addClass('debug-message-hover');
|
||||
msg.addClass('red-ui-debug-msg-hover');
|
||||
if (o._source) {
|
||||
config.messageMouseEnter(o._source.id);
|
||||
if (o._source._alias) {
|
||||
@@ -413,7 +413,7 @@ RED.debug = (function() {
|
||||
}
|
||||
});
|
||||
msg.on("mouseleave", function() {
|
||||
msg.removeClass('debug-message-hover');
|
||||
msg.removeClass('red-ui-debug-msg-hover');
|
||||
if (o._source) {
|
||||
config.messageMouseLeave(o._source.id);
|
||||
if (o._source._alias) {
|
||||
@@ -426,10 +426,10 @@ RED.debug = (function() {
|
||||
var property = sanitize(o.property?o.property:'');
|
||||
var payload = o.msg;
|
||||
var format = sanitize((o.format||"").toString());
|
||||
msg.attr("class", 'debug-message'+(o.level?(' debug-message-level-'+o.level):'')+
|
||||
msg.attr("class", 'red-ui-debug-msg'+(o.level?(' red-ui-debug-msg-level-'+o.level):'')+
|
||||
(sourceNode?(
|
||||
" debug-message-node-"+sourceNode.id.replace(/\./g,"_")+
|
||||
(sourceNode.z?" debug-message-flow-"+sourceNode.z.replace(/\./g,"_"):"")
|
||||
" red-ui-debug-msg-node-"+sourceNode.id.replace(/\./g,"_")+
|
||||
(sourceNode.z?" red-ui-debug-msg-flow-"+sourceNode.z.replace(/\./g,"_"):"")
|
||||
):""));
|
||||
|
||||
if (sourceNode) {
|
||||
@@ -445,22 +445,22 @@ RED.debug = (function() {
|
||||
}
|
||||
}
|
||||
|
||||
var metaRow = $('<div class="debug-message-meta"></div>').appendTo(msg);
|
||||
$('<span class="debug-message-date">'+ getTimestamp()+'</span>').appendTo(metaRow);
|
||||
var metaRow = $('<div class="red-ui-debug-msg-meta"></div>').appendTo(msg);
|
||||
$('<span class="red-ui-debug-msg-date">'+ getTimestamp()+'</span>').appendTo(metaRow);
|
||||
if (sourceNode) {
|
||||
$('<a>',{href:"#",class:"debug-message-name"}).text('node: '+(sourceNode.name||sourceNode.id))
|
||||
$('<a>',{href:"#",class:"red-ui-debug-msg-name"}).text('node: '+(sourceNode.name||sourceNode.id))
|
||||
.appendTo(metaRow)
|
||||
.click(function(evt) {
|
||||
.on("click", function(evt) {
|
||||
evt.preventDefault();
|
||||
config.messageSourceClick(sourceNode.id);
|
||||
});
|
||||
} else if (name) {
|
||||
$('<span class="debug-message-name">'+name+'</span>').appendTo(metaRow);
|
||||
$('<span class="red-ui-debug-msg-name">'+name+'</span>').appendTo(metaRow);
|
||||
}
|
||||
|
||||
payload = RED.utils.decodeObject(payload,format);
|
||||
|
||||
var el = $('<span class="debug-message-payload"></span>').appendTo(msg);
|
||||
var el = $('<span class="red-ui-debug-msg-payload"></span>').appendTo(msg);
|
||||
var path = o.property||'';
|
||||
var debugMessage = RED.utils.createObjectElement(payload, {
|
||||
key: /*true*/null,
|
||||
@@ -480,17 +480,17 @@ RED.debug = (function() {
|
||||
errorLvl = 30;
|
||||
errorLvlType = 'warn';
|
||||
}
|
||||
msg.addClass('debug-message-level-' + errorLvl);
|
||||
$('<span class="debug-message-topic">function : (' + errorLvlType + ')</span>').appendTo(metaRow);
|
||||
msg.addClass('red-ui-debug-msg-level-' + errorLvl);
|
||||
$('<span class="red-ui-debug-msg-topic">function : (' + errorLvlType + ')</span>').appendTo(metaRow);
|
||||
} else {
|
||||
var tools = $('<span class="debug-message-tools button-group"></span>').appendTo(metaRow);
|
||||
var filterMessage = $('<button class="editor-button editor-button-small"><i class="fa fa-caret-down"></i></button>').appendTo(tools);
|
||||
filterMessage.click(function(e) {
|
||||
var tools = $('<span class="red-ui-debug-msg-tools button-group"></span>').appendTo(metaRow);
|
||||
var filterMessage = $('<button class="red-ui-button red-ui-button-small"><i class="fa fa-caret-down"></i></button>').appendTo(tools);
|
||||
filterMessage.on("click", function(e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
showMessageMenu(filterMessage,debugMessage,sourceNode&&sourceNode.id);
|
||||
});
|
||||
$('<span class="debug-message-topic">'+
|
||||
$('<span class="red-ui-debug-msg-topic">'+
|
||||
(o.topic?topic+' : ':'')+
|
||||
(o.property?'msg.'+property:'msg')+" : "+format+
|
||||
'</span>').appendTo(metaRow);
|
||||
@@ -509,9 +509,9 @@ RED.debug = (function() {
|
||||
messageList.append(msg);
|
||||
} else {
|
||||
if (sourceNode) {
|
||||
var wrapper = $("#debug-message-source-"+sourceNode.id.replace(/\./g,"_"));
|
||||
var wrapper = $("#red-ui-debug-msg-source-"+sourceNode.id.replace(/\./g,"_"));
|
||||
if (wrapper.length === 0 ) {
|
||||
wrapper = $("<div>",{id:"debug-message-source-"+sourceNode.id.replace(/\./g,"_")}).appendTo(messageTable);
|
||||
wrapper = $("<div>",{id:"red-ui-debug-msg-source-"+sourceNode.id.replace(/\./g,"_")}).appendTo(messageTable);
|
||||
}
|
||||
wrapper.empty();
|
||||
wrapper.append(msg);
|
||||
@@ -530,7 +530,7 @@ RED.debug = (function() {
|
||||
}
|
||||
|
||||
function clearMessageList(clearFilter) {
|
||||
$(".debug-message").remove();
|
||||
$(".red-ui-debug-msg").remove();
|
||||
config.clear();
|
||||
if (!!clearFilter) {
|
||||
clearFilterSettings();
|
||||
@@ -541,10 +541,10 @@ RED.debug = (function() {
|
||||
function clearFilterSettings() {
|
||||
filteredNodes = {};
|
||||
filterType = 'filterAll';
|
||||
$('.debug-tab-filter-option').removeClass('selected');
|
||||
$('#debug-tab-filterAll').addClass('selected');
|
||||
$('#debug-tab-filter span').text(RED._('node-red:debug.sidebar.filterAll'));
|
||||
$('#debug-filter-node-list-row').slideUp();
|
||||
$('.red-ui-sidebar-debug-filter-option').removeClass('selected');
|
||||
$('#red-ui-sidebar-debug-filterAll').addClass('selected');
|
||||
$('#red-ui-sidebar-debug-filter span').text(RED._('node-red:debug.sidebar.filterAll'));
|
||||
$('#red-ui-sidebar-debug-filter-node-list-row').slideUp();
|
||||
}
|
||||
|
||||
return {
|
||||
|
@@ -17,7 +17,7 @@ $(function() {
|
||||
|
||||
var uiComponents = RED.debug.init(options);
|
||||
|
||||
$(".debug-window").append(uiComponents.content);
|
||||
$(".red-ui-debug-window").append(uiComponents.content);
|
||||
|
||||
window.addEventListener('message',function(evt) {
|
||||
if (evt.data.event === "message") {
|
||||
|
@@ -1,11 +1,10 @@
|
||||
<html>
|
||||
<head>
|
||||
<link href="../../vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet" media="screen">
|
||||
<link rel="stylesheet" href="../../red/style.min.css">
|
||||
<link rel="stylesheet" href="../../vendor/font-awesome/css/font-awesome.min.css">
|
||||
<title>Node-RED Debug Tools</title>
|
||||
</head>
|
||||
<body class="debug-window">
|
||||
<body class="red-ui-editor red-ui-debug-window">
|
||||
</body>
|
||||
<script src="../../vendor/vendor.js"></script>
|
||||
<script src="../../red/red.min.js"></script>
|
||||
|
@@ -1,544 +0,0 @@
|
||||
<style>
|
||||
.rpi-gpio-pinTable {
|
||||
width: 340px;
|
||||
display: inline-table;
|
||||
font-size: 13px;
|
||||
height: 380px;
|
||||
min-height: 380px;
|
||||
max-height: 380px;
|
||||
}
|
||||
.rpi-gpio-pinTable input[type="radio"] {
|
||||
width: auto;
|
||||
margin: 2px 2px;
|
||||
}
|
||||
.rpi-gpio-pinTable label {
|
||||
width: auto;
|
||||
margin: 0;
|
||||
display: block;
|
||||
}
|
||||
.rpi-gpio-pinTable .pinTableBody {
|
||||
width: 340px;
|
||||
display: table-row-group;
|
||||
line-height: 12px;
|
||||
}
|
||||
.rpi-gpio-pinTable .pinTableRow {
|
||||
width: 340px;
|
||||
display: table-row;
|
||||
height: 14px;
|
||||
}
|
||||
.rpi-gpio-pinTable .pinTableCellL {
|
||||
width: 170px;
|
||||
display: table-cell;
|
||||
text-align: right;
|
||||
padding-right: 4px;
|
||||
vertical-align: top;
|
||||
border: 1px solid #444;
|
||||
}
|
||||
.rpi-gpio-pinTable .pinTableCellR {
|
||||
width: 170px;
|
||||
display: table-cell;
|
||||
text-align: left;
|
||||
padding-left: 4px;
|
||||
vertical-align: top;
|
||||
border: 1px solid #000;
|
||||
}
|
||||
.rpi-gpio-pinTable .pinColorPower {
|
||||
background-color:#FECBCE;
|
||||
}
|
||||
.rpi-gpio-pinTable .pinColorGround {
|
||||
background-color:#DDDDDD;
|
||||
}
|
||||
.rpi-gpio-pinTable .pinColorGPIO {
|
||||
background-color:#BFEBBF;
|
||||
}
|
||||
.rpi-gpio-pinTable .pinColorDual {
|
||||
background-color:#D0E6F4;
|
||||
}
|
||||
.rpi-gpio-pinTable .pinColorSD {
|
||||
background-color:#FFFDD0;
|
||||
}
|
||||
</style>
|
||||
<script type="text/x-red" data-template-name="rpi-gpio in">
|
||||
|
||||
<div class="form-row" style="min-width: 540px">
|
||||
<label><i class="fa fa-circle"></i> <span data-i18n="rpi-gpio.pinname"></span></label>
|
||||
<input type="text" id="node-input-pin" style="display:none;">
|
||||
<div class="rpi-gpio-pinTable">
|
||||
<div class="pinTableBody" id="pinform">
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorPower"><label>3.3V Power - 1 <input disabled type="radio" name="pins" value=""></label></div>
|
||||
<div class="pinTableCellR pinColorPower"><label><input disabled type="radio" name="pins" value=""> 2 - 5V Power</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorDual"><label for="pinTable-pin-3">SDA1 - GPIO02 - 3 <input id="pinTable-pin-3" type="radio" name="pins" value="3"></label></div>
|
||||
<div class="pinTableCellR pinColorPower"><label><input disabled type="radio" name="pins" value=""> 4 - 5V Power</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorDual"><label for="pinTable-pin-5">SCL1 - GPIO03 - 5 <input id="pinTable-pin-5" type="radio" name="pins" value="5"></label></div>
|
||||
<div class="pinTableCellR pinColorGround"><label><input disabled type="radio" name="pins" value=""> 6 - Ground</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorGPIO"><label for="pinTable-pin-7">GPIO04 - 7 <input id="pinTable-pin-7" type="radio" name="pins" value="7"></label></div>
|
||||
<div class="pinTableCellR pinColorDual"><label for="pinTable-pin-8"><input id="pinTable-pin-8" type="radio" name="pins" value="8"> 8 - GPIO14 - TxD</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorGround"><label>Ground - 9 <input disabled type="radio" name="pins" value=""></label></div>
|
||||
<div class="pinTableCellR pinColorDual"><label for="pinTable-pin-10"><input id="pinTable-pin-10" type="radio" name="pins" value="10"> 10 - GPIO15 - RxD</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorGPIO"><label for="pinTable-pin-11">GPIO17 - 11 <input id="pinTable-pin-11" type="radio" name="pins" value="11"></label></div>
|
||||
<div class="pinTableCellR pinColorGPIO"><label for="pinTable-pin-12"><input id="pinTable-pin-12" type="radio" name="pins" value="12"> 12 - GPIO18</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorGPIO"><label for="pinTable-pin-13">GPIO27 - 13 <input id="pinTable-pin-13" type="radio" name="pins" value="13"></label></div>
|
||||
<div class="pinTableCellR pinColorGround"><label><input disabled type="radio" name="pins" value=""> 14 - Ground</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorGPIO"><label for="pinTable-pin-15">GPIO22 - 15 <input id="pinTable-pin-15" type="radio" name="pins" value="15"></label></div>
|
||||
<div class="pinTableCellR pinColorGPIO"><label for="pinTable-pin-16"><input id="pinTable-pin-16" type="radio" name="pins" value="16"> 16 - GPIO23</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorPower"><label>3.3V Power - 17 <input disabled type="radio" name="pins" value=""></label></div>
|
||||
<div class="pinTableCellR pinColorGPIO"><label for="pinTable-pin-18"><input id="pinTable-pin-18" type="radio" name="pins" value="18"> 18 - GPIO24</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorDual"><label for="pinTable-pin-19">MOSI - GPIO10 - 19 <input id="pinTable-pin-19" type="radio" name="pins" value="19"></label></div>
|
||||
<div class="pinTableCellR pinColorGround"><label><input disabled type="radio" name="pins" value=""> 20 - Ground</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorDual"><label for="pinTable-pin-21">MISO - GPIO09 - 21 <input id="pinTable-pin-21" type="radio" name="pins" value="21"></label></div>
|
||||
<div class="pinTableCellR pinColorGPIO"><label for="pinTable-pin-22"><input id="pinTable-pin-22" type="radio" name="pins" value="22"> 22 - GPIO25</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorDual"><label for="pinTable-pin-23">SCLK - GPIO11 - 23 <input id="pinTable-pin-23" type="radio" name="pins" value="23"></label></div>
|
||||
<div class="pinTableCellR pinColorDual"><label for="pinTable-pin-24"><input id="pinTable-pin-24" type="radio" name="pins" value="24"> 24 - GPIO8 - CE0</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorGround"><label>Ground - 25 <input disabled type="radio" name="pins" value=""></label></div>
|
||||
<div class="pinTableCellR pinColorDual"><label for="pinTable-pin-26"><input id="pinTable-pin-26" type="radio" name="pins" value="26"> 26 - GPIO7 - CE1</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorSD"><label>SD - 27 <input disabled type="radio" name="pins" value=""></label></div>
|
||||
<div class="pinTableCellR pinColorSD"><label><input disabled type="radio" name="pins" value=""> 28 - SC</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorGPIO"><label for="pinTable-pin-29">GPIO05 - 29 <input id="pinTable-pin-29" type="radio" name="pins" value="29"></label></div>
|
||||
<div class="pinTableCellR pinColorGround"><label><input disabled type="radio" name="pins" value=""> 30 - Ground</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorGPIO"><label for="pinTable-pin-31">GPIO06 - 31 <input id="pinTable-pin-31" type="radio" name="pins" value="31"></label></div>
|
||||
<div class="pinTableCellR pinColorGPIO"><label for="pinTable-pin-32"><input id="pinTable-pin-32" type="radio" name="pins" value="32"> 32 - GPIO12</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorGPIO"><label for="pinTable-pin-33">GPIO13 - 33 <input id="pinTable-pin-33" type="radio" name="pins" value="33"></label></div>
|
||||
<div class="pinTableCellR pinColorGround"><label><input disabled type="radio" name="pins" value=""> 34 - Ground</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorGPIO"><label for="pinTable-pin-35">GPIO19 - 35 <input id="pinTable-pin-35" type="radio" name="pins" value="35"></label></div>
|
||||
<div class="pinTableCellR pinColorGPIO"><label for="pinTable-pin-36"><input id="pinTable-pin-36" type="radio" name="pins" value="36"> 36 - GPIO16</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorGPIO"><label for="pinTable-pin-37">GPIO26 - 37 <input id="pinTable-pin-37" type="radio" name="pins" value="37"></label></div>
|
||||
<div class="pinTableCellR pinColorGPIO"><label for="pinTable-pin-38"><input id="pinTable-pin-38" type="radio" name="pins" value="38"> 38 - GPIO20</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorGround"><label>Ground - 39 <input disabled type="radio" name="pins" value=""></label></div>
|
||||
<div class="pinTableCellR pinColorGPIO"><label for="pinTable-pin-40"><input id="pinTable-pin-40" type="radio" name="pins" value="40"> 40 - GPIO21</label></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label for="node-input-intype"><i class="fa fa-level-up"></i> <span data-i18n="rpi-gpio.label.resistor"></span></label>
|
||||
<select type="text" id="node-input-intype" style="width:100px;">
|
||||
<option value="tri" data-i18n="rpi-gpio.resistor.none"></option>
|
||||
<option value="up" data-i18n="rpi-gpio.resistor.pullup"></option>
|
||||
<option value="down" data-i18n="rpi-gpio.resistor.pulldown"></option>
|
||||
</select>
|
||||
<span data-i18n="rpi-gpio.label.debounce"></span>
|
||||
<input type="text" id="node-input-debounce" style="width:47px; text-align:right"/> mS
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label> </label>
|
||||
<input type="checkbox" id="node-input-read" style="display: inline-block; width: auto; vertical-align: top;">
|
||||
<label for="node-input-read" style="width:70%;"><span data-i18n="rpi-gpio.label.readinitial"></span></label>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="common.label.name"></span></label>
|
||||
<input type="text" id="node-input-name" data-i18n="[placeholder]common.label.name">
|
||||
</div>
|
||||
<div class="form-tips" id="pin-tip"><span data-i18n="[html]rpi-gpio.tip.pin"></span></div>
|
||||
<div class="form-tips"><span data-i18n="[html]rpi-gpio.tip.in"></span></div>
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
var bcm2pin = {
|
||||
"2":"3", "3":"5", "4":"7", "14":"8", "15":"10", "17":"11", "18":"12", "27":"13", "22":"15",
|
||||
"23":"16", "24":"18", "10":"19", "9":"21", "25":"22", "11":"23", "8":"24", "7":"26",
|
||||
"5":"29", "6":"31", "12":"32", "13":"33", "19":"35", "16":"36", "26":"37", "20":"38", "21":"40"
|
||||
};
|
||||
var pinsInUse = {};
|
||||
RED.nodes.registerType('rpi-gpio in',{
|
||||
category: 'Raspberry Pi',
|
||||
color:"#c6dbef",
|
||||
defaults: {
|
||||
name: { value:"" },
|
||||
pin: { value:"tri",required:true,validate:RED.validators.number() },
|
||||
intype: { value:"tri" },
|
||||
debounce: { value:"25" },
|
||||
read: { value:false }
|
||||
},
|
||||
inputs:0,
|
||||
outputs:1,
|
||||
icon: "rpi.png",
|
||||
info: function() {
|
||||
if ( Object.keys(pinsInUse).length !== 0 ) {
|
||||
return "**Pins in use** : "+Object.keys(pinsInUse);
|
||||
}
|
||||
else { return ""; }
|
||||
},
|
||||
label: function() {
|
||||
var suf = "";
|
||||
if (this.intype === "up") { suf = "↑ "}
|
||||
if (this.intype === "down") { suf = "↓ "}
|
||||
return this.name || "PIN: "+suf+this.pin ;
|
||||
},
|
||||
labelStyle: function() {
|
||||
return this.name?"node_label_italic":"";
|
||||
},
|
||||
outputLabels: function() { return "GPIO"+this.pin; },
|
||||
oneditprepare: function() {
|
||||
var pinnow = this.pin;
|
||||
var pintip = this._("rpi-gpio.tip.pin");
|
||||
var pinname = this._("rpi-gpio.pinname");
|
||||
var alreadyuse = this._("rpi-gpio.alreadyuse");
|
||||
var alreadyset = this._("rpi-gpio.alreadyset");
|
||||
|
||||
$.getJSON('rpi-pins/'+this.id,function(data) {
|
||||
pinsInUse = data || {};
|
||||
$('#pin-tip').html(pintip + Object.keys(data));
|
||||
});
|
||||
$("#node-input-pin").change(function() {
|
||||
if ($("#node-input-pin").val()) {
|
||||
$("#pinform input[value="+$("#node-input-pin").val()+"]").prop('checked', true);
|
||||
}
|
||||
var pinnew = $("#node-input-pin").val();
|
||||
if ((pinnew) && (pinnew !== pinnow)) {
|
||||
if (pinsInUse.hasOwnProperty(pinnew)) {
|
||||
RED.notify(pinname+" "+pinnew+" "+alreadyuse,"warn");
|
||||
}
|
||||
pinnow = pinnew;
|
||||
}
|
||||
});
|
||||
$("#node-input-intype").change(function() {
|
||||
var newtype = $("#node-input-intype").val();
|
||||
if ((pinsInUse.hasOwnProperty(pinnow)) && (pinsInUse[pinnow] !== newtype)) {
|
||||
RED.notify(pinname+" "+pinnow+" "+alreadyset+" "+pinsInUse[pinnow],"error");
|
||||
}
|
||||
});
|
||||
$('#pinform input').on('change', function() {
|
||||
this.pin = $("#pinform input[type='radio']:checked").val();
|
||||
$("#node-input-pin").val(this.pin);
|
||||
});
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<script type="text/x-red" data-template-name="rpi-gpio out">
|
||||
<div class="form-row" style="min-width: 540px">
|
||||
<label><i class="fa fa-circle"></i> <span data-i18n="rpi-gpio.pinname"></span></label>
|
||||
<input type="text" id="node-input-pin" style="display:none;">
|
||||
<div class="rpi-gpio-pinTable">
|
||||
<div class="pinTableBody" id="pinform">
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorPower"><label>3.3V Power - 1 <input disabled type="radio" name="pins" value=""></label></div>
|
||||
<div class="pinTableCellR pinColorPower"><label><input disabled type="radio" name="pins" value=""> 2 - 5V Power</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorDual"><label for="pinTable-pin-3">SDA1 - GPIO02 - 3 <input id="pinTable-pin-3" type="radio" name="pins" value="3"></label></div>
|
||||
<div class="pinTableCellR pinColorPower"><label><input disabled type="radio" name="pins" value=""> 4 - 5V Power</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorDual"><label for="pinTable-pin-5">SCL1 - GPIO03 - 5 <input id="pinTable-pin-5" type="radio" name="pins" value="5"></label></div>
|
||||
<div class="pinTableCellR pinColorGround"><label><input disabled type="radio" name="pins" value=""> 6 - Ground</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorGPIO"><label for="pinTable-pin-7">GPIO04 - 7 <input id="pinTable-pin-7" type="radio" name="pins" value="7"></label></div>
|
||||
<div class="pinTableCellR pinColorDual"><label for="pinTable-pin-8"><input id="pinTable-pin-8" type="radio" name="pins" value="8"> 8 - GPIO14 - TxD</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorGround"><label>Ground - 9 <input disabled type="radio" name="pins" value=""></label></div>
|
||||
<div class="pinTableCellR pinColorDual"><label for="pinTable-pin-10"><input id="pinTable-pin-10" type="radio" name="pins" value="10"> 10 - GPIO15 - RxD</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorGPIO"><label for="pinTable-pin-11">GPIO17 - 11 <input id="pinTable-pin-11" type="radio" name="pins" value="11"></label></div>
|
||||
<div class="pinTableCellR pinColorGPIO"><label for="pinTable-pin-12"><input id="pinTable-pin-12" type="radio" name="pins" value="12"> 12 - GPIO18</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorGPIO"><label for="pinTable-pin-13">GPIO27 - 13 <input id="pinTable-pin-13" type="radio" name="pins" value="13"></label></div>
|
||||
<div class="pinTableCellR pinColorGround"><label><input disabled type="radio" name="pins" value=""> 14 - Ground</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorGPIO"><label for="pinTable-pin-15">GPIO22 - 15 <input id="pinTable-pin-15" type="radio" name="pins" value="15"></label></div>
|
||||
<div class="pinTableCellR pinColorGPIO"><label for="pinTable-pin-16"><input id="pinTable-pin-16" type="radio" name="pins" value="16"> 16 - GPIO23</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorPower"><label>3.3V Power - 17 <input disabled type="radio" name="pins" value=""></label></div>
|
||||
<div class="pinTableCellR pinColorGPIO"><label for="pinTable-pin-18"><input id="pinTable-pin-18" type="radio" name="pins" value="18"> 18 - GPIO24</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorDual"><label for="pinTable-pin-19">MOSI - GPIO10 - 19 <input id="pinTable-pin-19" type="radio" name="pins" value="19"></label></div>
|
||||
<div class="pinTableCellR pinColorGround"><label><input disabled type="radio" name="pins" value=""> 20 - Ground</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorDual"><label for="pinTable-pin-21">MISO - GPIO09 - 21 <input id="pinTable-pin-21" type="radio" name="pins" value="21"></label></div>
|
||||
<div class="pinTableCellR pinColorGPIO"><label for="pinTable-pin-22"><input id="pinTable-pin-22" type="radio" name="pins" value="22"> 22 - GPIO25</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorDual"><label for="pinTable-pin-23">SCLK - GPIO11 - 23 <input id="pinTable-pin-23" type="radio" name="pins" value="23"></label></div>
|
||||
<div class="pinTableCellR pinColorDual"><label for="pinTable-pin-24"><input id="pinTable-pin-24" type="radio" name="pins" value="24"> 24 - GPIO8 - CE0</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorGround"><label>Ground - 25 <input disabled type="radio" name="pins" value=""></label></div>
|
||||
<div class="pinTableCellR pinColorDual"><label for="pinTable-pin-26"><input id="pinTable-pin-26" type="radio" name="pins" value="26"> 26 - GPIO7 - CE1</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorSD"><label>SD - 27 <input disabled type="radio" name="pins" value=""></label></div>
|
||||
<div class="pinTableCellR pinColorSD"><label><input disabled type="radio" name="pins" value=""> 28 - SC</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorGPIO"><label for="pinTable-pin-29">GPIO05 - 29 <input id="pinTable-pin-29" type="radio" name="pins" value="29"></label></div>
|
||||
<div class="pinTableCellR pinColorGround"><label><input disabled type="radio" name="pins" value=""> 30 - Ground</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorGPIO"><label for="pinTable-pin-31">GPIO06 - 31 <input id="pinTable-pin-31" type="radio" name="pins" value="31"></label></div>
|
||||
<div class="pinTableCellR pinColorGPIO"><label for="pinTable-pin-32"><input id="pinTable-pin-32" type="radio" name="pins" value="32"> 32 - GPIO12</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorGPIO"><label for="pinTable-pin-33">GPIO13 - 33 <input id="pinTable-pin-33" type="radio" name="pins" value="33"></label></div>
|
||||
<div class="pinTableCellR pinColorGround"><label><input disabled type="radio" name="pins" value=""> 34 - Ground</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorGPIO"><label for="pinTable-pin-35">GPIO19 - 35 <input id="pinTable-pin-35" type="radio" name="pins" value="35"></label></div>
|
||||
<div class="pinTableCellR pinColorGPIO"><label for="pinTable-pin-36"><input id="pinTable-pin-36" type="radio" name="pins" value="36"> 36 - GPIO16</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorGPIO"><label for="pinTable-pin-37">GPIO26 - 37 <input id="pinTable-pin-37" type="radio" name="pins" value="37"></label></div>
|
||||
<div class="pinTableCellR pinColorGPIO"><label for="pinTable-pin-38"><input id="pinTable-pin-38" type="radio" name="pins" value="38"> 38 - GPIO20</label></div>
|
||||
</div>
|
||||
<div class="pinTableRow">
|
||||
<div class="pinTableCellL pinColorGround"><label>Ground - 39 <input disabled type="radio" name="pins" value=""></label></div>
|
||||
<div class="pinTableCellR pinColorGPIO"><label for="pinTable-pin-40"><input id="pinTable-pin-40" type="radio" name="pins" value="40"> 40 - GPIO21</label></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-row" id="node-set-pwm">
|
||||
<label> <span data-i18n="rpi-gpio.label.type"></span></label>
|
||||
<select id="node-input-out" style="width: 250px;">
|
||||
<option value="out" data-i18n="rpi-gpio.digout"></option>
|
||||
<option value="pwm" data-i18n="rpi-gpio.pwmout"></option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-row" id="node-set-tick">
|
||||
<label> </label>
|
||||
<input type="checkbox" id="node-input-set" style="display: inline-block; width: auto; vertical-align: top;">
|
||||
<label for="node-input-set" style="width: 70%;"><span data-i18n="rpi-gpio.label.initpin"></span></label>
|
||||
</div>
|
||||
<div class="form-row" id="node-set-state">
|
||||
<label for="node-input-level"> </label>
|
||||
<select id="node-input-level" style="width: 250px;">
|
||||
<option value="0" data-i18n="rpi-gpio.initpin0"></option>
|
||||
<option value="1" data-i18n="rpi-gpio.initpin1"></option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-row" id="node-set-freq">
|
||||
<label for="node-input-freq"> <span data-i18n="rpi-gpio.label.freq"></span></label>
|
||||
<input type="text" id="node-input-freq" placeholder="100"> Hz
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="common.label.name"></span></label>
|
||||
<input type="text" id="node-input-name" data-i18n="[placeholder]common.label.name">
|
||||
</div>
|
||||
<div class="form-tips" id="pin-tip"><span data-i18n="[html]rpi-gpio.tip.pin"></span></div>
|
||||
<div class="form-tips" id="dig-tip"><span data-i18n="[html]rpi-gpio.tip.dig"></span></div>
|
||||
<div class="form-tips" id="pwm-tip"><span data-i18n="[html]rpi-gpio.tip.pwm"></span></div>
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
var bcm2pin = {
|
||||
"2":"3", "3":"5", "4":"7", "14":"8", "15":"10", "17":"11", "18":"12", "27":"13", "22":"15",
|
||||
"23":"16", "24":"18", "10":"19", "9":"21", "25":"22", "11":"23", "8":"24", "7":"26",
|
||||
"5":"29", "6":"31", "12":"32", "13":"33", "19":"35", "16":"36", "26":"37", "20":"38", "21":"40"
|
||||
};
|
||||
var pinsInUse = {};
|
||||
RED.nodes.registerType('rpi-gpio out',{
|
||||
category: 'Raspberry Pi',
|
||||
color:"#c6dbef",
|
||||
defaults: {
|
||||
name: { value:"" },
|
||||
pin: { value:"",required:true,validate:RED.validators.number() },
|
||||
set: { value:"" },
|
||||
level: { value:"0" },
|
||||
freq: {value:""},
|
||||
out: { value:"out" }
|
||||
},
|
||||
inputs:1,
|
||||
outputs:0,
|
||||
icon: "rpi.png",
|
||||
info: function() {
|
||||
if ( Object.keys(pinsInUse).length !== 0 ) {
|
||||
return "**Pins in use** : "+Object.keys(pinsInUse);
|
||||
}
|
||||
else { return ""; }
|
||||
},
|
||||
align: "right",
|
||||
label: function() {
|
||||
if (this.out === "pwm") { return this.name || "PWM: "+this.pin; }
|
||||
else if (this.out === "ser") { return this.name || "Servo: "+this.pin; }
|
||||
else {
|
||||
var suf = "";
|
||||
if (this.set == true) { suf = (this.level === "1") ? " ¹" : " ₀"; }
|
||||
return this.name||"PIN: "+ this.pin + suf ;
|
||||
}
|
||||
},
|
||||
labelStyle: function() {
|
||||
return this.name?"node_label_italic":"";
|
||||
},
|
||||
inputLabels: function() { return "GPIO"+this.pin; },
|
||||
oneditprepare: function() {
|
||||
var pinnow = this.pin;
|
||||
var pintip = this._("rpi-gpio.tip.pin");
|
||||
var pinname = this._("rpi-gpio.pinname");
|
||||
var alreadyuse = this._("rpi-gpio.alreadyuse");
|
||||
var alreadyset = this._("rpi-gpio.alreadyset");
|
||||
if (!$("#node-input-out").val()) { $("#node-input-out").val("out"); }
|
||||
|
||||
$.getJSON('rpi-pins/'+this.id,function(data) {
|
||||
pinsInUse = data || {};
|
||||
$('#pin-tip').html(pintip + Object.keys(data));
|
||||
});
|
||||
|
||||
$("#node-input-pin").change(function() {
|
||||
if ($("#node-input-pin").val()) {
|
||||
$("#pinform input[value="+$("#node-input-pin").val()+"]").prop('checked', true);
|
||||
}
|
||||
var pinnew = $("#node-input-pin").val();
|
||||
if ((pinnew) && (pinnew !== pinnow)) {
|
||||
if (pinsInUse.hasOwnProperty(pinnew)) {
|
||||
RED.notify(pinname+" "+pinnew+" "+alreadyuse,"warn");
|
||||
}
|
||||
pinnow = pinnew;
|
||||
}
|
||||
});
|
||||
|
||||
$("#node-input-out").change(function() {
|
||||
var newtype = $("#node-input-out").val();
|
||||
if ((pinsInUse.hasOwnProperty(pinnow)) && (pinsInUse[pinnow] !== newtype)) {
|
||||
RED.notify(pinname+" "+pinnow+" "+alreadyset+" "+pinsInUse[pinnow],"error");
|
||||
}
|
||||
});
|
||||
|
||||
var hidestate = function () {
|
||||
if ($("#node-input-out").val() === "pwm") {
|
||||
$('#node-set-tick').hide();
|
||||
$('#node-set-state').hide();
|
||||
$('#node-input-set').prop('checked', false);
|
||||
$("#dig-tip").hide();
|
||||
$("#pwm-tip").show();
|
||||
$('#node-set-freq').show();
|
||||
}
|
||||
else {
|
||||
$('#node-set-tick').show();
|
||||
$("#dig-tip").show();
|
||||
$("#pwm-tip").hide();
|
||||
$('#node-set-freq').hide();
|
||||
}
|
||||
};
|
||||
$("#node-input-out").change(function () { hidestate(); });
|
||||
hidestate();
|
||||
|
||||
var setstate = function () {
|
||||
if ($('#node-input-set').is(":checked")) {
|
||||
$("#node-set-state").show();
|
||||
} else {
|
||||
$("#node-set-state").hide();
|
||||
}
|
||||
};
|
||||
$("#node-input-set").change(function () { setstate(); });
|
||||
setstate();
|
||||
|
||||
$('#pinform input').on('change', function() {
|
||||
this.pin = $("#pinform input[type='radio']:checked").val();
|
||||
$("#node-input-pin").val(this.pin);
|
||||
});
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<script type="text/x-red" data-template-name="rpi-mouse">
|
||||
<div class="form-row">
|
||||
<label for="node-input-butt"><i class="fa fa-circle"></i> <span data-i18n="rpi-gpio.label.button"></span></label>
|
||||
<select type="text" id="node-input-butt" style="width: 250px;">
|
||||
<option value="1" data-i18n="rpi-gpio.left"></option>
|
||||
<option value="2" data-i18n="rpi-gpio.right"></option>
|
||||
<option value="4" data-i18n="rpi-gpio.middle"></option>
|
||||
<option value="7" data-i18n="rpi-gpio.any"></option>
|
||||
</select>
|
||||
</div>
|
||||
<br/>
|
||||
<div class="form-row">
|
||||
<label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="common.label.name"></span></label>
|
||||
<input type="text" id="node-input-name" data-i18n="[placeholder]common.label.name">
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
RED.nodes.registerType('rpi-mouse',{
|
||||
category: 'Raspberry Pi',
|
||||
color:"#c6dbef",
|
||||
defaults: {
|
||||
name: { value:"" },
|
||||
butt: { value:"1",required:true }
|
||||
},
|
||||
inputs:0,
|
||||
outputs:1,
|
||||
icon: "rpi.png",
|
||||
label: function() {
|
||||
var na = this._("rpi-gpio.label.pimouse");
|
||||
if (this.butt === "1") { na += " "+this._("rpi-gpio.label.left"); }
|
||||
if (this.butt === "2") { na += " "+this._("rpi-gpio.label.right"); }
|
||||
if (this.butt === "4") { na += " "+this._("rpi-gpio.label.middle"); }
|
||||
return this.name||na;
|
||||
},
|
||||
labelStyle: function() {
|
||||
return this.name?"node_label_italic":"";
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<script type="text/x-red" data-template-name="rpi-keyboard">
|
||||
<div class="form-row">
|
||||
<label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="common.label.name"></span></label>
|
||||
<input type="text" id="node-input-name" data-i18n="[placeholder]common.label.name">
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
RED.nodes.registerType('rpi-keyboard',{
|
||||
category: 'Raspberry Pi',
|
||||
color:"#c6dbef",
|
||||
defaults: {
|
||||
name: { value:"" }
|
||||
},
|
||||
inputs:0,
|
||||
outputs:1,
|
||||
icon: "rpi.png",
|
||||
label: function() {
|
||||
return this.name || this._("rpi-gpio.label.pikeyboard");
|
||||
},
|
||||
labelStyle: function() {
|
||||
return this.name?"node_label_italic":"";
|
||||
}
|
||||
});
|
||||
</script>
|
@@ -1,371 +0,0 @@
|
||||
|
||||
module.exports = function(RED) {
|
||||
"use strict";
|
||||
var exec = require('child_process').exec;
|
||||
var spawn = require('child_process').spawn;
|
||||
var fs = require('fs');
|
||||
|
||||
var gpioCommand = __dirname+'/nrgpio';
|
||||
var allOK = true;
|
||||
|
||||
try {
|
||||
var cpuinfo = fs.readFileSync("/proc/cpuinfo").toString();
|
||||
if (cpuinfo.indexOf(": BCM") === -1) {
|
||||
allOK = false;
|
||||
RED.log.warn("rpi-gpio : "+RED._("rpi-gpio.errors.ignorenode"));
|
||||
}
|
||||
try {
|
||||
fs.statSync("/usr/share/doc/python-rpi.gpio"); // test on Raspbian
|
||||
// /usr/lib/python2.7/dist-packages/RPi/GPIO
|
||||
} catch(err) {
|
||||
try {
|
||||
fs.statSync("/usr/lib/python2.7/site-packages/RPi/GPIO"); // test on Arch
|
||||
} catch(err) {
|
||||
try {
|
||||
fs.statSync("/usr/lib/python2.7/dist-packages/RPi/GPIO"); // test on Hypriot
|
||||
} catch(err) {
|
||||
try {
|
||||
fs.statSync("/usr/local/lib/python2.7/dist-packages/RPi/GPIO"); // installed with pip
|
||||
} catch(err) {
|
||||
RED.log.warn("rpi-gpio : "+RED._("rpi-gpio.errors.libnotfound"));
|
||||
allOK = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( !(1 & parseInt((fs.statSync(gpioCommand).mode & parseInt("777", 8)).toString(8)[0]) )) {
|
||||
RED.log.warn("rpi-gpio : "+RED._("rpi-gpio.errors.needtobeexecutable",{command:gpioCommand}));
|
||||
allOK = false;
|
||||
}
|
||||
} catch(err) {
|
||||
allOK = false;
|
||||
RED.log.warn("rpi-gpio : "+RED._("rpi-gpio.errors.ignorenode"));
|
||||
}
|
||||
|
||||
// the magic to make python print stuff immediately
|
||||
process.env.PYTHONUNBUFFERED = 1;
|
||||
|
||||
var pinsInUse = {};
|
||||
var pinTypes = {"out":RED._("rpi-gpio.types.digout"), "tri":RED._("rpi-gpio.types.input"), "up":RED._("rpi-gpio.types.pullup"), "down":RED._("rpi-gpio.types.pulldown"), "pwm":RED._("rpi-gpio.types.pwmout")};
|
||||
|
||||
function GPIOInNode(n) {
|
||||
RED.nodes.createNode(this,n);
|
||||
this.buttonState = -1;
|
||||
this.pin = n.pin;
|
||||
this.intype = n.intype;
|
||||
this.read = n.read || false;
|
||||
this.debounce = Number(n.debounce || 25);
|
||||
if (this.read) { this.buttonState = -2; }
|
||||
var node = this;
|
||||
if (!pinsInUse.hasOwnProperty(this.pin)) {
|
||||
pinsInUse[this.pin] = this.intype;
|
||||
}
|
||||
else {
|
||||
if ((pinsInUse[this.pin] !== this.intype)||(pinsInUse[this.pin] === "pwm")) {
|
||||
node.warn(RED._("rpi-gpio.errors.alreadyset",{pin:this.pin,type:pinTypes[pinsInUse[this.pin]]}));
|
||||
}
|
||||
}
|
||||
|
||||
if (allOK === true) {
|
||||
if (node.pin !== undefined) {
|
||||
node.child = spawn(gpioCommand, ["in",node.pin,node.intype,node.debounce]);
|
||||
node.running = true;
|
||||
node.status({fill:"green",shape:"dot",text:"common.status.ok"});
|
||||
|
||||
node.child.stdout.on('data', function (data) {
|
||||
var d = data.toString().trim().split("\n");
|
||||
for (var i = 0; i < d.length; i++) {
|
||||
if (d[i] === '') { return; }
|
||||
if (node.running && node.buttonState !== -1 && !isNaN(Number(d[i])) && node.buttonState !== d[i]) {
|
||||
node.send({ topic:"pi/"+node.pin, payload:Number(d[i]) });
|
||||
}
|
||||
node.buttonState = d[i];
|
||||
node.status({fill:"green",shape:"dot",text:d[i]});
|
||||
if (RED.settings.verbose) { node.log("out: "+d[i]+" :"); }
|
||||
}
|
||||
});
|
||||
|
||||
node.child.stderr.on('data', function (data) {
|
||||
if (RED.settings.verbose) { node.log("err: "+data+" :"); }
|
||||
});
|
||||
|
||||
node.child.on('close', function (code) {
|
||||
node.running = false;
|
||||
node.child = null;
|
||||
if (RED.settings.verbose) { node.log(RED._("rpi-gpio.status.closed")); }
|
||||
if (node.done) {
|
||||
node.status({fill:"grey",shape:"ring",text:"rpi-gpio.status.closed"});
|
||||
node.done();
|
||||
}
|
||||
else { node.status({fill:"red",shape:"ring",text:"rpi-gpio.status.stopped"}); }
|
||||
});
|
||||
|
||||
node.child.on('error', function (err) {
|
||||
if (err.errno === "ENOENT") { node.error(RED._("rpi-gpio.errors.commandnotfound")); }
|
||||
else if (err.errno === "EACCES") { node.error(RED._("rpi-gpio.errors.commandnotexecutable")); }
|
||||
else { node.error(RED._("rpi-gpio.errors.error",{error:err.errno})) }
|
||||
});
|
||||
|
||||
}
|
||||
else {
|
||||
node.warn(RED._("rpi-gpio.errors.invalidpin")+": "+node.pin);
|
||||
}
|
||||
}
|
||||
else {
|
||||
node.status({fill:"grey",shape:"dot",text:"node-red:rpi-gpio.status.not-available"});
|
||||
if (node.read === true) {
|
||||
var val;
|
||||
if (node.intype == "up") { val = 1; }
|
||||
if (node.intype == "down") { val = 0; }
|
||||
setTimeout(function(){
|
||||
node.send({ topic:"pi/"+node.pin, payload:val });
|
||||
node.status({fill:"grey",shape:"dot",text:RED._("rpi-gpio.status.na",{value:val})});
|
||||
},250);
|
||||
}
|
||||
}
|
||||
|
||||
node.on("close", function(done) {
|
||||
node.status({fill:"grey",shape:"ring",text:"rpi-gpio.status.closed"});
|
||||
delete pinsInUse[node.pin];
|
||||
if (node.child != null) {
|
||||
node.done = done;
|
||||
node.child.stdin.write("close "+node.pin);
|
||||
node.child.kill('SIGKILL');
|
||||
}
|
||||
else { done(); }
|
||||
});
|
||||
}
|
||||
RED.nodes.registerType("rpi-gpio in",GPIOInNode);
|
||||
|
||||
function GPIOOutNode(n) {
|
||||
RED.nodes.createNode(this,n);
|
||||
this.pin = n.pin;
|
||||
this.set = n.set || false;
|
||||
this.level = n.level || 0;
|
||||
this.freq = n.freq || 100;
|
||||
this.out = n.out || "out";
|
||||
var node = this;
|
||||
if (!pinsInUse.hasOwnProperty(this.pin)) {
|
||||
pinsInUse[this.pin] = this.out;
|
||||
}
|
||||
else {
|
||||
if ((pinsInUse[this.pin] !== this.out)||(pinsInUse[this.pin] === "pwm")) {
|
||||
node.warn(RED._("rpi-gpio.errors.alreadyset",{pin:this.pin,type:pinTypes[pinsInUse[this.pin]]}));
|
||||
}
|
||||
}
|
||||
|
||||
function inputlistener(msg) {
|
||||
if (msg.payload === "true") { msg.payload = true; }
|
||||
if (msg.payload === "false") { msg.payload = false; }
|
||||
var out = Number(msg.payload);
|
||||
var limit = 1;
|
||||
if (node.out === "pwm") { limit = 100; }
|
||||
if ((out >= 0) && (out <= limit)) {
|
||||
if (RED.settings.verbose) { node.log("out: "+out); }
|
||||
if (node.child !== null) {
|
||||
node.child.stdin.write(out+"\n");
|
||||
node.status({fill:"green",shape:"dot",text:msg.payload.toString()});
|
||||
}
|
||||
else {
|
||||
node.error(RED._("rpi-gpio.errors.pythoncommandnotfound"),msg);
|
||||
node.status({fill:"red",shape:"ring",text:"rpi-gpio.status.not-running"});
|
||||
}
|
||||
}
|
||||
else { node.warn(RED._("rpi-gpio.errors.invalidinput")+": "+out); }
|
||||
}
|
||||
|
||||
if (allOK === true) {
|
||||
if (node.pin !== undefined) {
|
||||
if (node.set && (node.out === "out")) {
|
||||
node.child = spawn(gpioCommand, [node.out,node.pin,node.level]);
|
||||
node.status({fill:"green",shape:"dot",text:node.level});
|
||||
} else {
|
||||
node.child = spawn(gpioCommand, [node.out,node.pin,node.freq]);
|
||||
node.status({fill:"green",shape:"dot",text:"common.status.ok"});
|
||||
}
|
||||
node.running = true;
|
||||
|
||||
node.on("input", inputlistener);
|
||||
|
||||
node.child.stdout.on('data', function (data) {
|
||||
if (RED.settings.verbose) { node.log("out: "+data+" :"); }
|
||||
});
|
||||
|
||||
node.child.stderr.on('data', function (data) {
|
||||
if (RED.settings.verbose) { node.log("err: "+data+" :"); }
|
||||
});
|
||||
|
||||
node.child.on('close', function (code) {
|
||||
node.child = null;
|
||||
node.running = false;
|
||||
if (RED.settings.verbose) { node.log(RED._("rpi-gpio.status.closed")); }
|
||||
if (node.done) {
|
||||
node.status({fill:"grey",shape:"ring",text:"rpi-gpio.status.closed"});
|
||||
node.done();
|
||||
}
|
||||
else { node.status({fill:"red",shape:"ring",text:"rpi-gpio.status.stopped"}); }
|
||||
});
|
||||
|
||||
node.child.on('error', function (err) {
|
||||
if (err.errno === "ENOENT") { node.error(RED._("rpi-gpio.errors.commandnotfound")); }
|
||||
else if (err.errno === "EACCES") { node.error(RED._("rpi-gpio.errors.commandnotexecutable")); }
|
||||
else { node.error(RED._("rpi-gpio.errors.error")+': ' + err.errno); }
|
||||
});
|
||||
|
||||
}
|
||||
else {
|
||||
node.warn(RED._("rpi-gpio.errors.invalidpin")+": "+node.pin);
|
||||
}
|
||||
}
|
||||
else {
|
||||
node.status({fill:"grey",shape:"dot",text:"node-red:rpi-gpio.status.not-available"});
|
||||
node.on("input", function(msg){
|
||||
node.status({fill:"grey",shape:"dot",text:RED._("rpi-gpio.status.na",{value:msg.payload.toString()})});
|
||||
});
|
||||
}
|
||||
|
||||
node.on("close", function(done) {
|
||||
node.status({fill:"grey",shape:"ring",text:"rpi-gpio.status.closed"});
|
||||
delete pinsInUse[node.pin];
|
||||
if (node.child != null) {
|
||||
node.done = done;
|
||||
node.child.stdin.write("close "+node.pin);
|
||||
node.child.kill('SIGKILL');
|
||||
}
|
||||
else { done(); }
|
||||
});
|
||||
|
||||
}
|
||||
RED.nodes.registerType("rpi-gpio out",GPIOOutNode);
|
||||
|
||||
function PiMouseNode(n) {
|
||||
RED.nodes.createNode(this,n);
|
||||
this.butt = n.butt || 7;
|
||||
var node = this;
|
||||
|
||||
if (allOK === true) {
|
||||
node.child = spawn(gpioCommand+".py", ["mouse",node.butt]);
|
||||
node.status({fill:"green",shape:"dot",text:"common.status.ok"});
|
||||
|
||||
node.child.stdout.on('data', function (data) {
|
||||
data = Number(data);
|
||||
if (data !== 0) { node.send({ topic:"pi/mouse", button:data, payload:1 }); }
|
||||
else { node.send({ topic:"pi/mouse", button:data, payload:0 }); }
|
||||
});
|
||||
|
||||
node.child.stderr.on('data', function (data) {
|
||||
if (RED.settings.verbose) { node.log("err: "+data+" :"); }
|
||||
});
|
||||
|
||||
node.child.on('close', function (code) {
|
||||
node.child = null;
|
||||
node.running = false;
|
||||
if (RED.settings.verbose) { node.log(RED._("rpi-gpio.status.closed")); }
|
||||
if (node.done) {
|
||||
node.status({fill:"grey",shape:"ring",text:"rpi-gpio.status.closed"});
|
||||
node.done();
|
||||
}
|
||||
else { node.status({fill:"red",shape:"ring",text:"rpi-gpio.status.stopped"}); }
|
||||
});
|
||||
|
||||
node.child.on('error', function (err) {
|
||||
if (err.errno === "ENOENT") { node.error(RED._("rpi-gpio.errors.commandnotfound")); }
|
||||
else if (err.errno === "EACCES") { node.error(RED._("rpi-gpio.errors.commandnotexecutable")); }
|
||||
else { node.error(RED._("rpi-gpio.errors.error")+': ' + err.errno); }
|
||||
});
|
||||
|
||||
node.on("close", function(done) {
|
||||
node.status({fill:"grey",shape:"ring",text:"rpi-gpio.status.closed"});
|
||||
if (node.child != null) {
|
||||
node.done = done;
|
||||
node.child.kill('SIGINT');
|
||||
node.child = null;
|
||||
}
|
||||
else { done(); }
|
||||
});
|
||||
}
|
||||
else {
|
||||
node.status({fill:"grey",shape:"dot",text:"node-red:rpi-gpio.status.not-available"});
|
||||
}
|
||||
}
|
||||
RED.nodes.registerType("rpi-mouse",PiMouseNode);
|
||||
|
||||
function PiKeyboardNode(n) {
|
||||
RED.nodes.createNode(this,n);
|
||||
var node = this;
|
||||
|
||||
if (allOK === true) {
|
||||
node.child = spawn(gpioCommand+".py", ["kbd","0"]);
|
||||
node.status({fill:"green",shape:"dot",text:"common.status.ok"});
|
||||
|
||||
node.child.stdout.on('data', function (data) {
|
||||
var b = data.toString().trim().split(",");
|
||||
var act = "up";
|
||||
if (b[1] === "1") { act = "down"; }
|
||||
if (b[1] === "2") { act = "repeat"; }
|
||||
node.send({ topic:"pi/key", payload:Number(b[0]), action:act });
|
||||
});
|
||||
|
||||
node.child.stderr.on('data', function (data) {
|
||||
if (RED.settings.verbose) { node.log("err: "+data+" :"); }
|
||||
});
|
||||
|
||||
node.child.on('close', function (code) {
|
||||
node.running = false;
|
||||
node.child = null;
|
||||
if (RED.settings.verbose) { node.log(RED._("rpi-gpio.status.closed")); }
|
||||
if (node.done) {
|
||||
node.status({fill:"grey",shape:"ring",text:"rpi-gpio.status.closed"});
|
||||
node.done();
|
||||
}
|
||||
else { node.status({fill:"red",shape:"ring",text:"rpi-gpio.status.stopped"}); }
|
||||
});
|
||||
|
||||
node.child.on('error', function (err) {
|
||||
if (err.errno === "ENOENT") { node.error(RED._("rpi-gpio.errors.commandnotfound")); }
|
||||
else if (err.errno === "EACCES") { node.error(RED._("rpi-gpio.errors.commandnotexecutable")); }
|
||||
else { node.error(RED._("rpi-gpio.errors.error")+': ' + err.errno); }
|
||||
});
|
||||
|
||||
node.on("close", function(done) {
|
||||
node.status({});
|
||||
if (node.child != null) {
|
||||
node.done = done;
|
||||
node.child.kill('SIGINT');
|
||||
node.child = null;
|
||||
}
|
||||
else { done(); }
|
||||
});
|
||||
}
|
||||
else {
|
||||
node.status({fill:"grey",shape:"dot",text:"node-red:rpi-gpio.status.not-available"});
|
||||
}
|
||||
}
|
||||
RED.nodes.registerType("rpi-keyboard",PiKeyboardNode);
|
||||
|
||||
var pitype = { type:"" };
|
||||
if (allOK === true) {
|
||||
exec(gpioCommand+" info", function(err,stdout,stderr) {
|
||||
if (err) {
|
||||
RED.log.info(RED._("rpi-gpio.errors.version"));
|
||||
}
|
||||
else {
|
||||
try {
|
||||
var info = JSON.parse( stdout.trim().replace(/\'/g,"\"") );
|
||||
pitype.type = info["TYPE"];
|
||||
}
|
||||
catch(e) {
|
||||
RED.log.info(RED._("rpi-gpio.errors.sawpitype"),stdout.trim());
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
RED.httpAdmin.get('/rpi-gpio/:id', RED.auth.needsPermission('rpi-gpio.read'), function(req,res) {
|
||||
res.json(pitype);
|
||||
});
|
||||
|
||||
RED.httpAdmin.get('/rpi-pins/:id', RED.auth.needsPermission('rpi-gpio.read'), function(req,res) {
|
||||
res.json(pinsInUse);
|
||||
});
|
||||
}
|
@@ -1,17 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Copyright JS Foundation and other contributors, http://js.foundation
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
BASEDIR=$(dirname $0)
|
||||
python -u $BASEDIR/nrgpio.py $@
|
@@ -1,239 +0,0 @@
|
||||
#!/usr/bin/python
|
||||
#
|
||||
# Copyright JS Foundation and other contributors, http://js.foundation
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
# Import library functions we need
|
||||
import RPi.GPIO as GPIO
|
||||
import struct
|
||||
import sys
|
||||
import os
|
||||
import subprocess
|
||||
from time import sleep
|
||||
|
||||
try:
|
||||
raw_input # Python 2
|
||||
except NameError:
|
||||
raw_input = input # Python 3
|
||||
|
||||
bounce = 25
|
||||
|
||||
if len(sys.argv) > 2:
|
||||
cmd = sys.argv[1].lower()
|
||||
pin = int(sys.argv[2])
|
||||
GPIO.setmode(GPIO.BOARD)
|
||||
GPIO.setwarnings(False)
|
||||
|
||||
if cmd == "pwm":
|
||||
#print("Initialised pin "+str(pin)+" to PWM")
|
||||
try:
|
||||
freq = int(sys.argv[3])
|
||||
except:
|
||||
freq = 100
|
||||
|
||||
GPIO.setup(pin,GPIO.OUT)
|
||||
p = GPIO.PWM(pin, freq)
|
||||
p.start(0)
|
||||
|
||||
while True:
|
||||
try:
|
||||
data = raw_input()
|
||||
if 'close' in data:
|
||||
sys.exit(0)
|
||||
p.ChangeDutyCycle(float(data))
|
||||
except (EOFError, SystemExit): # hopefully always caused by us sigint'ing the program
|
||||
GPIO.cleanup(pin)
|
||||
sys.exit(0)
|
||||
except Exception as ex:
|
||||
print("bad data: "+data)
|
||||
|
||||
elif cmd == "buzz":
|
||||
#print("Initialised pin "+str(pin)+" to Buzz")
|
||||
GPIO.setup(pin,GPIO.OUT)
|
||||
p = GPIO.PWM(pin, 100)
|
||||
p.stop()
|
||||
|
||||
while True:
|
||||
try:
|
||||
data = raw_input()
|
||||
if 'close' in data:
|
||||
sys.exit(0)
|
||||
elif float(data) == 0:
|
||||
p.stop()
|
||||
else:
|
||||
p.start(50)
|
||||
p.ChangeFrequency(float(data))
|
||||
except (EOFError, SystemExit): # hopefully always caused by us sigint'ing the program
|
||||
GPIO.cleanup(pin)
|
||||
sys.exit(0)
|
||||
except Exception as ex:
|
||||
print("bad data: "+data)
|
||||
|
||||
elif cmd == "out":
|
||||
#print("Initialised pin "+str(pin)+" to OUT")
|
||||
GPIO.setup(pin,GPIO.OUT)
|
||||
if len(sys.argv) == 4:
|
||||
GPIO.output(pin,int(sys.argv[3]))
|
||||
|
||||
while True:
|
||||
try:
|
||||
data = raw_input()
|
||||
if 'close' in data:
|
||||
sys.exit(0)
|
||||
data = int(data)
|
||||
except (EOFError, SystemExit): # hopefully always caused by us sigint'ing the program
|
||||
GPIO.cleanup(pin)
|
||||
sys.exit(0)
|
||||
except:
|
||||
if len(sys.argv) == 4:
|
||||
data = int(sys.argv[3])
|
||||
else:
|
||||
data = 0
|
||||
if data != 0:
|
||||
data = 1
|
||||
GPIO.output(pin,data)
|
||||
|
||||
elif cmd == "in":
|
||||
#print("Initialised pin "+str(pin)+" to IN")
|
||||
bounce = float(sys.argv[4])
|
||||
def handle_callback(chan):
|
||||
sleep(bounce/1000.0)
|
||||
print(GPIO.input(chan))
|
||||
|
||||
if sys.argv[3].lower() == "up":
|
||||
GPIO.setup(pin,GPIO.IN,GPIO.PUD_UP)
|
||||
elif sys.argv[3].lower() == "down":
|
||||
GPIO.setup(pin,GPIO.IN,GPIO.PUD_DOWN)
|
||||
else:
|
||||
GPIO.setup(pin,GPIO.IN)
|
||||
|
||||
print(GPIO.input(pin))
|
||||
GPIO.add_event_detect(pin, GPIO.BOTH, callback=handle_callback, bouncetime=int(bounce))
|
||||
|
||||
while True:
|
||||
try:
|
||||
data = raw_input()
|
||||
if 'close' in data:
|
||||
sys.exit(0)
|
||||
except (EOFError, SystemExit): # hopefully always caused by us sigint'ing the program
|
||||
GPIO.cleanup(pin)
|
||||
sys.exit(0)
|
||||
|
||||
elif cmd == "byte":
|
||||
#print("Initialised BYTE mode - "+str(pin)+)
|
||||
list = [7,11,13,12,15,16,18,22]
|
||||
GPIO.setup(list,GPIO.OUT)
|
||||
|
||||
while True:
|
||||
try:
|
||||
data = raw_input()
|
||||
if 'close' in data:
|
||||
sys.exit(0)
|
||||
data = int(data)
|
||||
except (EOFError, SystemExit): # hopefully always caused by us sigint'ing the program
|
||||
GPIO.cleanup()
|
||||
sys.exit(0)
|
||||
except:
|
||||
data = 0
|
||||
for bit in range(8):
|
||||
if pin == 1:
|
||||
mask = 1 << (7 - bit)
|
||||
else:
|
||||
mask = 1 << bit
|
||||
GPIO.output(list[bit], data & mask)
|
||||
|
||||
elif cmd == "borg":
|
||||
#print("Initialised BORG mode - "+str(pin)+)
|
||||
GPIO.setup(11,GPIO.OUT)
|
||||
GPIO.setup(13,GPIO.OUT)
|
||||
GPIO.setup(15,GPIO.OUT)
|
||||
r = GPIO.PWM(11, 100)
|
||||
g = GPIO.PWM(13, 100)
|
||||
b = GPIO.PWM(15, 100)
|
||||
r.start(0)
|
||||
g.start(0)
|
||||
b.start(0)
|
||||
|
||||
while True:
|
||||
try:
|
||||
data = raw_input()
|
||||
if 'close' in data:
|
||||
sys.exit(0)
|
||||
c = data.split(",")
|
||||
r.ChangeDutyCycle(float(c[0]))
|
||||
g.ChangeDutyCycle(float(c[1]))
|
||||
b.ChangeDutyCycle(float(c[2]))
|
||||
except (EOFError, SystemExit): # hopefully always caused by us sigint'ing the program
|
||||
GPIO.cleanup()
|
||||
sys.exit(0)
|
||||
except:
|
||||
data = 0
|
||||
|
||||
elif cmd == "mouse": # catch mice button events
|
||||
file = open( "/dev/input/mice", "rb" )
|
||||
oldbutt = 0
|
||||
|
||||
def getMouseEvent():
|
||||
global oldbutt
|
||||
global pin
|
||||
buf = file.read(3)
|
||||
pin = pin & 0x07
|
||||
button = ord( buf[0] ) & pin # mask out just the required button(s)
|
||||
if button != oldbutt: # only send if changed
|
||||
oldbutt = button
|
||||
print(button)
|
||||
|
||||
while True:
|
||||
try:
|
||||
getMouseEvent()
|
||||
except:
|
||||
file.close()
|
||||
sys.exit(0)
|
||||
|
||||
elif cmd == "kbd": # catch keyboard button events
|
||||
try:
|
||||
while not os.path.isdir("/dev/input/by-path"):
|
||||
sleep(10)
|
||||
infile = subprocess.check_output("ls /dev/input/by-path/ | grep -m 1 'kbd'", shell=True).strip()
|
||||
infile_path = "/dev/input/by-path/" + infile
|
||||
EVENT_SIZE = struct.calcsize('llHHI')
|
||||
file = open(infile_path, "rb")
|
||||
event = file.read(EVENT_SIZE)
|
||||
while event:
|
||||
(tv_sec, tv_usec, type, code, value) = struct.unpack('llHHI', event)
|
||||
#if type != 0 or code != 0 or value != 0:
|
||||
if type == 1:
|
||||
# type,code,value
|
||||
print("%u,%u" % (code, value))
|
||||
event = file.read(EVENT_SIZE)
|
||||
print("0,0")
|
||||
file.close()
|
||||
sys.exit(0)
|
||||
except:
|
||||
file.close()
|
||||
sys.exit(0)
|
||||
|
||||
elif len(sys.argv) > 1:
|
||||
cmd = sys.argv[1].lower()
|
||||
if cmd == "rev":
|
||||
print(GPIO.RPI_REVISION)
|
||||
elif cmd == "ver":
|
||||
print(GPIO.VERSION)
|
||||
elif cmd == "info":
|
||||
print(GPIO.RPI_INFO)
|
||||
else:
|
||||
print("Bad parameters - in|out|pwm|buzz|byte|borg|mouse|kbd|ver|info {pin} {value|up|down}")
|
||||
print(" only ver (gpio version) and info (board information) accept no pin parameter.")
|
||||
|
||||
else:
|
||||
print("Bad parameters - in|out|pwm|buzz|byte|borg|mouse|kbd|ver|info {pin} {value|up|down}")
|
@@ -22,10 +22,10 @@
|
||||
<div class="form-row">
|
||||
<label style="width: 120px;"><i class="fa fa-file-text-o"></i> <span data-i18n="tls.label.cert"></span></label>
|
||||
<span class="tls-config-input-data">
|
||||
<label class="editor-button" for="node-config-input-certfile"><i class="fa fa-upload"></i> <span data-i18n="tls.label.upload"></span></label>
|
||||
<label class="red-ui-button" for="node-config-input-certfile"><i class="fa fa-upload"></i> <span data-i18n="tls.label.upload"></span></label>
|
||||
<input class="hide" type="file" id="node-config-input-certfile">
|
||||
<span id="tls-config-certname" style="width: calc(100% - 280px); overflow: hidden; line-height:34px; height:34px; text-overflow: ellipsis; white-space: nowrap; display: inline-block; vertical-align: middle;"> </span>
|
||||
<button class="editor-button editor-button-small" id="tls-config-button-cert-clear" style="margin-left: 10px"><i class="fa fa-times"></i></button>
|
||||
<button class="red-ui-button red-ui-button-small" id="tls-config-button-cert-clear" style="margin-left: 10px"><i class="fa fa-times"></i></button>
|
||||
</span>
|
||||
<input type="hidden" id="node-config-input-certname">
|
||||
<input type="hidden" id="node-config-input-certdata">
|
||||
@@ -34,10 +34,10 @@
|
||||
<div class="form-row">
|
||||
<label style="width: 120px;" for="node-config-input-key"><i class="fa fa-file-text-o"></i> <span data-i18n="tls.label.key"></span></label>
|
||||
<span class="tls-config-input-data">
|
||||
<label class="editor-button" for="node-config-input-keyfile"><i class="fa fa-upload"></i> <span data-i18n="tls.label.upload"></span></label>
|
||||
<label class="red-ui-button" for="node-config-input-keyfile"><i class="fa fa-upload"></i> <span data-i18n="tls.label.upload"></span></label>
|
||||
<input class="hide" type="file" id="node-config-input-keyfile">
|
||||
<span id="tls-config-keyname" style="width: calc(100% - 280px); overflow: hidden; line-height:34px; height:34px; text-overflow: ellipsis; white-space: nowrap; display: inline-block; vertical-align: middle;"> </span>
|
||||
<button class="editor-button editor-button-small" id="tls-config-button-key-clear" style="margin-left: 10px"><i class="fa fa-times"></i></button>
|
||||
<button class="red-ui-button red-ui-button-small" id="tls-config-button-key-clear" style="margin-left: 10px"><i class="fa fa-times"></i></button>
|
||||
</span>
|
||||
<input type="hidden" id="node-config-input-keyname">
|
||||
<input type="hidden" id="node-config-input-keydata">
|
||||
@@ -50,10 +50,10 @@
|
||||
<div class="form-row">
|
||||
<label style="width: 120px;" for="node-config-input-ca"><i class="fa fa-file-text-o"></i> <span data-i18n="tls.label.ca"></span></label>
|
||||
<span class="tls-config-input-data">
|
||||
<label class="editor-button" for="node-config-input-cafile"><i class="fa fa-upload"></i> <span data-i18n="tls.label.upload"></span></label>
|
||||
<label class="red-ui-button" for="node-config-input-cafile"><i class="fa fa-upload"></i> <span data-i18n="tls.label.upload"></span></label>
|
||||
<input class="hide" type="file" title=" " id="node-config-input-cafile">
|
||||
<span id="tls-config-caname" style="width: calc(100% - 280px); overflow: hidden; line-height:34px; height:34px; text-overflow: ellipsis; white-space: nowrap; display: inline-block; vertical-align: middle;"> </span>
|
||||
<button class="editor-button editor-button-small" id="tls-config-button-ca-clear" style="margin-left: 10px"><i class="fa fa-times"></i></button>
|
||||
<button class="red-ui-button red-ui-button-small" id="tls-config-button-ca-clear" style="margin-left: 10px"><i class="fa fa-times"></i></button>
|
||||
</span>
|
||||
<input type="hidden" id="node-config-input-caname">
|
||||
<input type="hidden" id="node-config-input-cadata">
|
||||
@@ -138,13 +138,13 @@
|
||||
}
|
||||
reader.readAsText(file,"UTF-8");
|
||||
}
|
||||
$("#node-config-input-certfile" ).change(function() {
|
||||
$("#node-config-input-certfile" ).on("change", function() {
|
||||
saveFile("cert", this.files[0]);
|
||||
});
|
||||
$("#node-config-input-keyfile" ).change(function() {
|
||||
$("#node-config-input-keyfile" ).on("change", function() {
|
||||
saveFile("key", this.files[0]);
|
||||
});
|
||||
$("#node-config-input-cafile" ).change(function() {
|
||||
$("#node-config-input-cafile" ).on("change", function() {
|
||||
saveFile("ca", this.files[0]);
|
||||
});
|
||||
|
||||
@@ -153,13 +153,13 @@
|
||||
$("#node-config-input-"+prop+"data").val("");
|
||||
$("#node-config-input-"+prop+"name").val("");
|
||||
}
|
||||
$("#tls-config-button-cert-clear").click(function() {
|
||||
$("#tls-config-button-cert-clear").on("click", function() {
|
||||
clearNameData("cert");
|
||||
});
|
||||
$("#tls-config-button-key-clear").click(function() {
|
||||
$("#tls-config-button-key-clear").on("click", function() {
|
||||
clearNameData("key");
|
||||
});
|
||||
$("#tls-config-button-ca-clear").click(function() {
|
||||
$("#tls-config-button-ca-clear").on("click", function() {
|
||||
clearNameData("ca");
|
||||
});
|
||||
|
||||
|
@@ -61,7 +61,7 @@
|
||||
return this.name || this.url || ('http proxy:' + this.id);
|
||||
},
|
||||
oneditprepare: function() {
|
||||
$('#node-config-input-useAuth').change(function() {
|
||||
$('#node-config-input-useAuth').on("change", function() {
|
||||
if ($(this).is(":checked")) {
|
||||
$('.node-config-input-useAuth-row').show();
|
||||
} else {
|
||||
@@ -117,7 +117,7 @@
|
||||
oneditresize: function(size) {
|
||||
var rows = $('#node-config-dialog-edit-form>div:not(.node-config-input-noproxy-container-row)');
|
||||
var height = size.height;
|
||||
for (var i = 0; i < rows.size(); i++) {
|
||||
for (var i = 0; i < rows.length; i++) {
|
||||
height -= $(rows[i]).outerHeight(true);
|
||||
}
|
||||
|
||||
|
@@ -57,7 +57,7 @@
|
||||
color:"#d8bfd8",
|
||||
inputs:0,
|
||||
outputs:1,
|
||||
icon: "bridge.png",
|
||||
icon: "bridge.svg",
|
||||
label: function() {
|
||||
return this.name||this.topic||"mqtt";
|
||||
},
|
||||
@@ -118,7 +118,7 @@
|
||||
color:"#d8bfd8",
|
||||
inputs:1,
|
||||
outputs:0,
|
||||
icon: "bridge.png",
|
||||
icon: "bridge.svg",
|
||||
align: "right",
|
||||
label: function() {
|
||||
return this.name||this.topic||"mqtt";
|
||||
@@ -135,13 +135,13 @@
|
||||
<input type="text" id="node-config-input-name" data-i18n="[placeholder]common.label.name">
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<ul style="background: #fff; min-width: 600px; margin-bottom: 20px;" id="node-config-mqtt-broker-tabs"></ul>
|
||||
<ul style="min-width: 600px; margin-bottom: 20px;" id="node-config-mqtt-broker-tabs"></ul>
|
||||
</div>
|
||||
<div id="node-config-mqtt-broker-tabs-content" style="min-height: 170px;">
|
||||
<div id="mqtt-broker-tab-connection" style="display:none">
|
||||
<div class="form-row node-input-broker">
|
||||
<label for="node-config-input-broker"><i class="fa fa-globe"></i> <span data-i18n="mqtt.label.broker"></span></label>
|
||||
<input class="input-append-left" type="text" id="node-config-input-broker" style="width:40%;" data-i18n="[placeholder]mqtt.label.example">
|
||||
<input type="text" id="node-config-input-broker" style="width:40%;" data-i18n="[placeholder]mqtt.label.example">
|
||||
<label for="node-config-input-port" style="margin-left:20px; width:43px; "> <span data-i18n="mqtt.label.port"></span></label>
|
||||
<input type="text" id="node-config-input-port" data-i18n="[placeholder]mqtt.label.port" style="width:55px">
|
||||
</div>
|
||||
@@ -179,7 +179,7 @@
|
||||
</div>
|
||||
<div id="mqtt-broker-tab-messages" style="display:none">
|
||||
<div id="mqtt-broker-section-birth">
|
||||
<div class="palette-header">
|
||||
<div class="red-ui-palette-header">
|
||||
<i class="fa fa-angle-down"></i><span data-i18n="mqtt.sections-label.birth-message"></span>
|
||||
</div>
|
||||
<div class="section-content" style="padding:10px 0 0 10px">
|
||||
@@ -205,7 +205,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div id="mqtt-broker-section-close">
|
||||
<div class="palette-header">
|
||||
<div class="red-ui-palette-header">
|
||||
<i class="fa fa-angle-down"></i><span data-i18n="mqtt.sections-label.close-message"></span>
|
||||
</div>
|
||||
<div class="section-content" style="padding:10px 0 0 10px">
|
||||
@@ -231,7 +231,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div id="mqtt-broker-section-will">
|
||||
<div class="palette-header">
|
||||
<div class="red-ui-palette-header">
|
||||
<i class="fa fa-angle-down"></i><span data-i18n="mqtt.sections-label.will-message"></span>
|
||||
</div>
|
||||
<div class="section-content" style="padding:10px 0 0 10px">
|
||||
@@ -336,7 +336,7 @@
|
||||
|
||||
function setUpSection(sectionId, isExpanded) {
|
||||
var birthMessageSection = $(sectionId);
|
||||
var paletteHeader = birthMessageSection.find('.palette-header');
|
||||
var paletteHeader = birthMessageSection.find('.red-ui-palette-header');
|
||||
var twistie = paletteHeader.find('i');
|
||||
var sectionContent = birthMessageSection.find('.section-content');
|
||||
|
||||
@@ -344,7 +344,7 @@
|
||||
twistie.toggleClass('expanded', expanded);
|
||||
sectionContent.toggle(expanded);
|
||||
}
|
||||
paletteHeader.click(function(e) {
|
||||
paletteHeader.on("click", function(e) {
|
||||
e.preventDefault();
|
||||
var isExpanded = twistie.hasClass('expanded');
|
||||
toggleSection(!isExpanded);
|
||||
@@ -429,7 +429,7 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
$("#node-config-input-broker").change(function() {
|
||||
$("#node-config-input-broker").on("change", function() {
|
||||
updatePortEntry();
|
||||
});
|
||||
$("#node-config-input-broker").on( "keyup", function() {
|
||||
|
@@ -334,7 +334,7 @@ module.exports = function(RED) {
|
||||
}
|
||||
};
|
||||
|
||||
this.publish = function (msg) {
|
||||
this.publish = function (msg,done) {
|
||||
if (node.connected) {
|
||||
if (msg.payload === null || msg.payload === undefined) {
|
||||
msg.payload = "";
|
||||
@@ -350,7 +350,10 @@ module.exports = function(RED) {
|
||||
qos: msg.qos || 0,
|
||||
retain: msg.retain || false
|
||||
};
|
||||
node.client.publish(msg.topic, msg.payload, options, function(err) {return});
|
||||
node.client.publish(msg.topic, msg.payload, options, function(err) {
|
||||
done && done();
|
||||
return
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
@@ -453,7 +456,7 @@ module.exports = function(RED) {
|
||||
|
||||
if (this.brokerConn) {
|
||||
this.status({fill:"red",shape:"ring",text:"node-red:common.status.disconnected"});
|
||||
this.on("input",function(msg) {
|
||||
this.on("input",function(msg,send,done) {
|
||||
if (msg.qos) {
|
||||
msg.qos = parseInt(msg.qos);
|
||||
if ((msg.qos !== 0) && (msg.qos !== 1) && (msg.qos !== 2)) {
|
||||
@@ -468,9 +471,13 @@ module.exports = function(RED) {
|
||||
}
|
||||
if ( msg.hasOwnProperty("payload")) {
|
||||
if (msg.hasOwnProperty("topic") && (typeof msg.topic === "string") && (msg.topic !== "")) { // topic must exist
|
||||
this.brokerConn.publish(msg); // send the message
|
||||
this.brokerConn.publish(msg, done); // send the message
|
||||
} else {
|
||||
node.warn(RED._("mqtt.errors.invalid-topic"));
|
||||
done();
|
||||
}
|
||||
else { node.warn(RED._("mqtt.errors.invalid-topic")); }
|
||||
} else {
|
||||
done();
|
||||
}
|
||||
});
|
||||
if (this.brokerConn.connected) {
|
||||
|
@@ -77,7 +77,7 @@
|
||||
},
|
||||
inputs:0,
|
||||
outputs:1,
|
||||
icon: "white-globe.png",
|
||||
icon: "white-globe.svg",
|
||||
label: function() {
|
||||
if (this.name) {
|
||||
return this.name;
|
||||
@@ -113,7 +113,7 @@
|
||||
if(!RED.nodes.getType("swagger-doc")){
|
||||
$('.row-swagger-doc').hide();
|
||||
}
|
||||
$("#node-input-method").change(function() {
|
||||
$("#node-input-method").on("change", function() {
|
||||
if ($(this).val() === "post") {
|
||||
$(".form-row-http-in-upload").show();
|
||||
} else {
|
||||
@@ -152,7 +152,7 @@
|
||||
inputs:1,
|
||||
outputs:0,
|
||||
align: "right",
|
||||
icon: "white-globe.png",
|
||||
icon: "white-globe.svg",
|
||||
label: function() {
|
||||
return this.name||("http"+(this.statusCode?" ("+this.statusCode+")":""));
|
||||
},
|
||||
@@ -267,7 +267,7 @@
|
||||
oneditresize: function(size) {
|
||||
var rows = $("#dialog-form>div:not(.node-input-headers-container-row)");
|
||||
var height = size.height;
|
||||
for (var i=0; i<rows.size(); i++) {
|
||||
for (var i=0; i<rows.length; i++) {
|
||||
height -= $(rows[i]).outerHeight(true);
|
||||
}
|
||||
var editorRow = $("#dialog-form>div.node-input-headers-container-row");
|
||||
|
@@ -68,6 +68,11 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<input type="checkbox" id="node-input-persist" style="display: inline-block; width: auto; vertical-align: top;">
|
||||
<label for="node-input-persist" style="width: auto" data-i18n="httpin.persist"></label>
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<input type="checkbox" id="node-input-useProxy" style="display: inline-block; width: auto; vertical-align: top;">
|
||||
<label for="node-input-useProxy" style="width: auto;"><span data-i18n="httpin.use-proxy"></span></label>
|
||||
@@ -102,6 +107,7 @@
|
||||
paytoqs: {value: false},
|
||||
url:{value:"",validate:function(v) { return (v.trim().length === 0) || (v.indexOf("://") === -1) || (v.trim().indexOf("http") === 0)} },
|
||||
tls: {type:"tls-config",required: false},
|
||||
persist: {value:false},
|
||||
proxy: {type:"http proxy",required: false},
|
||||
authType: {value: ""}
|
||||
},
|
||||
@@ -118,7 +124,7 @@
|
||||
obj: this._("httpin.label.jsonObject")
|
||||
}[this.ret]);
|
||||
},
|
||||
icon: "white-globe.png",
|
||||
icon: "white-globe.svg",
|
||||
label: function() {
|
||||
return this.name||this._("httpin.httpreq");
|
||||
},
|
||||
@@ -126,7 +132,7 @@
|
||||
return this.name?"node_label_italic":"";
|
||||
},
|
||||
oneditprepare: function() {
|
||||
$("#node-input-useAuth").change(function() {
|
||||
$("#node-input-useAuth").on("change", function() {
|
||||
if ($(this).is(":checked")) {
|
||||
$(".node-input-useAuth-row").show();
|
||||
// Nodes (< version 0.20.x) with credentials but without authentication type, need type 'basic'
|
||||
@@ -140,7 +146,7 @@
|
||||
$('#node-input-password').val('');
|
||||
}
|
||||
});
|
||||
$("#node-input-authType-select").change(function() {
|
||||
$("#node-input-authType-select").on("change", function() {
|
||||
var val = $(this).val();
|
||||
$("#node-input-authType").val(val);
|
||||
if (val === "basic" || val === "digest") {
|
||||
@@ -154,7 +160,7 @@
|
||||
$('#node-input-user').val('');
|
||||
}
|
||||
});
|
||||
$("#node-input-method").change(function() {
|
||||
$("#node-input-method").on("change", function() {
|
||||
if ($(this).val() == "GET") {
|
||||
$(".node-input-paytoqs-row").show();
|
||||
} else {
|
||||
@@ -203,7 +209,7 @@
|
||||
updateProxyOptions();
|
||||
});
|
||||
|
||||
$("#node-input-ret").change(function() {
|
||||
$("#node-input-ret").on("change", function() {
|
||||
if ($("#node-input-ret").val() === "obj") {
|
||||
$("#tip-json").show();
|
||||
} else {
|
||||
|
@@ -29,6 +29,7 @@ module.exports = function(RED) {
|
||||
var isTemplatedUrl = (nodeUrl||"").indexOf("{{") != -1;
|
||||
var nodeMethod = n.method || "GET";
|
||||
var paytoqs = n.paytoqs;
|
||||
var nodeHTTPPersistent = n["persist"];
|
||||
if (n.tls) {
|
||||
var tlsNode = RED.nodes.getNode(n.tls);
|
||||
}
|
||||
@@ -50,7 +51,7 @@ module.exports = function(RED) {
|
||||
noprox = proxyConfig.noproxy;
|
||||
}
|
||||
|
||||
this.on("input",function(msg) {
|
||||
this.on("input",function(msg,nodeSend,nodeDone) {
|
||||
var preRequestTimestamp = process.hrtime();
|
||||
node.status({fill:"blue",shape:"dot",text:"httpin.status.requesting"});
|
||||
var url = nodeUrl || msg.url;
|
||||
@@ -62,12 +63,14 @@ module.exports = function(RED) {
|
||||
}
|
||||
if (!url) {
|
||||
node.error(RED._("httpin.errors.no-url"),msg);
|
||||
nodeDone();
|
||||
return;
|
||||
}
|
||||
// url must start http:// or https:// so assume http:// if not set
|
||||
if (url.indexOf("://") !== -1 && url.indexOf("http") !== 0) {
|
||||
node.warn(RED._("httpin.errors.invalid-transport"));
|
||||
node.status({fill:"red",shape:"ring",text:"httpin.errors.invalid-transport"});
|
||||
nodeDone();
|
||||
return;
|
||||
}
|
||||
if (!((url.indexOf("http://") === 0) || (url.indexOf("https://") === 0))) {
|
||||
@@ -94,6 +97,7 @@ module.exports = function(RED) {
|
||||
opts.maxRedirects = 21;
|
||||
opts.jar = request.jar();
|
||||
opts.proxy = null;
|
||||
opts.forever = nodeHTTPPersistent;
|
||||
if (msg.requestTimeout !== undefined) {
|
||||
if (isNaN(msg.requestTimeout)) {
|
||||
node.warn(RED._("httpin.errors.timeout-isnan"));
|
||||
@@ -261,10 +265,12 @@ module.exports = function(RED) {
|
||||
}
|
||||
} catch(err) {
|
||||
node.error(RED._("httpin.errors.invalid-payload"),msg);
|
||||
nodeDone();
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
node.error(RED._("httpin.errors.invalid-payload"),msg);
|
||||
nodeDone();
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -320,7 +326,8 @@ module.exports = function(RED) {
|
||||
}
|
||||
msg.payload = err.toString() + " : " + url;
|
||||
msg.statusCode = err.code;
|
||||
node.send(msg);
|
||||
nodeSend(msg);
|
||||
nodeDone();
|
||||
}else{
|
||||
msg.statusCode = res.statusCode;
|
||||
msg.headers = res.headers;
|
||||
@@ -354,7 +361,8 @@ module.exports = function(RED) {
|
||||
}
|
||||
}
|
||||
node.status({});
|
||||
node.send(msg);
|
||||
nodeSend(msg);
|
||||
nodeDone();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
@@ -42,7 +42,7 @@
|
||||
|
||||
function ws_oneditprepare() {
|
||||
$("#websocket-client-row").hide();
|
||||
$("#node-input-mode").change(function() {
|
||||
$("#node-input-mode").on("change", function() {
|
||||
if ( $("#node-input-mode").val() === 'client') {
|
||||
$("#websocket-server-row").hide();
|
||||
$("#websocket-client-row").show();
|
||||
@@ -106,7 +106,7 @@
|
||||
color:"rgb(215, 215, 160)",
|
||||
inputs:0,
|
||||
outputs:1,
|
||||
icon: "white-globe.png",
|
||||
icon: "white-globe.svg",
|
||||
labelStyle: function() {
|
||||
return this.name?"node_label_italic":"";
|
||||
},
|
||||
@@ -125,7 +125,7 @@
|
||||
color:"rgb(215, 215, 160)",
|
||||
inputs:1,
|
||||
outputs:0,
|
||||
icon: "white-globe.png",
|
||||
icon: "white-globe.svg",
|
||||
align: "right",
|
||||
labelStyle: function() {
|
||||
return this.name?"node_label_italic":"";
|
||||
|
@@ -178,6 +178,9 @@ module.exports = function(RED) {
|
||||
if (this.wholemsg) {
|
||||
try {
|
||||
msg = JSON.parse(data);
|
||||
if (typeof msg !== "object" && !Array.isArray(msg) && (msg !== null)) {
|
||||
msg = { payload:msg };
|
||||
}
|
||||
}
|
||||
catch(err) {
|
||||
msg = { payload:data };
|
||||
@@ -194,20 +197,23 @@ module.exports = function(RED) {
|
||||
}
|
||||
|
||||
WebSocketListenerNode.prototype.broadcast = function(data) {
|
||||
try {
|
||||
if (this.isServer) {
|
||||
for (let client in this._clients) {
|
||||
if (this._clients.hasOwnProperty(client)) {
|
||||
if (this.isServer) {
|
||||
for (let client in this._clients) {
|
||||
if (this._clients.hasOwnProperty(client)) {
|
||||
try {
|
||||
this._clients[client].send(data);
|
||||
} catch(err) {
|
||||
this.warn(RED._("websocket.errors.send-error")+" "+client+" "+err.toString())
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
this.server.send(data);
|
||||
}
|
||||
}
|
||||
catch(e) { // swallow any errors
|
||||
this.warn("ws:"+i+" : "+e);
|
||||
else {
|
||||
try {
|
||||
this.server.send(data);
|
||||
} catch(err) {
|
||||
this.warn(RED._("websocket.errors.send-error")+" "+err.toString())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -303,7 +309,7 @@ module.exports = function(RED) {
|
||||
node.status(status);
|
||||
});
|
||||
}
|
||||
this.on("input", function(msg) {
|
||||
this.on("input", function(msg, nodeSend, nodeDone) {
|
||||
var payload;
|
||||
if (this.serverConfig.wholemsg) {
|
||||
var sess;
|
||||
@@ -331,6 +337,7 @@ module.exports = function(RED) {
|
||||
});
|
||||
}
|
||||
}
|
||||
nodeDone();
|
||||
});
|
||||
this.on('close', function() {
|
||||
node.status({});
|
||||
|
@@ -42,7 +42,7 @@
|
||||
color:"BurlyWood",
|
||||
inputs:0,
|
||||
outputs:1,
|
||||
icon: "watch.png",
|
||||
icon: "watch.svg",
|
||||
label: function() {
|
||||
return this.name||this.files||this._("watch.watch");
|
||||
},
|
||||
|
@@ -72,7 +72,7 @@
|
||||
},
|
||||
inputs:0,
|
||||
outputs:1,
|
||||
icon: "bridge-dash.png",
|
||||
icon: "bridge-dash.svg",
|
||||
label: function() {
|
||||
return this.name || "tcp:"+(this.host?this.host+":":"")+this.port;
|
||||
},
|
||||
@@ -155,7 +155,7 @@
|
||||
},
|
||||
inputs:1,
|
||||
outputs:0,
|
||||
icon: "bridge-dash.png",
|
||||
icon: "bridge-dash.svg",
|
||||
align: "right",
|
||||
label: function() {
|
||||
return this.name || "tcp:"+(this.host?this.host+":":"")+this.port;
|
||||
@@ -226,7 +226,7 @@
|
||||
},
|
||||
inputs:1,
|
||||
outputs:1,
|
||||
icon: "bridge-dash.png",
|
||||
icon: "bridge-dash.svg",
|
||||
label: function() {
|
||||
return this.name || "tcp:"+(this.server?this.server+":":"")+this.port;
|
||||
},
|
||||
@@ -235,7 +235,7 @@
|
||||
},
|
||||
oneditprepare: function() {
|
||||
var previous = null;
|
||||
$("#node-input-out").on('focus', function () { previous = this.value; }).change(function() {
|
||||
$("#node-input-out").on('focus', function () { previous = this.value; }).on("change", function() {
|
||||
if (previous === null) { previous = $("#node-input-out").val(); }
|
||||
if ($("#node-input-out").val() == "char") {
|
||||
if (previous != "char") { $("#node-input-splitc").val("\\n"); }
|
||||
|
@@ -33,7 +33,7 @@ module.exports = function(RED) {
|
||||
*/
|
||||
const enqueue = (queue, item) => {
|
||||
// drop msgs from front of queue if size is going to be exceeded
|
||||
if (queue.size() === msgQueueSize) { queue.shift(); }
|
||||
if (queue.length === msgQueueSize) { queue.shift(); }
|
||||
queue.push(item);
|
||||
return queue;
|
||||
};
|
||||
@@ -132,7 +132,7 @@ module.exports = function(RED) {
|
||||
reconnectTimeout = setTimeout(setupTcpClient, reconnectTime);
|
||||
}
|
||||
} else {
|
||||
if (node.done) { node.done(); }
|
||||
if (node.doneClose) { node.doneClose(); }
|
||||
}
|
||||
});
|
||||
client.on('error', function(err) {
|
||||
@@ -142,7 +142,7 @@ module.exports = function(RED) {
|
||||
setupTcpClient();
|
||||
|
||||
this.on('close', function(done) {
|
||||
node.done = done;
|
||||
node.doneClose = done;
|
||||
this.closing = true;
|
||||
if (client) { client.destroy(); }
|
||||
clearTimeout(reconnectTimeout);
|
||||
@@ -305,13 +305,13 @@ module.exports = function(RED) {
|
||||
reconnectTimeout = setTimeout(setupTcpClient,reconnectTime);
|
||||
}
|
||||
} else {
|
||||
if (node.done) { node.done(); }
|
||||
if (node.doneClose) { node.doneClose(); }
|
||||
}
|
||||
});
|
||||
}
|
||||
setupTcpClient();
|
||||
|
||||
node.on("input", function(msg) {
|
||||
node.on("input", function(msg,nodeSend,nodeDone) {
|
||||
if (node.connected && msg.payload != null) {
|
||||
if (Buffer.isBuffer(msg.payload)) {
|
||||
client.write(msg.payload);
|
||||
@@ -325,10 +325,11 @@ module.exports = function(RED) {
|
||||
if (client) { node.status({}); client.destroy(); }
|
||||
}
|
||||
}
|
||||
nodeDone();
|
||||
});
|
||||
|
||||
node.on("close", function(done) {
|
||||
node.done = done;
|
||||
node.doneClose = done;
|
||||
this.closing = true;
|
||||
if (client) { client.destroy(); }
|
||||
clearTimeout(reconnectTimeout);
|
||||
@@ -337,7 +338,7 @@ module.exports = function(RED) {
|
||||
|
||||
}
|
||||
else if (node.beserver == "reply") {
|
||||
node.on("input",function(msg) {
|
||||
node.on("input",function(msg, nodeSend, nodeDone) {
|
||||
if (msg._session && msg._session.type == "tcp") {
|
||||
var client = connectionPool[msg._session.id];
|
||||
if (client) {
|
||||
@@ -361,6 +362,7 @@ module.exports = function(RED) {
|
||||
}
|
||||
}
|
||||
}
|
||||
nodeDone();
|
||||
});
|
||||
}
|
||||
else {
|
||||
@@ -389,7 +391,7 @@ module.exports = function(RED) {
|
||||
});
|
||||
});
|
||||
|
||||
node.on("input", function(msg) {
|
||||
node.on("input", function(msg, nodeSend, nodeDone) {
|
||||
if (msg.payload != null) {
|
||||
var buffer;
|
||||
if (Buffer.isBuffer(msg.payload)) {
|
||||
@@ -404,6 +406,7 @@ module.exports = function(RED) {
|
||||
else { connectedSockets[i].write(buffer); }
|
||||
}
|
||||
}
|
||||
nodeDone();
|
||||
});
|
||||
|
||||
server.on('error', function(err) {
|
||||
@@ -461,7 +464,7 @@ module.exports = function(RED) {
|
||||
|
||||
var clients = {};
|
||||
|
||||
this.on("input", function(msg) {
|
||||
this.on("input", function(msg, nodeSend, nodeDone) {
|
||||
var i = 0;
|
||||
if ((!Buffer.isBuffer(msg.payload)) && (typeof msg.payload !== "string")) {
|
||||
msg.payload = msg.payload.toString();
|
||||
@@ -483,7 +486,7 @@ module.exports = function(RED) {
|
||||
connected: false,
|
||||
connecting: false
|
||||
};
|
||||
enqueue(clients[connection_id].msgQueue, msg);
|
||||
enqueue(clients[connection_id].msgQueue, {msg:msg,nodeSend:nodeSend, nodeDone: nodeDone});
|
||||
clients[connection_id].lastMsg = msg;
|
||||
|
||||
if (!clients[connection_id].connecting && !clients[connection_id].connected) {
|
||||
@@ -505,9 +508,10 @@ module.exports = function(RED) {
|
||||
if (clients[connection_id] && clients[connection_id].client) {
|
||||
clients[connection_id].connected = true;
|
||||
clients[connection_id].connecting = false;
|
||||
let msg;
|
||||
while (msg = dequeue(clients[connection_id].msgQueue)) {
|
||||
clients[connection_id].client.write(msg.payload);
|
||||
let event;
|
||||
while (event = dequeue(clients[connection_id].msgQueue)) {
|
||||
clients[connection_id].client.write(event.msg.payload);
|
||||
event.nodeDone();
|
||||
}
|
||||
if (node.out === "time" && node.splitc < 0) {
|
||||
clients[connection_id].connected = clients[connection_id].connecting = false;
|
||||
@@ -527,7 +531,7 @@ module.exports = function(RED) {
|
||||
if (clients[connection_id]) {
|
||||
const msg = clients[connection_id].lastMsg || {};
|
||||
msg.payload = data;
|
||||
node.send(RED.util.cloneMessage(msg));
|
||||
nodeSend(RED.util.cloneMessage(msg));
|
||||
}
|
||||
}
|
||||
// else if (node.splitc === 0) {
|
||||
@@ -550,7 +554,7 @@ module.exports = function(RED) {
|
||||
const msg = clients[connection_id].lastMsg || {};
|
||||
msg.payload = Buffer.alloc(i+1);
|
||||
buf.copy(msg.payload,0,0,i+1);
|
||||
node.send(msg);
|
||||
nodeSend(msg);
|
||||
if (clients[connection_id].client) {
|
||||
node.status({});
|
||||
clients[connection_id].client.destroy();
|
||||
@@ -572,7 +576,7 @@ module.exports = function(RED) {
|
||||
const msg = clients[connection_id].lastMsg || {};
|
||||
msg.payload = Buffer.alloc(i);
|
||||
buf.copy(msg.payload,0,0,i);
|
||||
node.send(msg);
|
||||
nodeSend(msg);
|
||||
if (clients[connection_id].client) {
|
||||
node.status({});
|
||||
clients[connection_id].client.destroy();
|
||||
@@ -591,7 +595,7 @@ module.exports = function(RED) {
|
||||
const msg = clients[connection_id].lastMsg || {};
|
||||
msg.payload = Buffer.alloc(i);
|
||||
buf.copy(msg.payload,0,0,i);
|
||||
node.send(msg);
|
||||
nodeSend(msg);
|
||||
if (clients[connection_id].client) {
|
||||
node.status({});
|
||||
clients[connection_id].client.destroy();
|
||||
@@ -628,9 +632,9 @@ module.exports = function(RED) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (node.done && !anyConnected) {
|
||||
if (node.doneClose && !anyConnected) {
|
||||
clients = {};
|
||||
node.done();
|
||||
node.doneClose();
|
||||
}
|
||||
});
|
||||
|
||||
@@ -663,13 +667,15 @@ module.exports = function(RED) {
|
||||
}
|
||||
else if (!clients[connection_id].connecting && clients[connection_id].connected) {
|
||||
if (clients[connection_id] && clients[connection_id].client) {
|
||||
clients[connection_id].client.write(dequeue(clients[connection_id].msgQueue).payload);
|
||||
let event = dequeue(clients[connection_id].msgQueue)
|
||||
clients[connection_id].client.write(event.msg.payload);
|
||||
event.nodeDone();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
this.on("close", function(done) {
|
||||
node.done = done;
|
||||
node.doneClose = done;
|
||||
for (var cl in clients) {
|
||||
if (clients[cl].hasOwnProperty("client")) {
|
||||
clients[cl].client.destroy();
|
||||
|
@@ -70,7 +70,7 @@
|
||||
},
|
||||
inputs:0,
|
||||
outputs:1,
|
||||
icon: "bridge-dash.png",
|
||||
icon: "bridge-dash.svg",
|
||||
label: function() {
|
||||
if (this.multicast=="false") {
|
||||
return this.name||"udp "+this.port;
|
||||
@@ -83,7 +83,7 @@
|
||||
return this.name?"node_label_italic":"";
|
||||
},
|
||||
oneditprepare: function() {
|
||||
$("#node-input-multicast").change(function() {
|
||||
$("#node-input-multicast").on("change", function() {
|
||||
var id = $("#node-input-multicast").val();
|
||||
if (id == "false") {
|
||||
$(".node-input-group").hide();
|
||||
@@ -103,7 +103,7 @@
|
||||
portsInUse = data || {};
|
||||
$('#udpporttip').html(porttip + data);
|
||||
});
|
||||
$("#node-input-port").change(function() {
|
||||
$("#node-input-port").on("change", function() {
|
||||
var portnew = $("#node-input-port").val();
|
||||
if (portsInUse.hasOwnProperty($("#node-input-port").val())) {
|
||||
RED.notify(alreadyused+" "+$("#node-input-port").val(),"warn");
|
||||
@@ -173,7 +173,7 @@
|
||||
},
|
||||
inputs:1,
|
||||
outputs:0,
|
||||
icon: "bridge-dash.png",
|
||||
icon: "bridge-dash.svg",
|
||||
align: "right",
|
||||
label: function() {
|
||||
return this.name||"udp "+(this.addr+":"+this.port);
|
||||
@@ -191,7 +191,7 @@
|
||||
var type = this.outport===""?"random":"fixed";
|
||||
$("#node-input-outport-type").val(type);
|
||||
|
||||
$("#node-input-outport-type").change(function() {
|
||||
$("#node-input-outport-type").on("change", function() {
|
||||
var type = $(this).val();
|
||||
if (type == "random") {
|
||||
$("#node-input-outport").val("").hide();
|
||||
@@ -201,7 +201,7 @@
|
||||
});
|
||||
$("#node-input-outport-type").change();
|
||||
|
||||
$("#node-input-multicast").change(function() {
|
||||
$("#node-input-multicast").on("change", function() {
|
||||
var id = $("#node-input-multicast").val();
|
||||
if (id === "multi") {
|
||||
$(".node-input-iface").show();
|
||||
|
@@ -223,16 +223,19 @@ module.exports = function(RED) {
|
||||
udpInputPortsInUse[p] = sock;
|
||||
}
|
||||
|
||||
node.on("input", function(msg) {
|
||||
node.on("input", function(msg, nodeSend, nodeDone) {
|
||||
if (msg.hasOwnProperty("payload")) {
|
||||
var add = node.addr || msg.ip || "";
|
||||
var por = node.port || msg.port || 0;
|
||||
if (add === "") {
|
||||
node.warn(RED._("udp.errors.ip-notset"));
|
||||
nodeDone();
|
||||
} else if (por === 0) {
|
||||
node.warn(RED._("udp.errors.port-notset"));
|
||||
nodeDone();
|
||||
} else if (isNaN(por) || (por < 1) || (por > 65535)) {
|
||||
node.warn(RED._("udp.errors.port-invalid"));
|
||||
nodeDone();
|
||||
} else {
|
||||
var message;
|
||||
if (node.base64) {
|
||||
@@ -247,6 +250,7 @@ module.exports = function(RED) {
|
||||
node.error("udp : "+err,msg);
|
||||
}
|
||||
message = null;
|
||||
nodeDone();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@@ -48,6 +48,7 @@
|
||||
{v:"lte",t:"<=",kind:'V'},
|
||||
{v:"gt",t:">",kind:'V'},
|
||||
{v:"gte",t:">=",kind:'V'},
|
||||
{v:"hask",t:"switch.rules.hask",kind:'V'},
|
||||
{v:"btwn",t:"switch.rules.btwn",kind:'V'},
|
||||
{v:"cont",t:"switch.rules.cont",kind:'V'},
|
||||
{v:"regex",t:"switch.rules.regex",kind:'V'},
|
||||
@@ -117,7 +118,7 @@
|
||||
return label;
|
||||
}
|
||||
},
|
||||
icon: "switch.png",
|
||||
icon: "switch.svg",
|
||||
label: function() {
|
||||
return this.name||this._("switch.switch");
|
||||
},
|
||||
@@ -128,7 +129,7 @@
|
||||
var node = this;
|
||||
var previousValueType = {value:"prev",label:this._("inject.previous"),hasValue:false};
|
||||
|
||||
$("#node-input-property").typedInput({default:this.propertyType||'msg',types:['msg','flow','global','jsonata']});
|
||||
$("#node-input-property").typedInput({default:this.propertyType||'msg',types:['msg','flow','global','jsonata','env']});
|
||||
var outputCount = $("#node-input-outputs").val("{}");
|
||||
|
||||
var andLabel = this._("switch.and");
|
||||
@@ -142,6 +143,7 @@
|
||||
var typeField = rule.find(".node-input-rule-type-value");
|
||||
var numField = rule.find(".node-input-rule-num-value");
|
||||
var expField = rule.find(".node-input-rule-exp-value");
|
||||
var keyField = rule.find(".node-input-rule-key-value");
|
||||
var btwnField1 = rule.find(".node-input-rule-btwn-value");
|
||||
var btwnField2 = rule.find(".node-input-rule-btwn-value2");
|
||||
var selectWidth;
|
||||
@@ -259,7 +261,7 @@
|
||||
finalspan.append(' → <span class="node-input-rule-index">'+(i+1)+'</span> ');
|
||||
var caseSensitive = $('<input/>',{id:"node-input-rule-case-"+i,class:"node-input-rule-case",type:"checkbox",style:"width:auto;vertical-align:top"}).appendTo(row2);
|
||||
$('<label/>',{for:"node-input-rule-case-"+i,style:"margin-left: 3px;"}).text(caseLabel).appendTo(row2);
|
||||
selectField.change(function() {
|
||||
selectField.on("change", function() {
|
||||
var type = selectField.val();
|
||||
if (valueField){
|
||||
valueField.typedInput('hide');
|
||||
@@ -352,6 +354,7 @@
|
||||
if (!expValueField){
|
||||
expValueField = createExpValueField();
|
||||
}
|
||||
} else if (rule.t === "jsonata_exp") {
|
||||
expValueField.typedInput('value',rule.v);
|
||||
expValueField.typedInput('type',rule.vt||'jsonata');
|
||||
} else if (typeof rule.v != "undefined") {
|
||||
@@ -446,7 +449,7 @@
|
||||
oneditresize: function(size) {
|
||||
var rows = $("#dialog-form>div:not(.node-input-rule-container-row)");
|
||||
var height = size.height;
|
||||
for (var i=0;i<rows.size();i++) {
|
||||
for (var i=0;i<rows.length;i++) {
|
||||
height -= $(rows[i]).outerHeight(true);
|
||||
}
|
||||
var editorRow = $("#dialog-form>div.node-input-rule-container-row");
|
||||
|
@@ -47,7 +47,6 @@ module.exports = function(RED) {
|
||||
}
|
||||
return false;
|
||||
},
|
||||
|
||||
'istype': function(a, b) {
|
||||
if (b === "array") { return Array.isArray(a); }
|
||||
else if (b === "buffer") { return Buffer.isBuffer(a); }
|
||||
@@ -72,6 +71,9 @@ module.exports = function(RED) {
|
||||
var index = parts.index;
|
||||
return ((min <= index) && (index <= max));
|
||||
},
|
||||
'hask': function(a, b) {
|
||||
return (typeof b !== "object" ) && a.hasOwnProperty(b+"");
|
||||
},
|
||||
'jsonata_exp': function(a, b) { return (b === true); },
|
||||
'else': function(a) { return a === true; }
|
||||
};
|
||||
|
@@ -28,7 +28,7 @@
|
||||
},
|
||||
inputs: 1,
|
||||
outputs: 1,
|
||||
icon: "swap.png",
|
||||
icon: "swap.svg",
|
||||
label: function() {
|
||||
function prop2name(type, key) {
|
||||
var result = RED.utils.parseContextKey(key);
|
||||
@@ -151,7 +151,7 @@
|
||||
.appendTo(row4)
|
||||
.typedInput({default:'msg',types:['msg','flow','global']});
|
||||
|
||||
selectField.change(function() {
|
||||
selectField.on("change", function() {
|
||||
var width = $("#node-input-rule-container").width();
|
||||
var type = $(this).val();
|
||||
if (type == "set") {
|
||||
@@ -254,7 +254,7 @@
|
||||
oneditresize: function(size) {
|
||||
var rows = $("#dialog-form>div:not(.node-input-rule-container-row)");
|
||||
var height = size.height;
|
||||
for (var i=0; i<rows.size(); i++) {
|
||||
for (var i=0; i<rows.length; i++) {
|
||||
height -= $(rows[i]).outerHeight(true);
|
||||
}
|
||||
var editorRow = $("#dialog-form>div.node-input-rule-container-row");
|
||||
|
@@ -328,13 +328,14 @@ module.exports = function(RED) {
|
||||
}
|
||||
|
||||
if (valid) {
|
||||
this.on('input', function(msg) {
|
||||
this.on('input', function(msg, send, done) {
|
||||
applyRules(msg, 0, (err,msg) => {
|
||||
if (err) {
|
||||
node.error(err,msg);
|
||||
} else if (msg) {
|
||||
node.send(msg);
|
||||
send(msg);
|
||||
}
|
||||
done();
|
||||
})
|
||||
});
|
||||
}
|
||||
|
@@ -52,7 +52,7 @@
|
||||
},
|
||||
inputs: 1,
|
||||
outputs: 1,
|
||||
icon: "range.png",
|
||||
icon: "range.svg",
|
||||
label: function() {
|
||||
if (this.minout !== "" && this.maxout !== "") { return this.name||this.minout + " - " + this.maxout; }
|
||||
else { return this.name||this._("range.range"); }
|
||||
|
@@ -61,7 +61,7 @@
|
||||
},
|
||||
inputs:1,
|
||||
outputs:1,
|
||||
icon: "split.png",
|
||||
icon: "split.svg",
|
||||
label: function() {
|
||||
return this.name||this._("split.split");
|
||||
},
|
||||
@@ -93,7 +93,7 @@
|
||||
types:['msg']
|
||||
});
|
||||
|
||||
$("#node-input-addname-cb").change(function() {
|
||||
$("#node-input-addname-cb").on("change", function() {
|
||||
$("#node-input-addname").prop('disabled',!this.checked);
|
||||
})
|
||||
if (this.addname === "") {
|
||||
@@ -218,7 +218,7 @@
|
||||
},
|
||||
inputs:1,
|
||||
outputs:1,
|
||||
icon: "join.png",
|
||||
icon: "join.svg",
|
||||
label: function() {
|
||||
return this.name||this._("join.join");
|
||||
},
|
||||
@@ -228,7 +228,7 @@
|
||||
oneditprepare: function() {
|
||||
var node = this;
|
||||
|
||||
$("#node-input-mode").change(function(e) {
|
||||
$("#node-input-mode").on("change", function(e) {
|
||||
var val = $(this).val();
|
||||
$(".node-row-custom").toggle(val==='custom');
|
||||
$(".node-row-reduce").toggle(val==='reduce');
|
||||
@@ -275,7 +275,7 @@
|
||||
}
|
||||
});
|
||||
|
||||
$("#node-input-build").change(function(e) {
|
||||
$("#node-input-build").on("change", function(e) {
|
||||
var val = $(this).val();
|
||||
$(".node-row-key").toggle(val==='object');
|
||||
$(".node-row-accumulate").toggle(val==='object' || val==='merged');
|
||||
|
@@ -75,7 +75,7 @@
|
||||
},
|
||||
inputs:1,
|
||||
outputs:1,
|
||||
icon: "sort.png",
|
||||
icon: "sort.svg",
|
||||
label: function() {
|
||||
return this.name||this._("sort.sort");
|
||||
},
|
||||
@@ -108,7 +108,7 @@
|
||||
typeField: $("#node-input-seqKeyType"),
|
||||
types:['msg', 'jsonata']
|
||||
});
|
||||
$("#node-input-target").change(function(e) {
|
||||
$("#node-input-target").on("change", function(e) {
|
||||
var val = $("#node-input-target").typedInput('type');
|
||||
$(".node-row-sort-msg-key").toggle(val === "msg");
|
||||
$(".node-row-sort-seq-key").toggle(val === "seq");
|
||||
|
@@ -81,7 +81,7 @@
|
||||
},
|
||||
inputs:1,
|
||||
outputs:1,
|
||||
icon: "batch.png",
|
||||
icon: "batch.svg",
|
||||
label: function() {
|
||||
return this.name||this._("batch.batch");;
|
||||
},
|
||||
@@ -125,7 +125,7 @@
|
||||
$("#node-input-count").spinner({min:1});
|
||||
$("#node-input-overlap").spinner({min:0});
|
||||
$("#node-input-interval").spinner({min:1});
|
||||
$("#node-input-mode").change(function(e) {
|
||||
$("#node-input-mode").on("change", function(e) {
|
||||
var val = $(this).val();
|
||||
$(".node-row-msg-count").toggle(val==="count");
|
||||
$(".node-row-msg-overlap").toggle(val==="count");
|
||||
@@ -159,7 +159,7 @@
|
||||
oneditresize: function(size) {
|
||||
var rows = $("#dialog-form>div:not(.node-input-topics-container-row)");
|
||||
var height = size.height;
|
||||
for (var i = 0; i < rows.size(); i++) {
|
||||
for (var i = 0; i < rows.length; i++) {
|
||||
height -= $(rows[i]).outerHeight(true);
|
||||
}
|
||||
var editorRow = $("#dialog-form>div.node-input-topics-container-row");
|
||||
|
@@ -24,13 +24,15 @@
|
||||
</div>
|
||||
<hr align="middle"/>
|
||||
<div class="form-row">
|
||||
<label style="width:100%; border-bottom:1px solid #eee;"><span data-i18n="csv.label.c2o"></span></label>
|
||||
<label style="width:100%;"><span data-i18n="csv.label.c2o"></span></label>
|
||||
</div>
|
||||
<div class="form-row" style="padding-left:20px;">
|
||||
<label><i class="fa fa-sign-in"></i> <span data-i18n="csv.label.input"></span></label>
|
||||
<span data-i18n="csv.label.skip-s"></span> <input type="text" id="node-input-skip" style="width:30px; height:25px;"/> <span data-i18n="csv.label.skip-e"></span><br/>
|
||||
<label> </label>
|
||||
<input style="width:20px; vertical-align:baseline; margin-right:5px;" type="checkbox" id="node-input-hdrin"><label style="width:auto; margin-top:7px;" for="node-input-hdrin"><span data-i18n="csv.label.firstrow"></span>
|
||||
<input style="width:20px; vertical-align:baseline; margin-right:5px;" type="checkbox" id="node-input-hdrin"><label style="width:auto; margin-top:7px;" for="node-input-hdrin"><span data-i18n="csv.label.firstrow"></span></label><br/>
|
||||
<label> </label>
|
||||
<input style="width:20px; vertical-align:baseline; margin-right:5px;" type="checkbox" id="node-input-strings"><label style="width:auto; margin-top:7px;" for="node-input-strings"><span data-i18n="csv.label.usestrings"></span></label><br/>
|
||||
</div>
|
||||
<div class="form-row" style="padding-left:20px;">
|
||||
<label><i class="fa fa-sign-out"></i> <span data-i18n="csv.label.output"></span></label>
|
||||
@@ -40,7 +42,7 @@
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-row" style="margin-top:20px">
|
||||
<label style="width:100%; border-bottom:1px solid #eee;"><span data-i18n="csv.label.o2c"></span></label>
|
||||
<label style="width:100%;"><span data-i18n="csv.label.o2c"></span></label>
|
||||
</div>
|
||||
<div class="form-row" style="padding-left:20px;">
|
||||
<label><i class="fa fa-sign-in"></i> <span data-i18n="csv.label.output"></span></label>
|
||||
@@ -71,11 +73,12 @@
|
||||
multi: {value:"one",required:true},
|
||||
ret: {value:'\\n'},
|
||||
temp: {value:""},
|
||||
skip: {value:"0"}
|
||||
skip: {value:"0"},
|
||||
strings: {value:true}
|
||||
},
|
||||
inputs:1,
|
||||
outputs:1,
|
||||
icon: "parser-csv.png",
|
||||
icon: "parser-csv.svg",
|
||||
label: function() {
|
||||
return this.name||"csv";
|
||||
},
|
||||
@@ -83,7 +86,7 @@
|
||||
return this.name?"node_label_italic":"";
|
||||
},
|
||||
oneditprepare: function() {
|
||||
console.log(this.skip,$("#node-input-skip").val());
|
||||
if (this.strings === undefined) { this.strings = true; $("#node-input-strings").prop('checked', true); }
|
||||
if (this.skip === undefined) { this.skip = 0; $("#node-input-skip").val("0");}
|
||||
$("#node-input-skip").spinner({ min:0 });
|
||||
if (this.sep == "," || this.sep == "\\t" || this.sep == ";" || this.sep == ":" || this.sep == " " || this.sep == "#") {
|
||||
@@ -94,7 +97,7 @@
|
||||
$("#node-input-sep").val(this.sep);
|
||||
$("#node-input-sep").show();
|
||||
}
|
||||
$("#node-input-select-sep").change(function() {
|
||||
$("#node-input-select-sep").on("change", function() {
|
||||
var v = $("#node-input-select-sep").val();
|
||||
$("#node-input-sep").val(v);
|
||||
if (v == "") {
|
||||
|
@@ -30,6 +30,8 @@ module.exports = function(RED) {
|
||||
this.goodtmpl = true;
|
||||
this.skip = parseInt(n.skip || 0);
|
||||
this.store = [];
|
||||
this.parsestrings = n.strings;
|
||||
if (this.parsestrings === undefined) { this.parsestrings = true; }
|
||||
var tmpwarn = true;
|
||||
var node = this;
|
||||
|
||||
@@ -138,7 +140,7 @@ module.exports = function(RED) {
|
||||
var line = msg.payload;
|
||||
var linecount = 0;
|
||||
var tmp = "";
|
||||
var reg = /^[-]?(?!0\d)\d*\.?\d*(E-?\+?)?\d+$/i;
|
||||
var reg = /^[-]?(?!E)(?!0\d)\d*\.?\d*(E-?\+?)?\d+$/i;
|
||||
if (msg.hasOwnProperty("parts")) {
|
||||
linecount = msg.parts.index;
|
||||
if (msg.parts.index > node.skip) { first = false; }
|
||||
@@ -172,7 +174,7 @@ module.exports = function(RED) {
|
||||
else if ((line[i] === node.sep) && f) { // if it is the end of the line then finish
|
||||
if (!node.goodtmpl) { node.template[j] = "col"+(j+1); }
|
||||
if ( node.template[j] && (node.template[j] !== "") && (k[j] !== "" ) ) {
|
||||
if ( reg.test(k[j]) ) { k[j] = parseFloat(k[j]); }
|
||||
if ( (node.parsestrings === true) && reg.test(k[j]) ) { k[j] = parseFloat(k[j]); }
|
||||
o[node.template[j]] = k[j];
|
||||
}
|
||||
j += 1;
|
||||
@@ -182,7 +184,7 @@ module.exports = function(RED) {
|
||||
//console.log(j,k,o,k[j]);
|
||||
if (!node.goodtmpl) { node.template[j] = "col"+(j+1); }
|
||||
if ( node.template[j] && (node.template[j] !== "") && (k[j] !== "") ) {
|
||||
if ( reg.test(k[j]) ) { k[j] = parseFloat(k[j]); }
|
||||
if ( (node.parsestrings === true) && reg.test(k[j]) ) { k[j] = parseFloat(k[j]); }
|
||||
else { k[j].replace(/\r$/,''); }
|
||||
o[node.template[j]] = k[j];
|
||||
}
|
||||
@@ -203,7 +205,7 @@ module.exports = function(RED) {
|
||||
//console.log(j,k,o,k[j]);
|
||||
if (!node.goodtmpl) { node.template[j] = "col"+(j+1); }
|
||||
if ( node.template[j] && (node.template[j] !== "") && (k[j] !== "") ) {
|
||||
if ( reg.test(k[j]) ) { k[j] = parseFloat(k[j]); }
|
||||
if ( (node.parsestrings === true) && reg.test(k[j]) ) { k[j] = parseFloat(k[j]); }
|
||||
else { k[j].replace(/\r$/,''); }
|
||||
o[node.template[j]] = k[j];
|
||||
}
|
||||
|
@@ -49,7 +49,7 @@
|
||||
},
|
||||
inputs:1,
|
||||
outputs:1,
|
||||
icon: "parser-html.png",
|
||||
icon: "parser-html.svg",
|
||||
label: function() {
|
||||
return this.name||this.tag||"html";
|
||||
},
|
||||
|
@@ -18,7 +18,7 @@
|
||||
</div>
|
||||
<hr align="middle"/>
|
||||
<div class="form-row node-json-to-json-options">
|
||||
<label style="width:100%; border-bottom: 1px solid #eee;"><span data-i18n="json.label.o2j"></span></label>
|
||||
<label style="width:100%;"><span data-i18n="json.label.o2j"></span></label>
|
||||
</div>
|
||||
<div class="form-row node-json-to-json-options" style="padding-left: 20px;">
|
||||
<input style="width:20px; vertical-align:top; margin-right: 5px;" type="checkbox" id="node-input-pretty"><label style="width: auto;" for="node-input-pretty" data-i18n="json.label.pretty"></span>
|
||||
@@ -37,7 +37,7 @@
|
||||
},
|
||||
inputs:1,
|
||||
outputs:1,
|
||||
icon: "parser-json.png",
|
||||
icon: "parser-json.svg",
|
||||
label: function() {
|
||||
return this.name||"json";
|
||||
},
|
||||
@@ -49,7 +49,7 @@
|
||||
$("#node-input-property").val("payload");
|
||||
}
|
||||
$("#node-input-property").typedInput({default:'msg',types:['msg']});
|
||||
$("#node-input-action").change(function() {
|
||||
$("#node-input-action").on("change", function() {
|
||||
if (this.value === "" || this.value === "str") {
|
||||
$(".node-json-to-json-options").show();
|
||||
} else {
|
||||
|
@@ -10,7 +10,7 @@
|
||||
</div>
|
||||
<hr align="middle"/>
|
||||
<div class="form-row">
|
||||
<label style="width:100%; border-bottom: 1px solid #eee;"><span data-i18n="xml.label.x2o"></span></label>
|
||||
<label style="width:100%;"><span data-i18n="xml.label.x2o"></span></label>
|
||||
</div>
|
||||
<div class="form-row" style="padding-left: 20px;">
|
||||
<label style="width:250px;" for="node-input-attr" data-i18n="xml.label.represent"></label> <input type="text" id="node-input-attr" style="text-align:center; width:40px" placeholder="$">
|
||||
@@ -32,7 +32,7 @@
|
||||
},
|
||||
inputs:1,
|
||||
outputs:1,
|
||||
icon: "parser-xml.png",
|
||||
icon: "parser-xml.svg",
|
||||
label: function() {
|
||||
return this.name||"xml";
|
||||
},
|
||||
|
@@ -20,7 +20,7 @@
|
||||
},
|
||||
inputs:1,
|
||||
outputs:1,
|
||||
icon: "parser-yaml.png",
|
||||
icon: "parser-yaml.svg",
|
||||
label: function() {
|
||||
return this.name||"yaml";
|
||||
},
|
||||
|
@@ -205,7 +205,7 @@
|
||||
color:"BurlyWood",
|
||||
inputs:1,
|
||||
outputs:1,
|
||||
icon: "file-out.png",
|
||||
icon: "file-out.svg",
|
||||
label: function() {
|
||||
if (this.overwriteFile === "delete") {
|
||||
return this.name||this._("file.label.deletelabel",{file:this.filename});
|
||||
@@ -273,7 +273,7 @@
|
||||
outputLabels: function(i) {
|
||||
return (this._((this.format === "utf8") ? "file.label.utf8String" : "file.label.binaryBuffer"));
|
||||
},
|
||||
icon: "file-in.png",
|
||||
icon: "file-in.svg",
|
||||
label: function() {
|
||||
return this.name||this.filename||this._("file.label.filelabel");
|
||||
},
|
||||
|
@@ -34,8 +34,9 @@ module.exports = function(RED) {
|
||||
}
|
||||
return data.toString();
|
||||
}
|
||||
|
||||
|
||||
function FileNode(n) {
|
||||
// Write/delete a file
|
||||
RED.nodes.createNode(this,n);
|
||||
this.filename = n.filename;
|
||||
this.appendNewline = n.appendNewline;
|
||||
@@ -48,7 +49,7 @@ module.exports = function(RED) {
|
||||
node.closing = false;
|
||||
node.closeCallback = null;
|
||||
|
||||
function processMsg(msg, done) {
|
||||
function processMsg(msg,nodeSend, done) {
|
||||
var filename = node.filename || msg.filename || "";
|
||||
if ((!node.filename) && (!node.tout)) {
|
||||
node.tout = setTimeout(function() {
|
||||
@@ -68,7 +69,7 @@ module.exports = function(RED) {
|
||||
if (RED.settings.verbose) {
|
||||
node.log(RED._("file.status.deletedfile",{file:filename}));
|
||||
}
|
||||
node.send(msg);
|
||||
nodeSend(msg);
|
||||
}
|
||||
done();
|
||||
});
|
||||
@@ -101,7 +102,7 @@ module.exports = function(RED) {
|
||||
});
|
||||
wstream.on("open", function() {
|
||||
wstream.end(buf, function() {
|
||||
node.send(msg);
|
||||
nodeSend(msg);
|
||||
done();
|
||||
});
|
||||
})
|
||||
@@ -150,13 +151,13 @@ module.exports = function(RED) {
|
||||
if (node.filename) {
|
||||
// Static filename - write and reuse the stream next time
|
||||
node.wstream.write(buf, function() {
|
||||
node.send(msg);
|
||||
nodeSend(msg);
|
||||
done();
|
||||
});
|
||||
} else {
|
||||
// Dynamic filename - write and close the stream
|
||||
node.wstream.end(buf, function() {
|
||||
node.send(msg);
|
||||
nodeSend(msg);
|
||||
delete node.wstream;
|
||||
delete node.wstreamIno;
|
||||
done();
|
||||
@@ -169,12 +170,13 @@ module.exports = function(RED) {
|
||||
}
|
||||
}
|
||||
|
||||
function processQ(queue) {
|
||||
var msg = queue[0];
|
||||
processMsg(msg, function() {
|
||||
function processQueue(queue) {
|
||||
var event = queue[0];
|
||||
processMsg(event.msg, event.send, function() {
|
||||
event.done();
|
||||
queue.shift();
|
||||
if (queue.length > 0) {
|
||||
processQ(queue);
|
||||
processQueue(queue);
|
||||
}
|
||||
else if (node.closing) {
|
||||
closeNode();
|
||||
@@ -182,14 +184,19 @@ module.exports = function(RED) {
|
||||
});
|
||||
}
|
||||
|
||||
this.on("input", function(msg) {
|
||||
this.on("input", function(msg,nodeSend,nodeDone) {
|
||||
var msgQueue = node.msgQueue;
|
||||
if (msgQueue.push(msg) > 1) {
|
||||
msgQueue.push({
|
||||
msg: msg,
|
||||
send: nodeSend,
|
||||
done: nodeDone
|
||||
})
|
||||
if (msgQueue.length > 1) {
|
||||
// pending write exists
|
||||
return;
|
||||
}
|
||||
try {
|
||||
processQ(msgQueue);
|
||||
processQueue(msgQueue);
|
||||
}
|
||||
catch (e) {
|
||||
node.msgQueue = [];
|
||||
@@ -234,6 +241,7 @@ module.exports = function(RED) {
|
||||
|
||||
|
||||
function FileInNode(n) {
|
||||
// Read a file
|
||||
RED.nodes.createNode(this,n);
|
||||
this.filename = n.filename;
|
||||
this.format = n.format;
|
||||
@@ -248,13 +256,14 @@ module.exports = function(RED) {
|
||||
if (this.format === "stream") { this.chunk = true; }
|
||||
var node = this;
|
||||
|
||||
this.on("input",function(msg) {
|
||||
this.on("input",function(msg, nodeSend, nodeDone) {
|
||||
var filename = (node.filename || msg.filename || "").replace(/\t|\r|\n/g,'');
|
||||
if (!node.filename) {
|
||||
node.status({fill:"grey",shape:"dot",text:filename});
|
||||
}
|
||||
if (filename === "") {
|
||||
node.warn(RED._("file.errors.nofilename"));
|
||||
nodeDone();
|
||||
}
|
||||
else {
|
||||
msg.filename = filename;
|
||||
@@ -288,7 +297,7 @@ module.exports = function(RED) {
|
||||
parts:{index:count, ch:ch, type:type, id:msg._msgid}
|
||||
}
|
||||
count += 1;
|
||||
node.send(m);
|
||||
nodeSend(m);
|
||||
}
|
||||
spare = bits[i];
|
||||
}
|
||||
@@ -304,7 +313,7 @@ module.exports = function(RED) {
|
||||
getout = false;
|
||||
m.parts.count = count;
|
||||
}
|
||||
node.send(m);
|
||||
nodeSend(m);
|
||||
}
|
||||
}
|
||||
else {
|
||||
@@ -318,8 +327,9 @@ module.exports = function(RED) {
|
||||
var sendMessage = RED.util.cloneMessage(msg);
|
||||
delete sendMessage.payload;
|
||||
sendMessage.error = err;
|
||||
node.send(sendMessage);
|
||||
nodeSend(sendMessage);
|
||||
}
|
||||
nodeDone();
|
||||
})
|
||||
.on('end', function() {
|
||||
if (node.chunk === false) {
|
||||
@@ -327,7 +337,7 @@ module.exports = function(RED) {
|
||||
msg.payload = decode(lines, node.encoding);
|
||||
}
|
||||
else { msg.payload = lines; }
|
||||
node.send(msg);
|
||||
nodeSend(msg);
|
||||
}
|
||||
else if (node.format === "lines") {
|
||||
var m = { payload: spare,
|
||||
@@ -339,12 +349,13 @@ module.exports = function(RED) {
|
||||
id: msg._msgid
|
||||
}
|
||||
};
|
||||
node.send(m);
|
||||
nodeSend(m);
|
||||
}
|
||||
else if (getout) { // last chunk same size as high water mark - have to send empty extra packet.
|
||||
var m = { parts:{index:count, count:count, ch:ch, type:type, id:msg._msgid} };
|
||||
node.send(m);
|
||||
nodeSend(m);
|
||||
}
|
||||
nodeDone();
|
||||
});
|
||||
}
|
||||
});
|
||||
|
Before Width: | Height: | Size: 308 B |
1
packages/node_modules/@node-red/nodes/icons/alert.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="40" height="60" xmlns="http://www.w3.org/2000/svg"><g transform="translate(-216.74 -415.04) scale(.62143)" fill="#fff"><path d="M371.3 683.97l1.61-1.61H389l1.61 1.61-3.219 40.23-3.218 3.218h-6.437l-3.219-3.218z"/><rect x="372.91" y="735.47" width="16.092" height="16.092" ry="3.017" color="#000"/></g></svg>
|
After Width: | Height: | Size: 320 B |
Before Width: | Height: | Size: 393 B |
1
packages/node_modules/@node-red/nodes/icons/arrow-in.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="40" height="60" xmlns="http://www.w3.org/2000/svg"><path d="M18 5v12H7v26h11v12l14-25z" fill="#fff"/></svg>
|
After Width: | Height: | Size: 120 B |
Before Width: | Height: | Size: 712 B |
1
packages/node_modules/@node-red/nodes/icons/batch.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="40" height="60" xmlns="http://www.w3.org/2000/svg"><g fill="#fff" stroke-width=".612"><path d="M34.001 27.987l-4 .004v3.997l4-.01M40.001 27.987l-4 .004v3.997l4-.01M26.001 29.987l-7-7.986v15.986M34.001 13.987l-4 .004v3.997l4-.01M40.001 13.987l-4 .004v3.997l4-.01M34.001 41.988l-4 .003v3.997l4-.01M40.001 41.988l-4 .003v3.997l4-.01M8.001 27.987l-4 .004v3.997l4-.01M14.001 27.987l-4 .004v3.997l4-.01M8.001 19.987l-4 .004v3.997l4-.01M14.001 19.987l-4 .004v3.997l4-.01M8.001 35.987l-4 .004v3.997l4-.01M14.001 35.987l-4 .004v3.997l4-.01"/></g></svg>
|
After Width: | Height: | Size: 556 B |
Before Width: | Height: | Size: 508 B |
1
packages/node_modules/@node-red/nodes/icons/bridge-dash.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="40" height="60" xmlns="http://www.w3.org/2000/svg"><path d="M19.924 6.61c4.372 5.433 7.182 13.893 7.182 23.397 0 9.493-2.804 17.946-7.167 23.379m-4.294-38.39c5.645 9.417 7.172 20.944.024 29.993m-4.36-21.661c1.338 1.459 2.215 3.906 2.215 6.68 0 2.571-.755 4.863-1.931 6.346" fill="none" stroke="#fff" stroke-dasharray="14.096, 3.524" stroke-width="3.524"/></svg>
|
After Width: | Height: | Size: 374 B |
Before Width: | Height: | Size: 575 B |
1
packages/node_modules/@node-red/nodes/icons/bridge.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="40" height="60" xmlns="http://www.w3.org/2000/svg"><path d="M19.924 6.61c4.372 5.433 7.182 13.893 7.182 23.397 0 9.493-2.804 17.946-7.167 23.379m-4.294-38.39c5.645 9.417 7.172 20.944.024 29.993m-4.36-21.661c1.338 1.459 2.215 3.906 2.215 6.68 0 2.571-.755 4.863-1.931 6.346" fill="none" stroke="#fff" stroke-width="3.224"/></svg>
|
After Width: | Height: | Size: 340 B |
BIN
packages/node_modules/@node-red/nodes/icons/cog.png
vendored
Before Width: | Height: | Size: 493 B |
1
packages/node_modules/@node-red/nodes/icons/cog.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="40" height="60" xmlns="http://www.w3.org/2000/svg"><path d="M20 12a18 18 0 0 0-3.494.36l-1.428 5.715-5.06-3.036a18 18 0 0 0-4.946 4.917l3.045 5.078-5.765 1.442A18 18 0 0 0 2 30a18 18 0 0 0 .345 3.434l5.775 1.444-3.072 5.12a18 18 0 0 0 4.893 4.924l5.137-3.083 1.455 5.82A18 18 0 0 0 20 48a18 18 0 0 0 3.47-.353l1.452-5.807 5.128 3.076a18 18 0 0 0 4.905-4.913l-3.074-5.124 5.783-1.446A18 18 0 0 0 38 30a18 18 0 0 0-.367-3.529l-5.75-1.437 3.041-5.069a18 18 0 0 0-4.937-4.928l-5.065 3.038-1.433-5.728A18 18 0 0 0 20 12zm0 9a9 9 0 0 1 9 9 9 9 0 0 1-9 9 9 9 0 0 1-9-9 9 9 0 0 1 9-9z" color="#000" fill="#fff" opacity=".98" style="isolation:auto;mix-blend-mode:normal"/></svg>
|
After Width: | Height: | Size: 682 B |
Before Width: | Height: | Size: 601 B |
1
packages/node_modules/@node-red/nodes/icons/comment.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="40" height="60" xmlns="http://www.w3.org/2000/svg"><path d="M36.19 28.6c0 6.088-7.289 11.024-16.28 11.024a23.98 23.98 0 0 1-2.982-.185c-1.272-.159-7.933 7.526-13.113 6.53.18-2.004 8.18-6.004 5.87-8.79C5.993 35.16 3.63 32.066 3.63 28.6c0-6.088 7.289-11.024 16.28-11.024 8.991 0 16.28 4.936 16.28 11.024z" fill="#fff" stroke="#868686" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" style="isolation:auto;mix-blend-mode:normal"/></svg>
|
After Width: | Height: | Size: 464 B |
BIN
packages/node_modules/@node-red/nodes/icons/db.png
vendored
Before Width: | Height: | Size: 459 B |
1
packages/node_modules/@node-red/nodes/icons/db.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="40" height="60" xmlns="http://www.w3.org/2000/svg"><g transform="translate(-355 -704.36)"><ellipse transform="matrix(1.2868 0 0 1.9263 -64.444 -607.56)" cx="341.25" cy="688.61" rx="9.84" ry="3.25" color="#000" fill="#fff"/><path d="M387.32 750.48c0 1.949-5.669 5.879-12.662 5.879s-12.662-3.93-12.662-5.879v-27.043c0 1.949 5.669 6.242 12.662 6.242s12.662-4.293 12.662-6.242v27.043" color="#000" fill="#fff"/></g></svg>
|
After Width: | Height: | Size: 430 B |
Before Width: | Height: | Size: 218 B |
1
packages/node_modules/@node-red/nodes/icons/debug.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="40" height="60" xmlns="http://www.w3.org/2000/svg"><path d="M10.004 14.499h20M10.004 46.503h20M10.004 22.5h20M10.004 30.501h20M10.004 38.502h20" stroke="#fff" stroke-width="2.9997000000000003"/></svg>
|
After Width: | Height: | Size: 213 B |
Before Width: | Height: | Size: 324 B |
1
packages/node_modules/@node-red/nodes/icons/envelope.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="40" height="60" xmlns="http://www.w3.org/2000/svg"><g fill="#fff"><path d="M20 32.96l-18-18h36z"/><path d="M2 20.36l18 18 18-18v26.1H2z"/></g></svg>
|
After Width: | Height: | Size: 161 B |
BIN
packages/node_modules/@node-red/nodes/icons/feed.png
vendored
Before Width: | Height: | Size: 378 B |
1
packages/node_modules/@node-red/nodes/icons/feed.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="40" height="60" xmlns="http://www.w3.org/2000/svg"><g fill="#b85c5c" stroke="#000"><path color="#000" d="M-.01-.004h39.998v60H-.01z" fill="none" stroke="none"/><g transform="translate(-450.266 -585.37)"><rect x="464.27" y="625.37" width="12" height="12" ry="2.4" color="#000" fill="#fff" stroke="none"/><g fill="none" stroke="#fff" stroke-width="4"><path d="M461.27 618.87l5.5-2.5h7l5.5 2.5M459.27 608.87l5.5-2.5h11l5.5 2.5M457.27 598.87l5.5-2.5h15l5.5 2.5"/></g></g></g></svg>
|
After Width: | Height: | Size: 489 B |
Before Width: | Height: | Size: 542 B |
1
packages/node_modules/@node-red/nodes/icons/file-in.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="40" height="60" xmlns="http://www.w3.org/2000/svg"><path color="#000" fill="none" d="M0-.04h40v60H0z"/><g fill="#fff"><path d="M5 9.96h14v16h9v7H18v10h10v7H5z"/><path d="M22 9.96l13 13H22z"/><path d="M28 25.96h7v6l5 6-4.987 6-.013 6h-7l10-12z" fill-rule="evenodd"/></g></svg>
|
After Width: | Height: | Size: 287 B |
Before Width: | Height: | Size: 503 B |
1
packages/node_modules/@node-red/nodes/icons/file-out.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="40" height="60" xmlns="http://www.w3.org/2000/svg"><path color="#000" fill="none" d="M0-.04h40v60H0z"/><g fill="#fff"><path d="M5 9.96h14v16h16v24H5v-7h5v7l10-12-10-12v7H5z"/><path d="M22 9.96l13 13H22z"/></g><path d="M5 30.96H0v14h5v-2H2v-10h3z" fill="#fff" fill-rule="evenodd"/></svg>
|
After Width: | Height: | Size: 298 B |
BIN
packages/node_modules/@node-red/nodes/icons/file.png
vendored
Before Width: | Height: | Size: 255 B |
1
packages/node_modules/@node-red/nodes/icons/file.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="40" height="60" xmlns="http://www.w3.org/2000/svg"><g fill="#fff"><path d="M5 10h14v16h16v24H5z"/><path d="M22 10l13 13H22z"/></g></svg>
|
After Width: | Height: | Size: 149 B |
Before Width: | Height: | Size: 457 B |
1
packages/node_modules/@node-red/nodes/icons/function.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="40" height="60" xmlns="http://www.w3.org/2000/svg"><path d="M30.999 31.005v-3h-6.762s.812-12.397 1.162-14 .597-3.35 2.628-3.103 1.971 3.103 1.971 3.103l4.862-.016s-.783-3.984-2.783-5.984-7.946-1.7-9.633.03c-1.687 1.73-2.302 5.065-2.597 6.422-.588 4.5-.854 9.027-1.248 13.547h-8.6v3H18.1s-.812 12.398-1.162 14-.597 3.35-2.628 3.103-1.972-3.102-1.972-3.102l-4.862.015s.783 3.985 2.783 5.985c2 2 7.946 1.699 9.634-.031 1.687-1.73 2.302-5.065 2.597-6.422.587-4.5.854-9.027 1.248-13.547z" fill="#fff"/></svg>
|
After Width: | Height: | Size: 516 B |
BIN
packages/node_modules/@node-red/nodes/icons/hash.png
vendored
Before Width: | Height: | Size: 502 B |
1
packages/node_modules/@node-red/nodes/icons/hash.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="40" height="60" xmlns="http://www.w3.org/2000/svg"><g fill="#fff" stroke-width=".857"><path d="M17.997 8.998l-5.972.072-4.028 43.928 5.914.072z"/><path d="M6 16.999l-1 6 31 1 1-6z"/><path d="M31.996 8.998l-5.971.072-4.029 43.928 5.914.072z"/><path d="M3.998 37.004l-1 6 31 1 1-6z"/></g></svg>
|
After Width: | Height: | Size: 305 B |
Before Width: | Height: | Size: 449 B |
1
packages/node_modules/@node-red/nodes/icons/inject.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="40" height="60" xmlns="http://www.w3.org/2000/svg"><path d="M18 5v12H7v9h15v-7l6 11-6 12v-8H7v9h11v12l14-25z" fill="#fff"/></svg>
|
After Width: | Height: | Size: 142 B |
BIN
packages/node_modules/@node-red/nodes/icons/join.png
vendored
Before Width: | Height: | Size: 253 B |
1
packages/node_modules/@node-red/nodes/icons/join.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="40" height="60" xmlns="http://www.w3.org/2000/svg"><path d="M40.001 39.99l-.032-19.955-11.967.017v19.983l12-.046M8.001 28.027l-4 .004v3.997l4-.01M14.001 28.027l-4 .004v3.997l4-.01M25.001 30.027l-7-7.986v15.986M8.001 20.027l-4 .004v3.996l4-.01M14.001 20.027l-4 .004v3.996l4-.01M8.001 36.027l-4 .004v3.997l4-.01M14.001 36.027l-4 .004v3.997l4-.01" fill="#fff" stroke-width=".612"/></svg>
|
After Width: | Height: | Size: 397 B |
Before Width: | Height: | Size: 639 B |
1
packages/node_modules/@node-red/nodes/icons/light.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="40" height="60" xmlns="http://www.w3.org/2000/svg"><g transform="matrix(.78737 0 0 .78793 -271.294 -529.99)" stroke="#fff" fill="none"><ellipse transform="matrix(1.4924 0 0 1.4616 -59.491 -343.46)" cx="287.75" cy="715.86" rx="10.75" ry="12" color="#000" stroke-width="4.071"/><path d="M362.5 717.86v15.5c6.371 2.128 8.712 2.003 15 0v-15.5" stroke-linejoin="round" stroke-width="5.01"/><path d="M366.5 717.86l1-12h5l1 12" stroke-linecap="round" stroke-linejoin="round" stroke-width="3.006"/></g></svg>
|
After Width: | Height: | Size: 513 B |
Before Width: | Height: | Size: 402 B |
1
packages/node_modules/@node-red/nodes/icons/link-out.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="40" height="60" xmlns="http://www.w3.org/2000/svg"><path d="M7 38.98v3.983h11v12l13-23H19l-.463.017c-1.28 4.048-5.066 6.983-9.537 6.983zm12-11.017h12l-13-23v12H7V20.9l2 .064c4.467 0 8.25 2.93 9.534 6.972zM6.95 24.22a6 6 0 1 1-.083 11.456" fill="#fff" style="isolation:auto;mix-blend-mode:normal"/></svg>
|
After Width: | Height: | Size: 316 B |
Before Width: | Height: | Size: 413 B |
1
packages/node_modules/@node-red/nodes/icons/parser-csv.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="40" height="60" xmlns="http://www.w3.org/2000/svg"><path d="M26.001 7.034l-22 .043v45.958h32v-36zm-14.838 14h2.838v15.001h-3V25.738c-1.027.96-2.606 1.114-4 1.574V24.76c.734-.24 1.53-.706 2.39-1.373.861-.673 1.452-1.457 1.772-2.351zm15.948 0c1.448 0 2.824.392 3.65 1.173.828.78 1.24 1.751 1.24 2.912 0 .66-.12 1.29-.36 1.89a7.143 7.143 0 0 1-1.05 1.872c-.34.433-.952 1.057-1.84 1.87-.886.815-1.687 1.355-1.927 1.622-.233.267-.423.408-.57.662h5.748v3H21.98c.107-.987.427-2.192.96-3.072.534-.887 1.825-2.06 3.4-3.522 1.267-1.18 1.972-1.982 2.259-2.402.387-.58.402-1.154.402-1.721 0-.627.008-1.108-.332-1.441-.333-.34-1.035-.51-1.629-.51-.587 0-1.053.178-1.4.531-.347.354-.546 1.316-.6 2.137h-3.039c.167-1.548.928-3.315 1.809-3.989.88-.673 1.98-1.011 3.3-1.011zM17.002 33.036h3v1.928c0 .814-.073 1.455-.213 1.922-.14.473-.407.898-.8 1.271-.387.374-.88.666-1.481.88l-.549-1.161c.567-.187.969-.443 1.21-.77.24-.327.367-.503.38-1.07h-1.547z" fill="#fff" stroke="none" stroke-width=".612"/></svg>
|
After Width: | Height: | Size: 1001 B |
Before Width: | Height: | Size: 393 B |
1
packages/node_modules/@node-red/nodes/icons/parser-html.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="40" height="60" xmlns="http://www.w3.org/2000/svg"><path d="M26.001 7.034l-22 .043v45.958h32v-36zm-13 13l3 2-6 8 6 8.001-3 2-7-10zm13 0l7 10-7 10.001-3-2 6-8-6-8z" fill="#fff" stroke="none" stroke-width=".612"/></svg>
|
After Width: | Height: | Size: 230 B |
Before Width: | Height: | Size: 467 B |
1
packages/node_modules/@node-red/nodes/icons/parser-json.svg
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="40" height="60" xmlns="http://www.w3.org/2000/svg"><path d="M26.001 7.034l-22 .043v45.958h32v-36zm-9.17 10.002h1.197v3.11c-.974 0-2.1.057-2.381.17a1.146 1.146 0 0 0-.606.493c-.131.217-.197.593-.197 1.131 0 .546-.04 1.583-.119 3.11-.044.858-.158 1.556-.342 2.093-.184.53-.421.968-.71 1.315-.281.347-.716.705-1.303 1.078.517.295.939.642 1.263 1.04.334.391.588.869.764 1.433.175.563.29 1.318.342 2.263a86.9 86.9 0 0 1 .092 2.756c0 .573.07.972.21 1.198.14.225.35.395.631.507.29.122 1.408.182 2.356.182v3.121H16.83c-1.185 0-2.093-.095-2.725-.285a3.69 3.69 0 0 1-1.604-.924 3.3 3.3 0 0 1-.869-1.613c-.149-.633-.224-1.634-.224-3.004 0-1.596-.07-2.633-.21-3.11-.192-.693-.487-1.187-.882-1.482-.386-.303-2.509-.539-3.316-.582v-3c.64-.035 2.649-.19 2.974-.346.324-.156.605-.417.842-.781.237-.373.398-.836.486-1.39.07-.417.106-1.143.106-2.175 0-1.682.08-2.852.238-3.511.158-.668.443-1.201.855-1.6.413-.408 1.012-.729 1.801-.963.535-.156 3.677-.234 2.527-.234zm5.157 0h1.197c1.15 0 1.993.078 2.528.234.79.234 1.388.555 1.8.963.413.399.698.932.856 1.6.158.659.238 1.83.238 3.511 0 1.032.036 1.758.106 2.174.087.555.25 1.018.486 1.39.237.365.517.626.842.782.324.156 2.333.311 2.973.346v3c-.807.043-2.93.278-3.315.582-.395.295-.69.789-.883 1.482-.14.477-.209 1.514-.209 3.11 0 1.37-.075 2.37-.224 3.004-.15.641-.44 1.18-.87 1.613a3.69 3.69 0 0 1-1.603.924c-.632.19-3.909.285-2.725.285h-1.197v-3.121c.947 0 2.066-.06 2.356-.182.28-.112.49-.282.63-.508.14-.225.211-.625.211-1.197 0-.399.03-1.316.092-2.756.053-.945.166-1.7.342-2.264.175-.563.43-1.041.764-1.431a4.434 4.434 0 0 1 1.263-1.041c-.587-.373-1.022-.731-1.302-1.078-.29-.347-.527-.786-.711-1.315-.185-.537-.298-1.235-.342-2.094-.08-1.526-.12-2.563-.12-3.109 0-.538-.065-.914-.197-1.13a1.146 1.146 0 0 0-.605-.495c-.28-.113-1.407-.17-2.38-.17z" fill="#fff" stroke="none" stroke-width=".612"/></svg>
|
After Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 393 B |