feat: Nur die Waehrungen zeigen, die man braucht – und auf dem Telefon lesbar

Drei Sachen, die beim Benutzen aufgefallen sind.

ANGEBOTENE WAEHRUNGEN. In den Einstellungen steht jetzt, welche Waehrungen in
den Auswahlfeldern erscheinen (Vorgabe EUR, CHF, USD). Dass dreissig
unterstuetzt werden, ist gut; dreissig Zeilen in einem Feld zu sehen, wenn man
drei davon braucht, ist es nicht.

Die Einstellung beschraenkt nur die ANZEIGE. Gueltig bleibt alles mit
EZB-Kurs, und die gerade gesetzte Waehrung steht IMMER im Feld – sonst stuende
ein Konto in Dollar vor einem Feld ohne Dollar und wechselte beim naechsten
Speichern stillschweigend die Waehrung. Der Saldo waere danach still falsch.
Die Hauptwaehrung laesst sich nicht abwaehlen.

ZEICHEN STATT KUERZEL, wo es hilft: "€ EUR", "$ USD", "£ GBP". CHF steht
bewusst ohne: "Fr." ist weniger gelaeufig als CHF selbst. Mehrfach belegte
Zeichen bleiben ebenfalls draussen – "US$" von "CA$" zu unterscheiden ist
Raetselraten.

AUF DEM TELEFON. Die Vertragszeile quetschte vier Spalten in 375 Pixel; vom
Namen blieb "Sal..." uebrig und von der Kategorie ein Punkt. Sie ist jetzt ein
Gitter: Unter 620 Pixel rutscht der Betrag unter den Namen, die Knoepfe
bleiben rechts. Der Name bekommt die volle Breite – auf dem Telefon ist er das
Einzige, woran man die Zeile erkennt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-09-07 16:16:45 +02:00
co-authored by Claude Opus 5
parent f99be47587
commit 0a790fd45a
11 changed files with 229 additions and 23 deletions
+66 -1
View File
@@ -1,4 +1,4 @@
// Welche Währungen die Oberfläche anbietet.
// Welche Währungen die Oberfläche kennt – und wie sie geschrieben werden.
//
// Muss zur Erlaubnisliste des Servers passen (backend/app/waehrungen.py):
// genau die Währungen, für die es einen EZB-Referenzkurs gibt. Ohne Kurs
@@ -15,3 +15,68 @@ const REST = [
];
export const WAEHRUNGEN = [...VORNE, ...REST];
// Zeichen, wo es eines gibt, das kürzer und eindeutiger ist als das Kürzel.
// CHF steht bewusst NICHT drin: "Fr." ist weniger geläufig als CHF selbst,
// und ein Zeichen, das niemand liest, hilft niemandem. Mehrfach belegte
// Zeichen ($, kr) bleiben ebenfalls draussen – dort ist das Kürzel die
// klarere Angabe, und "US$" neben "CA$" zu unterscheiden ist Rätselraten.
const ZEICHEN = {
EUR: "€",
USD: "$",
GBP: "£",
JPY: "¥",
CNY: "¥",
ILS: "₪",
INR: "₹",
KRW: "₩",
PHP: "₱",
THB: "฿",
TRY: "₺",
PLN: "zł",
BRL: "R$",
};
/** Wie eine Währung in Listen und Auswahlfeldern steht. */
export function waehrungLabel(code) {
const zeichen = ZEICHEN[code];
return zeichen ? `${zeichen} ${code}` : code;
}
/** Nur das Zeichen, wo es eines gibt – sonst das Kürzel. */
export function waehrungZeichen(code) {
return ZEICHEN[code] || code;
}
// Was ohne eigene Einstellung angeboten wird. Der Rest bleibt erreichbar,
// muss aber erst eingeschaltet werden: Dreissig Zeilen in einem Auswahlfeld
// sind kein Gewinn, wenn man drei davon braucht.
export const STANDARD_AKTIV = ["EUR", "CHF", "USD"];
/**
* Die Währungen, die ein Auswahlfeld zeigen soll.
*
* ``aktiv`` ist die Einstellung des Nutzers. ``dazu`` sind Werte, die trotzdem
* dabei sein müssen – allen voran der gerade gesetzte: Sonst stünde ein Konto
* in USD vor einem Feld ohne USD und wechselte beim nächsten Speichern
* stillschweigend die Währung.
*/
export function angeboteneWaehrungen(aktiv, ...dazu) {
const erlaubt = new Set(WAEHRUNGEN);
const gewaehlt = (aktiv && aktiv.length ? aktiv : STANDARD_AKTIV).filter((w) =>
erlaubt.has(w),
);
const menge = new Set(gewaehlt);
for (const w of dazu) if (w && erlaubt.has(w)) menge.add(w);
return WAEHRUNGEN.filter((w) => menge.has(w));
}
/** Die Einstellung als Liste – gespeichert wird sie als "EUR,CHF,USD". */
export function ausEinstellung(wert) {
if (!wert) return [...STANDARD_AKTIV];
const liste = wert
.split(",")
.map((s) => s.trim().toUpperCase())
.filter((s) => WAEHRUNGEN.includes(s));
return liste.length ? liste : [...STANDARD_AKTIV];
}