- __MSG_prefs_OptionText_default_chatgpt_lang__
+ __MSG_prefs_OptionText_default_chatgpt_lang__
@@ -56,7 +56,7 @@
- __MSG_prefs_OptionText_reply_type__
+ __MSG_prefs_OptionText_reply_type__
@@ -70,7 +70,7 @@
- __MSG_prefs_OptionText_dynamic_menu_order_alphabet__
+ __MSG_prefs_OptionText_dynamic_menu_order_alphabet__
@@ -81,7 +81,7 @@
- __MSG_prefs_OptionText_dynamic_menu_force_enter__
+ __MSG_prefs_OptionText_dynamic_menu_force_enter__
@@ -92,7 +92,7 @@
- __MSG_prefs_OptionText_placeholders_use_default_value__
+ __MSG_prefs_OptionText_placeholders_use_default_value__
@@ -115,7 +115,7 @@
- __MSG_prefs_Connection_type__
+ __MSG_prefs_Connection_type__
@@ -133,7 +133,7 @@
- __MSG_prefs_OptionText_chatgpt_web_model__
+ __MSG_prefs_OptionText_chatgpt_web_model__
@@ -145,26 +145,53 @@
- __MSG_prefs_OptionText_chatgpt_web_tempchat__
+ __MSG_prefs_OptionText_chatgpt_web_project__
+ __MSG_prefs_OptionText_chatgpt_web_custom_data_info__ /g/PROJECT-ID-PROJECT-NAME/project
+ __MSG_prefs_OptionText_chatgpt_web_custom_data_info2__
-
- __MSG_prefs_OptionText_chatgpt_web_tempchat_info__
+
+ __MSG_prefs_OptionText_chatgpt_web_project_info__
- __MSG_OpenChatGPTTab_Info__
+ __MSG_prefs_OptionText_chatgpt_web_custom_gpt__
+ __MSG_prefs_OptionText_chatgpt_web_custom_data_info__ /g/CUSTOM-GPT-ID
+ __MSG_prefs_OptionText_chatgpt_web_custom_data_info2__
- __MSG_OpenChatGPTTab__
+
+
+ __MSG_prefs_OptionText_chatgpt_web_custom_gpt_info__
+ __MSG_prefs_OptionText_CustomGPT_Warn__
+
+
+
+
+
+ __MSG_prefs_OptionText_chatgpt_web_tempchat__
+
+
+
+
+ __MSG_prefs_OptionText_chatgpt_web_tempchat_info__
+ __MSG_prefs_OptionText_Project_No_temporary_chat_warn__
+
+
+
+
+
+ __MSG_OpenChatGPTTab_Info__
+ __MSG_OpenChatGPTTab__
+ __MSG_OpenChatGPTTab_Info2__
- __MSG_prefs_ChatGPT_API_Key__
+ __MSG_prefs_ChatGPT_API_Key__
@@ -178,7 +205,7 @@
- __MSG_ChatGPT_Models__
+ __MSG_ChatGPT_Models__
@@ -192,7 +219,7 @@
- __MSG_ChatGPT_Developer_Messages__
+ __MSG_ChatGPT_Developer_Messages__
@@ -204,7 +231,7 @@
- __MSG_prefs_GoogleGemini_API_Key__
+ __MSG_prefs_GoogleGemini_API_Key__
@@ -218,7 +245,7 @@
- __MSG_GoogleGemini_Models__
+ __MSG_GoogleGemini_Models__
@@ -232,7 +259,7 @@
- __MSG_GoogleGemini_SystemInstruction__
+ __MSG_GoogleGemini_SystemInstruction__
@@ -244,7 +271,7 @@
- __MSG_prefs_API_Host__
+ __MSG_prefs_API_Host__
__MSG_prefs_API_Host_Info__ http://127.0.0.1:11434
@@ -275,7 +302,7 @@
- __MSG_Ollama_Models__
+ __MSG_Ollama_Models__
@@ -288,7 +315,7 @@
- __MSG_prefs_API_Host__
+ __MSG_prefs_API_Host__
__MSG_prefs_API_Host_Info__ http://localhost:1234
@@ -308,7 +335,7 @@
- __MSG_prefs_OptionText_openai_comp_use_v1__
+ __MSG_prefs_OptionText_openai_comp_use_v1__
@@ -319,7 +346,7 @@
- __MSG_prefs_OpenAIComp_API_Key__
+ __MSG_prefs_OpenAIComp_API_Key__
__MSG_Optional__
@@ -334,7 +361,7 @@
- __MSG_OpenAIComp_Models__
+ __MSG_OpenAIComp_Models__
__MSG_prefs_OpenAIComp_ForceModel__
@@ -348,7 +375,7 @@
- __MSG_prefs_OpenAIComp_ChatName__
+ __MSG_prefs_OpenAIComp_ChatName__
@@ -358,7 +385,7 @@
- __MSG_prefs_OptionText_max_prompt_length__
+ __MSG_prefs_OptionText_max_prompt_length__
@@ -367,7 +394,7 @@
- __MSG_prefs_OptionText_add_tags__
+ __MSG_prefs_OptionText_add_tags__
__MSG_prefs_OptionText_btnManageTagsInfo__
@@ -377,7 +404,7 @@
- __MSG_prefs_OptionText_spamfilter__
+ __MSG_prefs_OptionText_spamfilter__
__MSG_prefs_OptionText_btnManageSpamFilterInfo__
@@ -387,7 +414,7 @@
- __MSG_prefs_OptionText_get_calendar_event__
+ __MSG_prefs_OptionText_get_calendar_event__
__MSG_prefs_OptionText_btnManageCalendarEventInfo__
@@ -396,15 +423,26 @@
+
+ __MSG_prefs_OptionText_get_task__
+ __MSG_prefs_OptionText_btnManageTaskInfo__
+
+
+
+ __MSG_prefs_OptionText_get_task_Info__
+
+
+
- __MSG_prefs_OptionText_get_calendar_event_Sparks_not_present__
+ __MSG_prefs_OptionText_get_calendar_event_Sparks_not_present__
+ __MSG_prefs_OptionText_get_calendar_event_Sparks_wrong_version__
__MSG_prefs_OptionText_download_now__
- __MSG_Debug__
+ __MSG_Debug__
diff --git a/options/mzta-options.js b/options/mzta-options.js
index 2f319390..67d73003 100644
--- a/options/mzta-options.js
+++ b/options/mzta-options.js
@@ -22,14 +22,12 @@ import { OpenAI } from '../js/api/openai.js';
import { Ollama } from '../js/api/ollama.js';
import { OpenAIComp } from '../js/api/openai_comp.js'
import { GoogleGemini } from '../js/api/google_gemini.js';
-import { checkSparksPresence, isThunderbird128OrGreater } from '../js/mzta-utils.js';
+import { ChatGPTWeb_models, checkSparksPresence, isThunderbird128OrGreater, openTab, sanitizeChatGPTModelData, sanitizeChatGPTWebCustomData, validateCustomData_ChatGPTWeb, getChatGPTWebModelsList_HTML } from '../js/mzta-utils.js';
let taLog = new taLogger("mzta-options",true);
let _isThunderbird128OrGreater = true;
let permission_all_urls = false;
-const ChatGPTWeb_models = ['gpt-4o', 'o3', 'o4-mini', 'o4-mini-high', 'gpt-4o-mini'];
-
function saveOptions(e) {
e.preventDefault();
let options = {};
@@ -300,56 +298,25 @@ function disable_SpamFilter(){
async function disable_GetCalendarEvent(){
let get_calendar_event = document.getElementById('get_calendar_event');
+ let get_task = document.getElementById('get_task');
let no_sparks_tr = document.getElementById('no_sparks');
- let is_spark_present = await checkSparksPresence()
+ let no_sparks_text = document.getElementById('no_sparks_text');
+ let wrong_sparks_text = document.getElementById('wrong_sparks_text');
+ let is_spark_present = await checkSparksPresence();
let conntype_select = document.getElementById("connection_type");
- get_calendar_event.disabled = (conntype_select.value === "chatgpt_web") || !is_spark_present;
+ get_calendar_event.disabled = (conntype_select.value === "chatgpt_web") || !(is_spark_present == 1);
+ get_task.disabled = (conntype_select.value === "chatgpt_web") || !(is_spark_present == 1);
let get_calendar_event_tr_elements = document.querySelectorAll('.get_calendar_event_tr');
get_calendar_event_tr_elements.forEach(get_calendar_event_tr => {
get_calendar_event_tr.style.display = get_calendar_event.disabled ? 'none' : 'table-row';
});
- no_sparks_tr.style.display = (is_spark_present || (conntype_select.value === "chatgpt_web")) ? 'none' : 'table-row';
-}
-
-
-function getChatGPTWebModelsList_HTML(values, targetRowId) {
- const rowElement = document.getElementById(targetRowId);
- if (!rowElement) return;
-
- // Clears any existing td elements
- rowElement.innerHTML = '';
-
- // First TD: label
- const labelTd = document.createElement('td');
- const label = document.createElement('i');
- label.className = 'small_info';
- const labelNobr = document.createElement('nobr');
- labelNobr.textContent = browser.i18n.getMessage("AllowedValues") + ":";
- label.appendChild(labelNobr);
- labelTd.appendChild(label);
-
- // Second TD: values
- const valuesTd = document.createElement('td');
- const valuesContainer = document.createElement('i');
- valuesContainer.className = 'small_info';
-
- values.forEach(value => {
- const nbspBefore = document.createTextNode(' \u00A0 '); // " "
- const valueNobr = document.createElement('nobr');
- valueNobr.className = 'conntype_chatgpt_web_option';
- valueNobr.textContent = value;
- const nbspAfter = document.createTextNode(' \u00A0 ');
-
- valuesContainer.appendChild(nbspBefore);
- valuesContainer.appendChild(valueNobr);
- valuesContainer.appendChild(nbspAfter);
+ let get_task_tr_elements = document.querySelectorAll('.get_task_tr');
+ get_task_tr_elements.forEach(get_task_tr => {
+ get_task_tr.style.display = get_task.disabled ? 'none' : 'table-row';
});
-
- valuesTd.appendChild(valuesContainer);
-
- // Adds the td elements to the row
- rowElement.appendChild(labelTd);
- rowElement.appendChild(valuesTd);
+ no_sparks_tr.style.display = ((is_spark_present == 1) || (conntype_select.value === "chatgpt_web")) ? 'none' : 'table-row';
+ no_sparks_text.style.display = (is_spark_present == -1) ? 'inline' : 'none';
+ wrong_sparks_text.style.display = (is_spark_present == 0) ? 'inline' : 'none';
}
@@ -419,57 +386,32 @@ document.addEventListener('DOMContentLoaded', async () => {
get_calendar_event_info_btn.disabled = event.target.checked ? '' : 'disabled';
});
get_calendar_event_info_btn.disabled = get_calendar_event_el.checked ? '' : 'disabled';
+
+ let get_task_el = document.getElementById('get_task');
+ let get_task_info_btn = document.getElementById('btnManageTaskInfo');
+ get_task_el.addEventListener('click', (event) => {
+ get_task_info_btn.disabled = event.target.checked ? '' : 'disabled';
+ });
+ get_task_info_btn.disabled = get_task_el.checked ? '' : 'disabled';
document.getElementById('btnManagePrompts').addEventListener('click', () => {
- // check if the tab is already there
- browser.tabs.query({url: browser.runtime.getURL('../pages/customprompts/mzta-custom-prompts.html')}).then((tabs) => {
- if (tabs.length > 0) {
- // if the tab is already there, focus it
- browser.tabs.update(tabs[0].id, {active: true});
- } else {
- // if the tab is not there, create it
- browser.tabs.create({url: browser.runtime.getURL('../pages/customprompts/mzta-custom-prompts.html')});
- }
- })
+ openTab('../pages/customprompts/mzta-custom-prompts.html');
});
document.getElementById('btnManageTagsInfo').addEventListener('click', () => {
- // check if the tab is already there
- browser.tabs.query({url: browser.runtime.getURL('../pages/addtags/mzta-add-tags.html')}).then((tabs) => {
- if (tabs.length > 0) {
- // if the tab is already there, focus it
- browser.tabs.update(tabs[0].id, {active: true});
- } else {
- // if the tab is not there, create it
- browser.tabs.create({url: browser.runtime.getURL('../pages/addtags/mzta-add-tags.html')});
- }
- })
+ openTab('../pages/addtags/mzta-add-tags.html');
});
document.getElementById('btnManageSpamFilterInfo').addEventListener('click', () => {
- // check if the tab is already there
- browser.tabs.query({url: browser.runtime.getURL('../pages/spamfilter/mzta-spamfilter.html')}).then((tabs) => {
- if (tabs.length > 0) {
- // if the tab is already there, focus it
- browser.tabs.update(tabs[0].id, {active: true});
- } else {
- // if the tab is not there, create it
- browser.tabs.create({url: browser.runtime.getURL('../pages/spamfilter/mzta-spamfilter.html')});
- }
- })
+ openTab('../pages/spamfilter/mzta-spamfilter.html');
});
document.getElementById('btnManageCalendarEventInfo').addEventListener('click', () => {
- // check if the tab is already there
- browser.tabs.query({url: browser.runtime.getURL('../pages/get-calendar-event/mzta-get-calendar-event.html')}).then((tabs) => {
- if (tabs.length > 0) {
- // if the tab is already there, focus it
- browser.tabs.update(tabs[0].id, {active: true});
- } else {
- // if the tab is not there, create it
- browser.tabs.create({url: browser.runtime.getURL('../pages/get-calendar-event/mzta-get-calendar-event.html')});
- }
- })
+ openTab('../pages/get-calendar-event/mzta-get-calendar-event.html');
+ });
+
+ document.getElementById('btnManageTaskInfo').addEventListener('click', () => {
+ openTab('../pages/get-task/mzta-get-task.html');
});
document.getElementById('btnOpenAICompForceModel').addEventListener('click', () => {
@@ -515,6 +457,8 @@ document.addEventListener('DOMContentLoaded', async () => {
document.getElementById("ollama_host").addEventListener("change", warn_Ollama_HostEmpty);
document.getElementById("openai_comp_host").addEventListener("change", warn_OpenAIComp_HostEmpty);
document.getElementById("google_gemini_api_key").addEventListener("change", warn_GoogleGemini_APIKeyEmpty);
+ document.getElementById("chatgpt_web_project").addEventListener("input", validateCustomData_ChatGPTWeb);
+ document.getElementById("chatgpt_web_custom_gpt").addEventListener("input", validateCustomData_ChatGPTWeb);
let prefs = await browser.storage.sync.get({chatgpt_web_model: '', chatgpt_model: '', ollama_model: '', openai_comp_model: '', google_gemini_model: '', chatgpt_win_height: 0, chatgpt_win_width: 0 });
@@ -741,12 +685,23 @@ document.addEventListener('DOMContentLoaded', async () => {
const btnChatGPTWeb_Tab = document.getElementById('btnChatGPTWeb_Tab');
btnChatGPTWeb_Tab.addEventListener('click', async () => {
- let prefs_mod = await browser.storage.sync.get({chatgpt_web_model: ''});
+ let prefs_mod = await browser.storage.sync.get({chatgpt_web_model: prefs_default.chatgpt_web_model, chatgpt_web_project: prefs_default.chatgpt_web_project, chatgpt_web_custom_gpt: prefs_default.chatgpt_web_custom_gpt});
+
+ let base_url = 'https://chatgpt.com';
let model_opt = '';
+ let webproject_set = false;
+
if((prefs_mod.chatgpt_web_model != '') && (prefs_mod.chatgpt_web_model != undefined)){
- model_opt = '?model=' + encodeURIComponent(prefs_mod.chatgpt_web_model).toLowerCase();
+ model_opt = '?model=' + sanitizeChatGPTModelData(prefs_mod.chatgpt_web_model);
}
- browser.tabs.create({ url: 'https://chatgpt.com/' + model_opt });
+ if((prefs_mod.chatgpt_web_project != '') && (prefs_mod.chatgpt_web_project != undefined)){
+ base_url += sanitizeChatGPTWebCustomData(prefs_mod.chatgpt_web_project);
+ webproject_set = true;
+ }
+ if(!webproject_set && (prefs_mod.chatgpt_web_custom_gpt != '') && (prefs_mod.chatgpt_web_custom_gpt != undefined)){
+ base_url += sanitizeChatGPTWebCustomData(prefs_mod.chatgpt_web_custom_gpt);
+ }
+ browser.tabs.create({ url: base_url + model_opt });
});
browser.runtime.getPlatformInfo().then(info => {
diff --git a/options/mzta-release-notes.html b/options/mzta-release-notes.html
index 31765a99..762fb583 100644
--- a/options/mzta-release-notes.html
+++ b/options/mzta-release-notes.html
@@ -7,10 +7,23 @@
ThunderAI Release Notes
-
Version 3.3.6 - ??/??/2025
+
Version 3.4.0 - 07/05/2025
+ [All APIs] Added a special prompt to get tasks data from emails [#333 ]. To use this feature, you must install also the Sparks add-on.
+ [ChatGPT Web] It is now possible to define a Custom GPT or a Project in the options page to be used by default, or directly in a custom prompt to be used only for that prompt [#168 , #277 ].
+ The chatgpt.com access permission is no more requested when installing the addon. It's mandatory to give this permission to use the ChatGPT Web Interface integration [#293 ].
+ Added the {%mail_quoted_text%} placeholder to get the quoted text when composing a new message [#324 ].
+ Fix: correctly choosing the right account when replying [#369 ].
+ Fix: In the {%mail_typed_text%} placeholder text on different lines is now separated by a space.
+ Fix: correctly showing text differences when using {%mail_typed_text%} placeholder.
+ Added a default proofread prompt [#21 ].
+ Added a check for the presence of the correct version of ThunderAI Sparks [#315 ].
+ Added the {%empty%} placeholder to prevent the email body from being automatically appended at the end of the prompt [#345 ].
+ [All APIs] Improved the form asking for additional text [#97 ].
[All APIs] Fix: Ensure HTML body is generated from plain text if no parts are available when processing incoming messages for tags or spam.
- ...
+ Fix a condition when using a prompt from the compose window with a "Do reply" action that is changed in "Substitute Text" [#353 ].
+ Custom Prompts form improved.
+ Various improvements.
Version 3.3.5 - 22/04/2025
diff --git a/pages/addtags/mzta-add-tags.css b/pages/addtags/mzta-add-tags.css
index 2899916f..fc254dc4 100644
--- a/pages/addtags/mzta-add-tags.css
+++ b/pages/addtags/mzta-add-tags.css
@@ -12,7 +12,7 @@
font-style: italic;
}
-#addtags_excl_list_container{
+#addtags_excl_list_container, #account_selector_container{
width: 90%;
margin: 40px auto;
}
@@ -21,6 +21,22 @@
width: 30em;
}
+#account_selector_container{
+ display: none;
+}
+
+#account_selector_checkboxes{
+ padding: 10px;
+ border: 1px solid gray;
+ width: 24em;
+ margin-bottom: 10px;
+ margin-top: 10px;
+}
+
+.add_tags_auto{
+ background-color: #e9ffdf;
+}
+
.btn_div{
width: 100%;
display: flex;
@@ -129,4 +145,8 @@ table#miczPrefs tr:last-child td {
.autocomplete-list li.active {
background-color: #4c4e58;
}
+
+ .add_tags_auto{
+ background-color: #415c35;
+ }
}
\ No newline at end of file
diff --git a/pages/addtags/mzta-add-tags.html b/pages/addtags/mzta-add-tags.html
index 9067132c..18f20d48 100644
--- a/pages/addtags/mzta-add-tags.html
+++ b/pages/addtags/mzta-add-tags.html
@@ -49,8 +49,9 @@
-
- __MSG_prefs_OptionText_add_tags_auto__
+
+ __MSG_prefs_OptionText_add_tags_auto__
+ __MSG_prefs_OptionText_add_tags_auto_Info2__
@@ -58,7 +59,7 @@
-
+
__MSG_prefs_OptionText_add_tags_auto_force_existing__
@@ -67,7 +68,7 @@
-
+
__MSG_prefs_OptionText_add_tags_auto_only_inbox__
@@ -106,6 +107,13 @@
__MSG_save__
+
+
__MSG_AccountSelector_AutoTags__
+ __MSG_AccountSelector_AutoTags_infoline__
+
+
Select All
+
Deselect All
+
diff --git a/pages/addtags/mzta-add-tags.js b/pages/addtags/mzta-add-tags.js
index ba24ca7d..6e8662b2 100644
--- a/pages/addtags/mzta-add-tags.js
+++ b/pages/addtags/mzta-add-tags.js
@@ -22,7 +22,7 @@ import { getSpecialPrompts, setSpecialPrompts } from "../../js/mzta-prompts.js";
import { getPlaceholders } from "../../js/mzta-placeholders.js";
import { textareaAutocomplete } from "../../js/mzta-placeholders-autocomplete.js";
import { addTags_getExclusionList, addTags_setExclusionList } from "../../js/mzta-addatags-exclusion-list.js";
-
+import { getAccountsList } from "../../js/mzta-utils.js";
let autocompleteSuggestions = [];
let taLog = new taLogger("mzta-addtags-page",true);
@@ -56,12 +56,18 @@ document.addEventListener('DOMContentLoaded', async () => {
let add_tags_auto_el = document.getElementById('add_tags_auto');
let add_tags_auto_force_existing_tr = document.getElementById('add_tags_auto_force_existing_tr');
let add_tags_auto_only_inbox_tr = document.getElementById('add_tags_auto_only_inbox_tr');
+ let account_selector_container = document.getElementById('account_selector_container');
+ let add_tags_auto_infoline = document.getElementById('add_tags_auto_infoline');
add_tags_auto_el.addEventListener('click', (event) => {
add_tags_auto_force_existing_tr.style.display = event.target.checked ? 'table-row' : 'none';
add_tags_auto_only_inbox_tr.style.display = event.target.checked ? 'table-row' : 'none';
+ account_selector_container.style.display = event.target.checked ? 'block' : 'none';
+ add_tags_auto_infoline.style.display = event.target.checked ? 'inline' : 'none';
});
add_tags_auto_force_existing_tr.style.display = add_tags_auto_el.checked ? 'table-row' : 'none';
add_tags_auto_only_inbox_tr.style.display = add_tags_auto_el.checked ? 'table-row' : 'none';
+ account_selector_container.style.display = add_tags_auto_el.checked ? 'block' : 'none';
+ add_tags_auto_infoline.style.display = add_tags_auto_el.checked ? 'inline' : 'none';
addtags_reset_btn.addEventListener('click', () => {
addtags_textarea.value = browser.i18n.getMessage('prompt_add_tags_full_text');
@@ -118,6 +124,60 @@ document.addEventListener('DOMContentLoaded', async () => {
document.getElementById('excl_list_unsaved').classList.add('hidden');
});
+ //Accounts manager
+ let accounts = await getAccountsList();
+ const accountsContainer = document.getElementById('account_selector_checkboxes');
+ accounts.forEach(account => {
+ const accountLabel = document.createElement('label');
+ const accountCheckbox = document.createElement('input');
+ accountCheckbox.type = 'checkbox';
+ accountCheckbox.classList.add('accountCheckbox');
+ accountCheckbox.value = account.id;
+ accountLabel.appendChild(accountCheckbox);
+ accountLabel.appendChild(document.createTextNode(account.name));
+ accountsContainer.appendChild(accountLabel);
+ accountsContainer.appendChild(document.createElement('br'));
+ });
+
+ let prefs_add_tags = await browser.storage.sync.get({ add_tags_enabled_accounts: [] });
+ let add_tags_enabled_accounts = prefs_add_tags.add_tags_enabled_accounts;
+ taLog.log("add_tags_enabled_accounts = " + JSON.stringify(add_tags_enabled_accounts) + ".");
+ document.querySelectorAll('.accountCheckbox').forEach(checkbox => {
+ if (add_tags_enabled_accounts.length === 0 || add_tags_enabled_accounts.includes(checkbox.value)) {
+ checkbox.checked = true;
+ } else {
+ checkbox.checked = false;
+ }
+ });
+
+ document.querySelectorAll('.accountCheckbox').forEach(checkbox => {
+ checkbox.addEventListener('change', () => {
+ let selectedAccounts = Array.from(document.querySelectorAll('.accountCheckbox:checked')).map(checkbox => checkbox.value);
+ if (selectedAccounts.length === 0) {
+ checkbox.checked = true; // Prevent deselecting the last selected checkbox
+ taLog.log("At least one account must be selected.");
+ return;
+ }
+ if (selectedAccounts.length === document.querySelectorAll('.accountCheckbox').length) {
+ browser.storage.sync.set({ add_tags_enabled_accounts: [] });
+ taLog.log("All accounts selected, saving add_tags_enabled_accounts = [].");
+ } else {
+ browser.storage.sync.set({ add_tags_enabled_accounts: selectedAccounts });
+ taLog.log("Saving add_tags_enabled_accounts = " + JSON.stringify(selectedAccounts) + ".");
+ }
+ });
+ });
+
+ document.getElementById('accounts_select_all').addEventListener('click', () => {
+ let checkboxes = document.querySelectorAll('.accountCheckbox');
+ checkboxes.forEach(checkbox => checkbox.checked = true);
+ });
+
+ document.getElementById('accounts_deselect_all').addEventListener('click', () => {
+ let checkboxes = document.querySelectorAll('.accountCheckbox');
+ checkboxes.forEach(checkbox => checkbox.checked = false);
+ });
+
});
diff --git a/pages/customprompts/mzta-custom-prompts.css b/pages/customprompts/mzta-custom-prompts.css
index d96b29ca..888459df 100644
--- a/pages/customprompts/mzta-custom-prompts.css
+++ b/pages/customprompts/mzta-custom-prompts.css
@@ -25,6 +25,7 @@ table {
thead {
position: sticky;
top: 26px;
+ z-index: 90;
}
#command_palette{
@@ -33,6 +34,7 @@ thead {
padding-top: 1px;
height: 26px;
width: 100%;
+ z-index: 90;
}
#btnNew{
@@ -102,6 +104,10 @@ table .sort.desc {
background-image: url(../images/listjs-arrow-sort-active-up.png);
}
+tbody.list tr{
+ vertical-align: top;
+}
+
.hiddendata{
display: none;
}
@@ -135,6 +141,24 @@ table .sort.desc {
font-style: italic;
}
+.field_title{
+ font-weight: bold;
+}
+
+.field_title_s{
+ font-weight: bold;
+ font-size: small;
+}
+
+.field_title_us{
+ font-weight: bold;
+ font-size: smaller;
+}
+
+label, .id_show, .text_show, .name_show, .type_show, .action_show{
+ font-size: small;
+}
+
#txtIdNew, .id_output{
text-transform: lowercase;
}
@@ -204,6 +228,80 @@ table .sort.desc {
padding-right: 2px;
}
+#chatgpt_web_additional_info_toggle td{
+ padding:0px 5px;
+ font-style: italic;
+}
+
+#chatgpt_web_additional_info, #chatgpt_web_additional_info_toggle, .chatgpt_web_additional_info, .chatgpt_web_additional_info_toggle, .chatgpt_web_additional_info_show{
+ background-color: rgb(255, 209, 183);
+ display:none;
+}
+
+.chatgpt_web_models_list_table{
+ background-color: rgb(255, 209, 183);
+ border:0;
+}
+
+.chatgpt_web_models_list_table *{
+ border:0;
+}
+
+.chatgpt_web_models_list_table td{
+ padding:2px;
+}
+
+#chatgpt_web_additional_info_toggle, .chatgpt_web_additional_info_toggle{
+ cursor: pointer;
+}
+
+#chatgpt_web_additional_info_toggle:hover, .chatgpt_web_additional_info_toggle:hover{
+ background-color: rgb(255, 189, 153);
+ text-decoration: underline;
+}
+
+#chatgpt_web_additional_info_toggle td{
+ text-align: center;
+}
+
+#chatgpt_web_additional_info td{
+ vertical-align: top;
+}
+
+.chatgpt_web_additional_info_toggle{
+ width: -moz-available;
+ text-align: center;
+ margin-top: 10px;
+}
+
+.chatgpt_web_additional_info_show{
+ flex-direction: column;
+ justify-content: space-between;
+ height: 100%;
+ padding: 3px;
+ margin-top: 5px;
+}
+
+.chatgpt_web_additional_info_row{
+ display: flex;
+}
+
+.chatgpt_web_additional_info_row span{
+ margin-right: 0.4em;
+}
+
+input.input_additional[type="text"]{
+ width: -moz-available;
+}
+
+.small_info{
+ font-size:smaller;
+}
+
+.conntype_chatgpt_web_option{
+ cursor: pointer;
+}
+
@media (prefers-color-scheme: dark) {
body {
background-color: #1C1B22;
@@ -250,4 +348,13 @@ table .sort.desc {
.autocomplete-list li.active {
background-color: #4c4e58;
}
+
+ #chatgpt_web_additional_info, #chatgpt_web_additional_info_toggle, .chatgpt_web_additional_info, .chatgpt_web_additional_info_toggle, .chatgpt_web_additional_info_show, .chatgpt_web_models_list_table{
+ background-color: rgb(39, 11, 0);
+ color: rgb(182, 182, 182);
+ }
+
+ #chatgpt_web_additional_info_toggle:hover, .chatgpt_web_additional_info_toggle:hover{
+ background-color: rgb(88, 25, 0);
+ }
}
\ No newline at end of file
diff --git a/pages/customprompts/mzta-custom-prompts.html b/pages/customprompts/mzta-custom-prompts.html
index 4a8c0424..1ac05ee5 100644
--- a/pages/customprompts/mzta-custom-prompts.html
+++ b/pages/customprompts/mzta-custom-prompts.html
@@ -27,29 +27,39 @@
@@ -89,9 +112,9 @@
__MSG_customPrompts_form_label_ID__
__MSG_customPrompts_form_label_Name__
__MSG_customPrompts_form_label_Text__
- __MSG_customPrompts_add_to_menu__
- Properties
- __MSG_customPrompts_form_label_Action__
+
+ __MSG_customPrompts_Properties__
+
diff --git a/pages/customprompts/mzta-custom-prompts.js b/pages/customprompts/mzta-custom-prompts.js
index ac4f8f75..802f9e7b 100644
--- a/pages/customprompts/mzta-custom-prompts.js
+++ b/pages/customprompts/mzta-custom-prompts.js
@@ -16,12 +16,14 @@
* along with this program. If not, see .
*/
+import { prefs_default } from "../../options/mzta-options-default.js";
import { getPrompts, setDefaultPromptsProperties, setCustomPrompts, preparePromptsForExport, preparePromptsForImport } from "../../js/mzta-prompts.js";
-import { isThunderbird128OrGreater, getCustomPromptsUsedSpace, sanitizeHtml } from "../../js/mzta-utils.js";
+import { ChatGPTWeb_models, isThunderbird128OrGreater, getCustomPromptsUsedSpace, sanitizeHtml, validateCustomData_ChatGPTWeb, getChatGPTWebModelsList_HTML } from "../../js/mzta-utils.js";
import { taLogger } from "../../js/mzta-logger.js";
import { getPlaceholders } from "../../js/mzta-placeholders.js";
import { textareaAutocomplete } from "../../js/mzta-placeholders-autocomplete.js";
+let prefs = null;
var promptsList = null;
var somethingChanged = false;
var positionMax_compose = 0;
@@ -33,8 +35,8 @@ let autocompleteSuggestions = [];
document.addEventListener('DOMContentLoaded', async () => {
- let prefs_debug = await browser.storage.sync.get({do_debug: false});
- taLog = new taLogger("mzta-custom-prompts", prefs_debug.do_debug);
+ prefs = await browser.storage.sync.get({ connection_type:prefs_default.connection_type, do_debug: prefs_default.do_debug });
+ taLog = new taLogger("mzta-custom-prompts", prefs.do_debug);
setStorageSpace();
@@ -62,6 +64,9 @@ document.addEventListener('DOMContentLoaded', async () => {
e.preventDefault();
e.target.disabled = true;
document.getElementById('formNew').style.display = 'block';
+ let _checkboxUseDiffViewerNew = document.getElementById('checkboxUseDiffViewerNew');
+ _checkboxUseDiffViewerNew.checked = false;
+ _checkboxUseDiffViewerNew.disabled = true;
window.scrollTo({
top: 0,
behavior: 'smooth'
@@ -69,40 +74,6 @@ document.addEventListener('DOMContentLoaded', async () => {
}
btnNew.addEventListener('click', handleNewClick);
- // Display selected value next to select input
- // function handleSelectChange(e) {
- // e.preventDefault();
- // const spanElement = e.target.nextElementSibling;
- // spanElement.textContent = e.target.value;
- // }
- // document.querySelectorAll('select.input_mod').forEach(element => {
- // element.addEventListener('change', handleSelectChange);
- // });
-
- // Log data ID number from item row and prepare for edit action
-
- // Handle "type" select changes and log new state
- // function handleTypeSelectChange(e) {
- // e.preventDefault();
- // const spanElement = e.target.nextElementSibling;
- // spanElement.textContent = e.target.value;
- // }
- // let type_select_elements = document.querySelectorAll("select.type_output");
- // type_select_elements.forEach(element => {
- // element.addEventListener('change', handleTypeSelectChange);
- // });
-
- // Handle "action" select changes and log new state
- // function handleActionSelectChange(e) {
- // e.preventDefault();
- // const spanElement = e.target.nextElementSibling;
- // spanElement.textContent = e.target.value;
- // }
- // let action_select_elements = document.querySelectorAll("select.action_output");
- // action_select_elements.forEach(element => {
- // element.addEventListener('change', handleActionSelectChange);
- // });
-
// for the new prompt form
let btnNew_elements = document.querySelectorAll(".input_new");
if(btnNew_elements) {
@@ -129,22 +100,68 @@ document.addEventListener('DOMContentLoaded', async () => {
});
});
- // document.addEventListener('click', (e) => {
- // // Check if the click was outside the textarea or suggestion list
- // const isClickInsideTextarea = e.target.closest('.editor');
- // const isClickInsideAutocompleteList = e.target.closest('.autocomplete-list');
-
- // if (!isClickInsideTextarea && !isClickInsideAutocompleteList) {
- // textareas.forEach(textarea => {
- // const container = textarea.closest('.autocomplete-container');
- // const autocompleteList = container.querySelector('.autocomplete-list');
- // hideSuggestions(autocompleteList);
- // });
- // }
- // });
-
i18n.updateDocument();
+ switch(prefs.connection_type) {
+ case 'chatgpt_web': {
+ // for the new item form
+ document.getElementById('chatgpt_web_additional_info_toggle').style.display = 'table-row';
+ // for the edit list items form
+ document.querySelectorAll('.chatgpt_web_additional_info_toggle').forEach(element => {
+ element.addEventListener('click', (e) => {
+ e.preventDefault();
+ let additionalInfoRow = e.target.closest('td').querySelector('.chatgpt_web_additional_info');
+ if (additionalInfoRow.style.display === 'none' || additionalInfoRow.style.display === '') {
+ additionalInfoRow.style.display = 'block';
+ e.target.innerText = browser.i18n.getMessage('customPrompts_hide_additional_info');
+ } else {
+ additionalInfoRow.style.display = 'none';
+ e.target.innerText = browser.i18n.getMessage('customPrompts_show_additional_info');
+ }
+ });
+ });
+ document.querySelectorAll('input.chatgpt_web_project_output').forEach(element => {
+ element.addEventListener("input", validateCustomData_ChatGPTWeb);
+ });
+ document.querySelectorAll('input.chatgpt_web_custom_gpt_output').forEach(element => {
+ element.addEventListener("input", validateCustomData_ChatGPTWeb);
+ });
+ break;
+ }
+ // case 'chatgpt_api':
+ // document.getElementById('chatgpt_api').style.display = 'block';
+ // break;
+ // case 'ollama_api':
+ // document.getElementById('ollama_api').style.display = 'block';
+ // break;
+ // case 'openai_comp_api':
+ // document.getElementById('openai_comp_api').style.display = 'block';
+ // break;
+ // case 'google_gemini_api':
+ // document.getElementById('google_gemini_api').style.display = 'block';
+ // break;
+ }
+
+ const chatgptWebAdditionalPropToggle = document.getElementById('chatgpt_web_additional_info_toggle');
+ chatgptWebAdditionalPropToggle.addEventListener('click', (e) => {
+ e.preventDefault();
+ const additionalInfoRow = document.getElementById('chatgpt_web_additional_info');
+ if (additionalInfoRow.style.display === 'none' || additionalInfoRow.style.display === '') {
+ additionalInfoRow.style.display = 'table-row';
+ let subspan = chatgptWebAdditionalPropToggle.querySelector('td span');
+ if (subspan) {
+ subspan.innerText = browser.i18n.getMessage('customPrompts_hide_additional_info');
+ }
+ } else {
+ additionalInfoRow.style.display = 'none';
+ let subspan = chatgptWebAdditionalPropToggle.querySelector('td span');
+ if (subspan) {
+ subspan.innerText = browser.i18n.getMessage('customPrompts_show_additional_info');
+ }
+ }
+ });
+
+
//To add a new item
var txtIdNew = document.getElementById('txtIdNew');
var txtNameNew = document.getElementById('txtNameNew');
@@ -156,6 +173,21 @@ document.addEventListener('DOMContentLoaded', async () => {
var checkboxNeedCustomTextNew = document.getElementById('checkboxNeedCustomTextNew');
var checkboxDefineResponseLangNew = document.getElementById('checkboxDefineResponseLangNew');
var checkboxUseDiffViewerNew = document.getElementById('checkboxUseDiffViewerNew');
+ // ChatGTP Web Integration
+ var chatgptWebModelNew = document.getElementById('chatGPTWebModelNew');
+ var chatgptWebProjectNew = document.getElementById('chatGPTWebProjectNew');
+ var chatgptWebCustomGptNew = document.getElementById('chatGPTWebCustomGPTNew');
+ chatgptWebProjectNew.addEventListener("input", validateCustomData_ChatGPTWeb);
+ chatgptWebCustomGptNew.addEventListener("input", validateCustomData_ChatGPTWeb);
+
+ selectActionNew.addEventListener('change', (e) => {
+ if (e.target.value === "2") {
+ checkboxUseDiffViewerNew.disabled = false;
+ } else {
+ checkboxUseDiffViewerNew.checked = false;
+ checkboxUseDiffViewerNew.disabled = true;
+ }
+ });
const btnAddNew = document.getElementById('btnAddNew');
btnAddNew.addEventListener('click', (e) => {
@@ -163,7 +195,7 @@ document.addEventListener('DOMContentLoaded', async () => {
if(!checkFields()) {
return;
}
- let newItem = promptsList.add({
+ let newItemData = {
id: String(txtIdNew.value.trim()).toLocaleLowerCase(),
name: txtNameNew.value.trim(),
text: txtTextNew.value.trim(),
@@ -179,7 +211,29 @@ document.addEventListener('DOMContentLoaded', async () => {
position_display: positionMax_display + 1,
is_default: 0,
idnum: idnumMax + 1,
- });
+ };
+
+ switch(prefs.connection_type) {
+ case 'chatgpt_web':
+ newItemData.chatgpt_web_model = chatgptWebModelNew.value.trim();
+ newItemData.chatgpt_web_project = chatgptWebProjectNew.value.trim();
+ newItemData.chatgpt_web_custom_gpt = chatgptWebCustomGptNew.value.trim();
+ break;
+ // case 'chatgpt_api':
+ // document.getElementById('chatgpt_api').style.display = 'block';
+ // break;
+ // case 'ollama_api':
+ // document.getElementById('ollama_api').style.display = 'block';
+ // break;
+ // case 'openai_comp_api':
+ // document.getElementById('openai_comp_api').style.display = 'block';
+ // break;
+ // case 'google_gemini_api':
+ // document.getElementById('google_gemini_api').style.display = 'block';
+ // break;
+ }
+
+ let newItem = promptsList.add(newItemData);
idnumMax++;
let curr_idnum = newItem[0].values().idnum;
let checkboxes = document.querySelectorAll(`tr[data-idnum="${curr_idnum}"] input[type="checkbox"]`);
@@ -288,6 +342,32 @@ document.addEventListener('DOMContentLoaded', async () => {
};
}
+ document.querySelectorAll('.chatgpt_web_additional_info_show').forEach(element => {
+ toggleAdditionalPropertiesShow(element.closest('tr'));
+ });
+
+ getChatGPTWebModelsList_HTML(ChatGPTWeb_models, 'chatgpt_web_models_list');
+ let formNewWebModelList = document.getElementById('chatgpt_web_models_list');
+ formNewWebModelList.querySelectorAll('.conntype_chatgpt_web_option').forEach(element => {
+ element.addEventListener("click", () => {
+ let el = document.getElementById("chatGPTWebModelNew");
+ el.value = element.textContent;
+ el.dispatchEvent(new Event('change'), { bubbles: true });
+ });
+ });
+
+ document.querySelectorAll('.id_output').forEach(element => {
+ getChatGPTWebModelsList_HTML(ChatGPTWeb_models, 'chatgpt_web_models_list_' + element.value);
+ let formWebModelList = document.getElementById('chatgpt_web_models_list_' + element.value);
+ formWebModelList.querySelectorAll('.conntype_chatgpt_web_option').forEach(element2 => {
+ element2.addEventListener("click", () => {
+ let el = document.getElementById("chatgpt_web_model_output_" + element.value);
+ el.value = element2.textContent;
+ el.dispatchEvent(new Event('change'), { bubbles: true });
+ });
+ });
+ });
+
}, { once: true });
//========= handling an item in a row
@@ -301,6 +381,7 @@ function handleEditClick(e) {
// tr.querySelector('.btnEditItem').style.display = 'none'; // Edit btn
tr.querySelector('.btnDeleteItem').style.display = 'none'; // Delete btn
showItemRowEditor(tr);
+ toggleDiffviewer(e);
}
function showItemRowEditor(tr) {
@@ -312,9 +393,13 @@ function showItemRowEditor(tr) {
text_output.style.display = 'inline';
textareaAutocomplete(text_output, autocompleteSuggestions)
tr.querySelector('.text_show').style.display = 'none';
+ toggleAdditionalPropertiesEditor(tr);
+ tr.querySelector('.chatgpt_web_additional_info_show').style.display = 'none';
tr.querySelector('.type_output').style.display = 'inline';
tr.querySelector('.type_show').style.display = 'none';
- tr.querySelector('.action_output').style.display = 'inline';
+ const action_output = tr.querySelector('.action_output')
+ action_output.style.display = 'inline';
+ action_output.addEventListener('change', toggleDiffviewer);
tr.querySelector('.action_show').style.display = 'none';
tr.querySelector('input.need_selected').disabled = false;
tr.querySelector('input.need_signature').disabled = false;
@@ -330,9 +415,14 @@ function hideItemRowEditor(tr) {
tr.querySelector('.name_show').style.display = 'inline';
tr.querySelector('.text_output').style.display = 'none';
tr.querySelector('.text_show').style.display = 'inline';
+ tr.querySelector('.chatgpt_web_additional_info_toggle').style.display = 'none';
+ tr.querySelector('.chatgpt_web_additional_info').style.display = 'none';
+ toggleAdditionalPropertiesShow(tr);
tr.querySelector('.type_output').style.display = 'none';
tr.querySelector('.type_show').style.display = 'inline';
- tr.querySelector('.action_output').style.display = 'none';
+ const action_output = tr.querySelector('.action_output')
+ action_output.style.display = 'none';
+ action_output.addEventListener('change', toggleDiffviewer);
tr.querySelector('.action_show').style.display = 'inline';
tr.querySelector('input.need_selected').disabled = true;
tr.querySelector('input.need_signature').disabled = true;
@@ -341,6 +431,104 @@ function hideItemRowEditor(tr) {
tr.querySelector('input.use_diff_viewer').disabled = true;
}
+function toggleAdditionalPropertiesShow(tr) {
+ switch(prefs.connection_type) {
+ case 'chatgpt_web': {
+ let element = tr.querySelector('.chatgpt_web_additional_info_show');
+ let chatGPTWebModel_show = tr.querySelector('.chatgpt_web_model_show');
+ let chatGPTWebProject_show = tr.querySelector('.chatgpt_web_project_show');
+ let chatGPTWebCustomGPT_show = tr.querySelector('.chatgpt_web_custom_gpt_show');
+
+ if ((chatGPTWebModel_show.innerText !== '' && chatGPTWebModel_show.innerText !== 'undefined') ||
+ (chatGPTWebProject_show.innerText !== '' && chatGPTWebProject_show.innerText !== 'undefined') ||
+ (chatGPTWebCustomGPT_show.innerText !== '' && chatGPTWebCustomGPT_show.innerText !== 'undefined')) {
+ element.style.display = 'flex';
+ } else {
+ element.style.display = 'none';
+ }
+
+ if(chatGPTWebModel_show.innerText === '' || chatGPTWebModel_show.innerText === 'undefined') {
+ chatGPTWebModel_show.parentNode.style.display = 'none';
+ } else {
+ chatGPTWebModel_show.parentNode.style.display = 'inline';
+ }
+ if(chatGPTWebProject_show.innerText === '' || chatGPTWebProject_show.innerText === 'undefined') {
+ chatGPTWebProject_show.parentNode.style.display = 'none';
+ } else {
+ chatGPTWebProject_show.parentNode.style.display = 'inline';
+ }
+ if(chatGPTWebCustomGPT_show.innerText === '' || chatGPTWebCustomGPT_show.innerText === 'undefined') {
+ chatGPTWebCustomGPT_show.parentNode.style.display = 'none';
+ } else {
+ chatGPTWebCustomGPT_show.parentNode.style.display = 'inline';
+ }
+ break;
+ }
+ // case 'chatgpt_api':
+ // document.getElementById('chatgpt_api').style.display = 'block';
+ // break;
+ // case 'ollama_api':
+ // document.getElementById('ollama_api').style.display = 'block';
+ // break;
+ // case 'openai_comp_api':
+ // document.getElementById('openai_comp_api').style.display = 'block';
+ // break;
+ // case 'google_gemini_api':
+ // document.getElementById('google_gemini_api').style.display = 'block';
+ // break;
+ }
+}
+
+function toggleAdditionalPropertiesEditor(tr) {
+ switch(prefs.connection_type) {
+ case 'chatgpt_web': {
+ let info_toggle = tr.querySelector('.chatgpt_web_additional_info_toggle');
+ info_toggle.style.display = 'block';
+ let chatGPTWebModel_show = tr.querySelector('.chatgpt_web_model_show').innerText;
+ let chatGPTWebProject_show = tr.querySelector('.chatgpt_web_project_show').innerText;
+ let chatGPTWebCustomGPT_show = tr.querySelector('.chatgpt_web_custom_gpt_show').innerText;
+
+ if ((chatGPTWebModel_show !== '' && chatGPTWebModel_show !== 'undefined') ||
+ (chatGPTWebProject_show !== '' && chatGPTWebProject_show !== 'undefined') ||
+ (chatGPTWebCustomGPT_show !== '' && chatGPTWebCustomGPT_show !== 'undefined')) {
+ info_toggle.click();
+ }
+ break;
+ }
+ // case 'chatgpt_api':
+ // document.getElementById('chatgpt_api').style.display = 'block';
+ // break;
+ // case 'ollama_api':
+ // document.getElementById('ollama_api').style.display = 'block';
+ // break;
+ // case 'openai_comp_api':
+ // document.getElementById('openai_comp_api').style.display = 'block';
+ // break;
+ // case 'google_gemini_api':
+ // document.getElementById('google_gemini_api').style.display = 'block';
+ // break;
+ }
+}
+
+function toggleDiffviewer(e) {
+ e.preventDefault();
+ const tr = e.target.parentNode.parentNode;
+ const action = tr.querySelector('.action_output').value;
+ const checkbox = tr.querySelector('.use_diff_viewer');
+ if (action === "2") {
+ checkbox.disabled = false;
+ } else {
+ checkbox.checked = false;
+ checkbox.setAttribute('checked_val', '0');
+ checkbox.disabled = true;
+ }
+ //console.log('>>>>>>>> tr: ' + tr.getAttribute('data-idnum'));
+ //console.log('>>>>>>>> action: ' + action);
+ //console.log('>>>>>>>> checkbox: ' + checkbox.checked);
+ //console.log('>>>>>>>> checkbox: ' + checkbox.style.display);
+}
+
+
// Confirm and log deletion action
function handleDeleteClick(e) {
e.preventDefault();
@@ -369,6 +557,9 @@ function handleCancelClick(e) {
// tr.querySelector('.type_output').selectedOptions[0].text = tr.querySelector('.type_show').innerText;
tr.querySelector('.action_output').value = tr.querySelector('.action').innerText;
// tr.querySelector('.action_output').selectedOptions[0].text = tr.querySelector('.action_show').innerText;
+ tr.querySelector('.chatgpt_web_model_output').value = tr.querySelector('.chatgpt_web_model_show').innerText;
+ tr.querySelector('.chatgpt_web_project_output').value = tr.querySelector('.chatgpt_web_project_show').innerText;
+ tr.querySelector('.chatgpt_web_custom_gpt_output').value = tr.querySelector('.chatgpt_web_custom_gpt_show').innerText;
hideItemRowEditor(tr);
}
@@ -384,6 +575,9 @@ function handleConfirmClick(e) {
tr.querySelector('.id_show').innerText = String(tr.querySelector('.id_output').value).toLocaleLowerCase();
tr.querySelector('.name_show').innerText = tr.querySelector('.name_output').value;
tr.querySelector('.text_show').innerText = tr.querySelector('.text_output').value;
+ tr.querySelector('.chatgpt_web_model_show').innerText = tr.querySelector('.chatgpt_web_model_output').value;
+ tr.querySelector('.chatgpt_web_project_show').innerText = tr.querySelector('.chatgpt_web_project_output').value;
+ tr.querySelector('.chatgpt_web_custom_gpt_show').innerText = tr.querySelector('.chatgpt_web_custom_gpt_output').value;
tr.querySelector('.type').innerText = tr.querySelector('.type_output').value;
tr.querySelector('.type_show').innerText = tr.querySelector('.type_output').selectedOptions[0].text;
tr.querySelector('.action').innerText = tr.querySelector('.action_output').value;
@@ -449,38 +643,72 @@ function loadPromptsList(values){
let output = `
-
- ` + type_output + `
+
+
+
+ __MSG_customPrompts_show_additional_info__
+
+
__MSG_prefs_OptionText_chatgpt_web_model__:
+
+
+
+
+
__MSG_prefs_OptionText_chatgpt_web_project__:
+
+
+
__MSG_prefs_OptionText_chatgpt_web_custom_data_info__ /g/PROJECT_ID-PROJECT_NAME/project
+ __MSG_prefs_OptionText_chatgpt_web_custom_data_info2__
+
+
__MSG_prefs_OptionText_chatgpt_web_custom_gpt__:
+
+
+
__MSG_prefs_OptionText_chatgpt_web_custom_data_info__ /g/CUSTOM_GPT_ID
+ __MSG_prefs_OptionText_chatgpt_web_custom_data_info2__
+ __MSG_prefs_OptionText_CustomGPT_Warn__
+
+
+ __MSG_customPrompts_add_to_menu__:
+
+ ` + type_output + `
__MSG_customPrompts_add_to_menu_always__
__MSG_customPrompts_add_to_menu_reading__
__MSG_customPrompts_add_to_menu_composing__
` +
`
+
+ __MSG_customPrompts_form_label_Action__:
+ ` + action_output + `
+
+ __MSG_customPrompts_close_button__
+ __MSG_customPrompts_do_reply__
+ __MSG_customPrompts_substitute_text__
+ ` +
+ `
- Action: ` + action_output + `
-
- __MSG_customPrompts_close_button__
- __MSG_customPrompts_do_reply__
- __MSG_customPrompts_substitute_text__
- ` +
- `
+ __MSG_customPrompts_form_label_need_selected__
- __MSG_customPrompts_form_label_need_selected__
+ __MSG_customPrompts_form_label_need_signature__
- __MSG_customPrompts_form_label_need_signature__
+ __MSG_customPrompts_form_label_need_custom_text__
- __MSG_customPrompts_form_label_need_custom_text__
+ __MSG_customPrompts_form_label_define_response_lang__
- __MSG_customPrompts_form_label_define_response_lang__
+ __MSG_customPrompts_form_label_use_diff_viewer__
- __MSG_customPrompts_form_label_use_diff_viewer__
-
- __MSG_customPrompts_form_label_enabled__
+ __MSG_customPrompts_form_label_enabled__
+ __MSG_customPrompts_show_additional_info_show__
+
__MSG_prefs_OptionText_chatgpt_web_model__: ` + values.chatgpt_web_model + `
+
__MSG_prefs_OptionText_chatgpt_web_project__: ` + values.chatgpt_web_project + `
+
__MSG_prefs_OptionText_chatgpt_web_custom_gpt__: ` + values.chatgpt_web_custom_gpt + `
+
__MSG_customPrompts_btnEdit__
@@ -498,6 +726,28 @@ function loadPromptsList(values){
}
};
+ switch(prefs.connection_type) {
+ case 'chatgpt_web': {
+ options.valueNames.push('chatgpt_web_model', 'chatgpt_web_project', 'chatgpt_web_custom_gpt');
+ break;
+ }
+ // case 'chatgpt_api':
+ // document.getElementById('chatgpt_api').style.display = 'block';
+ // break;
+ // case 'ollama_api':
+ // document.getElementById('ollama_api').style.display = 'block';
+ // break;
+ // case 'openai_comp_api':
+ // document.getElementById('openai_comp_api').style.display = 'block';
+ // break;
+ // case 'google_gemini_api':
+ // document.getElementById('google_gemini_api').style.display = 'block';
+ // break;
+ }
+
+ // console.log('>>>>>>>>>>>>> options: ' + JSON.stringify(options));
+ // console.log('>>>>>>>>>>>>> values: ' + JSON.stringify(values));
+
promptsList = new List('all_prompts', options, values);
checkSelectedBoxes();
@@ -572,6 +822,9 @@ function clearFields() {
document.getElementById('txtIdNew').value = '';
document.getElementById('txtNameNew').value = '';
document.getElementById('txtTextNew').value = '';
+ document.getElementById('chatGPTWebModelNew').value = '';
+ document.getElementById('chatGPTWebProjectNew').value = '';
+ document.getElementById('chatGPTWebCustomGPTNew').value = '';
document.getElementById('selectTypeNew').value = '0';
document.getElementById('selectActionNew').value = '0';
document.getElementById('checkboxNeedSelectedNew').value = '0';
@@ -641,6 +894,7 @@ async function saveAll() {
promptsList.reIndex();
let newPrompts = promptsList.items.map(item => {
// For each item in the array, return only the '_values' part
+ // console.log(">>>>>>>>>>>>>>>> item: " + JSON.stringify(item))
return item.values();
});
taLog.log('newPrompts: ' + JSON.stringify(newPrompts));
diff --git a/pages/get-task/mzta-get-task.css b/pages/get-task/mzta-get-task.css
new file mode 100644
index 00000000..0ce83ec5
--- /dev/null
+++ b/pages/get-task/mzta-get-task.css
@@ -0,0 +1,119 @@
+#get_task_prompt_container{
+ width: 90%;
+ margin: 20px auto;
+}
+
+#get_task_prompt_text{
+ width: 100%;
+}
+
+.infoline{
+ font-size: 0.8em;
+ font-style: italic;
+}
+
+.btn_div{
+ width: 100%;
+ display: flex;
+ justify-content: space-between;
+}
+
+table#miczPrefs {
+ padding: 10px;
+ border-spacing: 0px;
+ width: 90%;
+ margin: 0px auto 40px auto;
+ border: 1px solid #ccc;
+}
+
+.get_task_table_title{
+ width: 90%;
+ margin: auto;
+}
+
+.section_title{
+ font-weight: bold;
+}
+
+table#miczPrefs td{
+ border-top: 1px solid #ccc;
+ border-bottom: 1px solid #ccc;
+ vertical-align: top;
+ padding: 2px;
+}
+
+table#miczPrefs tr:first-child td {
+ border-top: none;
+}
+
+table#miczPrefs tr:last-child td {
+ border-bottom: none;
+}
+
+.autocomplete-container {
+ position: relative;
+}
+
+.autocomplete-list {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ right: 0;
+ background-color: white;
+ border: 1px solid #ccc;
+ z-index: 1000;
+ max-height: 200px;
+ overflow-y: auto;
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ font-size: small;
+}
+
+.autocomplete-list li {
+ padding: 8px;
+ cursor: pointer;
+}
+
+.autocomplete-list li:hover {
+ background-color: #f0f0f0;
+}
+
+.autocomplete-list li.active {
+ background-color: #ddd;
+}
+
+.hidden {
+ display: none;
+}
+
+.unsaved{
+ color: red;
+}
+
+
+@media (prefers-color-scheme: dark) {
+ body {
+ background-color: #1C1B22;
+ color: rgb(251, 251, 254);
+ }
+
+ a:link { color: #409EFF; }
+ a:visited { color: #409EFF; }
+ a:hover { color: #66B1FF; }
+ a:active { color: #66B1FF; }
+ a:active { color: #66B1FF; }
+
+ .autocomplete-list {
+ background-color: #2E2F36;
+ border: 1px solid #2E2F36;
+ }
+
+ .autocomplete-list li:hover {
+ background-color: #4c4e58;
+ }
+
+ .autocomplete-list li.active {
+ background-color: #4c4e58;
+ }
+}
\ No newline at end of file
diff --git a/pages/get-task/mzta-get-task.html b/pages/get-task/mzta-get-task.html
new file mode 100644
index 00000000..98027d85
--- /dev/null
+++ b/pages/get-task/mzta-get-task.html
@@ -0,0 +1,73 @@
+
+
+
+
+ ThunderAI - __MSG_GetTask_PageTitle__
+
+
+
+
+
+
__MSG_GetTask_PageTitle__
+
__MSG_GetTask_info_default__
+
+ __MSG_get_calendar_event_prompt_prefs_title__
+
+
+
__MSG_GetCalendarEvent_prompt_text_title__ __MSG_customPrompts_unsaved_changes__
+
__MSG_prefs_OptionText_btnManagePrompts_infoline__ __MSG_customPrompts_managePrompts_help__
+ __MSG_prefs_OptionText_GetCalendarEvent_infoline2__
+
+
+
+
__MSG_reset_default__ __MSG_save__
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/get-task/mzta-get-task.js b/pages/get-task/mzta-get-task.js
new file mode 100644
index 00000000..2b33e297
--- /dev/null
+++ b/pages/get-task/mzta-get-task.js
@@ -0,0 +1,149 @@
+/*
+ * ThunderAI [https://micz.it/thunderbird-addon-thunderai/]
+ * Copyright (C) 2024 - 2025 Mic (m@micz.it)
+
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+import { prefs_default } from '../../options/mzta-options-default.js';
+import { taLogger } from '../../js/mzta-logger.js';
+import { getSpecialPrompts, setSpecialPrompts } from "../../js/mzta-prompts.js";
+import { getPlaceholders } from "../../js/mzta-placeholders.js";
+import { textareaAutocomplete } from "../../js/mzta-placeholders-autocomplete.js";
+
+let autocompleteSuggestions = [];
+let taLog = new taLogger("mzta-get-calendar-event-page",true);
+
+document.addEventListener('DOMContentLoaded', async () => {
+
+ i18n.updateDocument();
+ await restoreOptions();
+
+ document.querySelectorAll(".option-input").forEach(element => {
+ element.addEventListener("change", saveOptions);
+ });
+
+ let get_calendar_event_textarea = document.getElementById('get_task_prompt_text');
+ let get_calendar_event_save_btn = document.getElementById('btn_save_prompt');
+ let get_calendar_event_reset_btn = document.getElementById('btn_reset_prompt');
+
+ let specialPrompts = await getSpecialPrompts();
+ let get_calendar_event_prompt = specialPrompts.find(prompt => prompt.id === 'prompt_get_task');
+
+ get_calendar_event_textarea.addEventListener('input', (event) => {
+ get_calendar_event_reset_btn.disabled = (event.target.value === browser.i18n.getMessage('prompt_get_task_full_text'));
+ get_calendar_event_save_btn.disabled = (event.target.value === get_calendar_event_prompt.text);
+ if(get_calendar_event_save_btn.disabled){
+ document.getElementById('get_task_prompt_unsaved').classList.add('hidden');
+ } else {
+ document.getElementById('get_task_prompt_unsaved').classList.remove('hidden');
+ }
+ });
+
+ get_calendar_event_reset_btn.addEventListener('click', () => {
+ get_calendar_event_textarea.value = browser.i18n.getMessage('prompt_get_task_full_text');
+ get_calendar_event_reset_btn.disabled = true;
+ let event = new Event('input', { bubbles: true, cancelable: true });
+ get_calendar_event_textarea.dispatchEvent(event);
+ });
+
+ get_calendar_event_save_btn.addEventListener('click', () => {
+ specialPrompts.find(prompt => prompt.id === 'prompt_get_task').text = get_calendar_event_textarea.value;
+ setSpecialPrompts(specialPrompts);
+ get_calendar_event_save_btn.disabled = true;
+ document.getElementById('get_task_prompt_unsaved').classList.add('hidden');
+ browser.runtime.sendMessage({command: "reload_menus"});
+ });
+
+ if(get_calendar_event_prompt.text === 'prompt_get_task_full_text'){
+ get_calendar_event_prompt.text = browser.i18n.getMessage(get_calendar_event_prompt.text);
+ }
+ get_calendar_event_textarea.value = get_calendar_event_prompt.text;
+ get_calendar_event_reset_btn.disabled = (get_calendar_event_textarea.value === browser.i18n.getMessage('prompt_get_task_full_text'));
+
+ autocompleteSuggestions = (await getPlaceholders(true)).filter(p => !(p.id === 'additional_text')).map(p => ({command: '{%'+p.id+'%}', type: p.type}));
+ textareaAutocomplete(get_calendar_event_textarea, autocompleteSuggestions, 1); // type_value = 1, only when reading an email
+
+});
+
+
+
+// Methods to manage options, derived from: /options/mzta-options.js
+
+function saveOptions(e) {
+ e.preventDefault();
+ let options = {};
+ let element = e.target;
+
+ switch (element.type) {
+ case 'checkbox':
+ options[element.id] = element.checked;
+ break;
+ case 'number':
+ options[element.id] = element.valueAsNumber;
+ break;
+ case 'text':
+ case 'password':
+ options[element.id] = element.value.trim();
+ break;
+ default:
+ if (element.tagName === 'SELECT') {
+ options[element.id] = element.value;
+ }else{
+ console.error("[ThunderAI] Unhandled input type:", element.type);
+ }
+ }
+
+ browser.storage.sync.set(options);
+}
+
+async function restoreOptions() {
+ function setCurrentChoice(result) {
+ document.querySelectorAll(".option-input").forEach(element => {
+ taLog.log("Options restoring " + element.id + " = " + (element.id=="chatgpt_api_key" || element.id=="openai_comp_api_key" ? "****************" : result[element.id]));
+ switch (element.type) {
+ case 'checkbox':
+ element.checked = result[element.id] || false;
+ break;
+ case 'number':
+ let default_number_value = 0;
+ if(element.id == 'chatgpt_win_height') default_number_value = prefs_default.chatgpt_win_height;
+ if(element.id == 'chatgpt_win_width') default_number_value = prefs_default.chatgpt_win_width;
+ element.value = result[element.id] ?? default_number_value;
+ break;
+ case 'text':
+ case 'password':
+ let default_text_value = '';
+ if(element.id == 'default_chatgpt_lang') default_text_value = prefs_default.default_chatgpt_lang;
+ element.value = result[element.id] || default_text_value;
+ break;
+ default:
+ if (element.tagName === 'SELECT') {
+ let default_select_value = '';
+ if(element.id == 'reply_type') default_select_value = 'reply_all';
+ if(element.id == 'connection_type') default_select_value = 'chatgpt_web';
+ element.value = result[element.id] || default_select_value;
+ if (element.value === '') {
+ element.selectedIndex = -1;
+ }
+ }else{
+ console.error("[ThunderAI] Unhandled input type:", element.type);
+ }
+ }
+ });
+ }
+
+ let getting = await browser.storage.sync.get(prefs_default);
+ setCurrentChoice(getting);
+}
\ No newline at end of file
diff --git a/pages/onboarding/onboarding.css b/pages/onboarding/onboarding.css
index d3404775..cd1f9b64 100644
--- a/pages/onboarding/onboarding.css
+++ b/pages/onboarding/onboarding.css
@@ -181,3 +181,39 @@ h2 {
.section .button:active {
box-shadow: inset 5px 2px 5px rgba(0, 0, 0, 0.3);
}
+
+#chatgpt_web_permission {
+ display: none;
+ background-color: red;
+ color: white;
+ padding: 10px;
+ border-radius: 5px;
+ margin: 10px 0;
+ font-size: 18px;
+ font-weight: bold;
+ text-align: center;
+ cursor: pointer;
+ transition: background-color 0.3s ease, transform 0.3s ease;
+}
+
+#chatgpt_web_permission:hover {
+ background-color: darkred;
+ transform: scale(1.05);
+}
+
+#chatgpt_web_permission_ok {
+ display: none;
+ background-color: green;
+ color: white;
+ padding: 10px;
+ border-radius: 5px;
+ margin: 10px 0;
+ font-size: 18px;
+ font-weight: bold;
+ text-align: center;
+ cursor: pointer;
+}
+#chatgpt_web_permission_ok:hover {
+ background-color: darkgreen;
+ transform: scale(1.05);
+}
\ No newline at end of file
diff --git a/pages/onboarding/onboarding.html b/pages/onboarding/onboarding.html
index 8ab0c1d0..4312f8a8 100644
--- a/pages/onboarding/onboarding.html
+++ b/pages/onboarding/onboarding.html
@@ -14,6 +14,10 @@
+
__MSG_ask_chatgptweb_permission_1__
+ __MSG_ask_chatgptweb_permission_2__
+
+
__MSG_ask_chatgptweb_permission_ok__
+
+