From 637f5f4a70f14003ae34790a93d086cbb781ee94 Mon Sep 17 00:00:00 2001 From: Scarriffle Date: Mon, 19 Oct 2026 11:24:13 +0200 Subject: [PATCH] feat: Die Notiz laesst sich direkt in der Liste schreiben Bisher musste man dafuer die ganze Buchung aufmachen. Jetzt steht in der Notiz-Spalte ein Feld: hineinschreiben, Enter oder wegklicken - fertig. Escape nimmt die Aenderung zurueck, leeren loescht die Notiz. Und sie steht nicht mehr doppelt da. Die dritte Zeile unter der Buchung zeigte dieselbe Notiz wie die neue Spalte; sie faellt weg, der Verwendungszweck darueber bleibt. Co-Authored-By: Claude Opus 5 --- web/src/components/EditableText.jsx | 39 +++++++++++++++++++++++++++++ web/src/finance.css | 13 ++-------- web/src/locales/de.json | 1 + web/src/locales/en.json | 1 + web/src/pages/Transactions.jsx | 29 ++++++++++++--------- 5 files changed, 60 insertions(+), 23 deletions(-) create mode 100644 web/src/components/EditableText.jsx diff --git a/web/src/components/EditableText.jsx b/web/src/components/EditableText.jsx new file mode 100644 index 0000000..ab1611a --- /dev/null +++ b/web/src/components/EditableText.jsx @@ -0,0 +1,39 @@ +import { useEffect, useState } from "react"; + +// Kleines, editierbares Textfeld. Speichert beim Verlassen und bei Enter, aber +// nur wenn sich etwas geändert hat – wie EditableAmount daneben, nur ohne die +// Betragsrechnerei. Escape nimmt die Änderung zurück. +export default function EditableText({ value, onSave, placeholder, maxLength }) { + const [val, setVal] = useState(value || ""); + // Von aussen neu geladen (etwa nach dem Speichern): Stand übernehmen. + useEffect(() => { setVal(value || ""); }, [value]); + + function commit() { + const neu = val.trim(); + if (neu !== (value || "")) onSave(neu); + } + + return ( + setVal(e.target.value)} + onBlur={commit} + onKeyDown={(e) => { + if (e.key === "Enter") { + e.preventDefault(); + commit(); + e.target.blur(); + } + if (e.key === "Escape") { + setVal(value || ""); + e.target.blur(); + } + }} + /> + ); +} diff --git a/web/src/finance.css b/web/src/finance.css index 125d20b..eae5f87 100644 --- a/web/src/finance.css +++ b/web/src/finance.css @@ -781,7 +781,8 @@ tr.row-dup { schrumpfen (globale .table td select/input-Regel überschreiben). */ .datatable td select, .datatable td input[inputmode], -.datatable td input[type="text"] { max-width: none; width: 100%; } +.datatable td input[type="text"] { max-width: none; width: 100%; + margin-top: 0; padding: 5px 8px; } .datatable td .catsel { width: 100%; } /* ---------- Kategorie-Auswahl (auf-/zuklappbarer Baum, Ersatz für