From f6c77611823c7057e72ad697985896e901500a3b Mon Sep 17 00:00:00 2001 From: sylyx Date: Fri, 21 Aug 2026 10:23:36 +0200 Subject: [PATCH] Feld-Zuordnung: Feldname wieder als Auswahl - und die Liste bleibt gefuellt 0.12.1 hatte den Feldnamen auf eine freie Texteingabe umgestellt. Das behob zwar die Blockade, nahm aber die Auswahl weg - eigentlich war nur die Liste leer. Jetzt wieder ein : die Archiv-Feldliste - // gibt es erst nach Anmeldung, ein starres Dropdown wäre bis dahin leer und die - // Zeile unbenutzbar (ohne Feldnamen wirft collectMapping sie beim Speichern weg). - const fieldSel = document.createElement("input"); - fieldSel.type = "text"; - fieldSel.className = "map-field"; - fieldSel.setAttribute("list", "fieldNameList"); - fieldSel.placeholder = "DocuWare-Feldname, z. B. EML_SUBJECT"; - fieldSel.value = field || ""; - fieldSel.addEventListener("change", refreshFieldSelects); + // Feldname wird ausgewählt. Die Liste ist immer gefüllt (Archiv-Cache + + // Standardnamen), und „✎ Anderer Feldname" blendet eine freie Eingabe ein – + // für Felder, die in keiner Liste stehen. + const fieldSel = document.createElement("select"); + fieldSel.className = "map-field-sel"; + + const own = document.createElement("input"); + own.type = "text"; own.className = "map-field-custom"; + own.placeholder = "Eigener Feldname, z. B. EML_SUBJECT"; + own.hidden = true; + + fillFieldSelect(fieldSel, field); + if (field && fieldSel.value !== field) { + // Sicherheitsnetz: Name nicht im Dropdown gelandet -> als freie Eingabe zeigen, + // statt ihn stillschweigend zu verlieren. + fieldSel.value = CUSTOM_OPT; own.value = field; own.hidden = false; + } + + fieldSel.addEventListener("change", () => { + const isOwn = fieldSel.value === CUSTOM_OPT; + own.hidden = !isOwn; + if (isOwn) own.focus(); + }); + own.addEventListener("change", refreshFieldSelects); const src = document.createElement("select"); src.className = "map-source"; const none = document.createElement("option"); none.value = ""; none.textContent = "— nichts —"; @@ -227,7 +295,7 @@ function addMapRow(field = "", value = "") { if (st.sel === CONST_OPT) co.selected = true; src.appendChild(co); - left.append(fieldSel, src); + left.append(fieldSel, own, src); // Rechts (breit): fester Wert – nur sichtbar bei „Fester Wert". const right = document.createElement("div"); right.className = "map-right"; @@ -259,7 +327,7 @@ function loadMapping(map) { function collectMapping() { const map = {}; document.querySelectorAll("#mapBody .map-row").forEach((row) => { - const f = row.querySelector(".map-field").value.trim(); + const f = rowFieldName(row); if (!f) return; // ohne Feldname ignorieren const sel = row.querySelector(".map-source").value; if (sel === CONST_OPT) { @@ -372,14 +440,27 @@ $("mapCabinet").addEventListener("change", async () => { const id = $("mapCabinet").value; const st = $("mapFieldStatus"); if (!id) { availableFields = []; refreshFieldSelects(); st.textContent = ""; return; } - st.textContent = "Lade Felder …"; + + // Gemerkte Liste sofort anzeigen – dann ist die Auswahl auch ohne Anmeldung da. + if (Array.isArray(fieldsByCabinet[id])) { + availableFields = fieldsByCabinet[id]; + refreshFieldSelects(); + st.textContent = `${availableFields.length} Felder zur Auswahl (gemerkt).`; + } else { + 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; } + if (!ok) { + if (!availableFields.length) st.textContent = "Erst „Verbindung testen“ (Passwort nötig)."; + return; // gemerkte Liste bleibt stehen + } availableFields = (await DocuWare.cabinetFieldNames(s, id)) .filter((n) => n && !/^DW[A-Z]/.test(n)) // DW*-Systemfelder ausblenden .sort(); + await rememberFields(id, availableFields); refreshFieldSelects(); st.textContent = `${availableFields.length} Felder zur Auswahl geladen.`; } catch (e) {