first version for calling a shortcut and showing a div. see #130
This commit is contained in:
parent
e814f4e0d1
commit
c97ab5fb14
4 changed files with 206 additions and 5 deletions
61
css/mzta-compose-styles.css
Normal file
61
css/mzta-compose-styles.css
Normal file
|
|
@ -0,0 +1,61 @@
|
||||||
|
#mzta_search_banner{
|
||||||
|
background-color: rgb(122, 180, 255);
|
||||||
|
color:black;
|
||||||
|
border-radius: 5px;
|
||||||
|
width: 15em;
|
||||||
|
height: 2em;
|
||||||
|
position: absolute;
|
||||||
|
top: 5px;
|
||||||
|
right: 5px;
|
||||||
|
z-index: 1000;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mzta_autocomplete-items {
|
||||||
|
position: absolute;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
border-top: none;
|
||||||
|
z-index: 1001;
|
||||||
|
background-color: #fff;
|
||||||
|
max-height: 150px;
|
||||||
|
overflow-y: auto;
|
||||||
|
width: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mzta_autocomplete-item {
|
||||||
|
padding: 8px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mzta_autocomplete-item:hover {
|
||||||
|
background-color: #e9e9e9;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
|
||||||
|
input {
|
||||||
|
background-color: #27272a;
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
#mzta_search_banner{
|
||||||
|
background-color: #27272a;
|
||||||
|
color:#ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mzta_autocomplete-items {
|
||||||
|
border: 1px solid #555;
|
||||||
|
background-color: #2c2c2c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mzta_autocomplete-item {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mzta_autocomplete-item:hover {
|
||||||
|
background-color: #444444;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -62,8 +62,112 @@ switch (message.command) {
|
||||||
alert(message.message);
|
alert(message.message);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'searchPrompt':
|
||||||
|
searchPrompt();
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// do nothing
|
// do nothing
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const autocompleteData = [
|
||||||
|
'Apple',
|
||||||
|
'Apricot',
|
||||||
|
'Avocado',
|
||||||
|
'Banana',
|
||||||
|
'Blackberry',
|
||||||
|
'Blueberry',
|
||||||
|
'Cherry',
|
||||||
|
'Coconut',
|
||||||
|
'Date',
|
||||||
|
'Dragonfruit',
|
||||||
|
'Elderberry',
|
||||||
|
'Fig',
|
||||||
|
'Grape',
|
||||||
|
'Grapefruit',
|
||||||
|
'Guava',
|
||||||
|
'Honeydew',
|
||||||
|
'Jackfruit',
|
||||||
|
'Kiwi',
|
||||||
|
'Lemon',
|
||||||
|
'Lime',
|
||||||
|
'Mango',
|
||||||
|
'Melon',
|
||||||
|
'Nectarine',
|
||||||
|
'Orange',
|
||||||
|
'Papaya',
|
||||||
|
'Peach',
|
||||||
|
'Pear',
|
||||||
|
'Pineapple',
|
||||||
|
'Plum',
|
||||||
|
'Pomegranate',
|
||||||
|
'Raspberry',
|
||||||
|
'Strawberry',
|
||||||
|
'Watermelon'
|
||||||
|
];
|
||||||
|
|
||||||
|
function searchPrompt(){
|
||||||
|
const banner = document.createElement('div');
|
||||||
|
banner.id = 'mzta_search_banner';
|
||||||
|
|
||||||
|
const input = document.createElement('input');
|
||||||
|
input.type = 'text';
|
||||||
|
input.id = 'mzta_search_input';
|
||||||
|
input.placeholder = 'Search a prompt...';
|
||||||
|
banner.appendChild(input);
|
||||||
|
|
||||||
|
const autocompleteList = document.createElement('div');
|
||||||
|
autocompleteList.classList.add('mzta_autocomplete-items');
|
||||||
|
autocompleteList.style.display = 'none';
|
||||||
|
banner.appendChild(autocompleteList);
|
||||||
|
|
||||||
|
// Function to filter and display autocomplete suggestions
|
||||||
|
input.addEventListener('input', function() {
|
||||||
|
const query = this.value.trim().toLowerCase();
|
||||||
|
autocompleteList.innerHTML = ''; // Clear previous suggestions
|
||||||
|
|
||||||
|
if (query === '') {
|
||||||
|
autocompleteList.style.display = 'none';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Filter data based on the query
|
||||||
|
const filteredData = autocompleteData.filter(item => item.toLowerCase().startsWith(query));
|
||||||
|
|
||||||
|
if (filteredData.length === 0) {
|
||||||
|
autocompleteList.style.display = 'none';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a div for each filtered result
|
||||||
|
filteredData.forEach(item => {
|
||||||
|
const itemDiv = document.createElement('div');
|
||||||
|
itemDiv.classList.add('mzta_autocomplete-item');
|
||||||
|
itemDiv.textContent = item;
|
||||||
|
|
||||||
|
// Add a mousedown event to select the item
|
||||||
|
itemDiv.addEventListener('mousedown', function(e) { // Use mousedown instead of click
|
||||||
|
e.preventDefault(); // Prevents the input from losing focus
|
||||||
|
input.value = item;
|
||||||
|
autocompleteList.style.display = 'none';
|
||||||
|
});
|
||||||
|
|
||||||
|
autocompleteList.appendChild(itemDiv);
|
||||||
|
});
|
||||||
|
|
||||||
|
autocompleteList.style.display = 'block';
|
||||||
|
});
|
||||||
|
|
||||||
|
// Handle the input field losing focus to hide the banner
|
||||||
|
input.addEventListener('blur', function() {
|
||||||
|
// Use a timeout to allow clicking on suggestions before hiding
|
||||||
|
setTimeout(() => {
|
||||||
|
banner.remove();
|
||||||
|
}, 200);
|
||||||
|
});
|
||||||
|
|
||||||
|
document.body.insertBefore(banner, document.body.firstChild);
|
||||||
|
input.focus();
|
||||||
|
}
|
||||||
|
|
@ -44,5 +44,10 @@
|
||||||
"default_locale": "en",
|
"default_locale": "en",
|
||||||
"options_ui": {
|
"options_ui": {
|
||||||
"page": "options/mzta-options.html"
|
"page": "options/mzta-options.html"
|
||||||
}
|
},
|
||||||
|
"commands": {
|
||||||
|
"_thunderai__do_action": {
|
||||||
|
"description": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,12 +32,14 @@ let prefs_debug = await browser.storage.sync.get({do_debug: false});
|
||||||
let taLog = new taLogger("mzta-background",prefs_debug.do_debug);
|
let taLog = new taLogger("mzta-background",prefs_debug.do_debug);
|
||||||
|
|
||||||
browser.composeScripts.register({
|
browser.composeScripts.register({
|
||||||
js: [{file: "/js/mzta-compose-script.js"}]
|
js: [{ file: "js/mzta-compose-script.js" }],
|
||||||
|
css: [{ file: "css/mzta-compose-styles.css" }],
|
||||||
});
|
});
|
||||||
|
|
||||||
// Register the message display script for all newly opened message tabs.
|
// Register the message display script for all newly opened message tabs.
|
||||||
messenger.messageDisplayScripts.register({
|
messenger.messageDisplayScripts.register({
|
||||||
js: [{ file: "js/mzta-compose-script.js" }],
|
js: [{ file: "js/mzta-compose-script.js" }],
|
||||||
|
css: [{ file: "css/mzta-compose-styles.css" }],
|
||||||
});
|
});
|
||||||
|
|
||||||
// Inject script and CSS in all already open message tabs.
|
// Inject script and CSS in all already open message tabs.
|
||||||
|
|
@ -52,7 +54,10 @@ for (let messageTab of messageTabs) {
|
||||||
try {
|
try {
|
||||||
await browser.tabs.executeScript(messageTab.id, {
|
await browser.tabs.executeScript(messageTab.id, {
|
||||||
file: "js/mzta-compose-script.js"
|
file: "js/mzta-compose-script.js"
|
||||||
})
|
});
|
||||||
|
await browser.tabs.insertCSS(messageTab.id, {
|
||||||
|
file: "css/mzta-compose-styles.css"
|
||||||
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("[ThunderAI] Error injecting message display script:", error);
|
console.error("[ThunderAI] Error injecting message display script:", error);
|
||||||
console.error("[ThunderAI] Message tab:", messageTab.url);
|
console.error("[ThunderAI] Message tab:", messageTab.url);
|
||||||
|
|
@ -65,6 +70,32 @@ browser.contentScripts.register({
|
||||||
runAt: "document_idle"
|
runAt: "document_idle"
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Shortcut
|
||||||
|
messenger.commands.update({
|
||||||
|
name: "_thunderai__do_action",
|
||||||
|
shortcut: "Ctrl+Alt+A"
|
||||||
|
}).then(() => {
|
||||||
|
taLog.log('Shortcut registered successfully!');
|
||||||
|
}).catch((error) => {
|
||||||
|
taLog.error('Error registering shortcut: ' + error);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Listen for shortcut command
|
||||||
|
messenger.commands.onCommand.addListener((command, tab) => {
|
||||||
|
if (command === "_thunderai__do_action") {
|
||||||
|
handleShortcut(tab);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
function handleShortcut(tab) {
|
||||||
|
console.log("Shortcut triggered!");
|
||||||
|
if(!["mail", "messageCompose","messageDisplay"].includes(tab.type)){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
browser.tabs.sendMessage(tab.id, { command: "searchPrompt" });
|
||||||
|
}
|
||||||
|
|
||||||
messenger.runtime.onMessage.addListener(async (message, sender, sendResponse) => {
|
messenger.runtime.onMessage.addListener(async (message, sender, sendResponse) => {
|
||||||
// Check what type of message we have received and invoke the appropriate
|
// Check what type of message we have received and invoke the appropriate
|
||||||
// handler function.
|
// handler function.
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue