2026-06-03 11:15:59 +00:00
|
|
|
|
// Einstellungen lesen/schreiben (browser.storage.local).
|
2026-06-03 13:14:05 +00:00
|
|
|
|
// Wichtig: Das Passwort wird NICHT gespeichert. Es wird beim Login einmalig
|
|
|
|
|
|
// abgefragt, daraus ein OAuth-Token geholt und sofort verworfen (siehe auth.js
|
|
|
|
|
|
// + background.js). In storage.local liegen nur unkritische Daten.
|
2026-06-03 11:15:59 +00:00
|
|
|
|
|
|
|
|
|
|
const DEFAULTS = {
|
|
|
|
|
|
serverUrl: "", // z.B. https://docuware.example.com (ohne /DocuWare/Platform)
|
|
|
|
|
|
organization: "",
|
|
|
|
|
|
username: "",
|
|
|
|
|
|
defaultCabinetId: "",
|
|
|
|
|
|
dialogByCabinet: {}, // gemerkter Ablagedialog je Schrank: { [cabinetId]: dialogId }
|
2026-06-16 11:23:39 +00:00
|
|
|
|
mailFormat: "eml", // E-Mail wird als "eml" ODER "pdf" abgelegt (nie beides)
|
2026-06-03 11:15:59 +00:00
|
|
|
|
storeAttachments: true,
|
|
|
|
|
|
tagOnSuccess: true,
|
2026-06-16 13:01:37 +00:00
|
|
|
|
// DocuWare-Feldname -> Wert: entweder ein Mail-Token ("subject") ODER ein fester
|
|
|
|
|
|
// Wert ({ const: "NEU" }). Leer = DEFAULT_FIELD_MAP.
|
|
|
|
|
|
fieldMapping: {},
|
|
|
|
|
|
mappingUrl: "", // optional: raw-JSON-URL (Gitea/GitHub) zum Nachladen des Mappings.
|
2026-06-16 11:23:39 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// Mögliche Mail-Attribute für die Vorbefüllung (Token + Anzeigename).
|
|
|
|
|
|
// Wird von dialog.js (Werte aus meta) und options.js (Mapping-Editor) genutzt.
|
|
|
|
|
|
const MAIL_TOKENS = [
|
|
|
|
|
|
{ key: "senderEmail", label: "Absender – E-Mail" },
|
|
|
|
|
|
{ key: "senderName", label: "Absender – Name" },
|
|
|
|
|
|
{ key: "to", label: "Empfänger (An)" },
|
|
|
|
|
|
{ key: "cc", label: "CC" },
|
|
|
|
|
|
{ key: "bcc", label: "BCC" },
|
|
|
|
|
|
{ key: "subject", label: "Betreff" },
|
|
|
|
|
|
{ key: "body", label: "Text (Body)" },
|
|
|
|
|
|
{ key: "date", label: "Datum" },
|
|
|
|
|
|
{ key: "direction", label: "Richtung (Ein-/Ausgang)" },
|
|
|
|
|
|
{ key: "size", label: "Größe (Bytes)" },
|
|
|
|
|
|
{ key: "account", label: "Konto" },
|
Feld-Zuordnung: Dateiname, Datum+Uhrzeit, Benutzer und weitere Werte
MAIL_TOKENS wächst von 11 auf 22 auswählbare Werte:
- Dokument: fileName (je Dokument), attachmentCount, rfcMessageId
- Datum/Zeit: dateTime, time, archiveDate, archiveDateTime
- Wer/Woher: dwUser, dwOrganization, accountEmail, folder
fileName kann nicht wie die übrigen Tokens einmal je Mail aufgelöst werden: die
.eml/PDF trägt den Mailnamen, jeder Anhang seinen eigenen. Darum tragen TOKEN_FN
jetzt ein zweites Argument ctx {fileName, attachmentCount}, und Felder, die auf
ein Token aus PER_FILE_TOKENS gemappt sind, werden über applyPerFileFields() vor
JEDEM Upload neu gesetzt. Im Formular steht nur eine Vorschau (Tooltip erklärt
das), die beim Umschalten .eml <-> PDF nachzieht.
Fix DateTime-Felder: _field prüfte t.includes("date") zuerst, und "DateTime"
enthält "date" — jedes DocuWare-DateTime-Feld wurde damit auf UTC-Mitternacht
normalisiert und verlor die Uhrzeit. Das betraf auch bestehende Zuordnungen.
Jetzt wird datetime zuerst geprüft; der Dialog rendert solche Felder als
datetime-local und liest sie lokal zurück. Date-Felder bleiben unverändert auf
dem lokalen Kalendertag als UTC-Mitternacht.
Offen und im Code vermerkt: ob DocuWare bei DateTime das "Z" auswertet oder die
ISO-Zeichenkette als lokale Wanduhrzeit liest, ist nicht gegen einen Server
verifiziert.
Mail.getMeta liefert zusätzlich folder und accountEmail; _accountForMessage
wurde zu _accountInfo (Name + Identitäts-Adresse).
DEFAULT_FIELD_MAP: DOC_FILE_NAME -> fileName.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 14:55:32 +00:00
|
|
|
|
|
|
|
|
|
|
// --- Datum/Zeit ---------------------------------------------------------
|
|
|
|
|
|
// "date" liefert nur den Kalendertag. Für DocuWare-Felder vom Typ DateTime
|
|
|
|
|
|
// gibt es "dateTime" (Tag + Uhrzeit); "time" nur die Uhrzeit als Text.
|
|
|
|
|
|
{ key: "dateTime", label: "Datum + Uhrzeit der E-Mail" },
|
|
|
|
|
|
{ key: "time", label: "Uhrzeit der E-Mail" },
|
|
|
|
|
|
{ key: "archiveDate", label: "Ablagedatum (heute)" },
|
|
|
|
|
|
{ key: "archiveDateTime", label: "Ablagezeitpunkt (jetzt)" },
|
|
|
|
|
|
|
|
|
|
|
|
// --- Dokument -----------------------------------------------------------
|
|
|
|
|
|
// fileName wird JE HOCHGELADENEM DOKUMENT gesetzt: .eml/PDF tragen den
|
|
|
|
|
|
// Mailnamen, jeder Anhang seinen eigenen Dateinamen.
|
|
|
|
|
|
{ key: "fileName", label: "Dateiname (je Dokument)" },
|
|
|
|
|
|
{ key: "attachmentCount", label: "Anzahl Anhänge" },
|
|
|
|
|
|
{ key: "rfcMessageId", label: "Message-ID (RFC822)" },
|
|
|
|
|
|
|
|
|
|
|
|
// --- Wer/Woher ----------------------------------------------------------
|
|
|
|
|
|
{ key: "dwUser", label: "DocuWare-Benutzer (Mitarbeiter)" },
|
|
|
|
|
|
{ key: "dwOrganization", label: "DocuWare-Organisation" },
|
|
|
|
|
|
{ key: "accountEmail", label: "Eigene E-Mail-Adresse" },
|
|
|
|
|
|
{ key: "folder", label: "Ordner" },
|
2026-06-16 11:23:39 +00:00
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
|
|
// Standard-Zuordnung DocuWare-Feldname -> Mail-Token. Greift, solange der Nutzer
|
|
|
|
|
|
// in den Einstellungen kein eigenes fieldMapping gespeichert hat.
|
|
|
|
|
|
const DEFAULT_FIELD_MAP = {
|
|
|
|
|
|
EML_SENDER: "senderEmail",
|
|
|
|
|
|
EML_SENDER_DISPLAYNAME: "senderName",
|
|
|
|
|
|
EML_SENDER_NAME: "senderName",
|
|
|
|
|
|
EML_RECEIVER: "to",
|
|
|
|
|
|
EML_CC: "cc",
|
|
|
|
|
|
EML_BCC: "bcc",
|
|
|
|
|
|
EML_SUBJECT: "subject",
|
|
|
|
|
|
DOC_SUBJECT: "subject",
|
|
|
|
|
|
EML_BODY: "body",
|
|
|
|
|
|
EML_SENDINGDATE: "date",
|
|
|
|
|
|
EML_DISPLAYDATE: "date",
|
|
|
|
|
|
EML_RECEIVINGDATE: "date",
|
|
|
|
|
|
EML_DIRECTION: "direction",
|
|
|
|
|
|
EML_SIZE: "size",
|
|
|
|
|
|
EML_ACCOUNT: "account",
|
|
|
|
|
|
DOC_DATE: "date",
|
Feld-Zuordnung: Dateiname, Datum+Uhrzeit, Benutzer und weitere Werte
MAIL_TOKENS wächst von 11 auf 22 auswählbare Werte:
- Dokument: fileName (je Dokument), attachmentCount, rfcMessageId
- Datum/Zeit: dateTime, time, archiveDate, archiveDateTime
- Wer/Woher: dwUser, dwOrganization, accountEmail, folder
fileName kann nicht wie die übrigen Tokens einmal je Mail aufgelöst werden: die
.eml/PDF trägt den Mailnamen, jeder Anhang seinen eigenen. Darum tragen TOKEN_FN
jetzt ein zweites Argument ctx {fileName, attachmentCount}, und Felder, die auf
ein Token aus PER_FILE_TOKENS gemappt sind, werden über applyPerFileFields() vor
JEDEM Upload neu gesetzt. Im Formular steht nur eine Vorschau (Tooltip erklärt
das), die beim Umschalten .eml <-> PDF nachzieht.
Fix DateTime-Felder: _field prüfte t.includes("date") zuerst, und "DateTime"
enthält "date" — jedes DocuWare-DateTime-Feld wurde damit auf UTC-Mitternacht
normalisiert und verlor die Uhrzeit. Das betraf auch bestehende Zuordnungen.
Jetzt wird datetime zuerst geprüft; der Dialog rendert solche Felder als
datetime-local und liest sie lokal zurück. Date-Felder bleiben unverändert auf
dem lokalen Kalendertag als UTC-Mitternacht.
Offen und im Code vermerkt: ob DocuWare bei DateTime das "Z" auswertet oder die
ISO-Zeichenkette als lokale Wanduhrzeit liest, ist nicht gegen einen Server
verifiziert.
Mail.getMeta liefert zusätzlich folder und accountEmail; _accountForMessage
wurde zu _accountInfo (Name + Identitäts-Adresse).
DEFAULT_FIELD_MAP: DOC_FILE_NAME -> fileName.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 14:55:32 +00:00
|
|
|
|
DOC_FILE_NAME: "fileName", // .eml/PDF: Mailname, Anhang: eigener Dateiname
|
2026-06-16 11:23:39 +00:00
|
|
|
|
SUBJECT: "subject",
|
|
|
|
|
|
BETREFF: "subject",
|
|
|
|
|
|
EMAIL: "senderEmail",
|
|
|
|
|
|
E_MAIL: "senderEmail",
|
|
|
|
|
|
DATE: "date",
|
|
|
|
|
|
DATUM: "date",
|
2026-06-03 11:15:59 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const Settings = {
|
|
|
|
|
|
async get() {
|
|
|
|
|
|
const stored = await browser.storage.local.get("settings");
|
2026-06-16 11:23:39 +00:00
|
|
|
|
const raw = stored.settings || {};
|
|
|
|
|
|
const s = { ...DEFAULTS, ...raw };
|
|
|
|
|
|
// Migration: altes storeEml/storePdf -> mailFormat (einmalig, nicht persistiert).
|
|
|
|
|
|
if (raw.mailFormat === undefined && raw.storePdf && !raw.storeEml) {
|
|
|
|
|
|
s.mailFormat = "pdf";
|
|
|
|
|
|
}
|
|
|
|
|
|
return s;
|
2026-06-03 11:15:59 +00:00
|
|
|
|
},
|
|
|
|
|
|
|
2026-06-17 11:43:59 +00:00
|
|
|
|
// Laufende Schreibkette: serialisiert parallele set()-Aufrufe, damit zwei fast
|
|
|
|
|
|
// gleichzeitige Writes (z.B. Schrankwahl + Format-Umschalten) sich nicht beim
|
|
|
|
|
|
// read-modify-write gegenseitig überschreiben.
|
|
|
|
|
|
_writeQueue: Promise.resolve(),
|
|
|
|
|
|
|
2026-06-03 11:15:59 +00:00
|
|
|
|
async set(partial) {
|
2026-06-17 11:43:59 +00:00
|
|
|
|
const run = async () => {
|
|
|
|
|
|
const current = await this.get();
|
|
|
|
|
|
const next = { ...current, ...partial };
|
|
|
|
|
|
// Sicherheitsnetz: Passwort darf NIE persistiert werden (z.B. aus Alt-Importen).
|
|
|
|
|
|
delete next.password;
|
|
|
|
|
|
await browser.storage.local.set({ settings: next });
|
|
|
|
|
|
return next;
|
|
|
|
|
|
};
|
|
|
|
|
|
const p = this._writeQueue.then(run, run);
|
|
|
|
|
|
this._writeQueue = p.catch(() => {}); // Fehler bricht die Kette nicht ab
|
|
|
|
|
|
return p;
|
2026-06-03 11:15:59 +00:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
/** Basis-URL der Platform-API ohne abschließenden Slash. */
|
|
|
|
|
|
platformUrl(settings) {
|
|
|
|
|
|
const base = (settings.serverUrl || "").replace(/\/+$/, "");
|
|
|
|
|
|
if (!base) throw new Error("Keine DocuWare-Server-URL konfiguriert.");
|
|
|
|
|
|
return `${base}/DocuWare/Platform`;
|
|
|
|
|
|
},
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2026-06-16 11:23:39 +00:00
|
|
|
|
if (typeof module !== "undefined")
|
|
|
|
|
|
module.exports = { Settings, DEFAULTS, MAIL_TOKENS, DEFAULT_FIELD_MAP };
|