Compare commits
2 Commits
cbaee51b4e
...
ecbf1fcf33
| Author | SHA1 | Date | |
|---|---|---|---|
| ecbf1fcf33 | |||
| 2e6a1a58e5 |
@ -2,7 +2,7 @@
|
|||||||
"manifest_version": 2,
|
"manifest_version": 2,
|
||||||
"name": "DocuWare Ablage",
|
"name": "DocuWare Ablage",
|
||||||
"description": "Legt markierte E-Mails (als .eml, PDF und mit Anhängen) in DocuWare ab.",
|
"description": "Legt markierte E-Mails (als .eml, PDF und mit Anhängen) in DocuWare ab.",
|
||||||
"version": "0.12.0",
|
"version": "0.12.1",
|
||||||
"author": "l.lingler",
|
"author": "l.lingler",
|
||||||
"applications": {
|
"applications": {
|
||||||
"gecko": {
|
"gecko": {
|
||||||
|
|||||||
@ -108,7 +108,7 @@
|
|||||||
.map-row.has-const .map-left { flex: 0 0 250px; }
|
.map-row.has-const .map-left { flex: 0 0 250px; }
|
||||||
.map-right { display: none; flex: 1 1 auto; min-width: 0; }
|
.map-right { display: none; flex: 1 1 auto; min-width: 0; }
|
||||||
.map-row.has-const .map-right { display: flex; align-items: center; }
|
.map-row.has-const .map-right { display: flex; align-items: center; }
|
||||||
.map-left select, .map-right input { width: 100%; padding: 7px 9px; }
|
.map-left select, .map-left input, .map-right input { width: 100%; padding: 7px 9px; }
|
||||||
.map-hint { font-size: 11px; letter-spacing: .4px; text-transform: uppercase;
|
.map-hint { font-size: 11px; letter-spacing: .4px; text-transform: uppercase;
|
||||||
color: var(--muted); font-weight: 600; margin: 2px 2px 8px; }
|
color: var(--muted); font-weight: 600; margin: 2px 2px 8px; }
|
||||||
.icon-btn {
|
.icon-btn {
|
||||||
@ -222,6 +222,8 @@
|
|||||||
|
|
||||||
<div class="map-hint">DocuWare-Feld → Mail-Attribut · fester Wert</div>
|
<div class="map-hint">DocuWare-Feld → Mail-Attribut · fester Wert</div>
|
||||||
<div id="mapBody" class="map"></div>
|
<div id="mapBody" class="map"></div>
|
||||||
|
<!-- Vorschlagsliste fuer alle Feldname-Eingaben (siehe refreshFieldSelects). -->
|
||||||
|
<datalist id="fieldNameList"></datalist>
|
||||||
|
|
||||||
<div class="map-toolbar" style="margin-top:10px">
|
<div class="map-toolbar" style="margin-top:10px">
|
||||||
<button id="mapAdd" class="ghost" type="button">+ Zeile</button>
|
<button id="mapAdd" class="ghost" type="button">+ Zeile</button>
|
||||||
|
|||||||
@ -172,23 +172,26 @@ function mapValueState(value) {
|
|||||||
return { sel: "", konst: "" };
|
return { sel: "", konst: "" };
|
||||||
}
|
}
|
||||||
|
|
||||||
// Befüllt ein Feldname-Dropdown mit den Archiv-Feldern + dem aktuellen Wert (bleibt erhalten).
|
// Vorschläge für die Feldname-Eingaben: Felder des gewählten Archivs, dazu die
|
||||||
function fillFieldSelect(sel, current) {
|
// Standard-Feldnamen und alles schon Eingetragene. Der Archiv-Teil ist erst nach
|
||||||
sel.innerHTML = "";
|
// Anmeldung + Archivwahl da – ohne die beiden anderen Quellen stünde man vorher
|
||||||
const empty = document.createElement("option");
|
// vor einer leeren Liste.
|
||||||
empty.value = ""; empty.textContent = "— Feld wählen —";
|
function fieldSuggestions() {
|
||||||
sel.appendChild(empty);
|
const used = [...document.querySelectorAll("#mapBody .map-field")].map((i) => i.value);
|
||||||
[...new Set([...(availableFields || []), current].filter(Boolean))].sort().forEach((n) => {
|
const all = [...(availableFields || []), ...Object.keys(DEFAULT_FIELD_MAP), ...used];
|
||||||
const o = document.createElement("option");
|
return [...new Set(all.filter(Boolean))].sort();
|
||||||
o.value = n; o.textContent = n;
|
|
||||||
sel.appendChild(o);
|
|
||||||
});
|
|
||||||
sel.value = current || "";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Aktualisiert alle Feldname-Dropdowns auf die aktuelle Archiv-Feldliste (Auswahl bleibt).
|
// Baut die gemeinsame <datalist> neu auf (alle Zeilen hängen daran).
|
||||||
function refreshFieldSelects() {
|
function refreshFieldSelects() {
|
||||||
document.querySelectorAll("#mapBody .map-field").forEach((sel) => fillFieldSelect(sel, sel.value));
|
const dl = $("fieldNameList");
|
||||||
|
if (!dl) return;
|
||||||
|
dl.innerHTML = "";
|
||||||
|
fieldSuggestions().forEach((n) => {
|
||||||
|
const o = document.createElement("option");
|
||||||
|
o.value = n;
|
||||||
|
dl.appendChild(o);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function addMapRow(field = "", value = "") {
|
function addMapRow(field = "", value = "") {
|
||||||
@ -196,11 +199,19 @@ function addMapRow(field = "", value = "") {
|
|||||||
const row = document.createElement("div");
|
const row = document.createElement("div");
|
||||||
row.className = "map-row" + (st.sel === CONST_OPT ? " has-const" : "");
|
row.className = "map-row" + (st.sel === CONST_OPT ? " has-const" : "");
|
||||||
|
|
||||||
// Links gestapelt: Feldname (Dropdown) über Mail-Attribut.
|
// Links gestapelt: Feldname (Eingabe mit Vorschlägen) über Mail-Attribut.
|
||||||
const left = document.createElement("div"); left.className = "map-left";
|
const left = document.createElement("div"); left.className = "map-left";
|
||||||
|
|
||||||
const fieldSel = document.createElement("select"); fieldSel.className = "map-field";
|
// Freie Eingabe mit Vorschlagsliste – bewusst KEIN <select>: die Archiv-Feldliste
|
||||||
fillFieldSelect(fieldSel, field);
|
// 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);
|
||||||
|
|
||||||
const src = document.createElement("select"); src.className = "map-source";
|
const src = document.createElement("select"); src.className = "map-source";
|
||||||
const none = document.createElement("option"); none.value = ""; none.textContent = "— nichts —";
|
const none = document.createElement("option"); none.value = ""; none.textContent = "— nichts —";
|
||||||
@ -242,6 +253,7 @@ function addMapRow(field = "", value = "") {
|
|||||||
function loadMapping(map) {
|
function loadMapping(map) {
|
||||||
$("mapBody").innerHTML = "";
|
$("mapBody").innerHTML = "";
|
||||||
Object.entries(map || {}).forEach(([f, v]) => addMapRow(f, v));
|
Object.entries(map || {}).forEach(([f, v]) => addMapRow(f, v));
|
||||||
|
refreshFieldSelects();
|
||||||
}
|
}
|
||||||
|
|
||||||
function collectMapping() {
|
function collectMapping() {
|
||||||
@ -355,7 +367,7 @@ $("mappingPull").addEventListener("click", async () => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Archiv wählen -> dessen Indexfelder als Vorschläge (datalist) für alle Feldnamen.
|
// Archiv wählen -> dessen Indexfelder als Vorschläge für alle Feldname-Eingaben.
|
||||||
$("mapCabinet").addEventListener("change", async () => {
|
$("mapCabinet").addEventListener("change", async () => {
|
||||||
const id = $("mapCabinet").value;
|
const id = $("mapCabinet").value;
|
||||||
const st = $("mapFieldStatus");
|
const st = $("mapFieldStatus");
|
||||||
|
|||||||
@ -45,6 +45,10 @@
|
|||||||
{
|
{
|
||||||
"version": "0.12.0",
|
"version": "0.12.0",
|
||||||
"update_link": "https://sylyx.xyz/sylyx/thunderbird2docuware/releases/download/v0.12.0/docuware-ablage-0.12.0.xpi"
|
"update_link": "https://sylyx.xyz/sylyx/thunderbird2docuware/releases/download/v0.12.0/docuware-ablage-0.12.0.xpi"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "0.12.1",
|
||||||
|
"update_link": "https://sylyx.xyz/sylyx/thunderbird2docuware/releases/download/v0.12.1/docuware-ablage-0.12.1.xpi"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user