diff --git a/README.md b/README.md index 463f853..ca957f5 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Paperless-ngx für Thunderbird / Betterbird +# Paperless-Connector für Thunderbird / Betterbird Legt Anhänge und ganze E-Mails in einem Paperless-ngx-Archiv ab und fügt Dokumente aus dem Archiv als Anhang oder Freigabelink in Entwürfe ein. @@ -85,7 +85,7 @@ für Empfänger, die ohnehin Zugriff auf das Archiv haben sollen. ## Einrichten -1. Add-ons-Verwaltung → **Paperless-ngx** → Einstellungen +1. Add-ons-Verwaltung → **Paperless-Connector** → Einstellungen 2. Basisadresse eintragen, etwa `https://dms.example.org` — ohne abschließenden Schrägstrich 3. API-Token eintragen, erzeugt im **Benutzerprofil** von Paperless diff --git a/_locales/de/messages.json b/_locales/de/messages.json index 414ec94..49fc7de 100644 --- a/_locales/de/messages.json +++ b/_locales/de/messages.json @@ -79,7 +79,7 @@ "message": "Freigabelink im Nachrichtentext" }, "insertHintLink": { - "message": "Der Link ist ohne Anmeldung abrufbar. 0 Tage bedeutet unbegrenzt." + "message": "Der Link ist ohne Anmeldung abrufbar. 0 Tage bedeutet unbegrenzt. Leeres Tag-Feld bedeutet: keine Kennzeichnung setzen." }, "optionsTitle": { "message": "Paperless — Verbindung" @@ -249,12 +249,19 @@ "linkValidUnlimited": { "message": "Link ohne zeitliche Begrenzung" }, - "linkHeading": { - "message": "Datei $1", - "placeholders": { - "1": { - "content": "$1" - } - } + "optionsHintTag": { + "message": "Tag beim Teilen leer lassen, um keine Kennzeichnung zu setzen." + }, + "fieldShareBaseUrl": { + "message": "Adresse für Freigabelinks (optional)" + }, + "optionsHintShareUrl": { + "message": "Nur nötig, wenn der interne Zugang über einen abweichenden Port oder Namen läuft. Freigabelinks werden dann unter dieser Adresse gebaut, damit sie auch von außen funktionieren. Leer = Basisadresse." + }, + "tagsFilterPlaceholder": { + "message": "Tippen zum Filtern …" + }, + "tagsNoMatch": { + "message": "Keine Übereinstimmung." } } diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 3cc4868..9fe90fb 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -79,7 +79,7 @@ "message": "Share link in the message body" }, "insertHintLink": { - "message": "The link works without signing in. 0 days means unlimited." + "message": "The link works without signing in. 0 days means unlimited. An empty tag field means: do not set a tag." }, "optionsTitle": { "message": "Paperless — Connection" @@ -249,12 +249,19 @@ "linkValidUnlimited": { "message": "Link without time limit" }, - "linkHeading": { - "message": "File $1", - "placeholders": { - "1": { - "content": "$1" - } - } + "optionsHintTag": { + "message": "Leave the sharing tag empty to set no tag at all." + }, + "fieldShareBaseUrl": { + "message": "Address for share links (optional)" + }, + "optionsHintShareUrl": { + "message": "Only needed if internal access uses a different port or name. Share links are then built with this address so they work from outside as well. Empty = base address." + }, + "tagsFilterPlaceholder": { + "message": "Type to filter …" + }, + "tagsNoMatch": { + "message": "No match." } } diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json index 0f8ef06..42ff803 100644 --- a/_locales/fr/messages.json +++ b/_locales/fr/messages.json @@ -79,7 +79,7 @@ "message": "Lien de partage dans le corps du message" }, "insertHintLink": { - "message": "Le lien est accessible sans connexion. 0 jour signifie sans limite." + "message": "Le lien est accessible sans connexion. 0 jour signifie sans limite. Un champ d'étiquette vide signifie : ne pas marquer." }, "optionsTitle": { "message": "Paperless — Connexion" @@ -249,12 +249,19 @@ "linkValidUnlimited": { "message": "Lien sans limite de durée" }, - "linkHeading": { - "message": "Fichier $1", - "placeholders": { - "1": { - "content": "$1" - } - } + "optionsHintTag": { + "message": "Laisser l'étiquette de partage vide pour ne poser aucune étiquette." + }, + "fieldShareBaseUrl": { + "message": "Adresse pour les liens de partage (facultatif)" + }, + "optionsHintShareUrl": { + "message": "Nécessaire uniquement si l'accès interne utilise un port ou un nom différent. Les liens de partage seront alors construits avec cette adresse afin de fonctionner aussi depuis l'extérieur. Vide = adresse de base." + }, + "tagsFilterPlaceholder": { + "message": "Saisir pour filtrer …" + }, + "tagsNoMatch": { + "message": "Aucune correspondance." } } diff --git a/background.js b/background.js index 6d3d83e..70621ae 100644 --- a/background.js +++ b/background.js @@ -102,7 +102,22 @@ let naechsteAuftragsnummer = 1; // ---------------------------------------------------------------- Menüs -browser.runtime.onInstalled.addListener(() => { +/** + * Menüeinträge anlegen. + * + * NICHT in onInstalled: Eine Ereignisseite wird beendet und bei Bedarf + * neu geladen, das Skript läuft dabei erneut durch. Die Menüs überleben + * das aber - ein zweiter menus.create mit derselben Kennung scheitert + * dann mit "already exists". + * + * Deshalb erst removeAll, dann neu anlegen. Das ist bei jedem Aufwachen + * richtig und kostet nichts. + */ +async function menueAufbauen() { + try { + await browser.menus.removeAll(); + } catch { /* beim ersten Lauf gibt es nichts zu entfernen */ } + browser.menus.create({ id: "paperless-anhang", title: t("menuStoreAttachment"), @@ -113,7 +128,9 @@ browser.runtime.onInstalled.addListener(() => { title: t("menuStoreMessage"), contexts: ["message_list"] }); -}); +} + +menueAufbauen(); browser.menus.onClicked.addListener(async (info, tab) => { try { @@ -249,6 +266,29 @@ async function dialogOeffnen(art, daten) { // -------------------------------------------- Vermittlung für die Dialoge +/** + * Offene Verbindungen der Dialoge. + * + * SEHR WICHTIG: Eine Ereignisseite wird beendet, sobald keine Ereignisse + * mehr anstehen. Eine laufende Wartezeit in waitForTask zählt NICHT als + * Ereignis - mitten im Ablegen verschwindet sonst der Empfänger, und der + * Dialog bekommt "Could not establish connection. Receiving end does not + * exist." + * + * Eine offene Verbindung hält die Seite dagegen am Leben. Die Dialoge + * öffnen deshalb beim Laden eine und halten sie bis zum Schliessen. + */ +const verbindungen = new Set(); + +browser.runtime.onConnect.addListener((port) => { + verbindungen.add(port); + console.debug("[paperless] Dialog verbunden, offen:", verbindungen.size); + port.onDisconnect.addListener(() => { + verbindungen.delete(port); + console.debug("[paperless] Dialog getrennt, offen:", verbindungen.size); + }); +}); + browser.runtime.onMessage.addListener(async (nachricht, absender) => { // Nur Nachrichten aus dieser Erweiterung annehmen. Thunderbird lässt // fremde Absender hier zwar ohnehin nicht durch, solange kein @@ -390,14 +430,22 @@ async function ablegen(nachricht) { const antwort = await c.updateVersion( nachricht.zielId, datei.blob, datei.name, versionslabel(s.versionLabel)); - const id = await c.waitForTask(antwort); + const id = await c.waitForTask(antwort, (sek) => { + if (sek % 15 === 0) { + console.debug("[paperless] warte auf Aufgabe:", sek, "s"); + } + }); ergebnisse.push({ id, name: datei.name, art: "version", zielId: nachricht.zielId }); } else { const felder = { title: nachricht.titel || datei.name }; if (nachricht.erstellt) felder.created = nachricht.erstellt; const antwort = await c.postDocument(datei.blob, datei.name, felder); - const id = await c.waitForTask(antwort); + const id = await c.waitForTask(antwort, (sek) => { + if (sek % 15 === 0) { + console.debug("[paperless] warte auf Aufgabe:", sek, "s"); + } + }); ergebnisse.push({ id, name: datei.name, art: "neu" }); } } diff --git a/build.sh b/build.sh index 81b0c9f..e2885b8 100644 --- a/build.sh +++ b/build.sh @@ -7,7 +7,7 @@ set -eu cd "$(dirname "$0")" -NAME="paperless-thunderbird" +NAME="paperless-connector" VERSION="$(sed -n 's/.*"version"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' manifest.json | head -1)" OUT="${NAME}-${VERSION}.xpi" diff --git a/manifest.json b/manifest.json index 1578aed..17a24e4 100644 --- a/manifest.json +++ b/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 3, "name": "__MSG_extName__", "description": "__MSG_extDescription__", - "version": "1.6.1", + "version": "1.8.1", "author": "Name des Herausgebers", "homepage_url": "https://example.org/paperless-thunderbird", "default_locale": "de", diff --git a/ui/classify.html b/ui/classify.html index 789374b..831cbee 100644 --- a/ui/classify.html +++ b/ui/classify.html @@ -24,8 +24,17 @@