diff --git a/web/src/locales/de.json b/web/src/locales/de.json
index 7c1d311..92ad666 100644
--- a/web/src/locales/de.json
+++ b/web/src/locales/de.json
@@ -450,6 +450,9 @@
"allDone": "Alles zugeordnet.",
"choose": "Kategorie wählen …",
"noText": "Ohne Text",
- "rememberKeyword": "Zweck als Schlagwort merken, damit die nächste gleiche Buchung beim Import gleich zugeordnet wird"
+ "rememberKeyword": "Zweck als Schlagwort merken, damit die nächste gleiche Buchung beim Import gleich zugeordnet wird",
+ "copy": "Text kopieren",
+ "copied": "Kopiert",
+ "copyFailed": "Kopieren nicht möglich – Text lässt sich jetzt aber markieren."
}
}
diff --git a/web/src/locales/en.json b/web/src/locales/en.json
index 49cabbe..64c5ec1 100644
--- a/web/src/locales/en.json
+++ b/web/src/locales/en.json
@@ -450,6 +450,9 @@
"allDone": "Everything sorted.",
"choose": "Pick a category …",
"noText": "No text",
- "rememberKeyword": "Remember the text as a keyword so the next matching booking is categorised on import"
+ "rememberKeyword": "Remember the text as a keyword so the next matching booking is categorised on import",
+ "copy": "Copy text",
+ "copied": "Copied",
+ "copyFailed": "Copying failed – but the text can be selected now."
}
}
diff --git a/web/src/pages/Offen.jsx b/web/src/pages/Offen.jsx
index 5d948d4..bc2db4f 100644
--- a/web/src/pages/Offen.jsx
+++ b/web/src/pages/Offen.jsx
@@ -44,6 +44,17 @@ export default function Offen() {
}
useEffect(() => { laden(); }, []);
+ // Der Empfaengertext ist oft genau das, was man nachschlagen will („welches
+ // Franchise steckt hinter diesem Namen?"). Abtippen faellt damit weg.
+ async function kopieren(text) {
+ try {
+ await navigator.clipboard.writeText(text);
+ toast(t("open.copied"));
+ } catch {
+ toast(t("open.copyFailed"), "error");
+ }
+ }
+
async function zuordnen(tx, categoryId) {
if (categoryId == null) return;
try {
@@ -90,9 +101,18 @@ export default function Offen() {