213 lines
6.3 KiB
JavaScript
213 lines
6.3 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, meldungAnzeigen }
|
|
from "./gemeinsam.js";
|
|
|
|
const $ = (id) => document.getElementById(id);
|
|
|
|
let auftrag = null;
|
|
let einstellungen = 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();
|
|
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;
|
|
}
|
|
|
|
/**
|
|
* Weiter zum Schrittdialog.
|
|
*
|
|
* Die Auswahl wird über einen neuen Auftrag übergeben - das Fenster
|
|
* schliesst sich, und der Schrittdialog geht die Dateien einzeln durch.
|
|
*/
|
|
async function weiter() {
|
|
$("ablegen").disabled = true;
|
|
meldungAnzeigen(browser.i18n.getMessage("msgOpeningStep")
|
|
|| "Wird vorbereitet …");
|
|
try {
|
|
await ruf("schrittOeffnen", {
|
|
auftrag: {
|
|
...auftrag,
|
|
titelVorschlag: titelAusBetreff(auftrag.betreff),
|
|
alsPdf: auftrag.quelle === "nachricht"
|
|
? $("art_ganz_pdf")?.checked ?? true
|
|
: undefined
|
|
}
|
|
});
|
|
window.close();
|
|
} catch (err) {
|
|
fehlerAnzeigen(err.message);
|
|
$("ablegen").disabled = false;
|
|
}
|
|
}
|
|
|
|
function verdrahten() {
|
|
$("abbrechen").addEventListener("click", () => window.close());
|
|
$("ablegen").addEventListener("click", weiter);
|
|
}
|
|
|
|
function knopfPruefen() {
|
|
const etwasGewaehlt = auftrag.quelle === "nachricht"
|
|
|| (auftrag.dateien || []).some((d) => d.ausgewaehlt);
|
|
$("ablegen").disabled = !etwasGewaehlt;
|
|
}
|