changed rules property to be stored as a JSON string

This commit is contained in:
Niko Vujić
2025-12-31 10:29:00 +01:00
parent e07341fa05
commit 7c9c1ddf3a
4 changed files with 52 additions and 27 deletions

View File

@@ -5,7 +5,7 @@ RED.nodes.registerType('xilica-listen', {
defaults: { defaults: {
name: { value: "" }, name: { value: "" },
connection: { value: "", type: "xilica-connection" }, connection: { value: "", type: "xilica-connection" },
rules: { value: [] } rules: { value: "[]" }
}, },
inputs: 1, inputs: 1,
outputs: 1, outputs: 1,
@@ -18,17 +18,12 @@ RED.nodes.registerType('xilica-listen', {
}, },
oneditprepare: function () { oneditprepare: function () {
var node = this; var node = this;
var rules = node.rules || []; var rules;
if (typeof rules === "string") {
try { try {
rules = JSON.parse(rules); rules = node.rules ? JSON.parse(node.rules) : [];
} catch (e) { } catch (e) {
rules = []; rules = [];
} }
}
if (!Array.isArray(rules)) {
rules = [];
}
$("#node-input-rules").editableList({ $("#node-input-rules").editableList({
addItem: function (container, index, rule) { addItem: function (container, index, rule) {
@@ -118,7 +113,7 @@ RED.nodes.registerType('xilica-listen', {
rules.push(rule); rules.push(rule);
}); });
this.rules = rules; this.rules = JSON.stringify(rules);
} }
}); });
</script> </script>

View File

@@ -54,7 +54,15 @@ module.exports = function (RED) {
RED.nodes.createNode(this, config); RED.nodes.createNode(this, config);
const node = this; const node = this;
node.rules = Array.isArray(config.rules) ? config.rules : []; let storedRules = config.rules;
if (typeof storedRules === "string") {
try {
storedRules = JSON.parse(storedRules);
} catch (e) {
storedRules = [];
}
}
node.rules = Array.isArray(storedRules) ? storedRules : [];
node.on("input", (msg, send, done) => { node.on("input", (msg, send, done) => {
send = send =
@@ -76,7 +84,17 @@ module.exports = function (RED) {
return; return;
} }
const rules = Array.isArray(msg.rules) ? msg.rules : node.rules; let rules = msg.rules || node.rules;
if (typeof rules === "string") {
try {
rules = JSON.parse(rules);
} catch (e) {
rules = [];
}
}
if (!Array.isArray(rules)) {
rules = [];
}
const names = buildControlNamesFromRules(rules); const names = buildControlNamesFromRules(rules);
const matchAll = names.length === 0; const matchAll = names.length === 0;
const allowed = new Set(names); const allowed = new Set(names);
@@ -139,4 +157,3 @@ module.exports = function (RED) {
RED.nodes.registerType("xilica-listen", XilicaListen); RED.nodes.registerType("xilica-listen", XilicaListen);
}; };

View File

@@ -6,7 +6,7 @@ RED.nodes.registerType('xilica-subscribe', {
name: { value: "" }, name: { value: "" },
action: { value: "subscribe" }, action: { value: "subscribe" },
connection: { value: "", type: "xilica-connection" }, connection: { value: "", type: "xilica-connection" },
rules: { value: [] }, rules: { value: "[]" },
transport: { value: "TCP" } transport: { value: "TCP" }
}, },
inputs: 1, inputs: 1,
@@ -21,17 +21,12 @@ RED.nodes.registerType('xilica-subscribe', {
}, },
oneditprepare: function () { oneditprepare: function () {
var node = this; var node = this;
var rules = node.rules || []; var rules;
if (typeof rules === "string") {
try { try {
rules = JSON.parse(rules); rules = node.rules ? JSON.parse(node.rules) : [];
} catch (e) { } catch (e) {
rules = []; rules = [];
} }
}
if (!Array.isArray(rules)) {
rules = [];
}
$("#node-input-rules").editableList({ $("#node-input-rules").editableList({
addItem: function (container, index, rule) { addItem: function (container, index, rule) {
@@ -121,7 +116,7 @@ RED.nodes.registerType('xilica-subscribe', {
rules.push(rule); rules.push(rule);
}); });
this.rules = rules; this.rules = JSON.stringify(rules);
} }
}); });
</script> </script>

View File

@@ -65,7 +65,15 @@ module.exports = function (RED) {
const node = this; const node = this;
node.action = config.action || "subscribe"; node.action = config.action || "subscribe";
node.rules = Array.isArray(config.rules) ? config.rules : []; let storedRules = config.rules;
if (typeof storedRules === "string") {
try {
storedRules = JSON.parse(storedRules);
} catch (e) {
storedRules = [];
}
}
node.rules = Array.isArray(storedRules) ? storedRules : [];
node.transport = config.transport || "TCP"; node.transport = config.transport || "TCP";
node.connectionConfig = RED.nodes.getNode(config.connection); node.connectionConfig = RED.nodes.getNode(config.connection);
@@ -78,7 +86,17 @@ module.exports = function (RED) {
done = done || function () {}; done = done || function () {};
const action = normaliseAction(msg.action || node.action); const action = normaliseAction(msg.action || node.action);
const rules = Array.isArray(msg.rules) ? msg.rules : node.rules; let rules = msg.rules || node.rules;
if (typeof rules === "string") {
try {
rules = JSON.parse(rules);
} catch (e) {
rules = [];
}
}
if (!Array.isArray(rules)) {
rules = [];
}
const transport = const transport =
typeof msg.transport === "string" && msg.transport.trim().length typeof msg.transport === "string" && msg.transport.trim().length