From a9a29ea50be180da6d7ba5dbe0a1a51227ffbb87 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 10 Jan 2026 10:20:22 +0000 Subject: [PATCH 1/7] Initial plan From f92f791fec84662f175d67ab9ef3a1f813ccde53 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 10 Jan 2026 10:24:41 +0000 Subject: [PATCH 2/7] Add Send after Delay option to number input widget Co-authored-by: Steve-Mcl <44235289+Steve-Mcl@users.noreply.github.com> --- .../widgets/locales/en-US/ui_number_input.json | 2 ++ nodes/widgets/ui_number_input.html | 17 ++++++++++++++++- .../widgets/ui-number-input/UINumberInput.vue | 11 ++++++++++- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/nodes/widgets/locales/en-US/ui_number_input.json b/nodes/widgets/locales/en-US/ui_number_input.json index 6d325f5a3..da70cc2d7 100644 --- a/nodes/widgets/locales/en-US/ui_number_input.json +++ b/nodes/widgets/locales/en-US/ui_number_input.json @@ -15,8 +15,10 @@ "passThrough": "If msg arrives on input, pass through to output:", "clearable": "Clear number input with button", "sendMessageOn": "Send message on:", + "delay": "Delay", "focusLeave": "Focus Leave", "pressEnter": "Press Enter", + "delayUnit": "(ms)", "whenChanged": "When changed, send:", "payload": "Payload", "currentValue": "Current value", diff --git a/nodes/widgets/ui_number_input.html b/nodes/widgets/ui_number_input.html index 9523b347b..0465b7654 100644 --- a/nodes/widgets/ui_number_input.html +++ b/nodes/widgets/ui_number_input.html @@ -36,7 +36,14 @@ } }, tooltip: { value: '' }, + delay: { + value: 300, + validate: function (v) { + return $('#node-input-sendOnDelay').is(':checked') ? RED.validators.number()(v) : true + } + }, passthru: { value: true }, + sendOnDelay: { value: false }, sendOnBlur: { value: true }, sendOnEnter: { value: true }, className: { value: '' }, @@ -217,9 +224,17 @@
+
+ + +
+ + +
+
- +
diff --git a/ui/src/widgets/ui-number-input/UINumberInput.vue b/ui/src/widgets/ui-number-input/UINumberInput.vue index c81170fd2..a2e838fdb 100644 --- a/ui/src/widgets/ui-number-input/UINumberInput.vue +++ b/ui/src/widgets/ui-number-input/UINumberInput.vue @@ -179,7 +179,16 @@ export default { this.$socket.emit('widget-change', this.id, this.value) }, onChange () { - this.send() + if (this.props.sendOnDelay) { + // is send on delay enabled, if so, set a timeout to send the message + if (this.delayTimer) { + // reset the timer to count from the latest change + clearTimeout(this.delayTimer) + } + this.delayTimer = setTimeout(this.send, this.props.delay) + } else { + this.send() + } }, onBlur: function () { if (this.props.sendOnBlur) { From 6170173ab6450222bbbcb12f087b76b7285ec4ec Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 10 Jan 2026 10:25:34 +0000 Subject: [PATCH 3/7] Add German translation for delay fields in number input Co-authored-by: Steve-Mcl <44235289+Steve-Mcl@users.noreply.github.com> --- nodes/widgets/locales/de/ui_number_input.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nodes/widgets/locales/de/ui_number_input.json b/nodes/widgets/locales/de/ui_number_input.json index 8f166c212..1634521eb 100644 --- a/nodes/widgets/locales/de/ui_number_input.json +++ b/nodes/widgets/locales/de/ui_number_input.json @@ -15,8 +15,10 @@ "passThrough": "Wenn msg am Eingang ankommt, an den Ausgang weiterleiten:", "clearable": "Zahleneingabe mit Schaltfläche löschen", "sendMessageOn": "Nachricht senden bei:", + "delay": "Verzögerung", "focusLeave": "Fokus verlassen", "pressEnter": "Enter drücken", + "delayUnit": "(ms)", "whenChanged": "Bei Änderung senden:", "payload": "Nutzlast", "currentValue": "Aktueller Wert", From de0c99c3f25281cd1a24bdf211f67fe725aa8b64 Mon Sep 17 00:00:00 2001 From: Stephen McLaughlin <44235289+Steve-Mcl@users.noreply.github.com> Date: Sat, 10 Jan 2026 18:30:13 +0000 Subject: [PATCH 4/7] Update nodes/widgets/ui_number_input.html --- nodes/widgets/ui_number_input.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/widgets/ui_number_input.html b/nodes/widgets/ui_number_input.html index 0465b7654..c62402d12 100644 --- a/nodes/widgets/ui_number_input.html +++ b/nodes/widgets/ui_number_input.html @@ -39,7 +39,7 @@ delay: { value: 300, validate: function (v) { - return $('#node-input-sendOnDelay').is(':checked') ? RED.validators.number()(v) : true + return $('#node-input-sendOnDelay').is(':checked') ? (RED.validators.number()(v) && v >= 0) : true } }, passthru: { value: true }, From 59abe993e30f6f2a463f47801677cca42d28397a Mon Sep 17 00:00:00 2001 From: Stephen McLaughlin <44235289+Steve-Mcl@users.noreply.github.com> Date: Sat, 10 Jan 2026 18:30:21 +0000 Subject: [PATCH 5/7] Update ui/src/widgets/ui-number-input/UINumberInput.vue --- ui/src/widgets/ui-number-input/UINumberInput.vue | 2 -- 1 file changed, 2 deletions(-) diff --git a/ui/src/widgets/ui-number-input/UINumberInput.vue b/ui/src/widgets/ui-number-input/UINumberInput.vue index a2e838fdb..d03a09ca3 100644 --- a/ui/src/widgets/ui-number-input/UINumberInput.vue +++ b/ui/src/widgets/ui-number-input/UINumberInput.vue @@ -186,8 +186,6 @@ export default { clearTimeout(this.delayTimer) } this.delayTimer = setTimeout(this.send, this.props.delay) - } else { - this.send() } }, onBlur: function () { From 32aec7c66b9d33a7d9ccd24762f12edecdee0b95 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 10 Jan 2026 18:34:01 +0000 Subject: [PATCH 6/7] Fix onChange behavior and add in-place upgrade handling Co-authored-by: Steve-Mcl <44235289+Steve-Mcl@users.noreply.github.com> --- nodes/widgets/ui_number_input.html | 7 +++++++ nodes/widgets/ui_number_input.js | 9 +++++++++ ui/src/widgets/ui-number-input/UINumberInput.vue | 2 ++ 3 files changed, 18 insertions(+) diff --git a/nodes/widgets/ui_number_input.html b/nodes/widgets/ui_number_input.html index c62402d12..eb925e941 100644 --- a/nodes/widgets/ui_number_input.html +++ b/nodes/widgets/ui_number_input.html @@ -109,6 +109,13 @@ $('#node-input-sendOnClear').prop('checked', false) } + // Handle in-place upgrade: existing nodes should maintain current behavior + if (this.delay === undefined) { + // Set delay to 0 and enable sendOnDelay for upgraded nodes + $('#node-input-delay').val('0') + $('#node-input-sendOnDelay').prop('checked', true) + } + if (!this.iconPosition) { $('#node-input-iconPosition').val('left') } diff --git a/nodes/widgets/ui_number_input.js b/nodes/widgets/ui_number_input.js index 1e5c946a9..f05779214 100644 --- a/nodes/widgets/ui_number_input.js +++ b/nodes/widgets/ui_number_input.js @@ -6,6 +6,15 @@ module.exports = function (RED) { function NumberInputNode (config) { const node = this + // Handle in-place upgrade: set defaults for existing nodes + if (config.delay === undefined) { + config.delay = 0 + config.sendOnDelay = true + } + + // Ensure delay is a valid number >= 0 + config.delay = Math.max(0, parseInt(config.delay, 10) || 0) + // create node in Node-RED RED.nodes.createNode(this, config) diff --git a/ui/src/widgets/ui-number-input/UINumberInput.vue b/ui/src/widgets/ui-number-input/UINumberInput.vue index d03a09ca3..a2e838fdb 100644 --- a/ui/src/widgets/ui-number-input/UINumberInput.vue +++ b/ui/src/widgets/ui-number-input/UINumberInput.vue @@ -186,6 +186,8 @@ export default { clearTimeout(this.delayTimer) } this.delayTimer = setTimeout(this.send, this.props.delay) + } else { + this.send() } }, onBlur: function () { From 63bea0369bbf34765159afd1aac0df826873ec69 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 10 Jan 2026 19:11:33 +0000 Subject: [PATCH 7/7] Remove else block from onChange - only send when sendOnDelay is enabled Co-authored-by: Steve-Mcl <44235289+Steve-Mcl@users.noreply.github.com> --- ui/src/widgets/ui-number-input/UINumberInput.vue | 2 -- 1 file changed, 2 deletions(-) diff --git a/ui/src/widgets/ui-number-input/UINumberInput.vue b/ui/src/widgets/ui-number-input/UINumberInput.vue index a2e838fdb..d03a09ca3 100644 --- a/ui/src/widgets/ui-number-input/UINumberInput.vue +++ b/ui/src/widgets/ui-number-input/UINumberInput.vue @@ -186,8 +186,6 @@ export default { clearTimeout(this.delayTimer) } this.delayTimer = setTimeout(this.send, this.props.delay) - } else { - this.send() } }, onBlur: function () {