Verbesserung Ablagedialog bei mehreren ausgewählten Dateien

This commit is contained in:
2026-09-09 23:15:14 +02:00
parent 3f96e6f49d
commit 01a972d719
14 changed files with 908 additions and 236 deletions

View File

@@ -14,6 +14,12 @@ const $ = (id) => document.getElementById(id);
let dokumentId = null;
let alleTags = [];
// Bei mehreren abgelegten Dateien wird jede einzeln klassifiziert.
// Andernfalls trüge nur die erste eine sinnvolle Zuordnung, und die
// übrigen fielen später als unklassifiziert auf - wenn überhaupt.
let liste = [];
let stelle = 0;
// Gewählte Tags als Menge. Bewusst getrennt vom angezeigten Zustand der
// Kontrollkästchen: Der Filter blendet Zeilen aus, die Auswahl darf davon
// nicht berührt werden.
@@ -24,38 +30,82 @@ document.addEventListener("DOMContentLoaded", start);
async function start() {
uebersetzeSeite();
const p = new URLSearchParams(location.search);
dokumentId = Number(p.get("id"));
const weitere = Number(p.get("weiter") || 1);
$("ueberspringen").addEventListener("click", () => window.close());
// "ids" für mehrere, "id" für den Einzelfall - letzteres bleibt für
// Aufrufe aus anderen Stellen erhalten.
const roh = p.get("ids") || p.get("id") || "";
liste = roh.split(",").map((x) => Number(x)).filter(Boolean);
stelle = 0;
$("ueberspringen").addEventListener("click", weiter);
$("abbrechenAlle").addEventListener("click", () => window.close());
$("speichern").addEventListener("click", speichern);
try {
const [doc, stamm] = await Promise.all([
ruf("dokument", { id: dokumentId }),
ruf("stammdaten")
]);
alleTags = stamm.tags;
if (!liste.length) {
fehlerAnzeigen("Kein Dokument angegeben.");
return;
}
$("quelle").textContent =
`#${dokumentId} · ${kurz(doc.title, 70)}`
+ (weitere > 1
? ` · ${browser.i18n.getMessage("classifyMoreStored",
[String(weitere)]) || `${weitere} Dateien abgelegt`}`
: "");
try {
const stamm = await ruf("stammdaten");
alleTags = stamm.tags;
fuelleListe("korrListe", stamm.korr);
fuelleListe("typListe", stamm.typen);
zustand.korr = stamm.korr;
zustand.typen = stamm.typen;
} catch (err) {
fehlerAnzeigen(err.message);
return;
}
await anzeigen();
}
const zustand = { korr: [], typen: [] };
/** Das Dokument an der aktuellen Stelle laden und darstellen. */
async function anzeigen() {
dokumentId = liste[stelle];
$("speichern").disabled = false;
$("ueberspringen").disabled = false;
meldungAnzeigen("");
// Der Knopf zum Abbrechen aller weiteren ist nur sinnvoll, wenn noch
// welche folgen.
$("abbrechenAlle").hidden = liste.length < 2;
try {
const doc = await ruf("dokument", { id: dokumentId });
const zaehler = liste.length > 1
? ` · ${browser.i18n.getMessage("classifyProgress",
[String(stelle + 1), String(liste.length)])
|| `${stelle + 1} von ${liste.length}`}`
: "";
$("quelle").textContent = `#${dokumentId} · ${kurz(doc.title, 60)}`
+ zaehler;
$("titel").value = doc.title || "";
$("erstellt").value = (doc.created || "").slice(0, 10);
fuelleListe("korrListe", stamm.korr);
fuelleListe("typListe", stamm.typen);
$("korr").value = nameVon(stamm.korr, doc.correspondent);
$("typ").value = nameVon(stamm.typen, doc.document_type);
$("korr").value = nameVon(zustand.korr, doc.correspondent);
$("typ").value = nameVon(zustand.typen, doc.document_type);
zeigeTags(doc.tags || []);
if ($("tagSuche")) $("tagSuche").value = "";
} catch (err) {
fehlerAnzeigen(err.message);
}
}
/** Zum nächsten Dokument, oder schliessen. */
async function weiter() {
stelle += 1;
if (stelle >= liste.length) {
window.close();
return;
}
await anzeigen();
}
function fuelleListe(id, eintraege) {
const dl = $(id);
dl.replaceChildren();
@@ -204,7 +254,7 @@ async function speichern() {
typName: $("typ").value.trim()
});
meldungAnzeigen(browser.i18n.getMessage("msgSaved") || "Gespeichert.");
setTimeout(() => window.close(), 900);
setTimeout(weiter, 600);
} catch (err) {
fehlerAnzeigen(err.message);
$("speichern").disabled = false;