]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[WebUI] Update classifiers on server or tab switch 5534/head
authorAlexander Moisseev <moiseev@mezonplus.ru>
Mon, 30 Jun 2025 14:05:49 +0000 (17:05 +0300)
committerAlexander Moisseev <moiseev@mezonplus.ru>
Mon, 30 Jun 2025 14:13:30 +0000 (17:13 +0300)
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.

interface/js/app/rspamd.js
interface/js/app/upload.js

index ceba6864bf20e759093510b1922b27d91c7edb15..cb7fb8acefcbfe0addca5edbf8129ef0d22e593f 100644 (file)
@@ -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());
index c82bb23069680bf84eb0d22833d9b278c13b61a8..f95d5cc905842783bac7416583667b76f5d5eb50 100644 (file)
@@ -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($("<option>", {value: "", text: "All classifiers"}));
-                common.query("/bayes/classifiers", {
+                common.query("bayes/classifiers", {
                     success: function (data) {
                         data[0].data.forEach((c) => sel.append($("<option>", {value: c, text: c})));
                     },
-                    server: common.getServer()
+                    server: server
                 });
             }
         };
-        ui.getClassifiers();
 
 
         const fuzzyWidgets = [
@@ -339,19 +370,9 @@ define(["jquery", "app/common", "app/libft"],
             });
         }
 
-        let lastFuzzyStoragesReq = {config_id: null, server: null};
-
         ui.getFuzzyStorages = function () {
             const server = common.getServer();
-
-            const servers = JSON.parse(sessionStorage.getItem("Credentials") || "{}");
-            const config_id = servers[server]?.data?.config_id;
-
-            if ((config_id && config_id === lastFuzzyStoragesReq.config_id) ||
-                (!config_id && server === lastFuzzyStoragesReq.server)) {
-                return;
-            }
-            lastFuzzyStoragesReq = {config_id: config_id, server: server};
+            if (shouldSkipRequest(server, "storages")) return;
 
             fuzzyWidgets.forEach(({picker, container}) => container($(picker)).removeAttr("title"));