213 lines
6.7 KiB
JavaScript
213 lines
6.7 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 { 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.
|
|
*/
|
|
function dateienAnzeigen() {
|
|
const ziel = $("dateien");
|
|
ziel.replaceChildren();
|
|
|
|
if (auftrag.quelle === "nachricht") {
|
|
// Aufbau über createElement statt innerHTML. Hier stünde zwar nur
|
|
// festes Markup, aber die Zusicherung "kein innerHTML" soll ohne
|
|
// Ausnahme gelten - sonst muss man bei jeder Änderung neu prüfen, ob
|
|
// sich inzwischen ein Fremdwert eingeschlichen hat.
|
|
const zeile = document.createElement("div");
|
|
zeile.className = "wahl";
|
|
const box = document.createElement("input");
|
|
box.type = "checkbox";
|
|
box.id = "ganz";
|
|
box.checked = true;
|
|
box.disabled = true;
|
|
const bez = document.createElement("label");
|
|
bez.htmlFor = "ganz";
|
|
bez.textContent = browser.i18n.getMessage("storeWholeMessage")
|
|
|| "Die vollständige Nachricht als .eml";
|
|
zeile.append(box, bez);
|
|
ziel.append(zeile);
|
|
|
|
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);
|
|
}
|
|
return;
|
|
}
|
|
|
|
for (const [i, d] of (auftrag.dateien || []).entries()) {
|
|
const uninteressant =
|
|
einstellungen.ignorierteTypen.includes(d.contentType)
|
|
|| (d.size || 0) < einstellungen.ignorierteKleiner;
|
|
d.ausgewaehlt = !uninteressant;
|
|
|
|
const zeile = document.createElement("div");
|
|
zeile.className = "wahl";
|
|
const box = document.createElement("input");
|
|
box.type = "checkbox";
|
|
box.id = `d${i}`;
|
|
box.checked = d.ausgewaehlt;
|
|
box.addEventListener("change", () => {
|
|
d.ausgewaehlt = box.checked;
|
|
knopfPruefen();
|
|
});
|
|
const bez = document.createElement("label");
|
|
bez.htmlFor = box.id;
|
|
bez.textContent = `${d.name} (${groesse(d.size)}, ${d.contentType})`;
|
|
zeile.append(box, bez);
|
|
ziel.append(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,
|
|
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;
|
|
}
|
|
}
|