From: Alexander Moisseev Date: Mon, 30 Jun 2025 14:05:49 +0000 (+0300) Subject: [WebUI] Update classifiers on server or tab switch X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fpull%2F5534%2Fhead;p=thirdparty%2Frspamd.git [WebUI] Update classifiers on server or tab switch Ensure the Bayes classifiers dropdown is refreshed whenever the user changes the selected server or navigates to the Scan/Learn tab, so it always reflects the selected server’s configuration. --- diff --git a/interface/js/app/rspamd.js b/interface/js/app/rspamd.js index ceba6864bf..cb7fb8acef 100644 --- a/interface/js/app/rspamd.js +++ b/interface/js/app/rspamd.js @@ -176,7 +176,10 @@ define(["jquery", "app/common", "stickytabs", "visibility", require(["app/symbols"], (module) => module.getSymbols()); break; case "#scan_nav": - require(["app/upload"], (module) => module.getFuzzyStorages()); + require(["app/upload"], (module) => { + module.getClassifiers(); + module.getFuzzyStorages(); + }); break; case "#selectors_nav": require(["app/selectors"], (module) => module.displayUI()); diff --git a/interface/js/app/upload.js b/interface/js/app/upload.js index c82bb23069..f95d5cc905 100644 --- a/interface/js/app/upload.js +++ b/interface/js/app/upload.js @@ -29,6 +29,10 @@ define(["jquery", "app/common", "app/libft"], "use strict"; const ui = {}; const fileSet = {files: null, index: null}; + const lastReqContext = { + classifiers: {config_id: null, server: null}, + storages: {config_id: null, server: null} + }; let scanTextHeaders = {}; function uploadText(data, url, headers, method = "POST") { @@ -299,18 +303,45 @@ define(["jquery", "app/common", "app/libft"], common.fileUtils.setupFileHandling("#scanMsgSource", "#formFile", fileSet, enable_disable_scan_btn, multiple_files_cb); + + /** + * Returns `true` if we should skip the request as configuration is not changed, + * otherwise bumps the request context cache and returns `false`. + * + * @param {string} server + * Name of the currently selected Rspamd neighbour. + * @param {"classifiers"|"storages"} key + * Which endpoint’s cache to check. + * @returns {boolean} + */ + function shouldSkipRequest(server, key) { + const servers = JSON.parse(sessionStorage.getItem("Credentials") || "{}"); + const config_id = servers[server]?.data?.config_id; + const last = lastReqContext[key]; + + if ((config_id && config_id === last.config_id) || + (!config_id && server === last.server)) { + return true; + } + + lastReqContext[key] = {config_id, server}; + return false; + } + ui.getClassifiers = function () { + const server = common.getServer(); + if (shouldSkipRequest(server, "classifiers")) return; + if (!common.read_only) { const sel = $("#classifier").empty().append($("