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", 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..eb925e941 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) && v >= 0) : true + } + }, passthru: { value: true }, + sendOnDelay: { value: false }, sendOnBlur: { value: true }, sendOnEnter: { value: true }, className: { value: '' }, @@ -102,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') } @@ -217,9 +231,17 @@
+
+ + +
+ + +
+
- +
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 c81170fd2..d03a09ca3 100644 --- a/ui/src/widgets/ui-number-input/UINumberInput.vue +++ b/ui/src/widgets/ui-number-input/UINumberInput.vue @@ -179,7 +179,14 @@ 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) + } }, onBlur: function () { if (this.props.sendOnBlur) {