Initial commit
This commit is contained in:
211
ui/insert.js
Normal file
211
ui/insert.js
Normal file
@@ -0,0 +1,211 @@
|
||||
/**
|
||||
* 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user