/** * 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; } }