Verbesserung Ablagedialog hinsichtlich PDF-Konvertierung und nicht konvertierbaren Dateien
This commit is contained in:
@@ -7,6 +7,10 @@
|
||||
color-scheme: light dark;
|
||||
}
|
||||
* { box-sizing: border-box; }
|
||||
/* Muss VOR den Anzeigearten stehen und !important tragen: Eine Regel wie
|
||||
".wahl { display: flex }" überstimmt sonst das eingebaute
|
||||
"[hidden] { display: none }", und ausgeblendete Elemente erscheinen. */
|
||||
[hidden] { display: none !important; }
|
||||
body {
|
||||
font: message-box;
|
||||
font-size: 13px;
|
||||
@@ -43,6 +47,17 @@ input[type=text], input[type=password], input[type=number], select {
|
||||
.mass input { width: 68px; }
|
||||
.zeile > input[type=text] { flex: 1; }
|
||||
.wahl { display: flex; gap: 6px; align-items: center; margin: 3px 0; }
|
||||
|
||||
/* Dateiliste mit Wahl der Ablageart je Datei. */
|
||||
.dateizeile {
|
||||
display: flex; align-items: center; gap: 10px;
|
||||
padding: 3px 0; flex-wrap: wrap;
|
||||
}
|
||||
.dateizeile .name { flex: 1; min-width: 200px; }
|
||||
.dateizeile .art { display: flex; gap: 12px; align-items: center; }
|
||||
.dateizeile .art label { margin: 0; white-space: nowrap; font-size: 12px; }
|
||||
.dateizeile .art input { width: auto; margin: 0; }
|
||||
.dateizeile .art label.aus { color: GrayText; }
|
||||
.wahl input { width: auto; margin: 0; }
|
||||
button {
|
||||
padding: 5px 14px;
|
||||
|
||||
@@ -13,12 +13,6 @@
|
||||
<fieldset>
|
||||
<legend data-i18n="storeWhat">Was soll abgelegt werden?</legend>
|
||||
<div id="dateien"></div>
|
||||
<div class="wahl" id="pdfWahl" hidden>
|
||||
<input type="checkbox" id="alsPdf" checked>
|
||||
<label for="alsPdf" data-i18n="storeAsPdf">
|
||||
Als PDF aufbereiten, Original und Anhänge einbetten
|
||||
</label>
|
||||
</div>
|
||||
<div class="hinweis" data-i18n="storeHintPreselect">
|
||||
Kleine Bilder und Signaturen sind vorab abgewählt — sie sind meist
|
||||
Teil der Nachricht, keine eigenen Dokumente.
|
||||
|
||||
160
ui/store.js
160
ui/store.js
@@ -7,6 +7,7 @@
|
||||
*/
|
||||
|
||||
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);
|
||||
@@ -50,43 +51,35 @@ function quelleAnzeigen() {
|
||||
* 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") {
|
||||
// Die Wahl zwischen PDF und Rohformat gibt es nur hier. Bei einem
|
||||
// einzelnen Anhang waere sie sinnlos - dort wird die Datei so
|
||||
// abgelegt, wie sie ist.
|
||||
const wahl = $("pdfWahl");
|
||||
if (wahl && wahl.hidden) {
|
||||
wahl.hidden = false;
|
||||
$("alsPdf").checked = (einstellungen.mailFormat || "pdf") === "pdf";
|
||||
$("alsPdf").addEventListener("change", dateienAnzeigen);
|
||||
}
|
||||
|
||||
// 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";
|
||||
const alsPdf = $("alsPdf") ? $("alsPdf").checked
|
||||
: (einstellungen.mailFormat || "pdf") === "pdf";
|
||||
bez.textContent = alsPdf
|
||||
? (browser.i18n.getMessage("storeWholePdf")
|
||||
|| "Die Nachricht als PDF, mit eingebettetem Original")
|
||||
: (browser.i18n.getMessage("storeWholeMessage")
|
||||
|| "Die vollständige Nachricht als .eml");
|
||||
zeile.append(box, bez);
|
||||
ziel.append(zeile);
|
||||
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");
|
||||
@@ -96,6 +89,7 @@ function dateienAnzeigen() {
|
||||
|| `Die ${auftrag.dateien.length} Anhänge bleiben darin enthalten.`;
|
||||
ziel.append(h);
|
||||
}
|
||||
knopfPruefen();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -103,24 +97,82 @@ function dateienAnzeigen() {
|
||||
const uninteressant =
|
||||
einstellungen.ignorierteTypen.includes(d.contentType)
|
||||
|| (d.size || 0) < einstellungen.ignorierteKleiner;
|
||||
d.ausgewaehlt = !uninteressant;
|
||||
if (d.ausgewaehlt === undefined) d.ausgewaehlt = !uninteressant;
|
||||
if (d.alsPdf === undefined) d.alsPdf = false;
|
||||
|
||||
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);
|
||||
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() {
|
||||
@@ -199,10 +251,14 @@ async function ablegen() {
|
||||
|
||||
try {
|
||||
const ergebnisse = await ruf("ablegen", {
|
||||
auftrag: { ...auftrag,
|
||||
// Nur mitgeben, wenn die Wahl überhaupt angeboten wurde.
|
||||
alsPdf: $("pdfWahl") && !$("pdfWahl").hidden
|
||||
? $("alsPdf").checked : undefined },
|
||||
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(),
|
||||
|
||||
Reference in New Issue
Block a user