From 6e35a9f682a9547cfcc4439ba9fa5742c47190dd Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Thu, 14 Apr 2022 23:55:57 +0100 Subject: [PATCH] use typedInput for filename on file nodes --- .../@node-red/nodes/core/storage/10-file.html | 36 +++++++++++++++-- .../@node-red/nodes/core/storage/10-file.js | 39 +++++++++++++++++-- 2 files changed, 69 insertions(+), 6 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/storage/10-file.html b/packages/node_modules/@node-red/nodes/core/storage/10-file.html index b76a01615..fa3fdccc9 100755 --- a/packages/node_modules/@node-red/nodes/core/storage/10-file.html +++ b/packages/node_modules/@node-red/nodes/core/storage/10-file.html @@ -3,6 +3,7 @@
+
@@ -38,6 +39,7 @@
+
@@ -197,6 +199,7 @@ defaults: { name: {value:""}, filename: {value:""}, + filenameType: {value:""}, appendNewline: {value:true}, createDir: {value:false}, overwriteFile: {value:"false"}, @@ -207,10 +210,12 @@ outputs:1, icon: "file-out.svg", label: function() { + var fn = this.filename; + if(this.filenameType != "str") { fn = ""; } if (this.overwriteFile === "delete") { - return this.name||this._("file.label.deletelabel",{file:this.filename}); + return this.name||this._("file.label.deletelabel",{file:fn}); } else { - return this.name||this.filename||this._("file.label.write"); + return this.name||fn||this._("file.label.write"); } }, paletteLabel: RED._("node-red:file.label.write"), @@ -229,6 +234,17 @@ value: "setbymsg", label: node._("file.encoding.setbymsg") }).text(label).appendTo(encSel); + $("#node-input-filename").typedInput({ + default: "str", + types:[{ value: "str", label:"", icon:"red/images/typedInput/az.svg"}, "msg", "jsonata", "env"], + typeField: $("#node-input-filenameType") + }); + if(!node.filename && !node.filenameType) { + node.filename = "filename" + node.filenameType = "msg" + $("#node-input-filename").typedInput("type", node.filenameType); + $("#node-input-filename").typedInput("value", node.filename); + } encodings.forEach(function(item) { if(Array.isArray(item)) { var group = $("", { @@ -267,6 +283,7 @@ defaults: { name: {value:""}, filename: {value:""}, + filenameType: {value:""}, format: {value:"utf8"}, chunk: {value:false}, sendError: {value: false}, @@ -291,7 +308,9 @@ }, icon: "file-in.svg", label: function() { - return this.name||this.filename||this._("file.label.read"); + var fn = this.filename; + if(this.filenameType != "str") { fn = ""; } + return this.name||fn||this._("file.label.read"); }, paletteLabel: RED._("node-red:file.label.read"), labelStyle: function() { @@ -305,6 +324,17 @@ value: "none", label: label }).text(label).appendTo(encSel); + $("#node-input-filename").typedInput({ + default: "str", + types:[{ value: "str", label:"", icon:"red/images/typedInput/az.svg"}, "msg", "jsonata", "env"], + typeField: $("#node-input-filenameType") + }); + if(!node.filename && !node.filenameType) { + node.filename = "filename" + node.filenameType = "msg" + $("#node-input-filename").typedInput("type", node.filenameType); + $("#node-input-filename").typedInput("value", node.filename); + } encodings.forEach(function(item) { if(Array.isArray(item)) { var group = $("", { diff --git a/packages/node_modules/@node-red/nodes/core/storage/10-file.js b/packages/node_modules/@node-red/nodes/core/storage/10-file.js index ba81125fe..309de1abf 100644 --- a/packages/node_modules/@node-red/nodes/core/storage/10-file.js +++ b/packages/node_modules/@node-red/nodes/core/storage/10-file.js @@ -39,6 +39,7 @@ module.exports = function(RED) { // Write/delete a file RED.nodes.createNode(this,n); this.filename = n.filename; + this.filenameType = n.filenameTpye; this.appendNewline = n.appendNewline; this.overwriteFile = n.overwriteFile.toString(); this.createDir = n.createDir || false; @@ -50,7 +51,22 @@ module.exports = function(RED) { node.closeCallback = null; function processMsg(msg,nodeSend, done) { - var filename = node.filename || msg.filename || ""; + var filename = node.filename || ""; + //Pre V3 compatibility - if filename and filenameType are empty, check msg.filename + if(!node.filenameType && !node.filename) { + msg.filename = "filename"; + node.filenameType = "msg"; + } + + RED.util.evaluateNodeProperty(node.filename,node.filenameType,node,msg,(err,value) => { + if (err) { + node.error(err,msg); + return done(); + } else { + filename = value; + } + }); + var fullFilename = filename; if (filename && RED.settings.fileWorkingDirectory && !path.isAbsolute(filename)) { fullFilename = path.resolve(path.join(RED.settings.fileWorkingDirectory,filename)); @@ -158,7 +174,7 @@ module.exports = function(RED) { done(); }); } - if (node.filename) { + if (node.filenameType === "str") { // Static filename - write and reuse the stream next time node.wstream.write(buf, function() { nodeSend(msg); @@ -256,6 +272,7 @@ module.exports = function(RED) { // Read a file RED.nodes.createNode(this,n); this.filename = n.filename; + this.filenameType = n.filenameType; this.format = n.format; this.chunk = false; this.encoding = n.encoding || "none"; @@ -270,8 +287,24 @@ module.exports = function(RED) { var node = this; this.on("input",function(msg, nodeSend, nodeDone) { - var filename = (node.filename || msg.filename || "").replace(/\t|\r|\n/g,''); + var filename = node.filename || ""; + //Pre V3 compatibility - if filename and filenameType are empty, check msg.filename + if(!node.filenameType && !node.filename) { + msg.filename = "filename"; + node.filenameType = "msg"; + } + + RED.util.evaluateNodeProperty(node.filename,node.filenameType,node,msg,(err,value) => { + if (err) { + node.error(err,msg); + return done(); + } else { + filename = (value || "").replace(/\t|\r|\n/g,''); + } + }); + var fullFilename = filename; + var filePath = ""; if (filename && RED.settings.fileWorkingDirectory && !path.isAbsolute(filename)) { fullFilename = path.resolve(path.join(RED.settings.fileWorkingDirectory,filename)); }