ThunderAI Release Notes
Version 4.1.0 - ??/??/2026
+ - Antispam information are now permanently saved for each message [#675].
- ...
Version 4.0.3 - 20/03/2026
diff --git a/pages/addtags/mzta-add-tags.js b/pages/addtags/mzta-add-tags.js
index f9296c28..c57901f9 100644
--- a/pages/addtags/mzta-add-tags.js
+++ b/pages/addtags/mzta-add-tags.js
@@ -330,19 +330,21 @@ async function restoreOptions() {
const restoreValue = result[element.id] || default_select_value;
// Check if option exists
let optionExists = Array.from(element.options).some(opt => opt.value === restoreValue);
- // If it doesn't exist and restoreValue is not empty, create it
- if (!optionExists && restoreValue !== '') {
- let newOption = new Option(restoreValue, restoreValue);
- element.add(newOption);
- }
- // Set value
- element.value = restoreValue;
- if (element.value === '') {
- element.selectedIndex = -1;
- }
if (element.tomselect) {
- element.tomselect.setValue(element.value, true);
+ if (!optionExists && restoreValue !== '') {
+ element.tomselect.addOption({ value: restoreValue, text: restoreValue });
+ }
+ element.tomselect.setValue(restoreValue, true);
setTomSelectBorder(element.tomselect);
+ } else {
+ if (!optionExists && restoreValue !== '') {
+ let newOption = new Option(restoreValue, restoreValue);
+ element.add(newOption);
+ }
+ element.value = restoreValue;
+ if (element.value === '') {
+ element.selectedIndex = -1;
+ }
}
}else{
console.error("[ThunderAI] Unhandled input type:", element.type);
diff --git a/pages/get-calendar-event/mzta-get-calendar-event.js b/pages/get-calendar-event/mzta-get-calendar-event.js
index ca3c8ef7..19e54981 100644
--- a/pages/get-calendar-event/mzta-get-calendar-event.js
+++ b/pages/get-calendar-event/mzta-get-calendar-event.js
@@ -227,19 +227,21 @@ async function restoreOptions() {
const restoreValue = result[element.id] || default_select_value;
// Check if option exists
let optionExists = Array.from(element.options).some(opt => opt.value === restoreValue);
- // If it doesn't exist and restoreValue is not empty, create it
- if (!optionExists && restoreValue !== '') {
- let newOption = new Option(restoreValue, restoreValue);
- element.add(newOption);
- }
- // Set value
- element.value = restoreValue;
- if (element.value === '') {
- element.selectedIndex = -1;
- }
if (element.tomselect) {
- element.tomselect.setValue(element.value, true);
+ if (!optionExists && restoreValue !== '') {
+ element.tomselect.addOption({ value: restoreValue, text: restoreValue });
+ }
+ element.tomselect.setValue(restoreValue, true);
setTomSelectBorder(element.tomselect);
+ } else {
+ if (!optionExists && restoreValue !== '') {
+ let newOption = new Option(restoreValue, restoreValue);
+ element.add(newOption);
+ }
+ element.value = restoreValue;
+ if (element.value === '') {
+ element.selectedIndex = -1;
+ }
}
}else{
console.error("[ThunderAI] Unhandled input type:", element.type);
diff --git a/pages/get-task/mzta-get-task.js b/pages/get-task/mzta-get-task.js
index f5e3f257..34f818dc 100644
--- a/pages/get-task/mzta-get-task.js
+++ b/pages/get-task/mzta-get-task.js
@@ -180,19 +180,21 @@ async function restoreOptions() {
const restoreValue = result[element.id] || default_select_value;
// Check if option exists
let optionExists = Array.from(element.options).some(opt => opt.value === restoreValue);
- // If it doesn't exist and restoreValue is not empty, create it
- if (!optionExists && restoreValue !== '') {
- let newOption = new Option(restoreValue, restoreValue);
- element.add(newOption);
- }
- // Set value
- element.value = restoreValue;
- if (element.value === '') {
- element.selectedIndex = -1;
- }
if (element.tomselect) {
- element.tomselect.setValue(element.value, true);
+ if (!optionExists && restoreValue !== '') {
+ element.tomselect.addOption({ value: restoreValue, text: restoreValue });
+ }
+ element.tomselect.setValue(restoreValue, true);
setTomSelectBorder(element.tomselect);
+ } else {
+ if (!optionExists && restoreValue !== '') {
+ let newOption = new Option(restoreValue, restoreValue);
+ element.add(newOption);
+ }
+ element.value = restoreValue;
+ if (element.value === '') {
+ element.selectedIndex = -1;
+ }
}
}else{
console.error("[ThunderAI] Unhandled input type:", element.type);
diff --git a/pages/spamfilter/mzta-spamfilter.html b/pages/spamfilter/mzta-spamfilter.html
index 4576314e..fb232647 100644
--- a/pages/spamfilter/mzta-spamfilter.html
+++ b/pages/spamfilter/mzta-spamfilter.html
@@ -66,8 +66,7 @@
-
__MSG_SpamReport_Title__
-
__MSG_SpamReport_infoline__
+
__MSG_SpamReport_Title__
diff --git a/pages/spamfilter/mzta-spamfilter.js b/pages/spamfilter/mzta-spamfilter.js
index 54258510..fccea0cf 100644
--- a/pages/spamfilter/mzta-spamfilter.js
+++ b/pages/spamfilter/mzta-spamfilter.js
@@ -326,17 +326,21 @@ async function restoreOptions() {
const restoreValue = result[element.id] || default_select_value;
// Ensure option exists before restoring
let optionExists = Array.from(element.options).some(opt => opt.value === restoreValue);
- if (!optionExists && restoreValue !== '') {
- let newOption = new Option(restoreValue, restoreValue);
- element.add(newOption);
- }
- element.value = restoreValue;
- if (element.value === '') {
- element.selectedIndex = -1;
- }
if (element.tomselect) {
- element.tomselect.setValue(element.value, true);
+ if (!optionExists && restoreValue !== '') {
+ element.tomselect.addOption({ value: restoreValue, text: restoreValue });
+ }
+ element.tomselect.setValue(restoreValue, true);
setTomSelectBorder(element.tomselect);
+ } else {
+ if (!optionExists && restoreValue !== '') {
+ let newOption = new Option(restoreValue, restoreValue);
+ element.add(newOption);
+ }
+ element.value = restoreValue;
+ if (element.value === '') {
+ element.selectedIndex = -1;
+ }
}
}else{
console.error("[ThunderAI] Unhandled input type:", element.type);
diff --git a/pages/summarize/mzta-summarize.html b/pages/summarize/mzta-summarize.html
index a8db111d..ea6f59c7 100644
--- a/pages/summarize/mzta-summarize.html
+++ b/pages/summarize/mzta-summarize.html
@@ -26,6 +26,40 @@
|
+
+ | __MSG_prefs_OptionText_summarize_auto__ |
+
+
+ |
+
+
+ | __MSG_prefs_OptionText_summarize_display_mode__ |
+
+
+ |
+
+
+ | __MSG_prefs_OptionText_summarize_max_display_length__ |
+
+
+ |
+
diff --git a/pages/summarize/mzta-summarize.js b/pages/summarize/mzta-summarize.js
index 53196051..edb8ffec 100644
--- a/pages/summarize/mzta-summarize.js
+++ b/pages/summarize/mzta-summarize.js
@@ -32,7 +32,8 @@ import {
import { textareaAutocomplete } from "../../js/mzta-placeholders-autocomplete.js";
import {
normalizeStringList,
- isAPIKeyValue
+ isAPIKeyValue,
+ setTomSelectBorder
} from "../../js/mzta-utils.js";
import {
initializeSpecificIntegrationUI
@@ -196,8 +197,11 @@ function saveOptions(e) {
options[element.id] = element.value.trim();
break;
case 'select-one':
- // console.log(">>>>>>>>>> Saving option [select-one]: " + element.id + " = " + element.value);
- options[element.id] = element.value;
+ if (element.id === 'summarize_auto') {
+ options[element.id] = parseInt(element.value, 10);
+ } else {
+ options[element.id] = element.value;
+ }
break;
case 'textarea':
options[element.id] = normalizeStringList(element.value);
@@ -233,22 +237,31 @@ async function restoreOptions() {
break;
default:
if (element.tagName === 'SELECT') {
- let default_select_value = '';
- const restoreValue = result[element.id] || default_select_value;
+ let default_select_value = 0;
+ if (element.id === 'summarize_auto') {
+ default_select_value = prefs_default.summarize_auto;
+ }
+ if (element.id === 'summarize_display_mode') {
+ default_select_value = prefs_default.summarize_display_mode;
+ }
+ const restoreValue = result[element.id] ?? default_select_value;
// Check if option exists
- let optionExists = Array.from(element.options).some(opt => opt.value === restoreValue);
- // If it doesn't exist and restoreValue is not empty, create it
- if (!optionExists && restoreValue !== '') {
- let newOption = new Option(restoreValue, restoreValue);
- element.add(newOption);
- }
- // Set value
- element.value = restoreValue;
- if (element.value === '') {
- element.selectedIndex = -1;
- }
+ let optionExists = Array.from(element.options).some(opt => opt.value === String(restoreValue));
if (element.tomselect) {
- element.tomselect.setValue(element.value, true);
+ if (!optionExists && restoreValue !== '') {
+ element.tomselect.addOption({ value: String(restoreValue), text: String(restoreValue) });
+ }
+ element.tomselect.setValue(String(restoreValue), true);
+ setTomSelectBorder(element.tomselect);
+ } else {
+ if (!optionExists && restoreValue !== '') {
+ let newOption = new Option(restoreValue, restoreValue);
+ element.add(newOption);
+ }
+ element.value = restoreValue;
+ if (element.value === '') {
+ element.selectedIndex = 0;
+ }
}
}else{
console.error("[ThunderAI] Unhandled input type:", element.type);