diff --git a/Allgemeine Bestätigung.html b/Allgemeine Bestätigung.html deleted file mode 100644 index cfef71c..0000000 --- a/Allgemeine Bestätigung.html +++ /dev/null @@ -1,5 +0,0 @@ -

Sehr geehrte/r [Anrede Name],

-

 

-

Für weitere Fragen stehen wir Ihnen gern zur Verfügung.

-

 

-

Mit freundlichen Grüßen

diff --git a/Anfrage ablehnen.html b/Anfrage ablehnen.html deleted file mode 100644 index deed523..0000000 --- a/Anfrage ablehnen.html +++ /dev/null @@ -1,6 +0,0 @@ -

Sehr geehrte/r [Anrede Name],

-

 

-

vielen Dank für Ihre Anfrage.
-Leider sind in dem gewünschten Zeitraum unsere Kapazitäten bereits ausgeschöpft. Eventuell sind Sie noch flexibel und wir dürfen einen alternativen Termin für Sie prüfen.

-

 

-

Bei weiteren Fragen oder Anregungen stehen wir Ihnen sehr gerne zur Verfügung.

diff --git a/Angebot läuft ab.html b/Angebot läuft ab.html deleted file mode 100644 index 3eb6e80..0000000 --- a/Angebot läuft ab.html +++ /dev/null @@ -1,9 +0,0 @@ -

Sehr geehrte/r [Anrede Name],

-

 

-

bezugnehmend auf unser Angebot vom [Datum] bis [Datum] möchte ich Ihnen mitteilen, dass heute das Optionsdatum abläuft und wir das Angebot morgen aus dem System nehmen werden.

-

 

-

Daher freuen wir uns über eine schnelle Rückmeldung von Ihnen.

-

 

-

Bei weiteren Fragen zögern Sie bitte nicht, sich bei uns zu melden.

-

 

-

Herzliche Grüße aus Soltau

diff --git a/Angebot senden.html b/Angebot senden.html deleted file mode 100644 index 8b6631f..0000000 --- a/Angebot senden.html +++ /dev/null @@ -1,8 +0,0 @@ -

Sehr geehrte/r [Anrede Name],

-

 

-

vielen Dank für Ihre Anfrage.
-Im Anhang erhalten Sie Ihr Reservierungsangebot.

-

 

-

Um eine verbindliche Reservierung vornehmen zu können, benötigen wir Ihre Anschrift und eine Telefonnummer.

-

 

-

Bei weiteren Fragen oder Anregungen stehen wir Ihnen sehr gerne zur Verfügung.

diff --git a/Arrangement kein AE.html b/Arrangement kein AE.html deleted file mode 100644 index 3cb94be..0000000 --- a/Arrangement kein AE.html +++ /dev/null @@ -1,11 +0,0 @@ -

Sehr geehrte/r [Anrede Name],

-

 

-

wir möchten Sie freundlich darüber informieren, dass am [Datum] unsere Abendgastronomie sowie die Bar geschlossen bleiben.

-

 

-

Selbstverständlich haben wir für Sie eine Alternative vorgesehen. An der Rezeption erhalten Sie einen Gutschein für das Nachbarhotel (Fußweg ca. 200m) und einen Tisch reservieren wir auch gerne für Sie.

-

 

-

Weitere Getränke am Abend erhalten Sie bei uns an der Rezeption.

-

 

-

Bei Fragen stehen wir Ihnen gerne zur Verfügung.

-

 

-

Herzliche Grüße aus Soltau

diff --git a/Ausgangsrechnung.html b/Ausgangsrechnung.html deleted file mode 100644 index d99c4d8..0000000 --- a/Ausgangsrechnung.html +++ /dev/null @@ -1,5 +0,0 @@ -

Sehr geehrte/r [Anrede Name],

-

 

-

im Anhang erhalten Sie wie gewünscht die Rechnung.

-

 

-

Für weitere Fragen stehen wir Ihnen gern zur Verfügung.

diff --git a/Buchungsbestätigung.html b/Buchungsbestätigung.html deleted file mode 100644 index ed983e4..0000000 --- a/Buchungsbestätigung.html +++ /dev/null @@ -1,6 +0,0 @@ -

Sehr geehrte/r [Anrede Name],

-

 

-

vielen Dank für Ihre Buchung.
-Im Anhang erhalten Sie die Reservierungsbestätigung. Für Fragen stehen wir Ihnen gern zur Verfügung.

-

 

-

Herzliche Grüße aus Soltau

diff --git a/Fahrradverleih.html b/Fahrradverleih.html deleted file mode 100644 index 5d273cd..0000000 --- a/Fahrradverleih.html +++ /dev/null @@ -1,15 +0,0 @@ -

Sehr geehrte/r [Anrede Name],

-

 

-

