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 @@
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 () {