// 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();