vielen Dank für Ihre Anfrage und Ihr Interesse an unserem Fahrradverleih. Wir freuen uns, dass Sie während Ihres Aufenthalts die Umgebung aktiv erkunden möchten.

-

 

-

Gerne möchten wir Sie darauf hinweisen, dass unsere Fahrräder ausschließlich vor Ort und nach Verfügbarkeit verliehen werden. Eine Vorabreservierung ist aus betriebsorganisatorischen Gründen leider nicht möglich. Wir bitten um Ihr Verständnis, dass wir an dieser Regelung keine Ausnahmen machen können.

-

 

-

Unsere eBikes befinden sich derzeit in der Wartung, und leider können wir aktuell noch nicht absehen, wann sie wieder zur Verfügung stehen. Damit Sie dennoch nicht auf ein eBike verzichten müssen, empfehlen wir Ihnen den Fahrradverleih Fahrrad Sandau, der hochwertige eBikes anbietet und diese bei Bedarf direkt zu unserem Hotel liefert. Sie erreichen den Verleih unter:

-

 

-

Sohlstraße 23, 29633 Münster / 05192 2458 / info@fahrrad-sandau.de / www.fahrrad-sandau.de

-

 

-

Wir hoffen, Ihnen mit dieser Alternative eine angenehme Lösung anbieten zu können, und stehen Ihnen selbstverständlich jederzeit für weitere Fragen zur Verfügung.

-

 

-

Wir freuen uns darauf, Sie bald bei uns begrüßen zu dürfen, und wünschen Ihnen schon jetzt eine wunderbare Zeit bei uns.

-

 

-

Herzliche Grüße aus Soltau

diff --git a/Fundsache gefunden.html b/Fundsache gefunden.html deleted file mode 100644 index 2b0ac7f..0000000 --- a/Fundsache gefunden.html +++ /dev/null @@ -1,11 +0,0 @@ -

Sehr geehrte/r [Anrede Name],

-

 

-

es freut mich Ihnen mitzuteilen, dass Ihr [Gegenstand] gefunden wurde.

-

 

-

Gerne schicken wir Ihnen dieses versichert als Paket für 7,69 EUR zu.
-Bitte teilen Sie uns hierfür die gewünschte Versandart sowie Ihre Adresse mit.

-

 

-

Nach Eingang des Betrages auf unserem u.g. Konto werden wir die Sendung an die Post übergeben.
-Wir freuen uns auf Ihre Rückmeldung.

-

 

-

Herzliche Grüße aus Soltau

diff --git a/Fundsache nicht gefunden.html b/Fundsache nicht gefunden.html deleted file mode 100644 index 06e09cf..0000000 --- a/Fundsache nicht gefunden.html +++ /dev/null @@ -1,9 +0,0 @@ -

Sehr geehrte/r [Anrede Name],

-

 

-

gerne haben wir Rücksprache mit unserem Housekeeping-Team bezüglich Ihres vermissten [Gegenstand] gehalten.
-Dieser wurde leider nicht gefunden oder bei uns abgegeben.
-Wir wünschen weiterhin noch viel Erfolg bei der Suche und hoffen, dass er sich wieder anfindet.

-

 

-

Bei weiteren Fragen stehen wir Ihnen sehr gerne zur Verfügung.

-

 

-

Herzliche Grüße aus Soltau

diff --git a/Keine Abendgastronomie.html b/Keine Abendgastronomie.html deleted file mode 100644 index d32127e..0000000 --- a/Keine Abendgastronomie.html +++ /dev/null @@ -1,9 +0,0 @@ -

Sehr geehrte Damen und Herren,

-

 

-

wir möchten Sie freundlich darüber informieren, dass am [Datum] unsere Abendgastronomie sowie unsere Bar geschlossen bleiben.

-

 

-

Selbstverständlich sind wir Ihnen gerne bei der Wahl eines Restaurants vor Ort an der Rezeption behilflich.

-

 

-

Bei Fragen stehen wir Ihnen gerne zur Verfügung.

-

 

-

Herzliche Grüße aus Soltau

diff --git a/Keine Kostenübernahme.html b/Keine Kostenübernahme.html deleted file mode 100644 index 32d4080..0000000 --- a/Keine Kostenübernahme.html +++ /dev/null @@ -1,7 +0,0 @@ -

Sehr geehrte/r [Anrede Name],

-

 

-

bitte beachten Sie, dass wir aktuell keine schriftlichen Kostenübernahmen mehr annehmen.

-

 

-

Sie können uns jedoch gerne die Kreditkartendaten (Kartennummer, Gültigkeit, CVC) zukommen lassen, wir buchen dann den Betrag direkt ab. Alternativ kann der Gast auch vor Ort bezahlen und die Rechnung anschließend selbst einreichen.

-

 

-

Herzliche Grüße aus Soltau

