// 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 = ["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])); setMailFormat(s.mailFormat === "pdf" ? "pdf" : "eml"); loadMapping(s.fieldMapping && Object.keys(s.fieldMapping).length ? s.fieldMapping : DEFAULT_FIELD_MAP); // Schrankliste, falls vorher schon getestet (im Storage gecached) const cached = (await browser.storage.local.get("cabinets")).cabinets || []; fillCabinets(cached, s.defaultCabinetId); } function setMailFormat(v) { const el = document.querySelector(`input[name="mailFormat"][value="${v}"]`); if (el) el.checked = true; } function getMailFormat() { const el = document.querySelector('input[name="mailFormat"]:checked'); return el ? el.value : "eml"; } function fillCabinets(cabinets, selectedId) { // Standard-Ziel (Archive + Briefkörbe) const sel = $("defaultCabinet"); sel.innerHTML = ''; 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)); // Mapping-Helfer: nur Archive (Briefkörbe haben keine Indexfelder). const mc = $("mapCabinet"); const keep = mc.value; mc.innerHTML = ''; cabinets.filter((c) => !c.isBasket).forEach((c) => { const o = document.createElement("option"); o.value = c.id; o.textContent = c.name; mc.appendChild(o); }); if (keep) mc.value = keep; } // Besorgt einen Sitzungs-Token: vorhandenen vom Broker nutzen, sonst mit dem // (transienten) Passwortfeld anmelden. Liefert false, wenn kein Passwort da ist. async function ensureToken() { const st = await browser.runtime.sendMessage({ type: "auth:status" }); if (st && st.hasToken && st.token) { Auth.setToken(st.token); return true; } const pw = $("password").value; if (!pw) return false; 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 return true; } // --- Feld-Mapping-Editor --------------------------------------------------- function addMapRow(field = "", token = "") { const tr = document.createElement("tr"); const inp = document.createElement("input"); inp.type = "text"; inp.className = "map-field"; inp.value = field; inp.placeholder = "EML_SUBJECT"; inp.setAttribute("list", "fieldNames"); // Vorschläge aus gewähltem Archiv const tdF = document.createElement("td"); tdF.appendChild(inp); const sel = document.createElement("select"); sel.className = "map-token"; const none = document.createElement("option"); none.value = ""; none.textContent = "— nichts —"; sel.appendChild(none); MAIL_TOKENS.forEach((t) => { const o = document.createElement("option"); o.value = t.key; o.textContent = t.label; if (t.key === token) o.selected = true; sel.appendChild(o); }); const tdT = document.createElement("td"); tdT.appendChild(sel); const del = document.createElement("button"); del.type = "button"; del.className = "icon-btn"; del.textContent = "✕"; del.title = "Zeile entfernen"; del.addEventListener("click", () => tr.remove()); const tdX = document.createElement("td"); tdX.className = "del"; tdX.appendChild(del); tr.append(tdF, tdT, tdX); $("mapBody").appendChild(tr); } function loadMapping(map) { $("mapBody").innerHTML = ""; Object.entries(map || {}).forEach(([f, t]) => addMapRow(f, t)); } function collectMapping() { const map = {}; document.querySelectorAll("#mapBody tr").forEach((tr) => { const f = tr.querySelector(".map-field").value.trim(); const t = tr.querySelector(".map-token").value; if (f && t) map[f] = t; // leere Feldnamen/Token ignorieren }); return map; } function collect() { const partial = {}; FIELDS.forEach((f) => (partial[f] = $(f).value.trim())); CHECKS.forEach((c) => (partial[c] = $(c).checked)); partial.defaultCabinetId = $("defaultCabinet").value; partial.mailFormat = getMailFormat(); partial.fieldMapping = collectMapping(); return partial; } // --- Events ---------------------------------------------------------------- $("save").addEventListener("click", async () => { await Settings.set(collect()); setStatus("Gespeichert.", "ok"); }); $("test").addEventListener("click", async () => { setStatus("Verbinde …"); try { const s = await Settings.set(collect()); // erst speichern (ohne Passwort), dann testen const ok = await ensureToken(); if (!ok) { setStatus("Bitte Passwort eingeben.", "err"); return; } 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"); } }); $("mapAdd").addEventListener("click", () => addMapRow()); $("mapReset").addEventListener("click", () => loadMapping(DEFAULT_FIELD_MAP)); // Archiv wählen -> dessen Indexfelder als Vorschläge (datalist) für alle Feldnamen. $("mapCabinet").addEventListener("change", async () => { const id = $("mapCabinet").value; const dl = $("fieldNames"); const st = $("mapFieldStatus"); if (!id) { dl.innerHTML = ""; st.textContent = ""; return; } st.textContent = "Lade Felder …"; try { const s = await Settings.get(); const ok = await ensureToken(); if (!ok) { st.textContent = "Erst „Verbindung testen“ (Passwort nötig)."; return; } const names = (await DocuWare.cabinetFieldNames(s, id)) .filter((n) => n && !/^DW[A-Z]/.test(n)); // DW*-Systemfelder ausblenden dl.innerHTML = ""; names.sort().forEach((n) => { const o = document.createElement("option"); o.value = n; dl.appendChild(o); }); st.textContent = `${names.length} Felder als Vorschlag geladen.`; } catch (e) { st.textContent = `Fehler: ${e.message}`; } }); load();