Merge 0c15a8e38286d1b86bebeaaf63ee286ae32fee14 into 2feb290ae3c6cd88c16e4c27c2006a569e0146e2

This commit is contained in:
mschlgl 2025-02-25 20:32:18 +05:30 committed by GitHub
commit 16c3d53137
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 67 additions and 19 deletions

View File

@ -18,6 +18,8 @@
<div class="form-row node-input-filename">
<label for="node-input-files"><i class="fa fa-file"></i> <span data-i18n="watch.label.files"></span></label>
<input id="node-input-files" type="text" tabindex="1" data-i18n="[placeholder]watch.placeholder.files">
<!-- added to enable context type setup -->
<input type="hidden" id="node-input-filesType">
</div>
<div class="form-row">
<label>&nbsp;</label>
@ -37,11 +39,15 @@
defaults: {
name: {value:""},
files: {value:"",required:true,
label:RED._("node-red:watch.label.files")},
recursive: {value:""}
label:RED._("node-red:watch.label.files")},
// property added to enable context type setup
filesType: {value: "str"},
recursive: {value:""},
// property added to enable number of inputs change
inputs: {value:0}
},
color:"BurlyWood",
inputs:0,
inputs: 0,
outputs:1,
icon: "watch.svg",
label: function() {
@ -49,6 +55,20 @@
},
labelStyle: function() {
return this.name?"node_label_italic":"";
},
// function added to enable context type setup
oneditprepare: function() {
$("#node-input-files").typedInput({
default: 'str',
types: ['str','flow','global','env','msg'],
typeField: $("#node-input-filesType")
});
},
// function added to set node input number
oneditsave: function() {
// if controlled by msg there has to be a input
this.inputs = $("#node-input-filesType").typedInput("type") === "msg" ? 1 : 0;
return;
}
});
</script>
</script>

View File

@ -20,20 +20,17 @@ module.exports = function(RED) {
const fs = require("fs")
const path = require("path")
function WatchNode(n) {
RED.nodes.createNode(this,n);
this.recursive = n.recursive || false;
this.files = (n.files || "").split(",");
for (var f=0; f < this.files.length; f++) {
this.files[f] = this.files[f].trim();
function configureWatcher(node, n) {
if (node.filesType != 'msg') node.files = (n.files || "");
node.files = node.files.split(",");
for (var f=0; f < node.files.length; f++) {
node.files[f] = node.files[f].trim();
}
this.p = (this.files.length === 1) ? this.files[0] : JSON.stringify(this.files);
const node = this;
node.p = (node.files.length === 1) ? node.files[0] : JSON.stringify(node.files);
const watcher = watch(this.files, { recursive: this.recursive });
node.watcher = watch(node.files, { recursive: node.recursive });
watcher.on('change', function (event, fpath) {
node.watcher.on('change', function (event, fpath) {
const file = path.basename(fpath)
let stat;
try {
@ -60,14 +57,45 @@ module.exports = function(RED) {
node.send(msg);
});
watcher.on('error', function (error) {
node.watcher.on('error', function (error) {
const msg = { payload: "" };
node.error(error,msg);
});
};
function WatchNode(n) {
RED.nodes.createNode(this,n);
var node = this;
node.recursive = n.recursive || false;
node.files = n.files || "";
node.filesType = n.filesType || "str";
node.inputs = n.inputs || 0;
// added to enable context setup
switch (n.filesType) {
case "global":
n.files = node.context().global.get(`${n.files}`);
break;
case "flow":
n.files = node.context().flow.get(`${n.files}`);
break;
case "env":
n.files = node.context().env.get(`${n.files}`);
case "msg":
node.on('input', function(msg) {
if (msg[n.files] != node.files) { // new path/files list received
if (node.watcher) node.watcher.close(); // if watcher active close it
node.files = msg[n.files]; // save new path/files list
configureWatcher(node, n); // reconfigure watcher
};
});
break;
};
this.close = function() {
watcher.close();
if (n.filesType != 'msg') configureWatcher(node, n);
node.close = function() {
if (node.watcher) node.watcher.close();
}
}
RED.nodes.registerType("watch", WatchNode);
}
}