Files
hps-thunderbird-templates/background.js
Kendrick Bollens cf051458bb Feature: WYSIWYG-Editor, Gitea-Sync, Signaturen-Verwaltung
- WYSIWYG-Editor mit contenteditable statt Textarea (MDI-Icons, System-Fonts, Farbwähler)
- Gitea-Sync: Templates per Abteilung aus Git-Repo laden/hochladen mit Commit-Author
- Abteilungsordner + _gemeinsam Ordner, einzelnes Pull/Push pro Vorlage
- Sync-Status pro Vorlage (grün/rot/grau Ampel), persistent über Neustarts
- Signaturen-Tab: Identitäten bearbeiten, aus Datei laden, Sync über signatures/ Ordner
- Persönliche Signaturen für geteilte E-Mail-Adressen (pro Mitarbeiter)
- Tab-Navigation: Vorlagen, Signaturen, Synchronisierung
- Auto-Pull beim Thunderbird-Start (Templates + Signaturen)
2026-04-20 16:30:40 +02:00

91 lines
3.4 KiB
JavaScript

browser.runtime.onMessage.addListener((msg, sender, sendResponse) => {
if (msg.action !== 'insertTemplate') return false;
handleInsertTemplate(msg).then(() => sendResponse())
.catch(err => sendResponse({ error: err.message }));
return true; // keep channel open for async response
});
async function handleInsertTemplate(msg) {
try {
const [tab] = await browser.tabs.query({
active: true,
currentWindow: true,
windowType: 'messageCompose',
});
if (!tab) throw new Error('Kein Compose-Fenster gefunden');
const details = await browser.compose.getComposeDetails(tab.id);
const isHtmlTemplate = msg.text.includes('<');
// If compose is plain text but template is HTML, switch to HTML mode first
if (details.isPlainText && isHtmlTemplate) {
await browser.compose.setComposeDetails(tab.id, { isPlainText: false });
}
if (details.isPlainText && !isHtmlTemplate) {
// Plain text template in plain text mode - use old method
const old = details.plainTextBody || '';
const newBody = msg.text + (old ? '\n' + old : '');
await browser.compose.setComposeDetails(tab.id, { plainTextBody: newBody });
} else {
// HTML mode: use insertText API to go through the editor's rendering pipeline
const htmlContent = isHtmlTemplate ? msg.text : msg.text.replace(/\n/g, '<br>');
// Move cursor to beginning of body first via script injection
await browser.tabs.executeScript(tab.id, {
code: `
const editor = document.getElementById('messageEditor');
const editorDoc = editor ? editor.contentDocument : document;
const body = editorDoc.body;
if (body) {
const range = editorDoc.createRange();
range.setStart(body, 0);
range.collapse(true);
const sel = editorDoc.getSelection();
sel.removeAllRanges();
sel.addRange(range);
}
`
}).catch(() => {
// Fallback: some TB versions structure the editor differently
});
// Insert HTML at cursor position - this goes through the editor's render pipeline
await browser.compose.insertText(tab.id, htmlContent + '<br>', { insertAsText: false });
}
} catch (e) {
console.error('background.js error:', e);
// Fallback: if insertText fails, try setComposeDetails
try {
const [tab] = await browser.tabs.query({
active: true, currentWindow: true, windowType: 'messageCompose',
});
if (tab) {
const details = await browser.compose.getComposeDetails(tab.id);
const old = details.body || '';
const htmlTpl = msg.text.includes('<') ? msg.text : msg.text.replace(/\n/g, '<br>');
const bodyIdx = old.indexOf('<body');
let newBody;
if (bodyIdx !== -1) {
const insertAt = old.indexOf('>', bodyIdx) + 1;
newBody = old.slice(0, insertAt) + '\n' + htmlTpl + '\n' + old.slice(insertAt);
} else {
newBody = htmlTpl + '<br>' + old;
}
await browser.compose.setComposeDetails(tab.id, { body: newBody });
}
} catch (e2) {
console.error('background.js fallback error:', e2);
browser.notifications.create({
type: 'basic',
iconUrl: browser.runtime.getURL('icons/icon.png'),
title: 'Fehler beim Einfügen',
message: e2.message,
});
}
}
}