diff --git a/Kontingent Bestätigung.html b/Kontingent Bestätigung.html deleted file mode 100644 index 0d5cfe8..0000000 --- a/Kontingent Bestätigung.html +++ /dev/null @@ -1,8 +0,0 @@ -

Sehr geehrte/r [Anrede Name],

-

 

-

vielen Dank für Ihre Buchung eines Zimmers vom [Datum] bis [Datum].
-Gern bestätigen wir Ihnen wie gewünscht und freuen uns bereits auf Ihre Anreise.

-

 

-

Eine kostenfreie Stornierung ist bis 3 Tage vor Anreise möglich.

-

 

-

Für weitere Fragen stehen wir Ihnen gern zur Verfügung.

diff --git a/Reisen Aktuell kein AE.html b/Reisen Aktuell kein AE.html deleted file mode 100644 index b241617..0000000 --- a/Reisen Aktuell kein AE.html +++ /dev/null @@ -1,19 +0,0 @@ -

Sehr geehrte Damen und Herren,

-

 

-

wir möchten Sie freundlich darüber informieren, dass am [Datum] unsere Abendgastronomie sowie die Bar geschlossen bleiben.

-

 

-

Selbstverständlich haben wir für die Gäste eine Alternative vorgesehen. Die Gäste sollen sich dann bitte bei uns an der Rezeption melden.

-

 

-

Weitere Getränke am Abend erhalten die Gäste bei uns an der Rezeption.

-

 

-

Es sind folgende Gäste betroffen:

- -

 

-

Wir möchten Sie freundlich darum bitten, die oben genannten Gäste darüber zu informieren.

-

 

-

Bei Fragen stehen wir Ihnen gern zur Verfügung.

-

 

-

Herzliche Grüße aus Soltau

diff --git a/Stornierungsbestätigung.html b/Stornierungsbestätigung.html deleted file mode 100644 index f1c3987..0000000 --- a/Stornierungsbestätigung.html +++ /dev/null @@ -1,6 +0,0 @@ -

Sehr geehrte/r [Anrede Name],

-

 

-

wir bestätigen hiermit den Erhalt Ihrer Stornierung und die kostenfreie Aufhebung Ihrer Reservierung.
-Falls Sie zu einem späteren Zeitpunkt erneut bei uns buchen möchten, freuen wir uns, Sie wieder begrüßen zu dürfen.

-

 

-

Für weitere Fragen stehen wir Ihnen gern zur Verfügung.

diff --git a/background.js b/background.js index 5cd4e99..e25ca3b 100644 --- a/background.js +++ b/background.js @@ -1,61 +1,96 @@ -// Sluša poruke iz popupa -browser.runtime.onMessage.addListener(async msg => { - if (msg.action !== 'insertTemplate') return; - try { - // 1. Nađi aktivni Compose tab - const [tab] = await browser.tabs.query({ - active: true, - currentWindow: true, - windowType: 'messageCompose', - }); - if (!tab) throw new Error('Nije pronađen Compose tab'); - // 2. Dohvati postojeći sadržaj - const details = await browser.compose.getComposeDetails(tab.id); - // 3. Spoji stari i novi tekst - let newBody; - if (details.isPlainText) { - // 1. Grab existing text - const old = details.plainTextBody || ''; - - // 2. Build new body by prepending with two-line break spacer - // If there's no old content, just use msg.text - newBody = msg.text + (old ? '\n' + old : ''); - - // 3. Set the updated plain-text body - await browser.compose.setComposeDetails(tab.id, { - plainTextBody: newBody, - }); - } else { - const old = details.body || ''; - // If content already contains HTML tags, use as-is; otherwise convert newlines - const htmlTpl = msg.text.includes('<') ? msg.text : msg.text.replace(/\n/g, '
'); - const bodyTag = '', bodyIdx) + 1; - newBody = - old.slice(0, insertAt) + '\n' + htmlTpl + '\n' + old.slice(insertAt); - } else { - newBody = htmlTpl + '
' + old; - } - - await browser.compose.setComposeDetails(tab.id, { body: newBody }); - } - // 4. Obavijest korisniku - await browser.notifications.create({ - type: 'basic', - iconUrl: browser.runtime.getURL('icons/icon.png'), - title: 'Template inserted', - message: 'Sucessfully', - }); - } catch (e) { - console.error('background.js error:', e); - browser.notifications.create({ - type: 'basic', - iconUrl: browser.runtime.getURL('icons/icon.png'), - title: 'Error on inserting!', - message: e.message, - }); - } -}); +browser.runtime.onMessage.addListener(async msg => { + if (msg.action !== 'insertTemplate') return; + 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, '
'); + + // 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 + '
', { insertAsText: false }); + } + + await browser.notifications.create({ + type: 'basic', + iconUrl: browser.runtime.getURL('icons/icon.png'), + title: 'Vorlage eingefügt', + message: 'Erfolgreich', + }); + } 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, '
'); + const bodyIdx = old.indexOf('', bodyIdx) + 1; + newBody = old.slice(0, insertAt) + '\n' + htmlTpl + '\n' + old.slice(insertAt); + } else { + newBody = htmlTpl + '
' + old; + } + await browser.compose.setComposeDetails(tab.id, { body: newBody }); + + await browser.notifications.create({ + type: 'basic', + iconUrl: browser.runtime.getURL('icons/icon.png'), + title: 'Vorlage eingefügt', + message: 'Erfolgreich (Fallback)', + }); + } + } 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, + }); + } + } +}); diff --git a/templates-reply-hotel.xpi b/templates-reply-hotel.xpi new file mode 100644 index 0000000..e086f56 Binary files /dev/null and b/templates-reply-hotel.xpi differ diff --git a/templates_options/templates_options.html b/templates_options/templates_options.html index 999686d..82f183e 100644 --- a/templates_options/templates_options.html +++ b/templates_options/templates_options.html @@ -1,57 +1,248 @@ - - - - - Manage Templates - - - - -

