Files
thunderbird-paperless-conne…/ui/store.js

287 lines
8.8 KiB
JavaScript

/**
* store.js - Dialog zum Ablegen von Anhängen und ganzen Nachrichten.
*
* Der Dialog spricht nicht selbst mit Paperless, sondern lässt die
* Ereignisseite arbeiten. Dort hängt die zur Laufzeit erteilte
* Berechtigung für die Zieladresse.
*/
import { groesse, kurz, titelAusBetreff } from "../lib/settings.js";
import { umwandelbar } from "../lib/mailpdf.js";
import { uebersetzeSeite, ruf, fehlerAnzeigen } from "./gemeinsam.js";
const $ = (id) => document.getElementById(id);
let auftrag = null;
let einstellungen = null;
let treffer = [];
let gewaehlterTreffer = null;
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;
}
quelleAnzeigen();
dateienAnzeigen();
vorbelegen();
verdrahten();
}
function quelleAnzeigen() {
const teile = [];
if (auftrag.betreff) teile.push(kurz(auftrag.betreff, 80));
if (auftrag.absender) teile.push(kurz(auftrag.absender, 40));
if (auftrag.datum) teile.push(auftrag.datum);
$("quelle").textContent = teile.join(" · ");
}
/**
* Anhänge zur Auswahl anbieten.
*
* Vorab abgewählt werden kleine Bilder und Signaturen. Sie gehören zur
* Darstellung der Nachricht, nicht zum Inhalt - wer sie alle mit
* archiviert, hat nach einem Jahr hunderte Logos im Bestand.
*/
/**
* Dateien zur Auswahl anbieten, je Zeile mit der Wahl der Ablageart.
*
* Vorbelegt wird unterschiedlich, weil die Absicht unterschiedlich ist:
*
* Eine NACHRICHT wird als PDF aufbereitet - eine .eml sieht sich im
* Archiv niemand an.
*
* Ein ANHANG wird im Original abgelegt. Eine Rechnung als PDF ist
* bereits das Dokument; sie durch eine Textfassung zu ersetzen wäre
* Unfug. Nur bei Textdateien - etwa einem HTML-Anhang - ist die
* Aufbereitung sinnvoll, und dort steht sie zur Wahl.
*/
function dateienAnzeigen() {
const ziel = $("dateien");
ziel.replaceChildren();
if (auftrag.quelle === "nachricht") {
const name = `${titelAusBetreff(auftrag.betreff)}.eml`;
ziel.append(dateiZeile({
schluessel: "ganz",
beschriftung: name,
gewaehlt: true,
festGewaehlt: true,
pdfMoeglich: true,
alsPdf: (einstellungen.mailFormat || "pdf") === "pdf",
hinweisPdf: browser.i18n.getMessage("artMessagePdf")
|| "als PDF aufbereiten"
}));
if (auftrag.dateien?.length) {
const h = document.createElement("div");
h.className = "hinweis";
h.textContent = browser.i18n.getMessage("storeAttachmentsInside",
[String(auftrag.dateien.length)])
|| `Die ${auftrag.dateien.length} Anhänge bleiben darin enthalten.`;
ziel.append(h);
}
knopfPruefen();
return;
}
for (const [i, d] of (auftrag.dateien || []).entries()) {
const uninteressant =
einstellungen.ignorierteTypen.includes(d.contentType)
|| (d.size || 0) < einstellungen.ignorierteKleiner;
if (d.ausgewaehlt === undefined) d.ausgewaehlt = !uninteressant;
if (d.alsPdf === undefined) d.alsPdf = false;
ziel.append(dateiZeile({
schluessel: `d${i}`,
beschriftung: `${d.name} (${groesse(d.size)}, ${d.contentType})`,
gewaehlt: d.ausgewaehlt,
pdfMoeglich: umwandelbar(d.contentType, d.name),
alsPdf: d.alsPdf,
beiWahl: (an) => { d.ausgewaehlt = an; },
beiArt: (pdf) => { d.alsPdf = pdf; }
}));
}
knopfPruefen();
}
/**
* Eine Zeile der Dateiliste: Häkchen, Name, und rechts die Wahl zwischen
* Original und PDF.
*/
function dateiZeile(o) {
const zeile = document.createElement("div");
zeile.className = "dateizeile";
const box = document.createElement("input");
box.type = "checkbox";
box.id = o.schluessel;
box.checked = o.gewaehlt;
if (o.festGewaehlt) box.disabled = true;
box.addEventListener("change", () => {
o.beiWahl?.(box.checked);
knopfPruefen();
});
const name = document.createElement("label");
name.className = "name";
name.htmlFor = box.id;
name.textContent = o.beschriftung;
zeile.append(box, name);
const art = document.createElement("div");
art.className = "art";
const gruppe = `art_${o.schluessel}`;
const machen = (wert, text, aktiv) => {
const r = document.createElement("input");
r.type = "radio";
r.name = gruppe;
r.id = `${gruppe}_${wert}`;
r.value = wert;
r.checked = aktiv;
if (!o.pdfMoeglich && wert === "pdf") r.disabled = true;
r.addEventListener("change", () => {
if (r.checked) o.beiArt?.(wert === "pdf");
});
const l = document.createElement("label");
l.htmlFor = r.id;
l.textContent = text;
if (r.disabled) l.className = "aus";
art.append(r, l);
};
machen("original", browser.i18n.getMessage("artOriginal")
|| "Original ablegen", !o.alsPdf);
machen("pdf", o.hinweisPdf || browser.i18n.getMessage("artPdf")
|| "PDF aufbereiten", Boolean(o.alsPdf) && o.pdfMoeglich);
if (!o.pdfMoeglich) {
art.title = browser.i18n.getMessage("artPdfUnavailable")
|| "Für dieses Format nicht möglich - nur Textdateien lassen sich "
+ "aufbereiten.";
}
zeile.append(art);
return zeile;
}
function vorbelegen() {
$("titel").value = titelAusBetreff(auftrag.betreff);
if (auftrag.datum) $("erstellt").value = auftrag.datum;
}
function verdrahten() {
for (const r of document.querySelectorAll('input[name=ziel]')) {
r.addEventListener("change", zielGewechselt);
}
$("suchen").addEventListener("click", suchen);
$("suche").addEventListener("keydown", (e) => {
if (e.key === "Enter") suchen();
});
$("abbrechen").addEventListener("click", () => window.close());
$("ablegen").addEventListener("click", ablegen);
zielGewechselt();
}
function zielGewechselt() {
const neu = $("zielNeu").checked;
for (const id of ["titel", "erstellt"]) $(id).disabled = !neu;
for (const id of ["suche", "suchen"]) $(id).disabled = neu;
if (!neu && !treffer.length) suchen();
knopfPruefen();
}
async function suchen() {
const liste = $("treffer");
liste.replaceChildren();
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 asn = document.createElement("td");
asn.className = "zahl";
asn.textContent = r.archive_serial_number ?? "—";
const erstellt = document.createElement("td");
erstellt.textContent = (r.created || "").slice(0, 10);
const titel = document.createElement("td");
titel.textContent = r.title || "";
titel.title = r.title || "";
tr.append(asn, erstellt, titel);
tr.addEventListener("click", () => waehle(i));
liste.append(tr);
}
if (treffer.length) waehle(0);
else fehlerAnzeigen(browser.i18n.getMessage("msgNoHits") || "Keine Treffer.");
}
function waehle(i) {
gewaehlterTreffer = treffer[i] || null;
for (const [j, tr] of [...$("treffer").children].entries()) {
tr.classList.toggle("gewaehlt", j === i);
}
knopfPruefen();
}
function knopfPruefen() {
const etwasGewaehlt = auftrag.quelle === "nachricht"
|| (auftrag.dateien || []).some((d) => d.ausgewaehlt);
const zielOk = $("zielNeu").checked || Boolean(gewaehlterTreffer);
$("ablegen").disabled = !(etwasGewaehlt && zielOk);
}
async function ablegen() {
$("ablegen").disabled = true;
$("meldung").className = "hinweis";
$("meldung").textContent =
browser.i18n.getMessage("msgUploading") || "Wird abgelegt …";
try {
const ergebnisse = await ruf("ablegen", {
auftrag: {
...auftrag,
// Bei einer ganzen Nachricht entscheidet die eine Auswahl, bei
// Anhängen steht die Wahl je Datei im Eintrag selbst.
alsPdf: auftrag.quelle === "nachricht"
? $("art_ganz_pdf")?.checked ?? true
: undefined
},
ziel: $("zielNeu").checked ? "neu" : "vorhanden",
zielId: gewaehlterTreffer?.id,
titel: $("titel").value.trim(),
erstellt: $("erstellt").value.trim()
});
if ($("klassifizieren").checked && ergebnisse.length) {
// Beim Anhängen an ein vorhandenes Dokument gilt dessen
// Klassifizierung - dann ist die Wurzel gemeint, nicht die neue
// Version.
const erstes = ergebnisse[0];
const id = erstes.art === "version" ? erstes.zielId : erstes.id;
location.href = `classify.html?id=${id}&weiter=${ergebnisse.length}`;
return;
}
$("meldung").textContent =
browser.i18n.getMessage("msgStored", [String(ergebnisse.length)])
|| `${ergebnisse.length} abgelegt.`;
setTimeout(() => window.close(), 1200);
} catch (err) {
fehlerAnzeigen(err.message);
$("ablegen").disabled = false;
}
}