thunderbird2docuware/options/options.js

143 lines
5.0 KiB
JavaScript
Raw Permalink Normal View History

// Logik der Einstellungsseite.
const $ = (id) => document.getElementById(id);
// Passwort ist bewusst NICHT dabei es wird nie gespeichert, nur zum Testen/Login
// transient verwendet (siehe "Verbindung testen").
const FIELDS = ["serverUrl", "organization", "username"];
const CHECKS = ["storeEml", "storePdf", "storeAttachments", "tagOnSuccess"];
function setStatus(msg, kind) {
const el = $("status");
el.textContent = msg;
el.className = kind || "";
}
async function load() {
const s = await Settings.get();
FIELDS.forEach((f) => ($(f).value = s[f] || ""));
CHECKS.forEach((c) => ($(c).checked = !!s[c]));
// Schrankliste, falls vorher schon getestet (im Storage gecached)
const cached = (await browser.storage.local.get("cabinets")).cabinets || [];
fillCabinets(cached, s.defaultCabinetId);
}
function fillCabinets(cabinets, selectedId) {
const sel = $("defaultCabinet");
sel.innerHTML = '<option value="">— keiner —</option>';
const addGroup = (label, list) => {
if (!list.length) return;
const g = document.createElement("optgroup");
g.label = label;
list.forEach((c) => {
const o = document.createElement("option");
o.value = c.id;
o.textContent = c.name;
if (String(c.id) === String(selectedId)) o.selected = true;
g.appendChild(o);
});
sel.appendChild(g);
};
addGroup("Archive", cabinets.filter((c) => !c.isBasket));
addGroup("Briefkörbe", cabinets.filter((c) => c.isBasket));
}
function collect() {
const partial = {};
FIELDS.forEach((f) => (partial[f] = $(f).value.trim()));
CHECKS.forEach((c) => (partial[c] = $(c).checked));
partial.defaultCabinetId = $("defaultCabinet").value;
return partial;
}
$("save").addEventListener("click", async () => {
await Settings.set(collect());
setStatus("Gespeichert.", "ok");
});
$("test").addEventListener("click", async () => {
const pw = $("password").value;
if (!pw) { setStatus("Bitte Passwort eingeben.", "err"); return; }
setStatus("Verbinde …");
try {
const s = await Settings.set(collect()); // erst speichern (ohne Passwort), dann testen
// Anmeldung über den Hintergrund-Broker: primt zugleich die Sitzung, sodass
// das Ablege-Fenster danach nicht erneut nach dem Passwort fragt.
const res = await browser.runtime.sendMessage({ type: "auth:logon", password: pw });
if (!res || !res.ok) throw new Error(res && res.error ? res.error : "Anmeldung fehlgeschlagen.");
Auth.setToken(res.token);
$("password").value = ""; // Passwort nicht behalten
const cabinets = await DocuWare.listCabinets(s);
await browser.storage.local.set({ cabinets });
fillCabinets(cabinets, s.defaultCabinetId);
const arch = cabinets.filter((c) => !c.isBasket).length;
const bk = cabinets.filter((c) => c.isBasket).length;
setStatus(`Verbindung ok ${arch} Archive, ${bk} Briefkörbe gefunden.`, "ok");
} catch (e) {
setStatus(`Fehler: ${e.message}`, "err");
}
});
$("exportBtn").addEventListener("click", async () => {
const s = await Settings.get();
const blob = new Blob([JSON.stringify(s, null, 2)], { type: "application/json" });
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = "docuware-ablage-einstellungen.json";
document.body.appendChild(a);
a.click();
a.remove();
setTimeout(() => URL.revokeObjectURL(url), 1000);
setStatus("Einstellungen exportiert.", "ok");
});
$("importBtn").addEventListener("click", () => $("importFile").click());
$("importFile").addEventListener("change", async (e) => {
const file = e.target.files && e.target.files[0];
if (!file) return;
try {
const text = await file.text();
const data = JSON.parse(text);
await Settings.set(data);
await load();
setStatus("Einstellungen importiert.", "ok");
} catch (err) {
setStatus(`Import fehlgeschlagen: ${err.message}`, "err");
} finally {
e.target.value = "";
}
});
$("diagBtn").addEventListener("click", async () => {
const cabinetId = $("defaultCabinet").value;
const out = $("diag");
out.style.display = "block";
if (!cabinetId) {
out.value = "Bitte oben zuerst ein Standard-Ziel (Archiv) wählen.";
return;
}
out.value = "Analysiere …";
try {
const s = await Settings.set(collect());
// Sitzungs-Token nutzen; falls noch keiner da ist, Passwortfeld verwenden.
const st = await browser.runtime.sendMessage({ type: "auth:status" });
if (st && st.hasToken && st.token) {
Auth.setToken(st.token);
} else {
const pw = $("password").value;
if (!pw) { out.value = "Bitte Passwort eingeben (oder zuerst „Verbindung testen“)."; return; }
const res = await browser.runtime.sendMessage({ type: "auth:logon", password: pw });
if (!res || !res.ok) throw new Error(res && res.error ? res.error : "Anmeldung fehlgeschlagen.");
Auth.setToken(res.token);
$("password").value = "";
}
const dump = await DocuWare.diagnoseStoreDialog(s, cabinetId);
out.value = JSON.stringify(dump, null, 2);
} catch (e) {
out.value = `Fehler: ${e.message}`;
}
});
load();