Files
thunderbird-paperless-conne…/ui/insert.js
2026-09-04 19:50:29 +02:00

212 lines
7.2 KiB
JavaScript

/**
* insert.js - Dokument aus Paperless in einen Entwurf einfügen.
*
* Zwei Wege: als Anhang oder als Freigabelink. Der Link ist die bessere
* Wahl für grosse Dateien und für Empfänger, die ohnehin Zugriff auf das
* Archiv haben sollen - der Anhang für alles, was auch in fünf Jahren noch
* lesbar sein muss, wenn der Link längst abgelaufen ist.
*/
import { uebersetzeSeite, ruf, fehlerAnzeigen, meldungAnzeigen }
from "./gemeinsam.js";
const $ = (id) => document.getElementById(id);
let auftrag = null;
let einstellungen = null;
let treffer = [];
let versionen = [];
let gewaehltesDokument = null;
let gewaehlteVersion = null;
// Formate, die LibreOffice und Thunderbird sinnvoll darstellen. Nur für
// die Anzeige - eingefügt werden kann jedes.
const FORMATE = {
"application/pdf": "PDF",
"application/vnd.oasis.opendocument.text": "ODF Text",
"application/vnd.oasis.opendocument.spreadsheet": "ODF Tabelle",
"application/vnd.oasis.opendocument.presentation": "ODF Präsentation",
"application/msword": "Word 97",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document": "Word",
"application/vnd.ms-excel": "Excel 97",
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": "Excel",
"message/rfc822": "E-Mail",
"image/png": "Bild",
"image/jpeg": "Bild",
"text/plain": "Text"
};
document.addEventListener("DOMContentLoaded", start);
async function start() {
uebersetzeSeite();
const nummer = Number(new URLSearchParams(location.search).get("auftrag"));
einstellungen = await ruf("einstellungen");
auftrag = await ruf("auftrag", { nummer });
if (!auftrag) {
fehlerAnzeigen("Der Auftrag ist nicht mehr vorhanden.");
return;
}
$("tage").value = String(einstellungen.shareDays ?? 7);
// ?? statt ||: Ein bewusst geleertes Feld in den Einstellungen soll
// leer bleiben. Mit || käme die Vorgabe zurück, und die Kennzeichnung
// liesse sich nicht dauerhaft abschalten.
$("tagName").value = einstellungen.shareTag ?? "Sharelink";
$("suchen").addEventListener("click", suchen);
$("suche").addEventListener("keydown", (e) => {
if (e.key === "Enter") suchen();
});
$("abbrechen").addEventListener("click", () => window.close());
$("einfuegen").addEventListener("click", einfuegen);
for (const r of document.querySelectorAll('input[name=art]')) {
r.addEventListener("change", artGewechselt);
}
artGewechselt();
suchen();
}
function artGewechselt() {
const link = $("artLink").checked;
for (const id of ["tage", "tagName"]) $(id).disabled = !link;
// Bei einem Freigabelink zählt das Dokument, nicht die einzelne Version -
// der Link zeigt immer auf die Kopfversion.
$("versionen").closest(".wachsen").style.opacity = link ? ".5" : "1";
knopfPruefen();
}
async function suchen() {
$("treffer").replaceChildren();
$("versionen").replaceChildren();
gewaehltesDokument = null;
gewaehlteVersion = null;
try {
treffer = await ruf("suchen", { query: $("suche").value.trim() });
} catch (err) {
fehlerAnzeigen(err.message);
return;
}
for (const [i, r] of treffer.entries()) {
const tr = document.createElement("tr");
const a = document.createElement("td");
a.className = "zahl";
a.textContent = r.archive_serial_number ?? "—";
const b = document.createElement("td");
b.textContent = (r.created || "").slice(0, 10);
const c = document.createElement("td");
c.textContent = r.title || "";
c.title = r.title || "";
tr.append(a, b, c);
tr.addEventListener("click", () => waehleDokument(i));
$("treffer").append(tr);
}
if (treffer.length) waehleDokument(0);
else meldungAnzeigen(browser.i18n.getMessage("msgNoHits") || "Keine Treffer.");
}
async function waehleDokument(i) {
gewaehltesDokument = treffer[i] || null;
for (const [j, tr] of [...$("treffer").children].entries()) {
tr.classList.toggle("gewaehlt", j === i);
}
$("versionen").replaceChildren();
gewaehlteVersion = null;
knopfPruefen();
if (!gewaehltesDokument) return;
meldungAnzeigen(browser.i18n.getMessage("msgLoadingVersions")
|| "Versionen werden geladen …");
try {
versionen = await ruf("versionen", { id: gewaehltesDokument.id });
} catch (err) {
fehlerAnzeigen(err.message);
return;
}
meldungAnzeigen("");
for (const [k, v] of versionen.entries()) {
const tr = document.createElement("tr");
const a = document.createElement("td");
a.className = "zahl";
a.textContent = v.no;
const b = document.createElement("td");
b.textContent = (v.added || "").slice(0, 10);
const c = document.createElement("td");
c.textContent = FORMATE[v.mime_type] || (v.mime_type || "?");
const d = document.createElement("td");
d.textContent = v.version_label || "";
tr.append(a, b, c, d);
tr.addEventListener("click", () => waehleVersion(k));
$("versionen").append(tr);
}
if (versionen.length) waehleVersion(0);
}
function waehleVersion(k) {
gewaehlteVersion = versionen[k] || null;
for (const [j, tr] of [...$("versionen").children].entries()) {
tr.classList.toggle("gewaehlt", j === k);
}
knopfPruefen();
}
function knopfPruefen() {
const ok = $("artLink").checked
? Boolean(gewaehltesDokument)
: Boolean(gewaehlteVersion);
$("einfuegen").disabled = !ok;
}
async function einfuegen() {
$("einfuegen").disabled = true;
try {
if ($("artLink").checked) {
meldungAnzeigen(browser.i18n.getMessage("msgCreatingLink")
|| "Link wird erzeugt …");
// ACHTUNG: linktext darf NICHT auf url zurückgreifen - die Variable
// entsteht erst durch dieselbe Zuweisung. Bei einem Dokument ohne
// Titel gäbe das eine Ausnahme.
const { url, tagStatus, gueltigBis } = await ruf("freigabelink", {
id: gewaehltesDokument.id,
tage: Number($("tage").value || 0),
variante: "original",
tagName: $("tagName").value.trim() || null,
tabId: auftrag.tabId,
einfuegen: true,
linktext: gewaehltesDokument.title
|| `Dokument ${gewaehltesDokument.id}`
});
// Ein fehlgeschlagener Tag darf nicht untergehen. Er ist der Grund,
// warum sich geteilte Dokumente später wiederfinden lassen.
if (tagStatus && !tagStatus.ok) {
fehlerAnzeigen(`Link erzeugt, aber der Tag konnte nicht gesetzt `
+ `werden:\n${tagStatus.fehler}`);
return;
}
const teile = [url];
if (gueltigBis) {
const d = new Date(gueltigBis);
const z = (n) => String(n).padStart(2, "0");
teile.push(`gültig bis ${z(d.getDate())}.${z(d.getMonth() + 1)}.`
+ `${d.getFullYear()}`);
} else {
teile.push("ohne zeitliche Begrenzung");
}
if (tagStatus?.ok) teile.push(`Tag „${tagStatus.name}" gesetzt`);
meldungAnzeigen(teile.join(" · "));
} else {
meldungAnzeigen(browser.i18n.getMessage("msgAttaching")
|| "Wird angehängt …");
await ruf("anhaengen", {
versionId: gewaehlteVersion.id,
tabId: auftrag.tabId
});
}
setTimeout(() => window.close(), 1000);
} catch (err) {
fehlerAnzeigen(err.message);
$("einfuegen").disabled = false;
}
}