212 lines
7.2 KiB
JavaScript
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;
|
|
}
|
|
}
|