From ce1e1139a59c95be3918f03a1a28cdca7185c44e Mon Sep 17 00:00:00 2001 From: mschlgl Date: Tue, 10 Dec 2024 11:03:37 +0100 Subject: [PATCH 1/3] configurable watch node --- .../nodes/core/storage/23-watch.html | 28 +++++++-- .../@node-red/nodes/core/storage/23-watch.js | 58 ++++++++++++++----- 2 files changed, 67 insertions(+), 19 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/storage/23-watch.html b/packages/node_modules/@node-red/nodes/core/storage/23-watch.html index b2bd12f80..69d3a14d9 100644 --- a/packages/node_modules/@node-red/nodes/core/storage/23-watch.html +++ b/packages/node_modules/@node-red/nodes/core/storage/23-watch.html @@ -18,6 +18,8 @@
+ +
@@ -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")[0].attributes.value.value == "msg"?1:0; + return; } }); - + \ No newline at end of file diff --git a/packages/node_modules/@node-red/nodes/core/storage/23-watch.js b/packages/node_modules/@node-red/nodes/core/storage/23-watch.js index ccbdeba9f..2ee5770aa 100644 --- a/packages/node_modules/@node-red/nodes/core/storage/23-watch.js +++ b/packages/node_modules/@node-red/nodes/core/storage/23-watch.js @@ -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() { + node.watcher.close(); } } RED.nodes.registerType("watch", WatchNode); -} +} \ No newline at end of file From 9bd8ec9f62341a70a1fd5b9d00c5cf2f67e00227 Mon Sep 17 00:00:00 2001 From: mschlgl Date: Tue, 10 Dec 2024 13:23:39 +0100 Subject: [PATCH 2/3] configurable watch node --- packages/node_modules/@node-red/nodes/core/storage/23-watch.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/core/storage/23-watch.js b/packages/node_modules/@node-red/nodes/core/storage/23-watch.js index 2ee5770aa..69fa77e87 100644 --- a/packages/node_modules/@node-red/nodes/core/storage/23-watch.js +++ b/packages/node_modules/@node-red/nodes/core/storage/23-watch.js @@ -94,7 +94,7 @@ module.exports = function(RED) { if (n.filesType != 'msg') configureWatcher(node, n); node.close = function() { - node.watcher.close(); + if (node.watcher) node.watcher.close(); } } RED.nodes.registerType("watch", WatchNode); From bc0268481b4e29feb12829e6cd6759b3ef1f72bf Mon Sep 17 00:00:00 2001 From: mschlgl Date: Thu, 12 Dec 2024 15:41:50 +0100 Subject: [PATCH 3/3] configurable watch node --- .../node_modules/@node-red/nodes/core/storage/23-watch.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/core/storage/23-watch.html b/packages/node_modules/@node-red/nodes/core/storage/23-watch.html index 69d3a14d9..946398ad5 100644 --- a/packages/node_modules/@node-red/nodes/core/storage/23-watch.html +++ b/packages/node_modules/@node-red/nodes/core/storage/23-watch.html @@ -67,7 +67,7 @@ // function added to set node input number oneditsave: function() { // if controlled by msg there has to be a input - this.inputs = $("#node-input-filesType")[0].attributes.value.value == "msg"?1:0; + this.inputs = $("#node-input-filesType").typedInput("type") === "msg" ? 1 : 0; return; } });