From 1c45a0f0660f6ea14540d2bad4863804de9e6048 Mon Sep 17 00:00:00 2001 From: javalikescript Date: Sun, 2 Feb 2025 16:23:39 +0100 Subject: [PATCH] Refresh config after action --- extensions/web-base/www/app.html | 4 +-- extensions/web-base/www/app/extensions.js | 26 +++++++++++++++--- lha/restEngine.lua | 2 +- lha/utils.lua | 32 ++++++++++++++++++++++- 4 files changed, 56 insertions(+), 8 deletions(-) diff --git a/extensions/web-base/www/app.html b/extensions/web-base/www/app.html index 4809023..bb22cce 100644 --- a/extensions/web-base/www/app.html +++ b/extensions/web-base/www/app.html @@ -219,7 +219,7 @@

Action

- +
@@ -266,7 +266,7 @@

Action

- +

{{ info.name }}

diff --git a/extensions/web-base/www/app/extensions.js b/extensions/web-base/www/app/extensions.js index 4032b46..4f9f69b 100644 --- a/extensions/web-base/www/app/extensions.js +++ b/extensions/web-base/www/app/extensions.js @@ -79,14 +79,32 @@ function onShowExtension(extensionId) { })); } +function refreshConfig() { + return fetch('/engine/extensions/' + this.extensionId + '/config').then(getJson).then(function(config) { + this.config = config; + }.bind(this)); +} + function triggerAction(index) { - return fetch('/engine/extensions/' + this.extensionId + '/action/' + index, { + console.info('triggerAction(' + index + ')'); + var action = this.actions[index]; + if (!action) { + return Promise.reject('No action #' + index); + } + return fetch('/engine/extensions/' + this.extensionId + '/action/' + (index + 1), { method: 'POST', headers: { "Content-Type": 'application/json' }, body: '[]' // TODO ask arguments - }).then(assertIsOk).then(getResponseText).then(function(text) { - toaster.toast('Action triggered: ' + text); - }); + }).then(assertIsOk).then(getJson).then(function(response) { + if (response.success) { + toaster.toast('Action triggered, ' + response.message); + if (action.active === false) { + refreshConfig.call(this); + } + } else { + toaster.toast('Action failed, ' + response.message); + } + }.bind(this)); } new Vue({ diff --git a/lha/restEngine.lua b/lha/restEngine.lua index 0413da9..9491f35 100644 --- a/lha/restEngine.lua +++ b/lha/restEngine.lua @@ -176,7 +176,7 @@ local REST_EXTENSIONS = { elseif (action.arguments and #action.arguments or 0) ~= (arguments and #arguments or 0) then HttpExchange.badRequest(exchange, 'The action arguments are invalid') else - return method(extension, arguments) + return utils.toResponse(method, extension, arguments) end else HttpExchange.notFound(exchange) diff --git a/lha/utils.lua b/lha/utils.lua index 5942984..8e6aa87 100644 --- a/lha/utils.lua +++ b/lha/utils.lua @@ -2,6 +2,7 @@ local logger = require('jls.lang.logger'):get(...) local event = require('jls.lang.event') local system = require('jls.lang.system') local Promise = require('jls.lang.Promise') +local Exception = require('jls.lang.Exception') local File = require('jls.io.File') local Date = require('jls.util.Date') local json = require('jls.util.json') @@ -75,12 +76,41 @@ function utils.rejectIfNotOk(response) end) end +local function toResponse(success, message) + return { + success = success == true, + message = tostring(message) + } +end + +function utils.toResponse(v, ...) + if type(v) == 'function' then + local status, message = Exception.pcall(v, ...) + if not status then + return toResponse(status, message) + end + v = message + end + if type(v) == 'boolean' then + return toResponse(v, (...)) + elseif v == nil then + return toResponse(false, (...)) + elseif Promise.isPromise(v) then + return v:next(function(message) + return toResponse(true, message) + end, function(message) + return toResponse(false, message) + end); + end + return toResponse(true, v) +end + function utils.timeout(promise, delayMs, reason) return Promise:new(function(resolve, reject) local timer = event:setTimeout(function() reject(reason or 'timeout') end, delayMs or 30000) - promise:finally(function(...) + promise:finally(function() event:clearTimeout(timer) end) promise:next(resolve, reject)