From 7179d2e6dd1d9baf1f7e8f6862f702588eb5d69c Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Wed, 14 Aug 2019 22:54:59 +0200 Subject: [PATCH] luci-base: ui.js: add createHandlerFn() helper The createHandlerFn() helper function is useful to construct onclick or similar event handling functions. It will add a "spinning" CSS class on the event target element and disable the element, wrap the given function with Promise.resolv() and re-enable the target element once the promise is settled. Signed-off-by: Jo-Philipp Wich --- .../htdocs/luci-static/resources/ui.js | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/modules/luci-base/htdocs/luci-static/resources/ui.js b/modules/luci-base/htdocs/luci-static/resources/ui.js index 23a9d7bfd..e00868171 100644 --- a/modules/luci-base/htdocs/luci-static/resources/ui.js +++ b/modules/luci-base/htdocs/luci-static/resources/ui.js @@ -2081,6 +2081,29 @@ return L.Class.extend({ catch (e) { } }, + createHandlerFn: function(ctx, fn /*, ... */) { + if (typeof(fn) == 'string') + fn = ctx[fn]; + + if (typeof(fn) != 'function') + return null; + + return Function.prototype.bind.apply(function() { + var t = arguments[arguments.length - 1].target; + + t.classList.add('spinning'); + t.disabled = true; + + if (t.blur) + t.blur(); + + Promise.resolve(fn.apply(ctx, arguments)).then(function() { + t.classList.remove('spinning'); + t.disabled = false; + }); + }, this.varargs(arguments, 2, ctx)); + }, + /* Widgets */ Textfield: UITextfield, Checkbox: UICheckbox, -- 2.25.1