commit
bbd0186849
25 changed files with 4453 additions and 123 deletions
17
CHANGELOG.md
17
CHANGELOG.md
|
|
@ -2,25 +2,40 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Version 1.1.0 - ??/??/2024</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A prompt can be configured to request additional text from the user.</li>
|
||||||
|
<li>Added custom prompts. See more info <a href="https://micz.it/thunderdbird-addon-thunderai/custom-prompts/">here</a>.</li>
|
||||||
|
<li>Dark mode added.</li>
|
||||||
|
<li>Added some error messages to handle potential changes in the ChatGPT web interface.</li>
|
||||||
|
<li>German translation added.</li>
|
||||||
|
<li>French translation added.</li>
|
||||||
|
<li>Log messages improved.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h2>Version 1.0.10 - 17/05/2024</h2>
|
<h2>Version 1.0.10 - 17/05/2024</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Now using the new URL chatgpt.com.</li>
|
<li>Now using the new URL chatgpt.com.</li>
|
||||||
<li>More improvements in handling the ChatGPT web interface.</li>
|
<li>More improvements in handling the ChatGPT web interface.</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h2>Version 1.0.9 - 16/05/2024</h2>
|
<h2>Version 1.0.9 - 16/05/2024</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Improved handling of different versions of the ChatGPT web interface.</li>
|
<li>Improved handling of different versions of the ChatGPT web interface.</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h2>Version 1.0.8 - 15/05/2024</h2>
|
<h2>Version 1.0.8 - 15/05/2024</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Fixed changes in the ChatGPT web interface, see <a href="https://github.com/micz/ThunderAI/issues/57">#57</a> and <a href="https://github.com/micz/ThunderAI/issues/62">#62</a>.</li>
|
<li>Fixed changes in the ChatGPT web interface [<a href="https://github.com/micz/ThunderAI/issues/57">#57</a>, <a href="https://github.com/micz/ThunderAI/issues/62">#62</a>].</li>
|
||||||
<li>Correctly handling the model ChatGPT-4o.</li>
|
<li>Correctly handling the model ChatGPT-4o.</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h2>Version 1.0.7 - 09/05/2024</h2>
|
<h2>Version 1.0.7 - 09/05/2024</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Improved the reply prompt to exclude comments and other text beside the mail text.</li>
|
<li>Improved the reply prompt to exclude comments and other text beside the mail text.</li>
|
||||||
<li>Correctly keeping the signature in a reply even if it's above the quoted email [<a href="https://github.com/micz/ThunderAI/issues/45">#45</a>].</li>
|
<li>Correctly keeping the signature in a reply even if it's above the quoted email [<a href="https://github.com/micz/ThunderAI/issues/45">#45</a>].</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h2>Version 1.0.6 - 08/05/2024</h2>
|
<h2>Version 1.0.6 - 08/05/2024</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Correctly handling a change in the ChatGPT web interface [<a href="https://github.com/micz/ThunderAI/issues/43">#43</a>].</li>
|
<li>Correctly handling a change in the ChatGPT web interface [<a href="https://github.com/micz/ThunderAI/issues/43">#43</a>].</li>
|
||||||
|
|
|
||||||
|
|
@ -16,9 +16,15 @@ ThunderAI is a tool for anyone looking to improve their email quality, both in c
|
||||||
|
|
||||||
There is no need for an API key and is possibile to use this extension even with a free account!
|
There is no need for an API key and is possibile to use this extension even with a free account!
|
||||||
|
|
||||||
|
Starting from version 1.1.0, you can also define your own **custom prompts**! Find out how [here](https://micz.it/thunderdbird-addon-thunderai/custom-prompts/)!
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
## Changelog
|
## Changelog
|
||||||
ThunderAI's changes are logged [here](CHANGELOG.md).
|
ThunderAI's changes are logged [here](CHANGELOG.md).
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
<br>Thanks to:
|
<br>Thanks to:
|
||||||
<ul><li><a href="https://github.com/KudoAI/chatgpt.js">chatgpt.js</a> for providing methods to interact with the ChatGTP frontend.</li>
|
<ul><li><a href="https://github.com/KudoAI/chatgpt.js">chatgpt.js</a> for providing methods to interact with the ChatGTP frontend.</li>
|
||||||
<li><a href="https://github.com/ali-raheem/Aify">Aify</a> for inspiration and certains methods to process the text from ChatGPT.</li>
|
<li><a href="https://github.com/ali-raheem/Aify">Aify</a> for inspiration and certains methods to process the text from ChatGPT.</li>
|
||||||
|
|
|
||||||
407
_locales/de/messages.json
Normal file
407
_locales/de/messages.json
Normal file
|
|
@ -0,0 +1,407 @@
|
||||||
|
{
|
||||||
|
"extensionDescription": {
|
||||||
|
"message": "Verwenden Sie ChatGPT, um Ihre E-Mails zu verbessern!",
|
||||||
|
"description": "Beschreibung der Erweiterung."
|
||||||
|
},
|
||||||
|
|
||||||
|
"menu_title": {
|
||||||
|
"message": "KI",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prompt_lang": {
|
||||||
|
"message": "Antwort in ",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prompt_reply": {
|
||||||
|
"message": "Darauf antworten",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prompt_rewrite_polite": {
|
||||||
|
"message": "Höflich umschreiben",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prompt_rewrite_formal": {
|
||||||
|
"message": "Formal umschreiben",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prompt_classify": {
|
||||||
|
"message": "Klassifizieren",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prompt_summarize_this": {
|
||||||
|
"message": "Zusammenfassen",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prompt_translate_this": {
|
||||||
|
"message": "Übersetzen",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prompt_this": {
|
||||||
|
"message": "Auffordern",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prompt_selection_needed": {
|
||||||
|
"message": "Um fortzufahren, müssen Sie einen Text auswählen!",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_managePrompts": {
|
||||||
|
"message": "Eingabeaufforderungen verwalten",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_managePrompts_help": {
|
||||||
|
"message": "Informationen",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_start_saving": {
|
||||||
|
"message": "Eingabeaufforderungen werden gespeichert...",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_reindexing_list": {
|
||||||
|
"message": "Liste wird neu indiziert...",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_filtering_prompts": {
|
||||||
|
"message": "Eingabeaufforderungen werden gefiltert...",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_saving_default_prompts": {
|
||||||
|
"message": "Standard-Eingabeaufforderungen werden gespeichert...",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_saving_custom_prompts": {
|
||||||
|
"message": "Benutzerdefinierte Eingabeaufforderungen werden gespeichert...",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_reloading_menus": {
|
||||||
|
"message": "Menüs werden neu geladen...",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_saved": {
|
||||||
|
"message": "Eingabeaufforderungen gespeichert!",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_form_label_ID": {
|
||||||
|
"message": "ID",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_form_label_ID_rules": {
|
||||||
|
"message": "Muss eindeutig, kleingeschrieben und ohne Leerzeichen sein",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_form_label_Name": {
|
||||||
|
"message": "Name",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_form_label_Text": {
|
||||||
|
"message": "Eingabeaufforderungstext",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_form_label_Action": {
|
||||||
|
"message": "Aktion",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_form_label_need_selected": {
|
||||||
|
"message": "Textauswahl erforderlich",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_form_label_need_signature": {
|
||||||
|
"message": "Immer die Signatur hinzufügen",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_form_label_need_custom_text": {
|
||||||
|
"message": "Nach zusätzlichem Text fragen",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_form_label_enabled": {
|
||||||
|
"message": "Aktiviert",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_form_required_fields": {
|
||||||
|
"message": "Erforderliche Felder",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_btnEdit": {
|
||||||
|
"message": "Bearbeiten",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_btnCancel": {
|
||||||
|
"message": "Abbrechen",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_btnOK": {
|
||||||
|
"message": "OK",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_btnDelete": {
|
||||||
|
"message": "Löschen",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_btnDelete_confirmText": {
|
||||||
|
"message": "Sind Sie sicher, dass Sie dieses Element löschen möchten?",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_unsaved_changes": {
|
||||||
|
"message": "Es gibt ungespeicherte Änderungen!",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_btnSaveAll": {
|
||||||
|
"message": "Alle speichern",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_save_button": {
|
||||||
|
"message": "Speichern",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_btnNew": {
|
||||||
|
"message": "Neu hinzufügen",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_btnAddNewCommit": {
|
||||||
|
"message": "Eingabeaufforderung hinzufügen",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_add_to_menu": {
|
||||||
|
"message": "Zum Menü hinzufügen",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_add_to_menu_always": {
|
||||||
|
"message": "Immer",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_add_to_menu_reading": {
|
||||||
|
"message": "E-Mail lesen",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_add_to_menu_composing": {
|
||||||
|
"message": "E-Mail verfassen",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_close_button": {
|
||||||
|
"message": "Schließen",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_do_reply": {
|
||||||
|
"message": "Antworten",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_substitute_text": {
|
||||||
|
"message": "Text ersetzen",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"chatgpt_win_working": {
|
||||||
|
"message": "Arbeit in Arbeit...",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"chatgpt_win_job_completed": {
|
||||||
|
"message": "Abgeschlossen!",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"chatgpt_win_get_answer": {
|
||||||
|
"message": "Letzte Antwort verwenden",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"chatgpt_win_close": {
|
||||||
|
"message": "Schließen",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"chatgpt_textarea_not_found_error": {
|
||||||
|
"message": "Es gibt einen Fehler beim Senden der Eingabeaufforderung an ChatGPT. Bitte versuchen Sie es erneut. Wenn das Problem weiterhin besteht, überprüfen Sie bitte den <a href=\"https://micz.it/thunderdbird-addon-thunderai/status/\">Dienststatus</a>.",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"chatgpt_sendbutton_not_found_error": {
|
||||||
|
"message": "Klicken Sie auf die Schaltfläche „Senden“, um die Eingabeaufforderung zu übermitteln.",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"chatgpt_user_not_logged_in": {
|
||||||
|
"message": "Sie sind nicht bei ChatGPT angemeldet. Bitte melden Sie sich mit Ihren Anmeldeinformationen an, schließen Sie das ChatGPT-Fenster und wiederholen Sie dann die Aktion, die Sie versucht haben. Danach bleiben Sie angemeldet.",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"chatgpt_win_model_warning": {
|
||||||
|
"message": "Sie haben die Option zur Verwendung von ChatGPT-4 eingestellt, aber es scheint, dass es nicht korrekt geladen wird. Haben Sie das richtige Modell oben ausgewählt?",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"chatgpt_win_custom_text": {
|
||||||
|
"message": "Fügen Sie hier den zusätzlichen Text für die Eingabeaufforderung ein.",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"chatgpt_win_send": {
|
||||||
|
"message": "Senden",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"chatgpt_use_gpt35": {
|
||||||
|
"message": "Verwenden Sie GPT3.5",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"chatgpt_force_completion": {
|
||||||
|
"message": "Abschluss erzwingen",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"chatgpt_force_completion_title": {
|
||||||
|
"message": "Klicken Sie hier, um die Schaltfläche „Letzte Antwort verwenden“ anzuzeigen, wenn ChatGPT seine Arbeit abgeschlossen hat, die Schaltfläche jedoch nicht erschienen ist.",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"msg_prompt_too_long": {
|
||||||
|
"message": "Der eingegebene Text ist zu lang. Sie müssen ihn verkürzen, um ChatGPT zu verwenden.",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefs_OptionText_release_notes": {
|
||||||
|
"message": "Versionshinweise",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefs_status_page": {
|
||||||
|
"message": "Dienststatus",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefs_OptionText_chatgpt_win_text": {
|
||||||
|
"message": "ChatGPT-Fensterabmessungen",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefs_OptionText_chatgpt_win_height": {
|
||||||
|
"message": "Höhe",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefs_OptionText_chatgpt_win_width": {
|
||||||
|
"message": "Breite",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefs_OptionText_default_sign_name": {
|
||||||
|
"message": "Standard-Signaturname",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefs_OptionText_default_chatgpt_lang": {
|
||||||
|
"message": "Standardsprache für ChatGPT-Antworten",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefs_OptionText_reply_all": {
|
||||||
|
"message": "Allen antworten",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefs_OptionText_reply_sender": {
|
||||||
|
"message": "Absender antworten",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefs_OptionText_reply_type": {
|
||||||
|
"message": "Antworttyp",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefs_OptionText_chatpgt_use_gpt4": {
|
||||||
|
"message": "Verwenden Sie ChatGPT-4",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefs_OptionText_chatpgt_use_gpt4_info": {
|
||||||
|
"message": "Nachdem Sie diese Option geändert haben, müssen Sie beim ersten Gebrauch das richtige Modell auswählen.",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefs_OptionText_btnManagePrompts": {
|
||||||
|
"message": "Verwalten Sie Ihre Eingabeaufforderungen",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefsInfoTitle": {
|
||||||
|
"message": "Wichtige Informationen",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefsInfoDesc_1": {
|
||||||
|
"message": "Es ist nicht mehr möglich, den Verlauf der ChatGPT-Chats zu deaktivieren. Daher gibt es keine Möglichkeit, zu verhindern, dass Anfragen, die über dieses Addon gestellt werden, in Ihrem ChatGPT-Chatverlauf erscheinen.",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefsInfoDesc_2": {
|
||||||
|
"message": "Wenn eine weiße Seite erscheint, wenn das ChatGPT-Fenster geöffnet wird, bedeutet dies, dass es ein Problem beim Laden der ChatGPT-Seite gibt, das nicht mit der Verwendung dieses Add-Ons zusammenhängt.",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefsInfoDesc_3": {
|
||||||
|
"message": " ",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefsDonation_1": {
|
||||||
|
"message": "Gefällt Ihnen dieses Addon?",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefsDonation_2": {
|
||||||
|
"message": "Überlegen Sie, eine Spende zu machen!",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"backToOptionsText": {
|
||||||
|
"message": "Optionen",
|
||||||
|
"description": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -54,6 +54,186 @@
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"customPrompts_managePrompts": {
|
||||||
|
"message": "Manage Prompts",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_managePrompts_help": {
|
||||||
|
"message": "More info",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_start_saving": {
|
||||||
|
"message": "Saving prompts...",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_reindexing_list": {
|
||||||
|
"message": "Reindexing list...",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_filtering_prompts": {
|
||||||
|
"message": "Filtering prompts...",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_saving_default_prompts": {
|
||||||
|
"message": "Saving default prompts...",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_saving_custom_prompts": {
|
||||||
|
"message": "Saving custom prompts...",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_reloading_menus": {
|
||||||
|
"message": "Reloading menus...",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_saved": {
|
||||||
|
"message": "Prompts saved!",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_form_label_ID": {
|
||||||
|
"message": "ID",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_form_label_ID_rules": {
|
||||||
|
"message": "Must be unique, lowercase and without spaces",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_form_label_Name": {
|
||||||
|
"message": "Name",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_form_label_Text": {
|
||||||
|
"message": "Prompt Text",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_form_label_Action": {
|
||||||
|
"message": "Action",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_form_label_need_selected": {
|
||||||
|
"message": "Text selection needed",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_form_label_need_signature": {
|
||||||
|
"message": "Always add the signature",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_form_label_need_custom_text": {
|
||||||
|
"message": "Ask for additional text",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_form_label_enabled": {
|
||||||
|
"message": "Enabled",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_form_required_fields": {
|
||||||
|
"message": "Required fields",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_btnEdit": {
|
||||||
|
"message": "Edit",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_btnCancel": {
|
||||||
|
"message": "Cancel",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_btnOK": {
|
||||||
|
"message": "OK",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_btnDelete": {
|
||||||
|
"message": "Delete",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_btnDelete_confirmText": {
|
||||||
|
"message": "Are you sure you want to delete this item?",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_unsaved_changes": {
|
||||||
|
"message": "There are unsaved changes!",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_btnSaveAll": {
|
||||||
|
"message": "Save All",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_save_button": {
|
||||||
|
"message": "Save",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_btnNew": {
|
||||||
|
"message": "Add New",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_btnAddNewCommit": {
|
||||||
|
"message": "Add the Prompt",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_add_to_menu": {
|
||||||
|
"message": "Add to menu",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_add_to_menu_always": {
|
||||||
|
"message": "Always",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_add_to_menu_reading": {
|
||||||
|
"message": "Reading an email",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_add_to_menu_composing": {
|
||||||
|
"message": "Composing an email",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_close_button": {
|
||||||
|
"message": "Close button",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_do_reply": {
|
||||||
|
"message": "Do reply",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_substitute_text": {
|
||||||
|
"message": "Substitute text",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
"chatgpt_win_working": {
|
"chatgpt_win_working": {
|
||||||
"message": "Work in progress...",
|
"message": "Work in progress...",
|
||||||
"description": ""
|
"description": ""
|
||||||
|
|
@ -74,6 +254,16 @@
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"chatgpt_textarea_not_found_error": {
|
||||||
|
"message": "There is an error sending the prompt to ChatGPT, please retry. If the problem persists, please <a href=\"https://micz.it/thunderdbird-addon-thunderai/status/\">check the service status</a>.",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"chatgpt_sendbutton_not_found_error": {
|
||||||
|
"message": "Click the send button to submit the prompt.",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
"chatgpt_user_not_logged_in": {
|
"chatgpt_user_not_logged_in": {
|
||||||
"message": "You are not logged in to ChatGPT. Please log in with your credentials, close the ChatGPT window, and then repeat the action you attempted. You will remain logged in afterwards.",
|
"message": "You are not logged in to ChatGPT. Please log in with your credentials, close the ChatGPT window, and then repeat the action you attempted. You will remain logged in afterwards.",
|
||||||
"description": ""
|
"description": ""
|
||||||
|
|
@ -84,6 +274,16 @@
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"chatgpt_win_custom_text": {
|
||||||
|
"message": "Insert here the additional text for the prompt.",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"chatgpt_win_send": {
|
||||||
|
"message": "Send",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
"chatgpt_use_gpt35": {
|
"chatgpt_use_gpt35": {
|
||||||
"message": "Use GPT3.5",
|
"message": "Use GPT3.5",
|
||||||
"description": ""
|
"description": ""
|
||||||
|
|
@ -164,6 +364,11 @@
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"prefs_OptionText_btnManagePrompts": {
|
||||||
|
"message": "Manage your prompts",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
"prefsInfoTitle": {
|
"prefsInfoTitle": {
|
||||||
"message": "Important Information",
|
"message": "Important Information",
|
||||||
"description": ""
|
"description": ""
|
||||||
|
|
|
||||||
407
_locales/fr/messages.json
Normal file
407
_locales/fr/messages.json
Normal file
|
|
@ -0,0 +1,407 @@
|
||||||
|
{
|
||||||
|
"extensionDescription": {
|
||||||
|
"message": "Utilisez ChatGPT pour améliorer vos emails!",
|
||||||
|
"description": "Description de l'extension."
|
||||||
|
},
|
||||||
|
|
||||||
|
"menu_title": {
|
||||||
|
"message": "IA",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prompt_lang": {
|
||||||
|
"message": "Répondre en ",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prompt_reply": {
|
||||||
|
"message": "Répondre à ceci",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prompt_rewrite_polite": {
|
||||||
|
"message": "Réécrire de manière polie",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prompt_rewrite_formal": {
|
||||||
|
"message": "Réécrire de manière formelle",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prompt_classify": {
|
||||||
|
"message": "Classer",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prompt_summarize_this": {
|
||||||
|
"message": "Résumer ceci",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prompt_translate_this": {
|
||||||
|
"message": "Traduire ceci",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prompt_this": {
|
||||||
|
"message": "Proposer ceci",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prompt_selection_needed": {
|
||||||
|
"message": "Pour continuer, vous devez sélectionner du texte!",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_managePrompts": {
|
||||||
|
"message": "Gérer les prompts",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_managePrompts_help": {
|
||||||
|
"message": "Informations",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_start_saving": {
|
||||||
|
"message": "Enregistrement des prompts...",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_reindexing_list": {
|
||||||
|
"message": "Réindexation de la liste...",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_filtering_prompts": {
|
||||||
|
"message": "Filtrage des prompts...",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_saving_default_prompts": {
|
||||||
|
"message": "Enregistrement des prompts par défaut...",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_saving_custom_prompts": {
|
||||||
|
"message": "Enregistrement des prompts personnalisées...",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_reloading_menus": {
|
||||||
|
"message": "Rechargement des menus...",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_saved": {
|
||||||
|
"message": "prompts enregistrées!",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_form_label_ID": {
|
||||||
|
"message": "ID",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_form_label_ID_rules": {
|
||||||
|
"message": "Doit être unique, en minuscules et sans espaces",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_form_label_Name": {
|
||||||
|
"message": "Nom",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_form_label_Text": {
|
||||||
|
"message": "Texte de la proposition",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_form_label_Action": {
|
||||||
|
"message": "Action",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_form_label_need_selected": {
|
||||||
|
"message": "Sélection de texte nécessaire",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_form_label_need_signature": {
|
||||||
|
"message": "Toujours ajouter la signature",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_form_label_need_custom_text": {
|
||||||
|
"message": "Demander du texte supplémentaire",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_form_label_enabled": {
|
||||||
|
"message": "Activé",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_form_required_fields": {
|
||||||
|
"message": "Champs obligatoires",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_btnEdit": {
|
||||||
|
"message": "Modifier",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_btnCancel": {
|
||||||
|
"message": "Annuler",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_btnOK": {
|
||||||
|
"message": "OK",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_btnDelete": {
|
||||||
|
"message": "Supprimer",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_btnDelete_confirmText": {
|
||||||
|
"message": "Êtes-vous sûr de vouloir supprimer cet élément?",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_unsaved_changes": {
|
||||||
|
"message": "Il y a des modifications non enregistrées!",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_btnSaveAll": {
|
||||||
|
"message": "Tout enregistrer",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_save_button": {
|
||||||
|
"message": "Enregistrer",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_btnNew": {
|
||||||
|
"message": "Ajouter nouveau",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_btnAddNewCommit": {
|
||||||
|
"message": "Ajouter la proposition",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_add_to_menu": {
|
||||||
|
"message": "Ajouter au menu",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_add_to_menu_always": {
|
||||||
|
"message": "Toujours",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_add_to_menu_reading": {
|
||||||
|
"message": "Lors de la lecture d'un email",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_add_to_menu_composing": {
|
||||||
|
"message": "Lors de la rédaction d'un email",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_close_button": {
|
||||||
|
"message": "Bouton de fermeture",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_do_reply": {
|
||||||
|
"message": "Faire une réponse",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"customPrompts_substitute_text": {
|
||||||
|
"message": "Remplacer le texte",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"chatgpt_win_working": {
|
||||||
|
"message": "Travail en cours...",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"chatgpt_win_job_completed": {
|
||||||
|
"message": "Terminé!",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"chatgpt_win_get_answer": {
|
||||||
|
"message": "Utiliser la dernière réponse",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"chatgpt_win_close": {
|
||||||
|
"message": "Fermer",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"chatgpt_textarea_not_found_error": {
|
||||||
|
"message": "Il y a une erreur lors de l'envoi de la proposition à ChatGPT, veuillez réessayer. Si le problème persiste, veuillez <a href=\"https://micz.it/thunderdbird-addon-thunderai/status/\">vérifier le statut du service</a>.",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"chatgpt_sendbutton_not_found_error": {
|
||||||
|
"message": "Cliquez sur le bouton d'envoi pour soumettre la proposition.",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"chatgpt_user_not_logged_in": {
|
||||||
|
"message": "Vous n'êtes pas connecté à ChatGPT. Veuillez vous connecter avec vos identifiants, fermer la fenêtre ChatGPT, puis répéter l'action que vous avez tentée. Vous resterez connecté par la suite.",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"chatgpt_win_model_warning": {
|
||||||
|
"message": "Vous avez choisi l'option d'utiliser ChatGPT-4, mais il semble qu'il ne se charge pas correctement. Avez-vous choisi le bon modèle en haut?",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"chatgpt_win_custom_text": {
|
||||||
|
"message": "Insérez ici le texte supplémentaire pour la proposition.",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"chatgpt_win_send": {
|
||||||
|
"message": "Envoyer",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"chatgpt_use_gpt35": {
|
||||||
|
"message": "Utiliser GPT3.5",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"chatgpt_force_completion": {
|
||||||
|
"message": "forcer l'achèvement",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"chatgpt_force_completion_title": {
|
||||||
|
"message": "Cliquez ici pour afficher le bouton 'Utiliser la dernière réponse' si ChatGPT a terminé son travail mais que le bouton n'est pas apparu.",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"msg_prompt_too_long": {
|
||||||
|
"message": "Le texte que vous avez fourni est trop long. Vous devez le réduire pour utiliser ChatGPT.",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefs_OptionText_release_notes": {
|
||||||
|
"message": "Notes de version",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefs_status_page": {
|
||||||
|
"message": "statut du service",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefs_OptionText_chatgpt_win_text": {
|
||||||
|
"message": "Dimensions de la fenêtre ChatGPT",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefs_OptionText_chatgpt_win_height": {
|
||||||
|
"message": "Hauteur",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefs_OptionText_chatgpt_win_width": {
|
||||||
|
"message": "Largeur",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefs_OptionText_default_sign_name": {
|
||||||
|
"message": "Nom de la signature par défaut",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefs_OptionText_default_chatgpt_lang": {
|
||||||
|
"message": "Langue par défaut pour les réponses de ChatGPT",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefs_OptionText_reply_all": {
|
||||||
|
"message": "Répondre à tous",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefs_OptionText_reply_sender": {
|
||||||
|
"message": "Répondre à l'expéditeur",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefs_OptionText_reply_type": {
|
||||||
|
"message": "Type de réponse",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefs_OptionText_chatpgt_use_gpt4": {
|
||||||
|
"message": "Utiliser ChatGPT-4",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefs_OptionText_chatpgt_use_gpt4_info": {
|
||||||
|
"message": "Après avoir changé cette option, vous devez choisir le bon modèle la première fois que vous l'utilisez.",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefs_OptionText_btnManagePrompts": {
|
||||||
|
"message": "Gérer vos prompts",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefsInfoTitle": {
|
||||||
|
"message": "Informations importantes",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefsInfoDesc_1": {
|
||||||
|
"message": "Il n'est plus possible de désactiver l'historique des chats ChatGPT. Par conséquent, il n'y a aucun moyen d'empêcher les demandes effectuées via cet addon d'apparaître dans l'historique de vos chats ChatGPT.",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefsInfoDesc_2": {
|
||||||
|
"message": "Si une page blanche apparaît lors de l'ouverture de la fenêtre ChatGPT, cela signifie qu'il y a un problème de chargement de la page ChatGPT, non lié à l'utilisation de cet addon.",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefsInfoDesc_3": {
|
||||||
|
"message": " ",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefsDonation_1": {
|
||||||
|
"message": "Aimez-vous cet addon?",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"prefsDonation_2": {
|
||||||
|
"message": "Envisagez de faire un don!",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
|
||||||
|
"backToOptionsText": {
|
||||||
|
"message": "Options",
|
||||||
|
"description": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -1,201 +1,326 @@
|
||||||
{
|
{
|
||||||
"extensionDescription": {
|
"extensionDescription": {
|
||||||
"message": "Usa ChatGPT per migliorare le tue email!",
|
"message": "Usa ChatGPT per migliorare le tue email!",
|
||||||
"description": "Descrizione dell'estensione."
|
"description": "Description of the extension."
|
||||||
},
|
},
|
||||||
|
|
||||||
"menu_title": {
|
"menu_title": {
|
||||||
"message": "IA",
|
"message": "IA",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"prompt_lang": {
|
"prompt_lang": {
|
||||||
"message": "Rispondi in ",
|
"message": "Rispondi in ",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"prompt_reply": {
|
"prompt_reply": {
|
||||||
"message": "Rispondi",
|
"message": "Rispondi",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"prompt_rewrite_polite": {
|
"prompt_rewrite_polite": {
|
||||||
"message": "Riscrivi cortese",
|
"message": "Riscrivi cortese",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"prompt_rewrite_formal": {
|
"prompt_rewrite_formal": {
|
||||||
"message": "Riscrivi formale",
|
"message": "Riscrivi formale",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"prompt_classify": {
|
"prompt_classify": {
|
||||||
"message": "Classifica",
|
"message": "Classifica",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"prompt_summarize_this": {
|
"prompt_summarize_this": {
|
||||||
"message": "Riassumi",
|
"message": "Riassumi",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"prompt_translate_this": {
|
"prompt_translate_this": {
|
||||||
"message": "Traduci",
|
"message": "Traduci",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"prompt_this": {
|
"prompt_this": {
|
||||||
"message": "Chedi a ChatGPT",
|
"message": "Chedi a ChatGPT",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"prompt_selection_needed": {
|
"prompt_selection_needed": {
|
||||||
"message": "Per procedere è necessario che selezioni del testo!",
|
"message": "Per procedere è necessario che selezioni del testo!",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
"customPrompts_managePrompts": {
|
||||||
|
"message": "Gestisci i prompt",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_managePrompts_help": {
|
||||||
|
"message": "Informazioni",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_start_saving": {
|
||||||
|
"message": "Salvataggio prompt in corso...",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_reindexing_list": {
|
||||||
|
"message": "Indicizzazione lista...",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_filtering_prompts": {
|
||||||
|
"message": "Applicazione filtro in corso...",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_saving_default_prompts": {
|
||||||
|
"message": "Salvataggio prompt di base...",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_saving_custom_prompts": {
|
||||||
|
"message": "Salvataggio prompt personalizzati...",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_reloading_menus": {
|
||||||
|
"message": "Caricamento menu aggiornati...",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_saved": {
|
||||||
|
"message": "Prompt salvati!",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_form_label_ID": {
|
||||||
|
"message": "ID",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_form_label_ID_rules": {
|
||||||
|
"message": "Deve essere univoco, minuscolo e senza spazi.",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_form_label_Name": {
|
||||||
|
"message": "Nome",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_form_label_Text": {
|
||||||
|
"message": "Testo del prompt",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_form_label_Action": {
|
||||||
|
"message": "Azione",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_form_label_need_selected": {
|
||||||
|
"message": "Necessaria la selezione di testo",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_form_label_need_signature": {
|
||||||
|
"message": "Aggiungi sempre la firma",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_form_label_need_custom_text": {
|
||||||
|
"message": "Chiedi un testo aggiuntivo",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_form_label_enabled": {
|
||||||
|
"message": "Attivo",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_form_required_fields": {
|
||||||
|
"message": "Campi obbligatori",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_btnEdit": {
|
||||||
|
"message": "Modifica",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_btnCancel": {
|
||||||
|
"message": "Annulla",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_btnOK": {
|
||||||
|
"message": "OK",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_btnDelete": {
|
||||||
|
"message": "Cancella",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_btnDelete_confirmText": {
|
||||||
|
"message": "Sei sicuro di voler cancellare questo elemento?",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_unsaved_changes": {
|
||||||
|
"message": "Ci sono modifiche non salvate!",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_btnSaveAll": {
|
||||||
|
"message": "Salva Tutto",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_save_button": {
|
||||||
|
"message": "Salva",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_btnNew": {
|
||||||
|
"message": "Aggiungi Nuovo",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_btnAddNewCommit": {
|
||||||
|
"message": "Aggiungi il Prompt",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_add_to_menu": {
|
||||||
|
"message": "Aggiungi al menu",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_add_to_menu_always": {
|
||||||
|
"message": "Sempre",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_add_to_menu_reading": {
|
||||||
|
"message": "In lettura di una mail",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_add_to_menu_composing": {
|
||||||
|
"message": "In composizione di una mail",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_close_button": {
|
||||||
|
"message": "Pulsante chiudi",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_do_reply": {
|
||||||
|
"message": "Rispondi",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"customPrompts_substitute_text": {
|
||||||
|
"message": "Sostituisci il testo",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
"chatgpt_win_working": {
|
"chatgpt_win_working": {
|
||||||
"message": "Elaborazione in corso...",
|
"message": "Elaborazione in corso...",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"chatgpt_win_job_completed": {
|
"chatgpt_win_job_completed": {
|
||||||
"message": "Completato!",
|
"message": "Completato!",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"chatgpt_win_get_answer": {
|
"chatgpt_win_get_answer": {
|
||||||
"message": "Usa l'ultima risposta",
|
"message": "Usa l'ultima risposta",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"chatgpt_win_close": {
|
"chatgpt_win_close": {
|
||||||
"message": "Chiudi",
|
"message": "Chiudi",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"chatgpt_user_not_logged_in": {
|
"chatgpt_user_not_logged_in": {
|
||||||
"message": "Non sei connesso a ChatGPT. Effettua l'accesso con le tue credenziali, chiudi la finestra di ChatGPT e poi ripeti l'azione che avevi tentato. Rimarrai connesso in seguito.",
|
"message": "Non sei connesso a ChatGPT. Effettua l'accesso con le tue credenziali, chiudi la finestra di ChatGPT e poi ripeti l'azione che avevi tentato. Rimarrai connesso in seguito.",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"chatgpt_win_model_warning": {
|
"chatgpt_win_model_warning": {
|
||||||
"message": "Hai impostato l'opzione per utilizzare ChatGPT-4, ma sembra che non si stia caricando. Hai selezionato correttamente il modello in alto?",
|
"message": "Hai impostato l'opzione per utilizzare ChatGPT-4, ma sembra che non si stia caricando. Hai selezionato correttamente il modello in alto?",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
"chatgpt_win_custom_text": {
|
||||||
|
"message": "Inserisci qui il testo aggiuntivo per il prompt.",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"chatgpt_win_send": {
|
||||||
|
"message": "Invia",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
"chatgpt_use_gpt35": {
|
"chatgpt_use_gpt35": {
|
||||||
"message": "Usa GPT3.5",
|
"message": "Usa GPT3.5",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"chatgpt_force_completion": {
|
"chatgpt_force_completion": {
|
||||||
"message": "forza il completamento",
|
"message": "forza il completamento",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"chatgpt_force_completion_title": {
|
"chatgpt_force_completion_title": {
|
||||||
"message": "Fai clic qui per visualizzare il pulsante 'Usa l'ultima risposta' se ChatGPT ha terminato il suo lavoro ma il pulsante non è apparso.",
|
"message": "Fai clic qui per visualizzare il pulsante 'Usa l'ultima risposta' se ChatGPT ha terminato il suo lavoro ma il pulsante non è apparso.",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"msg_prompt_too_long": {
|
"msg_prompt_too_long": {
|
||||||
"message": "Il testo che vuoi inviare a ChatGPT è troppo lungo. Devi ridurlo per poter procedere.",
|
"message": "Il testo che vuoi inviare a ChatGPT è troppo lungo. Devi ridurlo per poter procedere.",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"prefs_OptionText_release_notes": {
|
"prefs_OptionText_release_notes": {
|
||||||
"message": "Note di rilascio",
|
"message": "Note di rilascio",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"prefs_status_page": {
|
"prefs_status_page": {
|
||||||
"message": "stato del servizio",
|
"message": "stato del servizio",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"prefs_OptionText_chatgpt_win_text": {
|
"prefs_OptionText_chatgpt_win_text": {
|
||||||
"message": "Dimensioni della finestra di ChatGPT",
|
"message": "Dimensioni della finestra di ChatGPT",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"prefs_OptionText_chatgpt_win_height": {
|
"prefs_OptionText_chatgpt_win_height": {
|
||||||
"message": "Altezza",
|
"message": "Altezza",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"prefs_OptionText_chatgpt_win_width": {
|
"prefs_OptionText_chatgpt_win_width": {
|
||||||
"message": "Larghezza",
|
"message": "Larghezza",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
"chatgpt_textarea_not_found_error": {
|
||||||
|
"message": "C'è stato un errore nell'invio del prompt a ChatGPT, per favore riprova. Se il problema persiste, per favore <a href=\"https://micz.it/thunderdbird-addon-thunderai/status/\">controlla lo stato del servizio</a>.",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"chatgpt_sendbutton_not_found_error": {
|
||||||
|
"message": "Premi il pulsante per inviare il prompt a ChatGPT.",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
"prefs_OptionText_default_sign_name": {
|
"prefs_OptionText_default_sign_name": {
|
||||||
"message": "Nome da utilizzare per la firma",
|
"message": "Nome da utilizzare per la firma",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"prefs_OptionText_default_chatgpt_lang": {
|
"prefs_OptionText_default_chatgpt_lang": {
|
||||||
"message": "Lingua predefinita per le risposte di ChatGPT",
|
"message": "Lingua predefinita per le risposte di ChatGPT",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"prefs_OptionText_reply_all": {
|
"prefs_OptionText_reply_all": {
|
||||||
"message": "Rispondi a tutti",
|
"message": "Rispondi a tutti",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"prefs_OptionText_reply_sender": {
|
"prefs_OptionText_reply_sender": {
|
||||||
"message": "Rispondi al mittente",
|
"message": "Rispondi al mittente",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"prefs_OptionText_reply_type": {
|
"prefs_OptionText_reply_type": {
|
||||||
"message": "Modalità di risposta",
|
"message": "Modalità di risposta",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"prefs_OptionText_chatpgt_use_gpt4": {
|
"prefs_OptionText_chatpgt_use_gpt4": {
|
||||||
"message": "Usa il modello ChatGPT-4",
|
"message": "Usa il modello ChatGPT-4",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"prefs_OptionText_chatpgt_use_gpt4_info": {
|
"prefs_OptionText_chatpgt_use_gpt4_info": {
|
||||||
"message": "Dopo aver modificato questa opzione, devi scegliere il modello corretto la prima volta che lo usi.",
|
"message": "Dopo aver modificato questa opzione, devi scegliere il modello corretto la prima volta che lo usi.",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
"prefs_OptionText_btnManagePrompts": {
|
||||||
|
"message": "Gestisci i tuoi prompts",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
"prefsInfoTitle": {
|
"prefsInfoTitle": {
|
||||||
"message": "Informazioni Importanti",
|
"message": "Informazioni Importanti",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"prefsInfoDesc_1": {
|
"prefsInfoDesc_1": {
|
||||||
"message": "Non è più possibile disabilitare la cronologia delle chat di ChatGPT. Pertanto, non c'è modo di impedire che le richieste effettuate tramite questo componente aggiuntivo appaiano nella cronologia delle chat di ChatGPT.",
|
"message": "Non è più possibile disabilitare la cronologia delle chat di ChatGPT. Pertanto, non c'è modo di impedire che le richieste effettuate tramite questo componente aggiuntivo appaiano nella cronologia delle chat di ChatGPT.",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"prefsInfoDesc_2": {
|
"prefsInfoDesc_2": {
|
||||||
"message": "Se all'apertura della finestra di ChatGPT, viene mostrata una pagina bianca, significa che c'è un problema di caricamento della pagina di ChatGPT, non relativo all'utilizzo di questo componente aggiuntivo.",
|
"message": "Se all'apertura della finestra di ChatGPT, viene mostrata una pagina bianca, significa che c'è un problema di caricamento della pagina di ChatGPT, non relativo all'utilizzo di questo componente aggiuntivo.",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"prefsInfoDesc_3": {
|
"prefsInfoDesc_3": {
|
||||||
"message": " ",
|
"message": " ",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"prefsDonation_1": {
|
"prefsDonation_1": {
|
||||||
"message": "Ti piace questo componente aggiuntivo?",
|
"message": "Ti piace questo componente aggiuntivo?",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"prefsDonation_2": {
|
"prefsDonation_2": {
|
||||||
"message": "Considera di fare una donazione!",
|
"message": "Considera di fare una donazione!",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
|
|
||||||
"backToOptionsText": {
|
"backToOptionsText": {
|
||||||
"message": "Opzioni",
|
"message": "Opzioni",
|
||||||
"description": ""
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
2020
customprompts/list.js
Normal file
2020
customprompts/list.js
Normal file
File diff suppressed because it is too large
Load diff
1
customprompts/list.js.map
Normal file
1
customprompts/list.js.map
Normal file
File diff suppressed because one or more lines are too long
172
customprompts/mzta-custom-prompts.css
Normal file
172
customprompts/mzta-custom-prompts.css
Normal file
|
|
@ -0,0 +1,172 @@
|
||||||
|
@media (prefers-color-scheme: light) {
|
||||||
|
table th {
|
||||||
|
background-color: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
#command_palette{
|
||||||
|
background-color: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.prompts_list tr:nth-child(even) {
|
||||||
|
background-color: #e9e9e9;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.prompts_list tr:nth-child(odd) {
|
||||||
|
background-color: #f3f3f3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@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; }
|
||||||
|
|
||||||
|
table {
|
||||||
|
background-color: #1C1B22;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.prompts_list th {
|
||||||
|
background-color: #4c4e58;
|
||||||
|
border: 1px solid rgb(251, 251, 254);
|
||||||
|
color: rgb(194, 194, 194);
|
||||||
|
}
|
||||||
|
|
||||||
|
#command_palette{
|
||||||
|
background-color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.prompts_list tr:nth-child(even) {
|
||||||
|
background-color: #2E2F36;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
border-spacing: 0;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
thead {
|
||||||
|
position: sticky;
|
||||||
|
top: 26px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#command_palette{
|
||||||
|
position: sticky;
|
||||||
|
top: 0;
|
||||||
|
padding-top: 1px;
|
||||||
|
height: 26px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#btnNew{
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
#btnSaveAll{
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
#msgDisplay{
|
||||||
|
padding-left: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
table tr {
|
||||||
|
border-bottom: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.prompts_list th {
|
||||||
|
padding: 8px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
table td {
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
padding: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
table td.w08{
|
||||||
|
width: 8vw;
|
||||||
|
}
|
||||||
|
|
||||||
|
table td.w17{
|
||||||
|
width: 17vw;
|
||||||
|
}
|
||||||
|
|
||||||
|
table td.w19{
|
||||||
|
width: 19vw;
|
||||||
|
}
|
||||||
|
|
||||||
|
table td.w25{
|
||||||
|
width: 25vw;
|
||||||
|
}
|
||||||
|
|
||||||
|
table td.w40{
|
||||||
|
width: 40vw;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.prompts_list td.properties{
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
table .sort {
|
||||||
|
background-image: url(../images/listjs-arrow-sort-inactive.png);
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: right center;
|
||||||
|
padding-right: 14px;
|
||||||
|
cursor: pointer;
|
||||||
|
cursor: hand;
|
||||||
|
}
|
||||||
|
|
||||||
|
table .sort.asc {
|
||||||
|
background-image: url(../images/listjs-arrow-sort-active-down.png);
|
||||||
|
}
|
||||||
|
|
||||||
|
table .sort.desc {
|
||||||
|
background-image: url(../images/listjs-arrow-sort-active-up.png);
|
||||||
|
}
|
||||||
|
|
||||||
|
.hiddendata{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#formNew{
|
||||||
|
display: none;
|
||||||
|
width: 100%;
|
||||||
|
padding-bottom: 7px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text_output{
|
||||||
|
width: 98%;
|
||||||
|
height: 9em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.go_right_float{
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.go_right{
|
||||||
|
width: 100%;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.width_all{
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small_label{
|
||||||
|
font-size: small;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
#txtIdNew, .id_output{
|
||||||
|
text-transform: lowercase;
|
||||||
|
}
|
||||||
91
customprompts/mzta-custom-prompts.html
Normal file
91
customprompts/mzta-custom-prompts.html
Normal file
|
|
@ -0,0 +1,91 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>ThunderAI - __MSG_customPrompts_managePrompts__</title>
|
||||||
|
<link rel="stylesheet" href="mzta-custom-prompts.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div>
|
||||||
|
<h1>__MSG_customPrompts_managePrompts__</h1>
|
||||||
|
<p><a href="https://micz.it/thunderdbird-addon-thunderai/custom-prompts/">__MSG_customPrompts_managePrompts_help__</a></p>
|
||||||
|
</div>
|
||||||
|
<div id="command_palette">
|
||||||
|
<button id="btnSaveAll" disabled>__MSG_customPrompts_btnSaveAll__</button>
|
||||||
|
<span id="msgDisplay"></span>
|
||||||
|
<button id="btnNew">__MSG_customPrompts_btnNew__</button>
|
||||||
|
</div>
|
||||||
|
<div id="formNew">
|
||||||
|
<table class="width_all">
|
||||||
|
<tr>
|
||||||
|
<td class="w19">
|
||||||
|
<label for="txtIdNew">*__MSG_customPrompts_form_label_ID__:</label>
|
||||||
|
<br>
|
||||||
|
<input type="text" id="txtIdNew" name="id" class="input_new" tabindex="1">
|
||||||
|
<br><span class="small_label">[__MSG_customPrompts_form_label_ID_rules__]</span>
|
||||||
|
</td>
|
||||||
|
<td rowspan="2" class="w25">
|
||||||
|
<label for="txtTextNew">*__MSG_customPrompts_form_label_Text__:</label>
|
||||||
|
<br>
|
||||||
|
<textarea id="txtTextNew" name="text" class="input_new text_output" tabindex="3"></textarea>
|
||||||
|
</td>
|
||||||
|
<td class="w19">
|
||||||
|
<label for="selectTypeNew">__MSG_customPrompts_add_to_menu__:</label>
|
||||||
|
<br>
|
||||||
|
<select id="selectTypeNew" name="type" tabindex="4">
|
||||||
|
<option value="0">__MSG_customPrompts_add_to_menu_always__</option>
|
||||||
|
<option value="1">__MSG_customPrompts_add_to_menu_reading__</option>
|
||||||
|
<option value="2">__MSG_customPrompts_add_to_menu_composing__</option>
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
|
<td rowspan="2" class="w19">
|
||||||
|
<input type="checkbox" id="checkboxNeedSelectedNew" name="need_selected" value="1" tabindex="6"> <label for="checkboxNeedSelectedNew">__MSG_customPrompts_form_label_need_selected__</label>
|
||||||
|
<br>
|
||||||
|
<input type="checkbox" id="checkboxNeedSignatureNew" name="need_signature" value="1" tabindex="7"> <label for="checkboxNeedSignatureNew">__MSG_customPrompts_form_label_need_signature__</label>
|
||||||
|
<br>
|
||||||
|
<input type="checkbox" id="checkboxNeedCustomTextNew" name="need_custom_text" value="1" tabindex="8"> <label for="checkboxNeedCustomTextNew">__MSG_customPrompts_form_label_need_custom_text__</label>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="w19">
|
||||||
|
<label for="txtNameNew">*__MSG_customPrompts_form_label_Name__:</label>
|
||||||
|
<br>
|
||||||
|
<input type="text" id="txtNameNew" name="name" class="input_new" tabindex="2">
|
||||||
|
</td>
|
||||||
|
<td class="w19">
|
||||||
|
<label for="selectActionNew">__MSG_customPrompts_form_label_Action__:</label>
|
||||||
|
<br>
|
||||||
|
<select id="selectActionNew" name="action" tabindex="5">
|
||||||
|
<option value="0">__MSG_customPrompts_close_button__</option>
|
||||||
|
<option value="1">__MSG_customPrompts_do_reply__</option>
|
||||||
|
<option value="2">__MSG_customPrompts_substitute_text__</option>
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<div class="go_right_float">* __MSG_customPrompts_form_required_fields__</div>
|
||||||
|
<br>
|
||||||
|
<div class="go_right"><button id="btnAddNew" disabled>__MSG_customPrompts_btnAddNewCommit__</button></div>
|
||||||
|
</div>
|
||||||
|
<div id="all_prompts">
|
||||||
|
<table class="prompts_list">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="sort" data-sort="id">__MSG_customPrompts_form_label_ID__</th>
|
||||||
|
<th class="sort" data-sort="name">__MSG_customPrompts_form_label_Name__</th>
|
||||||
|
<th class="sort" data-sort="text">__MSG_customPrompts_form_label_Text__</th>
|
||||||
|
<th class="sort" data-sort="type">__MSG_customPrompts_add_to_menu__</th>
|
||||||
|
<th>Properties</th>
|
||||||
|
<th>__MSG_customPrompts_form_label_Action__</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody class="list">
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<script src="list.js"></script>
|
||||||
|
<script src="mzta-custom-prompts.js" type="module"></script>
|
||||||
|
<script src="../js/mzta-i18n.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
||||||
525
customprompts/mzta-custom-prompts.js
Normal file
525
customprompts/mzta-custom-prompts.js
Normal file
|
|
@ -0,0 +1,525 @@
|
||||||
|
/*
|
||||||
|
* ThunderAI [https://micz.it/thunderdbird-addon-thunderai/]
|
||||||
|
* Copyright (C) 2024 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { getPrompts, setDefaultPromptsProperties, setCustomPrompts } from "../js/mzta-prompts.js";
|
||||||
|
|
||||||
|
var promptsList = null;
|
||||||
|
var somethingChanged = false;
|
||||||
|
var positionMax_compose = 0;
|
||||||
|
var positionMax_display = 0;
|
||||||
|
var idnumMax = 0;
|
||||||
|
var msgTimeout = null;
|
||||||
|
|
||||||
|
document.addEventListener('DOMContentLoaded', async () => {
|
||||||
|
let options = {
|
||||||
|
valueNames: [ { data: ['idnum'] }, 'is_default', 'id', 'name', 'text', 'type', 'action', 'position_compose', 'position_display', { name: 'need_selected', attr: 'checked_val'}, { name: 'need_signature', attr: 'checked_val'}, { name: 'need_custom_text', attr: 'checked_val'}, { name: 'enabled', attr: 'checked_val'} ],
|
||||||
|
item: function(values) {
|
||||||
|
let type_output = '';
|
||||||
|
switch(String(values.type)){
|
||||||
|
case "0":
|
||||||
|
type_output = `__MSG_customPrompts_add_to_menu_always__`;
|
||||||
|
break;
|
||||||
|
case "1":
|
||||||
|
type_output = `__MSG_customPrompts_add_to_menu_reading__`;
|
||||||
|
break;
|
||||||
|
case "2":
|
||||||
|
type_output = `__MSG_customPrompts_add_to_menu_composing__`;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
let action_output = '';
|
||||||
|
switch(String(values.action)){
|
||||||
|
case "0":
|
||||||
|
action_output = `__MSG_customPrompts_close_button__`;
|
||||||
|
break;
|
||||||
|
case "1":
|
||||||
|
action_output = `__MSG_customPrompts_do_reply__`;
|
||||||
|
break;
|
||||||
|
case "2":
|
||||||
|
action_output = `__MSG_customPrompts_substitute_text__`;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
//console.log('>>>>>>>>>>>>> action_output: ' + JSON.stringify(action_output));
|
||||||
|
|
||||||
|
let output = `<tr ` + ((values.is_default == 1) ? 'class="is_default"':'') + `>
|
||||||
|
<td class="w08"><span class="id id_show"></span><input type="text" class="hiddendata id_output" value="` + values.id + `" /></td>
|
||||||
|
<td class="w08"><span class="name name_show"></span><input type="text" class="hiddendata name_output" value="` + values.name + `" /></td>
|
||||||
|
<td class="w40"><span class="text text_show"></span><textarea class="hiddendata text_output">` + values.text + `</textarea></td>
|
||||||
|
<td class="w08"><span class="type_show">` + type_output + `</span>
|
||||||
|
<select class="type_output hiddendata">
|
||||||
|
<option value="0"` + ((values.type == "0") ? ' selected':'') + `>__MSG_customPrompts_add_to_menu_always__</option>
|
||||||
|
<option value="1"` + ((values.type == "1") ? ' selected':'') + `>__MSG_customPrompts_add_to_menu_reading__</option>
|
||||||
|
<option value="2"` + ((values.type == "2") ? ' selected':'') + `>__MSG_customPrompts_add_to_menu_composing__</option>
|
||||||
|
</select>` +
|
||||||
|
`<span class="type hiddendata"></span>
|
||||||
|
</td>
|
||||||
|
<td class="w17">
|
||||||
|
Action: <span class="action_show">` + action_output + `</span>
|
||||||
|
<select class="action_output hiddendata">
|
||||||
|
<option value="0"` + ((values.action == "0") ? ' selected':'') + `>__MSG_customPrompts_close_button__</option>
|
||||||
|
<option value="1"` + ((values.action == "1") ? ' selected':'') + `>__MSG_customPrompts_do_reply__</option>
|
||||||
|
<option value="2"` + ((values.action == "2") ? ' selected':'') + `>__MSG_customPrompts_substitute_text__</option>
|
||||||
|
</select>` +
|
||||||
|
`<span class="action hiddendata"></span>
|
||||||
|
<br>
|
||||||
|
<input type="checkbox" class="need_selected" disabled> __MSG_customPrompts_form_label_need_selected__
|
||||||
|
<br>
|
||||||
|
<input type="checkbox" class="need_signature" disabled> __MSG_customPrompts_form_label_need_signature__
|
||||||
|
<br>
|
||||||
|
<input type="checkbox" class="need_custom_text" disabled> __MSG_customPrompts_form_label_need_custom_text__
|
||||||
|
<br>
|
||||||
|
<input type="checkbox" class="enabled input_mod"> __MSG_customPrompts_form_label_enabled__
|
||||||
|
<span class="is_default hiddendata"></span>
|
||||||
|
<span class="position_compose hiddendata"></span>
|
||||||
|
<span class="position_display hiddendata"></span>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<button class="btnEditItem"` + ((values.is_default == 1) ? ' disabled':'') + `>__MSG_customPrompts_btnEdit__</button>
|
||||||
|
<button class="btnCancelItem hiddendata"` + ((values.is_default == 1) ? ' disabled':'') + `>__MSG_customPrompts_btnCancel__</button>
|
||||||
|
<br><br>
|
||||||
|
<button class="btnConfirmItem hiddendata"` + ((values.is_default == 1) ? ' disabled':'') + `>__MSG_customPrompts_btnOK__</button>
|
||||||
|
<button class="btnDeleteItem"` + ((values.is_default == 1) ? ' disabled':'') + `>__MSG_customPrompts_btnDelete__</button>
|
||||||
|
</td>
|
||||||
|
</tr>`;
|
||||||
|
//console.log('>>>>>>>> values.name: ' + JSON.stringify(values.name));
|
||||||
|
positionMax_compose = Math.max(positionMax_compose, values.position_compose);
|
||||||
|
positionMax_display = Math.max(positionMax_display, values.position_display);
|
||||||
|
idnumMax = Math.max(idnumMax, values.idnum);
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let values = await getPrompts();
|
||||||
|
|
||||||
|
//console.log('>>>>>>>>>>>>>>>> values: ' + JSON.stringify(values));
|
||||||
|
|
||||||
|
promptsList = new List('all_prompts', options, values);
|
||||||
|
|
||||||
|
checkSelectedBoxes();
|
||||||
|
|
||||||
|
const btnSaveAll = document.getElementById('btnSaveAll');
|
||||||
|
btnSaveAll.disabled = true;
|
||||||
|
|
||||||
|
// Disable save button and handle save actions
|
||||||
|
function handleSaveAllClick(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
saveAll();
|
||||||
|
clearFields();
|
||||||
|
}
|
||||||
|
btnSaveAll.addEventListener('click', handleSaveAllClick);
|
||||||
|
|
||||||
|
const btnNew = document.getElementById('btnNew');
|
||||||
|
|
||||||
|
// Show the new item form
|
||||||
|
function handleNewClick(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
e.target.disabled = true;
|
||||||
|
document.getElementById('formNew').style.display = 'block';
|
||||||
|
window.scrollTo({
|
||||||
|
top: 0,
|
||||||
|
behavior: 'smooth'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
btnNew.addEventListener('click', handleNewClick);
|
||||||
|
|
||||||
|
// Enable save button on input change
|
||||||
|
function handleInputChange(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
setSomethingChanged();
|
||||||
|
}
|
||||||
|
document.querySelectorAll('.input_mod').forEach(element => {
|
||||||
|
element.addEventListener('change', handleInputChange);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 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
|
||||||
|
function handleEditClick(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
const tr = e.target.parentNode.parentNode;
|
||||||
|
//console.log('>>>>>>>> tr: ' + tr.getAttribute('data-idnum'));
|
||||||
|
e.target.style.display = 'none'; // Edit btn
|
||||||
|
tr.querySelector('.btnConfirmItem').style.display = 'inline'; // Save btn
|
||||||
|
tr.querySelector('.btnCancelItem').style.display = 'inline'; // Cancel btn
|
||||||
|
// tr.querySelector('.btnEditItem').style.display = 'none'; // Edit btn
|
||||||
|
tr.querySelector('.btnDeleteItem').style.display = 'none'; // Delete btn
|
||||||
|
showItemRowEditor(tr);
|
||||||
|
}
|
||||||
|
let btnEditItem_elements = document.querySelectorAll(".btnEditItem");
|
||||||
|
btnEditItem_elements.forEach(element => {
|
||||||
|
element.addEventListener('click', handleEditClick);
|
||||||
|
});
|
||||||
|
|
||||||
|
function showItemRowEditor(tr) {
|
||||||
|
tr.querySelector('.id_output').style.display = 'inline';
|
||||||
|
tr.querySelector('.id_show').style.display = 'none';
|
||||||
|
tr.querySelector('.name_output').style.display = 'inline';
|
||||||
|
tr.querySelector('.name_show').style.display = 'none';
|
||||||
|
tr.querySelector('.text_output').style.display = 'inline';
|
||||||
|
tr.querySelector('.text_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';
|
||||||
|
tr.querySelector('.action_show').style.display = 'none';
|
||||||
|
tr.querySelector('input.need_selected').disabled = false;
|
||||||
|
tr.querySelector('input.need_signature').disabled = false;
|
||||||
|
tr.querySelector('input.need_custom_text').disabled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function hideItemRowEditor(tr) {
|
||||||
|
tr.querySelector('.id_output').style.display = 'none';
|
||||||
|
tr.querySelector('.id_show').style.display = 'inline';
|
||||||
|
tr.querySelector('.name_output').style.display = 'none';
|
||||||
|
tr.querySelector('.name_show').style.display = 'inline';
|
||||||
|
tr.querySelector('.text_output').style.display = 'none';
|
||||||
|
tr.querySelector('.text_show').style.display = 'inline';
|
||||||
|
tr.querySelector('.type_output').style.display = 'none';
|
||||||
|
tr.querySelector('.type_show').style.display = 'inline';
|
||||||
|
tr.querySelector('.action_output').style.display = 'none';
|
||||||
|
tr.querySelector('.action_show').style.display = 'inline';
|
||||||
|
tr.querySelector('input.need_selected').disabled = true;
|
||||||
|
tr.querySelector('input.need_signature').disabled = true;
|
||||||
|
tr.querySelector('input.need_custom_text').disabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Confirm and log deletion action
|
||||||
|
function handleDeleteClick(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
const checkConfirm = window.confirm(browser.i18n.getMessage("customPrompts_btnDelete_confirmText"));
|
||||||
|
if (!checkConfirm) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const tr = e.target.parentNode.parentNode;
|
||||||
|
//console.log('>>>>>>>> tr: ' + tr.getAttribute('data-idnum'));
|
||||||
|
promptsList.remove("id", tr.querySelector('span.id').innerText);
|
||||||
|
setSomethingChanged();
|
||||||
|
}
|
||||||
|
let btnDeleteItem_elements = document.querySelectorAll(".btnDeleteItem");
|
||||||
|
btnDeleteItem_elements.forEach(element => {
|
||||||
|
element.addEventListener('click', handleDeleteClick);
|
||||||
|
});
|
||||||
|
|
||||||
|
function handleCancelClick(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
const tr = e.target.parentNode.parentNode;
|
||||||
|
e.target.style.display = 'none'; // Cancel btn
|
||||||
|
tr.querySelector('.btnConfirmItem').style.display = 'none'; // Save btn
|
||||||
|
// tr.querySelector('.btnCancelItem').style.display = 'none'; // Cancel btn
|
||||||
|
tr.querySelector('.btnEditItem').style.display = 'inline'; // Edit btn
|
||||||
|
tr.querySelector('.btnDeleteItem').style.display = 'inline'; // Delete btn
|
||||||
|
hideItemRowEditor(tr);
|
||||||
|
}
|
||||||
|
let btnCancelItem_elements = document.querySelectorAll(".btnCancelItem");
|
||||||
|
btnCancelItem_elements.forEach(element => {
|
||||||
|
element.addEventListener('click', handleCancelClick);
|
||||||
|
});
|
||||||
|
|
||||||
|
function handleConfirmClick(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
const tr = e.target.parentNode.parentNode;
|
||||||
|
e.target.style.display = 'none'; // Ok btn
|
||||||
|
// tr.querySelector('.btnConfirmItem').style.display = 'none'; // Ok btn
|
||||||
|
tr.querySelector('.btnCancelItem').style.display = 'none'; // Cancel btn
|
||||||
|
tr.querySelector('.btnEditItem').style.display = 'inline'; // Edit btn
|
||||||
|
tr.querySelector('.btnDeleteItem').style.display = 'inline'; // Delete btn
|
||||||
|
// Update item data
|
||||||
|
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('.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;
|
||||||
|
tr.querySelector('.action_show').innerText = tr.querySelector('.action_output').selectedOptions[0].text;
|
||||||
|
// the checkboxes update is handled directly by themselves
|
||||||
|
hideItemRowEditor(tr);
|
||||||
|
setSomethingChanged();
|
||||||
|
}
|
||||||
|
let btnConfirmItem_elements = document.querySelectorAll(".btnConfirmItem");
|
||||||
|
btnConfirmItem_elements.forEach(element => {
|
||||||
|
element.addEventListener('click', handleConfirmClick);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Handle checkbox changes and log new state
|
||||||
|
function handleCheckboxChange(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
e.target.setAttribute('checked_val', e.target.checked ? '1' : '0');
|
||||||
|
//console.log('>>>>>>>> checked_val: ' + e.target.getAttribute('checked_val'));
|
||||||
|
}
|
||||||
|
let checkbox_elements = document.querySelectorAll("input[type='checkbox']");
|
||||||
|
checkbox_elements.forEach(element => {
|
||||||
|
element.addEventListener('change', handleCheckboxChange);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 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) {
|
||||||
|
btnNew_elements.forEach(element => {
|
||||||
|
element.addEventListener('change', (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
checkFields();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
i18n.updateDocument();
|
||||||
|
|
||||||
|
//To add a new item
|
||||||
|
var txtIdNew = document.getElementById('txtIdNew');
|
||||||
|
var txtNameNew = document.getElementById('txtNameNew');
|
||||||
|
var txtTextNew = document.getElementById('txtTextNew');
|
||||||
|
var selectTypeNew = document.getElementById('selectTypeNew');
|
||||||
|
var selectActionNew = document.getElementById('selectActionNew');
|
||||||
|
var checkboxNeedSelectedNew = document.getElementById('checkboxNeedSelectedNew');
|
||||||
|
var checkboxNeedSignatureNew = document.getElementById('checkboxNeedSignatureNew');
|
||||||
|
var checkboxNeedCustomTextNew = document.getElementById('checkboxNeedCustomTextNew');
|
||||||
|
|
||||||
|
const btnAddNew = document.getElementById('btnAddNew');
|
||||||
|
btnAddNew.addEventListener('click', (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
if(!checkFields()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let newItem = promptsList.add({
|
||||||
|
id: String(txtIdNew.value.trim()).toLocaleLowerCase(),
|
||||||
|
name: txtNameNew.value.trim(),
|
||||||
|
text: txtTextNew.value.trim(),
|
||||||
|
type: selectTypeNew.value,
|
||||||
|
action: selectActionNew.value,
|
||||||
|
need_selected: (checkboxNeedSelectedNew.checked) ? 1 : 0,
|
||||||
|
need_signature: (checkboxNeedSignatureNew.checked) ? 1 : 0,
|
||||||
|
need_custom_text: (checkboxNeedCustomTextNew.checked) ? 1 : 0,
|
||||||
|
enabled: 1,
|
||||||
|
position_compose: positionMax_compose + 1,
|
||||||
|
position_display: positionMax_display + 1,
|
||||||
|
is_default: 0,
|
||||||
|
idnum: idnumMax + 1,
|
||||||
|
});
|
||||||
|
idnumMax++;
|
||||||
|
let curr_idnum = newItem[0].values().idnum;
|
||||||
|
let checkboxes = document.querySelectorAll(`tr[data-idnum="${curr_idnum}"] input[type="checkbox"]`);
|
||||||
|
checkSelectedBoxes(checkboxes);
|
||||||
|
let editBtn = document.querySelector(`tr[data-idnum="${curr_idnum}"] button.btnEditItem`);
|
||||||
|
//console.log(`>>>>>>>>>>>> tr[data-idnum="${curr_idnum}"] button.btnEditItem`);
|
||||||
|
editBtn.addEventListener('click', handleEditClick);
|
||||||
|
//console.log('>>>>>>>>>>>>> editBtn: ' + JSON.stringify(editBtn));
|
||||||
|
let deleteBtn = document.querySelector(`tr[data-idnum="${curr_idnum}"] button.btnDeleteItem`);
|
||||||
|
//console.log(`>>>>>>>>>>>> tr[data-idnum="${curr_idnum}"] button.btnDeleteItem`);
|
||||||
|
deleteBtn.addEventListener('click', handleDeleteClick);
|
||||||
|
let okBtn = document.querySelector(`tr[data-idnum="${curr_idnum}"] button.btnConfirmItem`);
|
||||||
|
okBtn.addEventListener('click', handleConfirmClick);
|
||||||
|
let cancelBtn = document.querySelector(`tr[data-idnum="${curr_idnum}"] button.btnCancelItem`);
|
||||||
|
cancelBtn.addEventListener('click', handleCancelClick);
|
||||||
|
// console.log('>>>>>>>>>>>>> deleteBtn: ' + JSON.stringify(deleteBtn));
|
||||||
|
// console.log('>>>>>>>>>>>>> newItem: ' + JSON.stringify(newItem));
|
||||||
|
document.getElementById('btnNew').disabled = false;
|
||||||
|
clearFields();
|
||||||
|
setSomethingChanged();
|
||||||
|
i18n.updateDocument();
|
||||||
|
window.scrollTo({
|
||||||
|
top: document.body.scrollHeight,
|
||||||
|
behavior: 'smooth'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
}, { once: true });
|
||||||
|
|
||||||
|
|
||||||
|
function checkFields() {
|
||||||
|
//console.log('>>>>>>>>>>>>> typeof promptsList: ' + typeof promptsList);
|
||||||
|
//console.log('>>>>>>>>>>>>> Array.isArray(promptsList): ' + Array.isArray(promptsList));
|
||||||
|
// the id must be unique and without spaces
|
||||||
|
let is_error = false;
|
||||||
|
let id_value = document.getElementById('txtIdNew').value.trim();
|
||||||
|
if ((id_value == '')||
|
||||||
|
(/\s/.test(id_value))) {
|
||||||
|
inputSetError('txtIdNew');
|
||||||
|
is_error = true;
|
||||||
|
} else {
|
||||||
|
let exists = promptsList.get("id", id_value);
|
||||||
|
//console.log('>>>>>>>>>>>>> exists: ' + JSON.stringify(exists));
|
||||||
|
if(exists && exists.length > 0) {
|
||||||
|
inputSetError('txtIdNew');
|
||||||
|
is_error = true;
|
||||||
|
} else {
|
||||||
|
inputClearError('txtIdNew');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (document.getElementById('txtNameNew').value.trim() == '') {
|
||||||
|
inputSetError('txtNameNew');
|
||||||
|
is_error = true;
|
||||||
|
} else {
|
||||||
|
inputClearError('txtNameNew');
|
||||||
|
}
|
||||||
|
if (document.getElementById('txtTextNew').value.trim() == '') {
|
||||||
|
inputSetError('txtTextNew');
|
||||||
|
is_error = true;
|
||||||
|
} else {
|
||||||
|
inputClearError('txtTextNew');
|
||||||
|
}
|
||||||
|
document.getElementById('btnAddNew').disabled = is_error;
|
||||||
|
return !is_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function clearFields() {
|
||||||
|
document.getElementById('txtIdNew').value = '';
|
||||||
|
document.getElementById('txtNameNew').value = '';
|
||||||
|
document.getElementById('txtTextNew').value = '';
|
||||||
|
document.getElementById('selectTypeNew').value = '0';
|
||||||
|
document.getElementById('selectActionNew').value = '0';
|
||||||
|
document.getElementById('checkboxNeedSelectedNew').value = '0';
|
||||||
|
document.getElementById('checkboxNeedSignatureNew').value = '0';
|
||||||
|
document.getElementById('checkboxNeedCustomTextNew').value = '0';
|
||||||
|
document.getElementById('formNew').style.display = 'none';
|
||||||
|
}
|
||||||
|
|
||||||
|
function inputSetError(input) {
|
||||||
|
document.getElementById(input).style.borderColor = 'red';
|
||||||
|
}
|
||||||
|
|
||||||
|
function inputClearError(input) {
|
||||||
|
document.getElementById(input).style.borderColor = 'green';
|
||||||
|
}
|
||||||
|
|
||||||
|
function setSomethingChanged(){
|
||||||
|
clearTimeout(msgTimeout);
|
||||||
|
somethingChanged = true;
|
||||||
|
document.getElementById('btnSaveAll').disabled = false;
|
||||||
|
let msgDisplay = document.getElementById('msgDisplay');
|
||||||
|
msgDisplay.innerHTML = browser.i18n.getMessage('customPrompts_unsaved_changes');
|
||||||
|
msgDisplay.style.display = 'inline';
|
||||||
|
msgDisplay.style.color = 'red';
|
||||||
|
}
|
||||||
|
|
||||||
|
function setNothingChanged(){
|
||||||
|
somethingChanged = false;
|
||||||
|
document.getElementById('btnSaveAll').disabled = true;
|
||||||
|
let msgDisplay = document.getElementById('msgDisplay');
|
||||||
|
msgDisplay.disabled = true;
|
||||||
|
msgDisplay.innerHTML = ''
|
||||||
|
msgDisplay.style.display = 'none';
|
||||||
|
msgDisplay.style.color = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkSelectedBoxes(checkboxes = null) {
|
||||||
|
if(checkboxes == null){
|
||||||
|
checkboxes = [
|
||||||
|
...document.querySelectorAll('.need_selected[type="checkbox"]'),
|
||||||
|
...document.querySelectorAll('.need_signature[type="checkbox"]'),
|
||||||
|
...document.querySelectorAll('.need_custom_text[type="checkbox"]'),
|
||||||
|
...document.querySelectorAll('.enabled[type="checkbox"]'),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iterate through the checkboxes
|
||||||
|
checkboxes.forEach(checkbox => {
|
||||||
|
// Check if the 'checked' attribute is "0"
|
||||||
|
if (checkbox.getAttribute('checked_val') == "0") {
|
||||||
|
// Uncheck the checkbox
|
||||||
|
checkbox.checked = false;
|
||||||
|
} else {
|
||||||
|
checkbox.checked = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
//Save all prompts
|
||||||
|
async function saveAll() {
|
||||||
|
setMessage(browser.i18n.getMessage('customPrompts_start_saving'));
|
||||||
|
setNothingChanged();
|
||||||
|
if(promptsList != null) {
|
||||||
|
setMessage(browser.i18n.getMessage('customPrompts_reindexing_list'));
|
||||||
|
promptsList.reIndex();
|
||||||
|
let newPrompts = promptsList.items.map(item => {
|
||||||
|
// For each item in the array, return only the '_values' part
|
||||||
|
return item.values();
|
||||||
|
});
|
||||||
|
// newPrompts.forEach(prompt => {
|
||||||
|
// console.log('>>>>>>>>>>>>> id: ' + JSON.stringify(prompt));
|
||||||
|
// });
|
||||||
|
//console.log('>>>>>>>>>>>>> saveAll: ' + JSON.stringify(newPrompts));
|
||||||
|
setMessage(browser.i18n.getMessage('customPrompts_filtering_prompts'));
|
||||||
|
let newDefaultPrompts = newPrompts.filter(item => item.is_default == 1);
|
||||||
|
//console.log('>>>>>>>>>>>>> newDefaultPrompts: ' + JSON.stringify(newDefaultPrompts));
|
||||||
|
let newCustomPrompts = newPrompts.filter(item => item.is_default == 0);
|
||||||
|
setMessage(browser.i18n.getMessage('customPrompts_saving_default_prompts'));
|
||||||
|
await setDefaultPromptsProperties(newDefaultPrompts);
|
||||||
|
setMessage(browser.i18n.getMessage('customPrompts_saving_custom_prompts'));
|
||||||
|
await setCustomPrompts(newCustomPrompts);
|
||||||
|
setMessage(browser.i18n.getMessage('customPrompts_reloading_menus'));
|
||||||
|
browser.runtime.sendMessage({command: "reload_menus"});
|
||||||
|
setMessage(browser.i18n.getMessage('customPrompts_saved'),'green');
|
||||||
|
msgTimeout = setTimeout(() => {
|
||||||
|
clearMessage();
|
||||||
|
}, 10000)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setMessage(msg, color = '') {
|
||||||
|
clearTimeout(msgTimeout);
|
||||||
|
let msgDisplay = document.getElementById('msgDisplay');
|
||||||
|
msgDisplay.innerHTML = msg;
|
||||||
|
msgDisplay.style.display = 'inline';
|
||||||
|
msgDisplay.style.color = color;
|
||||||
|
}
|
||||||
|
|
||||||
|
function clearMessage() {
|
||||||
|
let msgDisplay = document.getElementById('msgDisplay');
|
||||||
|
msgDisplay.innerHTML = '';
|
||||||
|
msgDisplay.style.display = 'none';
|
||||||
|
msgDisplay.style.color = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// window.addEventListener('beforeunload', function (event) {
|
||||||
|
// // Check if any changes have been made
|
||||||
|
// if (somethingChanged) {
|
||||||
|
// event.preventDefault();
|
||||||
|
// }
|
||||||
|
// });
|
||||||
BIN
images/listjs-arrow-sort-active-down.png
Normal file
BIN
images/listjs-arrow-sort-active-down.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 515 B |
BIN
images/listjs-arrow-sort-active-up.png
Normal file
BIN
images/listjs-arrow-sort-active-up.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 560 B |
BIN
images/listjs-arrow-sort-inactive.png
Normal file
BIN
images/listjs-arrow-sort-inactive.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 629 B |
|
|
@ -22,13 +22,22 @@
|
||||||
|
|
||||||
export const mzta_script = `
|
export const mzta_script = `
|
||||||
let force_go = false;
|
let force_go = false;
|
||||||
|
let current_message = null;
|
||||||
|
|
||||||
async function chatgpt_sendMsg(msg, method ='') {
|
async function chatgpt_sendMsg(msg, method ='') { // return -1 send button not found, -2 textarea not found
|
||||||
const textArea = document.querySelector('form textarea'),
|
const textArea = document.querySelector('form textarea'),
|
||||||
sendButton = document.querySelector('path[d*="M15.192 8.906a1.143"]')?.parentNode.parentNode // post-GPT-4o;
|
sendButton = document.querySelector('path[d*="M15.192 8.906a1.143"]')?.parentNode.parentNode // post-GPT-4o;
|
||||||
|| document.querySelector('[data-testid="send-button"]'); // pre-GPT-4o
|
|| document.querySelector('[data-testid="send-button"]'); // pre-GPT-4o
|
||||||
|
//check if the textarea has been found
|
||||||
|
if(!textArea) {
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
textArea.value = msg;
|
textArea.value = msg;
|
||||||
textArea.dispatchEvent(new Event('input', { bubbles: true })); // enable send button
|
textArea.dispatchEvent(new Event('input', { bubbles: true })); // enable send button
|
||||||
|
//check if the sendbutton has been found
|
||||||
|
if (!sendButton) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
const delaySend = setInterval(() => {
|
const delaySend = setInterval(() => {
|
||||||
if (!sendButton?.hasAttribute('disabled')) { // send msg
|
if (!sendButton?.hasAttribute('disabled')) { // send msg
|
||||||
method.toLowerCase() == 'click' ? sendButton.click()
|
method.toLowerCase() == 'click' ? sendButton.click()
|
||||||
|
|
@ -36,6 +45,7 @@ async function chatgpt_sendMsg(msg, method ='') {
|
||||||
clearInterval(delaySend);
|
clearInterval(delaySend);
|
||||||
}
|
}
|
||||||
}, 25);
|
}, 25);
|
||||||
|
return 0; //everything is ok
|
||||||
}
|
}
|
||||||
|
|
||||||
async function chatgpt_isIdle() {
|
async function chatgpt_isIdle() {
|
||||||
|
|
@ -106,22 +116,27 @@ async function chatgpt_getFromDOM(pos) {
|
||||||
|
|
||||||
function chatpgt_scrollToBottom () {
|
function chatpgt_scrollToBottom () {
|
||||||
try { document.querySelector('button[class*="cursor"][class*="bottom"]').click(); }
|
try { document.querySelector('button[class*="cursor"][class*="bottom"]').click(); }
|
||||||
catch (err) { console.error('', err); }
|
catch (err) { console.error('[ThunderAI] ', err); }
|
||||||
}
|
}
|
||||||
|
|
||||||
function addCustomDiv(prompt_action,tabId) {
|
function addCustomDiv(prompt_action,tabId) {
|
||||||
// Create <style> element for the CSS
|
// Create <style> element for the CSS
|
||||||
var style = document.createElement('style');
|
var style = document.createElement('style');
|
||||||
style.innerHTML = ".mzta-header-fixed {position: fixed;bottom: 0;left: 0;height:100px;width: 100%;background-color: #333;color: white;text-align: center;padding: 10px 0;z-index: 1000;}"
|
style.innerHTML = ".mzta-header-fixed {position: fixed;bottom: 0;left: 0;height:100px;width: 100%;background-color: #333;color: white;text-align: center;padding: 10px 0;z-index: 1000;border-top: 3px solid white;}"
|
||||||
style.innerHTML += "body {padding-bottom: 100px;} [id^='headlessui-dialog-panel-:r']{padding-bottom: 100px;}";
|
style.innerHTML += "body {padding-bottom: 100px;} [id^='headlessui-dialog-panel-:r']{padding-bottom: 100px;}";
|
||||||
style.innerHTML += "#mzta-btn_ok {background-color: #007bff;border: none;color: white;padding: 8px 15px;text-align: center;text-decoration: none;display: inline-block;font-size: 16px;margin: 4px 2px;transition-duration: 0.4s;cursor: pointer;border-radius: 5px;}";
|
style.innerHTML += ".mzta-btn {background-color: #007bff;border: none;color: white;padding: 8px 15px;text-align: center;text-decoration: none;display: inline-block;font-size: 16px;margin: 4px 2px;transition-duration: 0.4s;cursor: pointer;border-radius: 5px;}";
|
||||||
style.innerHTML += "#mzta-btn_ok:hover {background-color: #0056b3;color: white;}";
|
style.innerHTML += ".mzta-btn:hover {background-color:#0056b3;color:white;}";
|
||||||
style.innerHTML += "#mzta-loading{height:50px;display:inline-block;}";
|
style.innerHTML += "#mzta-loading{height:50px;display:inline-block;}";
|
||||||
style.innerHTML += "#mzta-model_warn{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);max-height:100%px;min-width:30%;max-width:50%;padding:3px;border-radius:5px;text-align:center;background-color:#FFBABA;border:1px solid;font-size:13px;color:#D8000C;display:none;}";
|
style.innerHTML += "#mzta-model_warn{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);max-height:100%px;min-width:30%;max-width:50%;padding:3px;border-radius:5px;text-align:center;background-color:#FFBABA;border:1px solid;font-size:13px;color:#D8000C;display:none;}#mzta-model_warn a{color:blue;text-decoration: underline;}";
|
||||||
style.innerHTML += "#mzta-btn_gpt35 {background-color: #007bff;border: none;color: white;padding: 2px 4px;text-align: center;text-decoration: none;display: none;font-size: 13px;margin-left: 4px;transition-duration: 0.4s;cursor: pointer;border-radius: 2px;}";
|
style.innerHTML += "#mzta-btn_gpt35 {background-color: #007bff;border: none;color: white;padding: 2px 4px;text-align: center;text-decoration: none;display: none;font-size: 13px;margin-left: 4px;transition-duration: 0.4s;cursor: pointer;border-radius: 2px;}";
|
||||||
style.innerHTML += "#mzta-status-page{position:fixed;bottom:0;left:0;padding-left:5px;font-size:13px;font-style:italic;text-decoration:underline;color:#919191;}";
|
style.innerHTML += "#mzta-status-page{position:fixed;bottom:0;left:0;padding-left:5px;font-size:13px;font-style:italic;text-decoration:underline;color:#919191;}";
|
||||||
style.innerHTML += "#mzta-force-completion{cursor:pointer;position:fixed;bottom:0;right:0;padding-right:5px;font-size:13px;font-style:italic;text-decoration:underline;color:#919191;}";
|
style.innerHTML += "#mzta-force-completion{cursor:pointer;position:fixed;bottom:0;right:0;padding-right:5px;font-size:13px;font-style:italic;text-decoration:underline;color:#919191;}";
|
||||||
style.innerHTML += "#mzta-status-page:hover, #mzta-force-completion:hover{color:#007bff;}";
|
style.innerHTML += "#mzta-status-page:hover, #mzta-force-completion:hover{color:#007bff;}";
|
||||||
|
style.innerHTML += "#mzta-custom_text{padding:10px;width:auto;max-width:80%;height:auto;max-height:80%;border-radius:5px;overflow:auto;position:fixed;top:50%;left:50%;display:none;transform:translate(-50%,-50%);text-align:center;background:#333;color:white;border:3px solid white;}";
|
||||||
|
style.innerHTML += "#mzta-custom_loading{height:50px;display:none;}";
|
||||||
|
style.innerHTML += "#mzta-custom_textarea{color:black;padding:1px;font-size:15px;width:100%;}";
|
||||||
|
style.innerHTML += "#mzta-custom_info{text-align:center;width:100%;padding-bottom:10px;font-size:15px;}";
|
||||||
|
|
||||||
// Add <style> to the page's <head>
|
// Add <style> to the page's <head>
|
||||||
document.head.appendChild(style);
|
document.head.appendChild(style);
|
||||||
|
|
||||||
|
|
@ -175,16 +190,17 @@ function addCustomDiv(prompt_action,tabId) {
|
||||||
|
|
||||||
var btn_ok = document.createElement('button');
|
var btn_ok = document.createElement('button');
|
||||||
btn_ok.id="mzta-btn_ok";
|
btn_ok.id="mzta-btn_ok";
|
||||||
|
btn_ok.classList.add('mzta-btn');
|
||||||
//console.log('default: '+prompt_action)
|
//console.log('default: '+prompt_action)
|
||||||
switch(prompt_action){
|
switch(String(prompt_action)){
|
||||||
default:
|
default:
|
||||||
case 0: // close window
|
case "0": // close window
|
||||||
btn_ok.innerHTML = browser.i18n.getMessage("chatgpt_win_close");
|
btn_ok.innerHTML = browser.i18n.getMessage("chatgpt_win_close");
|
||||||
btn_ok.onclick = async function() {
|
btn_ok.onclick = async function() {
|
||||||
browser.runtime.sendMessage({command: "chatgpt_close"});
|
browser.runtime.sendMessage({command: "chatgpt_close"});
|
||||||
};
|
};
|
||||||
break;
|
break;
|
||||||
case 1: // do reply
|
case "1": // do reply
|
||||||
btn_ok.innerHTML = browser.i18n.getMessage("chatgpt_win_get_answer");
|
btn_ok.innerHTML = browser.i18n.getMessage("chatgpt_win_get_answer");
|
||||||
btn_ok.onclick = async function() {
|
btn_ok.onclick = async function() {
|
||||||
const response = await chatgpt_getFromDOM('last');
|
const response = await chatgpt_getFromDOM('last');
|
||||||
|
|
@ -193,7 +209,7 @@ function addCustomDiv(prompt_action,tabId) {
|
||||||
browser.runtime.sendMessage({command: "chatgpt_close"});
|
browser.runtime.sendMessage({command: "chatgpt_close"});
|
||||||
};
|
};
|
||||||
break;
|
break;
|
||||||
case 2: // replace text
|
case "2": // replace text
|
||||||
btn_ok.innerHTML = browser.i18n.getMessage("chatgpt_win_get_answer");
|
btn_ok.innerHTML = browser.i18n.getMessage("chatgpt_win_get_answer");
|
||||||
btn_ok.onclick = async function() {
|
btn_ok.onclick = async function() {
|
||||||
const response = await chatgpt_getFromDOM('last');
|
const response = await chatgpt_getFromDOM('last');
|
||||||
|
|
@ -207,12 +223,45 @@ function addCustomDiv(prompt_action,tabId) {
|
||||||
btn_ok.style.display = 'none';
|
btn_ok.style.display = 'none';
|
||||||
fixedDiv.appendChild(btn_ok);
|
fixedDiv.appendChild(btn_ok);
|
||||||
|
|
||||||
|
//div per custom text
|
||||||
|
let customDiv = document.createElement('div');
|
||||||
|
customDiv.id = 'mzta-custom_text';
|
||||||
|
let customInfo = document.createElement('div');
|
||||||
|
customInfo.id = 'mzta-custom_info';
|
||||||
|
customInfo.innerHTML = browser.i18n.getMessage("chatgpt_win_custom_text");
|
||||||
|
customDiv.appendChild(customInfo);
|
||||||
|
let customTextArea = document.createElement('textarea');
|
||||||
|
customTextArea.id = 'mzta-custom_textarea';
|
||||||
|
customDiv.appendChild(customTextArea);
|
||||||
|
let customLoading = document.createElement('img');
|
||||||
|
customLoading.src = browser.runtime.getURL("/images/loading.gif");
|
||||||
|
customLoading.id = "mzta-custom_loading";
|
||||||
|
customDiv.appendChild(customLoading);
|
||||||
|
let customBtn = document.createElement('button');
|
||||||
|
customBtn.id = 'mzta-custom_btn';
|
||||||
|
customBtn.innerHTML = browser.i18n.getMessage("chatgpt_win_send");
|
||||||
|
customBtn.classList.add('mzta-btn');
|
||||||
|
customBtn.addEventListener("click", () => { customTextBtnClick({customBtn:customBtn,customLoading:customLoading,customDiv:customDiv}) });
|
||||||
|
customTextArea.addEventListener("keydown", (event) => { if(event.code == "Enter" && event.ctrlKey) customTextBtnClick({customBtn:customBtn,customLoading:customLoading,customDiv:customDiv}) });
|
||||||
|
customDiv.appendChild(customBtn);
|
||||||
|
fixedDiv.appendChild(customDiv);
|
||||||
|
|
||||||
document.body.insertBefore(fixedDiv, document.body.firstChild);
|
document.body.insertBefore(fixedDiv, document.body.firstChild);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function customTextBtnClick(args) {
|
||||||
|
const customText = document.getElementById('mzta-custom_textarea').value;
|
||||||
|
args.customBtn.disabled = true;
|
||||||
|
args.customBtn.classList.add('disabled');
|
||||||
|
args.customLoading.style.display = 'inline-block';
|
||||||
|
args.customLoading.style.display = 'none';
|
||||||
|
doProceed(current_message,customText);
|
||||||
|
args.customDiv.style.display = 'none';
|
||||||
|
}
|
||||||
|
|
||||||
function checkGPT4Model() {
|
function checkGPT4Model() {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
// Set up an interval that shows the waring after 2 seconds
|
// Set up an interval that shows the warning after 2 seconds
|
||||||
const intervalId2 = setTimeout(() => {
|
const intervalId2 = setTimeout(() => {
|
||||||
document.getElementById('mzta-model_warn').style.display = 'inline-block';
|
document.getElementById('mzta-model_warn').style.display = 'inline-block';
|
||||||
document.getElementById('mzta-btn_gpt35').style.display = 'inline';
|
document.getElementById('mzta-btn_gpt35').style.display = 'inline';
|
||||||
|
|
@ -226,7 +275,7 @@ function checkGPT4Model() {
|
||||||
for(element of elements){
|
for(element of elements){
|
||||||
// Check if the element exists and its content is '4' or '4o'
|
// Check if the element exists and its content is '4' or '4o'
|
||||||
if ((element && element.textContent === '4')||(element && element.textContent === '4o')||(force_go)) {
|
if ((element && element.textContent === '4')||(element && element.textContent === '4o')||(force_go)) {
|
||||||
console.log("The GPT Model is now '4' or '4o'");
|
console.log("[ThunderAI] The GPT Model is now '4' or '4o'");
|
||||||
clearInterval(intervalId);
|
clearInterval(intervalId);
|
||||||
clearTimeout(intervalId2);
|
clearTimeout(intervalId2);
|
||||||
document.getElementById('mzta-model_warn').style.display = 'none';
|
document.getElementById('mzta-model_warn').style.display = 'none';
|
||||||
|
|
@ -234,7 +283,7 @@ function checkGPT4Model() {
|
||||||
resolve("GPT4");
|
resolve("GPT4");
|
||||||
break;
|
break;
|
||||||
} else if (!element) {
|
} else if (!element) {
|
||||||
console.log("Element not found!");
|
console.log("[ThunderAI] Element not found!");
|
||||||
clearInterval(intervalId);
|
clearInterval(intervalId);
|
||||||
reject("Element not found.");
|
reject("Element not found.");
|
||||||
}
|
}
|
||||||
|
|
@ -256,6 +305,33 @@ function checkLoggedIn(){
|
||||||
return !window.location.href.startsWith('https://chatgpt.com/auth/');
|
return !window.location.href.startsWith('https://chatgpt.com/auth/');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function showCustomTextField(){
|
||||||
|
document.getElementById('mzta-custom_text').style.display = 'block';
|
||||||
|
}
|
||||||
|
|
||||||
|
async function doProceed(message, customText = ''){
|
||||||
|
let prefs = await browser.storage.sync.get({chatpgt_use_gpt4:false});
|
||||||
|
if(prefs.chatpgt_use_gpt4){
|
||||||
|
await checkGPT4Model();
|
||||||
|
}
|
||||||
|
//await chatgpt.isLoaded();
|
||||||
|
let send_result = await chatgpt_sendMsg(message.prompt+' '+customText,'click');
|
||||||
|
switch(send_result){
|
||||||
|
case -1: // send button not found
|
||||||
|
document.getElementById('mzta-curr_msg').style.display = 'block';
|
||||||
|
document.getElementById('mzta-curr_msg').innerHTML = browser.i18n.getMessage("chatgpt_sendbutton_not_found_error");
|
||||||
|
break;
|
||||||
|
case -2: // textarea not found
|
||||||
|
document.getElementById('mzta-model_warn').innerHTML = browser.i18n.getMessage("chatgpt_textarea_not_found_error");
|
||||||
|
document.getElementById('mzta-model_warn').style.display = 'inline-block';
|
||||||
|
document.getElementById('mzta-curr_msg').innerHTML = "";
|
||||||
|
document.getElementById('mzta-loading').style.display = 'none';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
await chatgpt_isIdle();
|
||||||
|
operation_done();
|
||||||
|
}
|
||||||
|
|
||||||
// Nello script di contenuto
|
// Nello script di contenuto
|
||||||
browser.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
browser.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
||||||
if (message.command === "chatgpt_send") {
|
if (message.command === "chatgpt_send") {
|
||||||
|
|
@ -265,15 +341,12 @@ browser.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
||||||
}else{
|
}else{
|
||||||
addCustomDiv(message.action,message.tabId);
|
addCustomDiv(message.action,message.tabId);
|
||||||
(async () => {
|
(async () => {
|
||||||
let prefs = await browser.storage.sync.get({chatpgt_use_gpt4:false});
|
if(mztaDoCustomText === 1){
|
||||||
if(prefs.chatpgt_use_gpt4){
|
current_message = message;
|
||||||
await checkGPT4Model();
|
showCustomTextField();
|
||||||
|
} else {
|
||||||
|
await doProceed(message);
|
||||||
}
|
}
|
||||||
//await chatgpt.isLoaded();
|
|
||||||
await chatgpt_sendMsg(message.prompt,'click');
|
|
||||||
await chatgpt_isIdle();
|
|
||||||
// console.log(response);
|
|
||||||
operation_done();
|
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
120
js/mzta-menus.js
120
js/mzta-menus.js
|
|
@ -18,14 +18,15 @@
|
||||||
|
|
||||||
// Some original methods are derived from https://github.com/ali-raheem/Aify/blob/cfadf52f576b7be3720b5b73af7c8d3129c054da/plugin/html/actions.js
|
// Some original methods are derived from https://github.com/ali-raheem/Aify/blob/cfadf52f576b7be3720b5b73af7c8d3129c054da/plugin/html/actions.js
|
||||||
|
|
||||||
import { defaultPrompts } from './mzta-prompts.js';
|
import { getPrompts } from './mzta-prompts.js';
|
||||||
import { getLanguageDisplayName } from './mzta-utils.js'
|
import { getLanguageDisplayName, getMenuContextCompose, getMenuContextDisplay } from './mzta-utils.js'
|
||||||
|
|
||||||
export class mzta_Menus {
|
export class mzta_Menus {
|
||||||
|
|
||||||
|
allPrompts = [];
|
||||||
openChatGPT = null;
|
openChatGPT = null;
|
||||||
menu_context_compose = 'compose_action_menu';
|
menu_context_compose = null;
|
||||||
menu_context_display = 'message_display_action_menu';
|
menu_context_display = null;
|
||||||
menu_listeners = {};
|
menu_listeners = {};
|
||||||
|
|
||||||
rootMenu = [
|
rootMenu = [
|
||||||
|
|
@ -33,16 +34,36 @@ export class mzta_Menus {
|
||||||
];
|
];
|
||||||
|
|
||||||
constructor(openChatGPT) {
|
constructor(openChatGPT) {
|
||||||
|
this.menu_context_compose = getMenuContextCompose();
|
||||||
|
this.menu_context_display = getMenuContextDisplay();
|
||||||
this.openChatGPT = openChatGPT;
|
this.openChatGPT = openChatGPT;
|
||||||
defaultPrompts.forEach((prompt) => {
|
this.allPrompts = [];
|
||||||
|
this.listener = this.listener.bind(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async initialize() {
|
||||||
|
this.allPrompts = [];
|
||||||
|
this.rootMenu = [];
|
||||||
|
this.menu_listeners = {};
|
||||||
|
this.allPrompts = await getPrompts(true);
|
||||||
|
this.allPrompts.sort((a, b) => a.name.localeCompare(b.name));
|
||||||
|
this.allPrompts.forEach((prompt) => {
|
||||||
this.addAction(prompt)
|
this.addAction(prompt)
|
||||||
});
|
});
|
||||||
//this.addMenu(this.rootMenu);
|
}
|
||||||
|
|
||||||
|
async reload(){
|
||||||
|
await browser.menus.removeAll().catch(error => {
|
||||||
|
console.error("[ThunderAI] ERROR removing the menus: ", error);
|
||||||
|
});
|
||||||
|
this.removeClickListener();
|
||||||
|
this.loadMenus();
|
||||||
}
|
}
|
||||||
|
|
||||||
addAction = (curr_prompt) => {
|
addAction = (curr_prompt) => {
|
||||||
|
|
||||||
let curr_menu_entry = {id: curr_prompt.id };
|
let curr_menu_entry = {id: curr_prompt.id, is_default: curr_prompt.is_default, name: curr_prompt.name};
|
||||||
|
|
||||||
const getHighlight = async () => {
|
const getHighlight = async () => {
|
||||||
const tabs = await browser.tabs.query({ active: true, currentWindow: true });
|
const tabs = await browser.tabs.query({ active: true, currentWindow: true });
|
||||||
|
|
@ -56,7 +77,7 @@ export class mzta_Menus {
|
||||||
const msg_text = await getHighlight();
|
const msg_text = await getHighlight();
|
||||||
|
|
||||||
//check if a selection is needed
|
//check if a selection is needed
|
||||||
if(curr_prompt.need_selected && (msg_text.selection==='')){
|
if(String(curr_prompt.need_selected) == "1" && (msg_text.selection==='')){
|
||||||
//A selection is needed, but nothing is selected!
|
//A selection is needed, but nothing is selected!
|
||||||
//alert(browser.i18n.getMessage('prompt_selection_needed'));
|
//alert(browser.i18n.getMessage('prompt_selection_needed'));
|
||||||
const tabs = await browser.tabs.query({ active: true, currentWindow: true });
|
const tabs = await browser.tabs.query({ active: true, currentWindow: true });
|
||||||
|
|
@ -75,7 +96,7 @@ export class mzta_Menus {
|
||||||
let prefs = await browser.storage.sync.get({default_chatgpt_lang: getLanguageDisplayName(browser.i18n.getUILanguage())});
|
let prefs = await browser.storage.sync.get({default_chatgpt_lang: getLanguageDisplayName(browser.i18n.getUILanguage())});
|
||||||
let chatgpt_lang = prefs.default_chatgpt_lang;
|
let chatgpt_lang = prefs.default_chatgpt_lang;
|
||||||
|
|
||||||
var fullPrompt = curr_prompt.text + (curr_prompt.need_signature ? " " + await this.getDefaultSignature():"") + " " + browser.i18n.getMessage("prompt_lang") + chatgpt_lang + ". \"" + body_text + "\" ";
|
var fullPrompt = curr_prompt.text + (String(curr_prompt.need_signature) == "1" ? " " + await this.getDefaultSignature():"") + " " + browser.i18n.getMessage("prompt_lang") + chatgpt_lang + ". \"" + body_text + "\" ";
|
||||||
|
|
||||||
switch(curr_prompt.id){
|
switch(curr_prompt.id){
|
||||||
case 'prompt_translate_this':
|
case 'prompt_translate_this':
|
||||||
|
|
@ -87,14 +108,15 @@ export class mzta_Menus {
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
const tabs = await browser.tabs.query({ active: true, currentWindow: true });
|
const tabs = await browser.tabs.query({ active: true, currentWindow: true });
|
||||||
|
// add custom text if needed
|
||||||
//browser.runtime.sendMessage({command: "chatgpt_open", prompt: fullPrompt, action: curr_prompt.action, tabId: tabs[0].id});
|
//browser.runtime.sendMessage({command: "chatgpt_open", prompt: fullPrompt, action: curr_prompt.action, tabId: tabs[0].id});
|
||||||
this.openChatGPT(fullPrompt, curr_prompt.action, tabs[0].id);
|
this.openChatGPT(fullPrompt, curr_prompt.action, tabs[0].id, curr_prompt.need_custom_text);
|
||||||
};
|
};
|
||||||
this.rootMenu.push(curr_menu_entry);
|
this.rootMenu.push(curr_menu_entry);
|
||||||
};
|
};
|
||||||
|
|
||||||
async getDefaultSignature(){
|
async getDefaultSignature(){
|
||||||
let prefs = await browser.storage.sync.get({default_sign_name: ''});
|
let prefs = await browser.storage.sync.get({default_sign_name: ''});
|
||||||
if(prefs.default_sign_name===''){
|
if(prefs.default_sign_name===''){
|
||||||
|
|
@ -104,53 +126,83 @@ export class mzta_Menus {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
loadMenus() {
|
async loadMenus() {
|
||||||
this.addMenu(this.rootMenu);
|
await this.initialize();
|
||||||
let listeners = this.menu_listeners;
|
await this.addMenu(this.rootMenu);
|
||||||
browser.menus.onClicked.addListener((info, tab) => {
|
this.addClickListener();
|
||||||
listeners[info.menuItemId] && listeners[info.menuItemId] (info, tab);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
addMenu = (menu, root = null) => {
|
listener(info, tab) {
|
||||||
for (let item of menu) {
|
let listeners = this.menu_listeners;
|
||||||
let {id, menu, act} = item;
|
if (listeners[info.menuItemId]) {
|
||||||
|
listeners[info.menuItemId](info, tab);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
browser.menus.create({
|
addClickListener() {
|
||||||
id: id,
|
browser.menus.onClicked.addListener(this.listener);
|
||||||
title: browser.i18n.getMessage(id),
|
}
|
||||||
contexts: this.getContexts(id),
|
|
||||||
parentId: root
|
removeClickListener() {
|
||||||
});
|
browser.menus.onClicked.removeListener(this.listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
addMenu = async (menu, root = null) => {
|
||||||
|
for (let item of menu) {
|
||||||
|
let {id, is_default, name, menu, act} = item;
|
||||||
|
|
||||||
|
await new Promise(resolve =>
|
||||||
|
browser.menus.create({
|
||||||
|
id: id,
|
||||||
|
title: this.getCustomTextAttribute(id) + is_default == 1 ? (browser.i18n.getMessage(id) || name) : name,
|
||||||
|
contexts: this.getContexts(id),
|
||||||
|
parentId: root
|
||||||
|
},
|
||||||
|
resolve
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
if (act) {
|
if (act) {
|
||||||
this.menu_listeners[id] = act;
|
this.menu_listeners[id] = act;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (menu) {
|
if (menu) {
|
||||||
this.addMenu(menu, id);
|
await this.addMenu(menu, id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
getContexts(id){
|
getContexts(id){
|
||||||
const curr_prompt = defaultPrompts.find(p => p.id === id);
|
//console.log(">>>>>>>>> id: " + id);
|
||||||
|
const curr_prompt = this.allPrompts.find(p => p.id === id);
|
||||||
|
//console.log(">>>>>>>>>> curr_prompt: " + JSON.stringify(curr_prompt));
|
||||||
if (!curr_prompt) {
|
if (!curr_prompt) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
switch(curr_prompt.type){
|
switch(String(curr_prompt.type)){
|
||||||
case 0:
|
case "0":
|
||||||
return [this.menu_context_compose, this.menu_context_display];
|
return [this.menu_context_compose, this.menu_context_display];
|
||||||
case 1:
|
case "1":
|
||||||
return [this.menu_context_display];
|
return [this.menu_context_display];
|
||||||
case 2:
|
case "2":
|
||||||
return [this.menu_context_compose];
|
return [this.menu_context_compose];
|
||||||
default:
|
default:
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getCustomTextAttribute(id){
|
||||||
|
const curr_prompt = this.allPrompts.find(p => p.id === id);
|
||||||
|
if (!curr_prompt) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
if(String(curr_prompt.need_custom_text) === "1"){
|
||||||
|
return "*";
|
||||||
|
}else{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -16,9 +16,13 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Modified version derived from https://github.com/ali-raheem/Aify/blob/13ff87583bc520fb80f555ab90a90c5c9df797a7/plugin/html/globals.js
|
// Modified prompts text derived from https://github.com/ali-raheem/Aify/blob/13ff87583bc520fb80f555ab90a90c5c9df797a7/plugin/html/globals.js
|
||||||
|
|
||||||
/* Types (type attribute):
|
/* ================= PROMPTS PROPERTIES ========================================
|
||||||
|
|
||||||
|
================ BASE PROPERTIES
|
||||||
|
|
||||||
|
Types (type attribute):
|
||||||
0: always show (when composing a part of the text must be selected if need_selected = 1)
|
0: always show (when composing a part of the text must be selected if need_selected = 1)
|
||||||
1: show when reading an email
|
1: show when reading an email
|
||||||
2: show when composing a mail (a part of the text must be selected if need_selected = 1)
|
2: show when composing a mail (a part of the text must be selected if need_selected = 1)
|
||||||
|
|
@ -28,21 +32,178 @@
|
||||||
1: do reply
|
1: do reply
|
||||||
2: substitute text
|
2: substitute text
|
||||||
|
|
||||||
Only if text selected (attribute need_selected):
|
Only if text selected (need_selected attribute):
|
||||||
0: no selection needed (use all the message body)
|
0: no selection needed (use all the message body)
|
||||||
1: need a selection
|
1: need a selection
|
||||||
|
|
||||||
Signature
|
Signature (need_signature attribute):
|
||||||
0: No signature needed
|
0: No signature needed
|
||||||
1: Signature needed
|
1: Signature needed
|
||||||
|
|
||||||
|
Custom Text (need_custom_text attribute):
|
||||||
|
0: No custom text needed
|
||||||
|
1: Custom text needed
|
||||||
|
|
||||||
|
================ USER PROPERTIES
|
||||||
|
Enabled (enabled attribute):
|
||||||
|
0: Disabled
|
||||||
|
1: Enabled
|
||||||
|
|
||||||
|
Position Display Message (position_display attribute):
|
||||||
|
<num>: position number
|
||||||
|
|
||||||
|
Position Compose Message (position_compose attribute):
|
||||||
|
<num>: position number
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export const defaultPrompts = [
|
const defaultPrompts = [
|
||||||
{ id: 'prompt_reply', name: "__MSG_prompt_reply__", text: "Reply to the following email. Reply with only the mail text, with greetings and signature, and with no extra comments.", type: 1, action: 1, need_selected: 0, need_signature: 1 },
|
{
|
||||||
{ id: 'prompt_rewrite_polite', name: "__MSG_prompt_rewrite_polite__", text: "Rewrite the following text to be more polite. Reply with only the re-written text and with no extra comments or other text.", type: 2, action: 2, need_selected: 1, need_signature: 0 },
|
id: 'prompt_reply',
|
||||||
{ id: 'prompt_rewrite_formal', name: "__MSG_prompt_rewrite_formal__", text: "Rewrite the following text to be more formal. Reply with only the re-written text and with no extra comments or other text.", type: 2, action: 2, need_selected: 1, need_signature: 0 },
|
name: "__MSG_prompt_reply__",
|
||||||
{ id: 'prompt_classify', name: "__MSG_prompt_classify__", text: "Classify the following text in terms of Politeness, Warmth, Formality, Assertiveness, Offensiveness giving a percentage for each category. Reply with only the category and score with no extra comments or other text.", type: 0, action: 0, need_selected: 0, need_signature: 0 },
|
text: "Reply to the following email.",
|
||||||
{ id: 'prompt_summarize_this', name: "__MSG_prompt_summarize_this__", text: "Summarize the following email into a bullet point list.", type: 0, action: 0, need_selected: 0, need_signature: 0 },
|
type: "1",
|
||||||
{ id: 'prompt_translate_this', name: "__MSG_prompt_translate_this__", text: "Translate the following email in ", type: 0, action: 0, need_selected: 0, need_signature: 0 },
|
action: "1",
|
||||||
{ id: 'prompt_this', name: "__MSG_prompt_this__", text: "Reply with only the needed text and with no extra comments or other text.", type: 2, action: 2, need_selected: 1, need_signature: 0 },
|
need_selected: "0",
|
||||||
|
need_signature: "1",
|
||||||
|
need_custom_text: "0",
|
||||||
|
is_default: "1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'prompt_rewrite_polite',
|
||||||
|
name: "__MSG_prompt_rewrite_polite__",
|
||||||
|
text: "Rewrite the following text to be more polite. Reply with only the re-written text and with no extra comments or other text.",
|
||||||
|
type: "2",
|
||||||
|
action: "2",
|
||||||
|
need_selected: "1",
|
||||||
|
need_signature: "0",
|
||||||
|
need_custom_text: "0",
|
||||||
|
is_default: "1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'prompt_rewrite_formal',
|
||||||
|
name: "__MSG_prompt_rewrite_formal__",
|
||||||
|
text: "Rewrite the following text to be more formal. Reply with only the re-written text and with no extra comments or other text.",
|
||||||
|
type: "2",
|
||||||
|
action: "2",
|
||||||
|
need_selected: "1",
|
||||||
|
need_signature: "0",
|
||||||
|
need_custom_text: "0",
|
||||||
|
is_default: "1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'prompt_classify',
|
||||||
|
name: "__MSG_prompt_classify__",
|
||||||
|
text: "Classify the following text in terms of Politeness, Warmth, Formality, Assertiveness, Offensiveness giving a percentage for each category. Reply with only the category and score with no extra comments or other text.",
|
||||||
|
type: "0",
|
||||||
|
action: "0",
|
||||||
|
need_selected: "0",
|
||||||
|
need_signature: "0",
|
||||||
|
need_custom_text: "0",
|
||||||
|
is_default: "1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'prompt_summarize_this',
|
||||||
|
name: "__MSG_prompt_summarize_this__",
|
||||||
|
text: "Summarize the following email into a bullet point list.",
|
||||||
|
type: "0",
|
||||||
|
action: "0",
|
||||||
|
need_selected: "0",
|
||||||
|
need_signature: "0",
|
||||||
|
need_custom_text: "0",
|
||||||
|
is_default: "1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'prompt_translate_this',
|
||||||
|
name: "__MSG_prompt_translate_this__",
|
||||||
|
text: "Translate the following email in ",
|
||||||
|
type: "0",
|
||||||
|
action: "0",
|
||||||
|
need_selected: "0",
|
||||||
|
need_signature: "0",
|
||||||
|
need_custom_text: "0",
|
||||||
|
is_default: "1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'prompt_this',
|
||||||
|
name: "__MSG_prompt_this__",
|
||||||
|
text: "Reply with only the needed text and with no extra comments or other text.",
|
||||||
|
type: "2",
|
||||||
|
action: "2",
|
||||||
|
need_selected: "1",
|
||||||
|
need_signature: "0",
|
||||||
|
need_custom_text: "0",
|
||||||
|
is_default: "1",
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
||||||
|
export async function getPrompts(onlyEnabled = false){
|
||||||
|
const defaultPrompts = await getDefaultPrompts_withProps();
|
||||||
|
const customPrompts = await getCustomPrompts();
|
||||||
|
let output = defaultPrompts.concat(customPrompts);
|
||||||
|
if(onlyEnabled){
|
||||||
|
output = output.filter(obj => obj.enabled != 0);
|
||||||
|
}else{ // order only if we are not filtering, the filtering is for the menus and we are ordering there after i18n
|
||||||
|
output.sort((a, b) => a.id.localeCompare(b.id));
|
||||||
|
}
|
||||||
|
for(let i=1; i<=output.length; i++){
|
||||||
|
output[i-1].idnum = i;
|
||||||
|
}
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async function getDefaultPrompts_withProps() {
|
||||||
|
let prefs = await browser.storage.sync.get({_default_prompts_properties: null}); //production
|
||||||
|
let defaultPrompts_prop = [...defaultPrompts];
|
||||||
|
if(prefs._default_prompts_properties === null){ // no default prompts properties saved
|
||||||
|
let pos = 1;
|
||||||
|
defaultPrompts_prop.forEach((prompt) => {
|
||||||
|
prompt.position_display = pos;
|
||||||
|
prompt.position_compose = pos;
|
||||||
|
prompt.enabled = 1;
|
||||||
|
pos++;
|
||||||
|
})
|
||||||
|
} else { // we have saved default prompts properties
|
||||||
|
let pos = 1000;
|
||||||
|
defaultPrompts_prop.forEach((prompt) => {
|
||||||
|
if(prefs._default_prompts_properties?.[prompt.id]){
|
||||||
|
prompt.position_compose = prefs._default_prompts_properties[prompt.id].position_compose;
|
||||||
|
prompt.position_display = prefs._default_prompts_properties[prompt.id].position_display;
|
||||||
|
prompt.enabled = prefs._default_prompts_properties[prompt.id].enabled;
|
||||||
|
}else{
|
||||||
|
prompt.position_display = pos;
|
||||||
|
prompt.position_compose = pos;
|
||||||
|
prompt.enabled = 1;
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return defaultPrompts_prop;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async function getCustomPrompts() {
|
||||||
|
let prefs = await browser.storage.sync.get({_custom_prompt: null});
|
||||||
|
if(prefs._custom_prompt === null){
|
||||||
|
return [];
|
||||||
|
} else {
|
||||||
|
return prefs._custom_prompt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function setDefaultPromptsProperties(prompts) {
|
||||||
|
let default_prompts_properties = {};
|
||||||
|
prompts.forEach((prompt) => {
|
||||||
|
default_prompts_properties[prompt.id] = {position_compose: prompt.position_compose, position_display: prompt.position_display, enabled: prompt.enabled};
|
||||||
|
});
|
||||||
|
//console.log('>>>>>>>>>>>>>> default_prompts_properties: ' + JSON.stringify(default_prompts_properties));
|
||||||
|
await browser.storage.sync.set({_default_prompts_properties: default_prompts_properties});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export async function setCustomPrompts(prompts) {
|
||||||
|
await browser.storage.sync.set({_custom_prompt: prompts});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,9 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
export const getMenuContextCompose = () => 'compose_action_menu';
|
||||||
|
export const getMenuContextDisplay = () => 'message_display_action_menu';
|
||||||
|
|
||||||
|
|
||||||
export function getLanguageDisplayName(languageCode) {
|
export function getLanguageDisplayName(languageCode) {
|
||||||
const languageDisplay = new Intl.DisplayNames([languageCode], {type: 'language'});
|
const languageDisplay = new Intl.DisplayNames([languageCode], {type: 'language'});
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
"manifest_version": 2,
|
"manifest_version": 2,
|
||||||
"name": "ThunderAI",
|
"name": "ThunderAI",
|
||||||
"description": "__MSG_extensionDescription__",
|
"description": "__MSG_extensionDescription__",
|
||||||
"version": "1.0.10",
|
"version": "1.1.0pre4",
|
||||||
"author": "Mic (m@micz.it)",
|
"author": "Mic (m@micz.it)",
|
||||||
"homepage_url": "https://micz.it/thunderdbird-addon-thunderai/",
|
"homepage_url": "https://micz.it/thunderdbird-addon-thunderai/",
|
||||||
"browser_specific_settings": {
|
"browser_specific_settings": {
|
||||||
|
|
|
||||||
|
|
@ -55,10 +55,10 @@ messenger.runtime.onMessage.addListener(async (message, sender, sendResponse) =>
|
||||||
return true;
|
return true;
|
||||||
case 'chatgpt_close':
|
case 'chatgpt_close':
|
||||||
browser.windows.remove(createdWindowID).then(() => {
|
browser.windows.remove(createdWindowID).then(() => {
|
||||||
console.log("ChatGPT window closed successfully.");
|
console.log("[ThunderAI] ChatGPT window closed successfully.");
|
||||||
return true;
|
return true;
|
||||||
}).catch((error) => {
|
}).catch((error) => {
|
||||||
console.error("Error closing ChatGPT window:", error);
|
console.error("[ThunderAI] Error closing ChatGPT window:", error);
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
|
@ -113,6 +113,10 @@ messenger.runtime.onMessage.addListener(async (message, sender, sendResponse) =>
|
||||||
await setBody(message.tabId, original_html);
|
await setBody(message.tabId, original_html);
|
||||||
await setBody(message.tabId, modified_html);
|
await setBody(message.tabId, modified_html);
|
||||||
break;
|
break;
|
||||||
|
case 'reload_menus':
|
||||||
|
await menus.reload();
|
||||||
|
console.log('[ThunderAI] Reloaded menus');
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -122,10 +126,10 @@ messenger.runtime.onMessage.addListener(async (message, sender, sendResponse) =>
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
async function openChatGPT(promptText, action, curr_tabId) {
|
async function openChatGPT(promptText, action, curr_tabId, do_custom_text = 0) {
|
||||||
let prefs = await browser.storage.sync.get(prefs_default);
|
let prefs = await browser.storage.sync.get(prefs_default);
|
||||||
prefs = checkScreenDimensions(prefs);
|
prefs = checkScreenDimensions(prefs);
|
||||||
console.log('Prompt length: ' + promptText.length);
|
console.log('[ThunderAI] Prompt length: ' + promptText.length);
|
||||||
if(promptText.length > 30000 ){
|
if(promptText.length > 30000 ){
|
||||||
// Prompt too long for ChatGPT
|
// Prompt too long for ChatGPT
|
||||||
browser.tabs.sendMessage(curr_tabId, { command: "promptTooLong" });
|
browser.tabs.sendMessage(curr_tabId, { command: "promptTooLong" });
|
||||||
|
|
@ -138,7 +142,7 @@ async function openChatGPT(promptText, action, curr_tabId) {
|
||||||
height: prefs.chatgpt_win_height
|
height: prefs.chatgpt_win_height
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log("Script started...");
|
console.log("[ThunderAI] Script started...");
|
||||||
createdWindowID = newWindow.id;
|
createdWindowID = newWindow.id;
|
||||||
const createdTab = newWindow.tabs[0];
|
const createdTab = newWindow.tabs[0];
|
||||||
|
|
||||||
|
|
@ -164,15 +168,16 @@ async function openChatGPT(promptText, action, curr_tabId) {
|
||||||
let pre_script = `let mztaStatusPageDesc="`+ browser.i18n.getMessage("prefs_status_page") +`";
|
let pre_script = `let mztaStatusPageDesc="`+ browser.i18n.getMessage("prefs_status_page") +`";
|
||||||
let mztaForceCompletionDesc="`+ browser.i18n.getMessage("chatgpt_force_completion") +`";
|
let mztaForceCompletionDesc="`+ browser.i18n.getMessage("chatgpt_force_completion") +`";
|
||||||
let mztaForceCompletionTitle="`+ browser.i18n.getMessage("chatgpt_force_completion_title") +`";
|
let mztaForceCompletionTitle="`+ browser.i18n.getMessage("chatgpt_force_completion_title") +`";
|
||||||
|
let mztaDoCustomText=`+ do_custom_text +`;
|
||||||
`;
|
`;
|
||||||
|
|
||||||
browser.tabs.executeScript(createdTab.id, { code: pre_script + mzta_script, matchAboutBlank: false })
|
browser.tabs.executeScript(createdTab.id, { code: pre_script + mzta_script, matchAboutBlank: false })
|
||||||
.then(async () => {
|
.then(async () => {
|
||||||
console.log("Script injected successfully");
|
console.log("[ThunderAI] Script injected successfully");
|
||||||
browser.tabs.sendMessage(createdTab.id, { command: "chatgpt_send", prompt: promptText, action: action, tabId: curr_tabId });
|
browser.tabs.sendMessage(createdTab.id, { command: "chatgpt_send", prompt: promptText, action: action, tabId: curr_tabId });
|
||||||
})
|
})
|
||||||
.catch(err => {
|
.catch(err => {
|
||||||
console.error("Error injecting the script: ", err);
|
console.error("[ThunderAI] Error injecting the script: ", err);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,16 @@
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
body {
|
||||||
|
background-color: rgb(35, 34, 43);
|
||||||
|
color: rgb(251, 251, 254);
|
||||||
|
}
|
||||||
|
|
||||||
|
a:link { color: #409EFF; }
|
||||||
|
a:visited { color: #409EFF; }
|
||||||
|
a:hover { color: #66B1FF; }
|
||||||
|
a:active { color: #66B1FF; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
div#miczDescription{
|
div#miczDescription{
|
||||||
padding:0px 15px 0px 15px;
|
padding:0px 15px 0px 15px;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
|
|
@ -71,4 +84,10 @@ input#chatgpt_win_height{
|
||||||
span.dims_label{
|
span.dims_label{
|
||||||
width: 75px;
|
width: 75px;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
#btn_custom_prompts{
|
||||||
|
text-align: center;
|
||||||
|
width: 100%;
|
||||||
|
margin: 10px 0px;
|
||||||
}
|
}
|
||||||
|
|
@ -71,6 +71,9 @@
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
<div id="btn_custom_prompts">
|
||||||
|
<button id="btnManagePrompts">__MSG_prefs_OptionText_btnManagePrompts__</button>
|
||||||
|
</div>
|
||||||
<div id="miczDescription">
|
<div id="miczDescription">
|
||||||
<h1>__MSG_prefsInfoTitle__</h1>
|
<h1>__MSG_prefsInfoTitle__</h1>
|
||||||
<p>__MSG_prefsInfoDesc_1__<br/>
|
<p>__MSG_prefsInfoDesc_1__<br/>
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ function saveOptions(e) {
|
||||||
if (element.tagName === 'SELECT') {
|
if (element.tagName === 'SELECT') {
|
||||||
options[element.id] = element.value;
|
options[element.id] = element.value;
|
||||||
}else{
|
}else{
|
||||||
console.log('Unhandled input type:', element.type);
|
console.log('[ThunderAI] Unhandled input type:', element.type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -73,14 +73,14 @@ function restoreOptions() {
|
||||||
element.selectedIndex = -1;
|
element.selectedIndex = -1;
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
console.log('Unhandled input type:', element.type);
|
console.log('[ThunderAI] Unhandled input type:', element.type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function onError(error) {
|
function onError(error) {
|
||||||
console.log(`Error: ${error}`);
|
console.log(`[ThunderAI] Error: ${error}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
let getting = browser.storage.sync.get(null);
|
let getting = browser.storage.sync.get(null);
|
||||||
|
|
@ -93,4 +93,16 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||||
document.querySelectorAll(".option-input").forEach(element => {
|
document.querySelectorAll(".option-input").forEach(element => {
|
||||||
element.addEventListener("change", saveOptions);
|
element.addEventListener("change", saveOptions);
|
||||||
});
|
});
|
||||||
|
document.getElementById('btnManagePrompts').addEventListener('click', () => {
|
||||||
|
// check if the tab is already there
|
||||||
|
browser.tabs.query({url: browser.runtime.getURL('../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('../customprompts/mzta-custom-prompts.html')});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
});
|
||||||
}, { once: true });
|
}, { once: true });
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,16 @@
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
body {
|
||||||
|
background-color: rgb(35, 34, 43);
|
||||||
|
color: rgb(251, 251, 254);
|
||||||
|
}
|
||||||
|
|
||||||
|
a:link { color: #409EFF; }
|
||||||
|
a:visited { color: #409EFF; }
|
||||||
|
a:hover { color: #66B1FF; }
|
||||||
|
a:active { color: #66B1FF; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
div#miczRelNotes{
|
div#miczRelNotes{
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,25 +7,40 @@
|
||||||
<body>
|
<body>
|
||||||
<div id="miczBackPrefs"><a href="mzta-options.html">__MSG_backToOptionsText__</a></div>
|
<div id="miczBackPrefs"><a href="mzta-options.html">__MSG_backToOptionsText__</a></div>
|
||||||
<div id="miczRelNotes"><h1>ThunderAI Release Notes</h1>
|
<div id="miczRelNotes"><h1>ThunderAI Release Notes</h1>
|
||||||
|
<h2>Version 1.1.0 - ??/??/2024</h2>
|
||||||
|
<ul>
|
||||||
|
<li>A prompt can be configured to request additional text from the user.</li>
|
||||||
|
<li>Added custom prompts. See more info <a href="https://micz.it/thunderdbird-addon-thunderai/custom-prompts/">here</a>.</li>
|
||||||
|
<li>Dark mode added.</li>
|
||||||
|
<li>Added some error messages to handle potential changes in the ChatGPT web interface.</li>
|
||||||
|
<li>German translation added.</li>
|
||||||
|
<li>French translation added.</li>
|
||||||
|
<li>Log messages improved.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h2>Version 1.0.10 - 17/05/2024</h2>
|
<h2>Version 1.0.10 - 17/05/2024</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Now using the new URL chatgpt.com.</li>
|
<li>Now using the new URL chatgpt.com.</li>
|
||||||
<li>More improvements in handling the ChatGPT web interface.</li>
|
<li>More improvements in handling the ChatGPT web interface.</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h2>Version 1.0.9 - 16/05/2024</h2>
|
<h2>Version 1.0.9 - 16/05/2024</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Improved handling of different versions of the ChatGPT web interface.</li>
|
<li>Improved handling of different versions of the ChatGPT web interface.</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h2>Version 1.0.8 - 15/05/2024</h2>
|
<h2>Version 1.0.8 - 15/05/2024</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Fixed changes in the ChatGPT web interface, see <a href="https://github.com/micz/ThunderAI/issues/57">#57</a> and <a href="https://github.com/micz/ThunderAI/issues/62">#62</a>.</li>
|
<li>Fixed changes in the ChatGPT web interface [<a href="https://github.com/micz/ThunderAI/issues/57">#57</a>, <a href="https://github.com/micz/ThunderAI/issues/62">#62</a>].</li>
|
||||||
<li>Correctly handling the model ChatGPT-4o.</li>
|
<li>Correctly handling the model ChatGPT-4o.</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h2>Version 1.0.7 - 09/05/2024</h2>
|
<h2>Version 1.0.7 - 09/05/2024</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Improved the reply prompt to exclude comments and other text beside the mail text.</li>
|
<li>Improved the reply prompt to exclude comments and other text beside the mail text.</li>
|
||||||
<li>Correctly keeping the signature in a reply even if it's above the quoted email [<a href="https://github.com/micz/ThunderAI/issues/45">#45</a>].</li>
|
<li>Correctly keeping the signature in a reply even if it's above the quoted email [<a href="https://github.com/micz/ThunderAI/issues/45">#45</a>].</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h2>Version 1.0.6 - 08/05/2024</h2>
|
<h2>Version 1.0.6 - 08/05/2024</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Correctly handling a change in the ChatGPT web interface [<a href="https://github.com/micz/ThunderAI/issues/43">#43</a>].</li>
|
<li>Correctly handling a change in the ChatGPT web interface [<a href="https://github.com/micz/ThunderAI/issues/43">#43</a>].</li>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue