/** * 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; } }