Templates manager

- -
- HTML-Dateien importieren -

Wähle eine oder mehrere .html Dateien aus (z.B. vom Netzlaufwerk). Dateiname = Template-Name. Bestehende Templates mit gleichem Namen werden überschrieben.

- -
- - -
- -
- -
- New Template -
- - -
-
- -
-
- - - -
-
- -

Existing Templates

-
- - -
-
-

There is no saved templates.

-
- - - - \ No newline at end of file + + + + + Vorlagen verwalten + + + + +

Vorlagen verwalten

+ + +
+
HTML-Dateien importieren
+
Wähle eine oder mehrere .html Dateien aus (z.B. vom Netzlaufwerk).
Dateiname = Vorlagen-Name. Bestehende Vorlagen mit gleichem Namen werden überschrieben.
+ +
+ + +
+ + +
+
Neue Vorlage erstellen
+
+ + + + + + + +
+
+ + +

Gespeicherte Vorlagen

+
+ + +
+
+

Keine Vorlagen vorhanden.

+
+ + + + diff --git a/templates_options/templates_options.js b/templates_options/templates_options.js index 7f86b32..90e794a 100644 --- a/templates_options/templates_options.js +++ b/templates_options/templates_options.js @@ -57,11 +57,11 @@ function renderTemplates(templates) { const item = document.createElement('div'); item.className = 'template-item'; item.innerHTML = ` - + ${template.name} -
- - +
+ +
`; templateList.appendChild(item); @@ -109,7 +109,7 @@ templateForm.addEventListener('submit', async (e) => { * Deletes a template */ async function handleDelete(e) { - if (!confirm('Are you sure you want to delete this template?')) { + if (!confirm('Diese Vorlage wirklich löschen?')) { return; } const idToDelete = e.target.dataset.id; @@ -136,8 +136,8 @@ async function handleEdit(e) { document.getElementById('template-content').value = template.content; // Update UI to signal editing - formLegend.textContent = 'Edit Template'; - saveButton.textContent = 'Update Template'; + formLegend.textContent = 'Vorlage bearbeiten'; + saveButton.textContent = 'Aktualisieren'; cancelButton.style.display = 'inline'; // Scroll to the top of the form @@ -152,8 +152,8 @@ function resetForm() { templateForm.reset(); document.getElementById('template-id').value = ''; - formLegend.textContent = 'Add New Template'; - saveButton.textContent = 'Save Template'; + formLegend.textContent = 'Neue Vorlage erstellen'; + saveButton.textContent = 'Speichern'; cancelButton.style.display = 'none'; } @@ -238,7 +238,7 @@ document.getElementById('import-button').addEventListener('click', async () => { await saveTemplates(templates); renderTemplates(templates); - statusEl.textContent = `${importCount} Template(s) importiert!`; + statusEl.textContent = `${importCount} Vorlage(n) importiert!`; statusEl.style.color = 'green'; statusEl.style.display = 'inline'; fileInput.value = ''; diff --git a/Übernachtungssteuer-Hinweis.html b/Übernachtungssteuer-Hinweis.html deleted file mode 100644 index 9ae78ed..0000000 --- a/Übernachtungssteuer-Hinweis.html +++ /dev/null @@ -1,3 +0,0 @@ -

Verehrte Gäste,

-

die Stadt Soltau erhebt für alle Übernachtungen, die ab dem 01.01.2026 gebucht werden, eine Übernachtungssteuer in Höhe von 1,75 % pro Zimmer/Übernachtung, zzgl. 7 % MwSt.

-

Diese Abgabe wird separat in Rechnung gestellt und von uns an die Stadt Soltau abgeführt.