fix(costs): three-decimal currencies stay typable and refunds work on iOS (#2175, #2176)

The split and receipt fields rejected the third decimal a KWD or BHD amount seeds, on desktop and in the mobile sheet, which share the currency-aware guard now. Signed amounts get a sign toggle on the numeric input because the iOS decimal pad has no minus key, and the under/over hint no longer swaps direction for a negative total.
This commit is contained in:
Maurice
2026-09-02 19:00:49 +02:00
committed by Maurice
parent c907e0d5e5
commit 7c857173cf
29 changed files with 199 additions and 34 deletions
+1
View File
@@ -146,5 +146,6 @@ const budget: TranslationStrings = {
'costs.splitBalanced': 'التقسيم يطابق الإجمالي',
'costs.splitSumUnder': 'مجموع الحصص: {sum} من {total} (ناقص {diff})',
'costs.splitSumOver': 'مجموع الحصص: {sum} من {total} (زائد {diff})',
'costs.toggleSign': 'التبديل بين المصروف والاسترداد',
};
export default budget;
+1
View File
@@ -146,5 +146,6 @@ const budget: TranslationStrings = {
'costs.splitBalanced': 'A divisão bate com o total',
'costs.splitSumUnder': 'Soma das partes: {sum} de {total} (faltam {diff})',
'costs.splitSumOver': 'Soma das partes: {sum} de {total} (sobram {diff})',
'costs.toggleSign': 'Alternar entre despesa e reembolso',
};
export default budget;
+1
View File
@@ -146,6 +146,7 @@ const budget: TranslationStrings = {
'costs.splitBalanced': 'El repartiment quadra amb el total',
'costs.splitSumUnder': 'Suma de les parts: {sum} de {total} (en falten {diff})',
'costs.splitSumOver': 'Suma de les parts: {sum} de {total} ({diff} de més)',
'costs.toggleSign': 'Alterna entre despesa i devolució',
};
export default budget;
+1
View File
@@ -146,5 +146,6 @@ const budget: TranslationStrings = {
'costs.splitBalanced': 'Rozdělení sedí s celkem',
'costs.splitSumUnder': 'Součet podílů: {sum} z {total} (chybí {diff})',
'costs.splitSumOver': 'Součet podílů: {sum} z {total} (o {diff} více)',
'costs.toggleSign': 'Přepnout mezi výdajem a vratkou',
};
export default budget;
+1
View File
@@ -146,5 +146,6 @@ const budget: TranslationStrings = {
'costs.splitBalanced': 'Aufteilung passt zur Summe',
'costs.splitSumUnder': 'Summe der Anteile: {sum} von {total} (es fehlen {diff})',
'costs.splitSumOver': 'Summe der Anteile: {sum} von {total} ({diff} zu viel)',
'costs.toggleSign': 'Zwischen Ausgabe und Erstattung wechseln',
};
export default budget;
+1
View File
@@ -146,6 +146,7 @@ const budget: TranslationStrings = {
'costs.splitBalanced': 'Split matches total',
'costs.splitSumUnder': 'Sum of splits: {sum} of {total} (under by {diff})',
'costs.splitSumOver': 'Sum of splits: {sum} of {total} (over by {diff})',
'costs.toggleSign': 'Switch between expense and refund',
};
export default budget;
+1
View File
@@ -146,5 +146,6 @@ const budget: TranslationStrings = {
'costs.splitBalanced': 'El reparto cuadra con el total',
'costs.splitSumUnder': 'Suma de las partes: {sum} de {total} (faltan {diff})',
'costs.splitSumOver': 'Suma de las partes: {sum} de {total} (sobran {diff})',
'costs.toggleSign': 'Cambiar entre gasto y reembolso',
};
export default budget;
+1
View File
@@ -146,5 +146,6 @@ const budget: TranslationStrings = {
'costs.splitBalanced': 'La répartition correspond au total',
'costs.splitSumUnder': 'Somme des parts : {sum} sur {total} (il manque {diff})',
'costs.splitSumOver': 'Somme des parts : {sum} sur {total} ({diff} de trop)',
'costs.toggleSign': 'Basculer entre dépense et remboursement',
};
export default budget;
+1
View File
@@ -147,5 +147,6 @@ const budget: TranslationStrings = {
'costs.splitBalanced': 'Ο διαμοιρασμός ταιριάζει με το σύνολο',
'costs.splitSumUnder': 'Άθροισμα μεριδίων: {sum} από {total} (λείπουν {diff})',
'costs.splitSumOver': 'Άθροισμα μεριδίων: {sum} από {total} ({diff} παραπάνω)',
'costs.toggleSign': 'Εναλλαγή μεταξύ εξόδου και επιστροφής',
};
export default budget;
+1
View File
@@ -146,5 +146,6 @@ const budget: TranslationStrings = {
'costs.splitBalanced': 'A felosztás megegyezik a végösszeggel',
'costs.splitSumUnder': 'A részek összege: {sum} / {total} (hiányzik {diff})',
'costs.splitSumOver': 'A részek összege: {sum} / {total} ({diff} a többlet)',
'costs.toggleSign': 'Váltás kiadás és visszatérítés között',
};
export default budget;
+1
View File
@@ -146,5 +146,6 @@ const budget: TranslationStrings = {
'costs.splitBalanced': 'Pembagian sudah pas dengan total',
'costs.splitSumUnder': 'Jumlah bagian: {sum} dari {total} (kurang {diff})',
'costs.splitSumOver': 'Jumlah bagian: {sum} dari {total} (lebih {diff})',
'costs.toggleSign': 'Beralih antara pengeluaran dan pengembalian dana',
};
export default budget;
+1
View File
@@ -146,5 +146,6 @@ const budget: TranslationStrings = {
'costs.splitBalanced': 'La divisione corrisponde al totale',
'costs.splitSumUnder': 'Somma delle quote: {sum} di {total} (mancano {diff})',
'costs.splitSumOver': 'Somma delle quote: {sum} di {total} ({diff} in più)',
'costs.toggleSign': 'Passa da spesa a rimborso',
};
export default budget;
+1
View File
@@ -146,5 +146,6 @@ const budget: TranslationStrings = {
'costs.splitBalanced': '分割は合計と一致しています',
'costs.splitSumUnder': '分割の合計: {total} のうち {sum}({diff} 不足)',
'costs.splitSumOver': '分割の合計: {total} のうち {sum}({diff} 超過)',
'costs.toggleSign': '支出と返金を切り替える',
};
export default budget;
+1
View File
@@ -146,5 +146,6 @@ const budget: TranslationStrings = {
'costs.splitBalanced': '분할 금액이 합계와 일치합니다',
'costs.splitSumUnder': '분할 합계: {total} 중 {sum} ({diff} 부족)',
'costs.splitSumOver': '분할 합계: {total} 중 {sum} ({diff} 초과)',
'costs.toggleSign': '지출과 환불 전환',
};
export default budget;
+1
View File
@@ -146,5 +146,6 @@ const budget: TranslationStrings = {
'costs.splitBalanced': 'Verdeling klopt met het totaal',
'costs.splitSumUnder': 'Som van de delen: {sum} van {total} ({diff} te weinig)',
'costs.splitSumOver': 'Som van de delen: {sum} van {total} ({diff} te veel)',
'costs.toggleSign': 'Wisselen tussen uitgave en terugbetaling',
};
export default budget;
+1
View File
@@ -146,5 +146,6 @@ const budget: TranslationStrings = {
'costs.splitBalanced': 'Podział zgadza się z sumą',
'costs.splitSumUnder': 'Suma podziałów: {sum} z {total} (brakuje {diff})',
'costs.splitSumOver': 'Suma podziałów: {sum} z {total} (o {diff} za dużo)',
'costs.toggleSign': 'Przełącz między wydatkiem a zwrotem',
};
export default budget;
+1
View File
@@ -146,5 +146,6 @@ const budget: TranslationStrings = {
'costs.splitBalanced': 'Разделение совпадает с итогом',
'costs.splitSumUnder': 'Сумма долей: {sum} из {total} (не хватает {diff})',
'costs.splitSumOver': 'Сумма долей: {sum} из {total} (больше на {diff})',
'costs.toggleSign': 'Переключить между расходом и возвратом',
};
export default budget;
+1
View File
@@ -146,5 +146,6 @@ const budget: TranslationStrings = {
'costs.splitBalanced': 'Fördelningen stämmer med totalen',
'costs.splitSumUnder': 'Summan av delarna: {sum} av {total} ({diff} saknas)',
'costs.splitSumOver': 'Summan av delarna: {sum} av {total} ({diff} för mycket)',
'costs.toggleSign': 'Växla mellan utgift och återbetalning',
};
export default budget;
+1
View File
@@ -146,5 +146,6 @@ const budget: TranslationStrings = {
'costs.splitBalanced': 'Bölüşüm toplamla eşleşiyor',
'costs.splitSumUnder': 'Payların toplamı: {total} tutarın {sum} kadarı ({diff} eksik)',
'costs.splitSumOver': 'Payların toplamı: {total} tutarın {sum} kadarı ({diff} fazla)',
'costs.toggleSign': 'Gider ve iade arasında geçiş yap',
};
export default budget;
+1
View File
@@ -146,5 +146,6 @@ const budget: TranslationStrings = {
'costs.splitBalanced': 'Розподіл збігається із сумою',
'costs.splitSumUnder': 'Сума часток: {sum} з {total} (бракує {diff})',
'costs.splitSumOver': 'Сума часток: {sum} з {total} (більше на {diff})',
'costs.toggleSign': 'Перемкнути між витратою та поверненням',
};
export default budget;
+1
View File
@@ -146,6 +146,7 @@ const budget: TranslationStrings = {
'costs.splitBalanced': 'Phần chia khớp với tổng',
'costs.splitSumUnder': 'Tổng các phần: {sum} trên {total} (thiếu {diff})',
'costs.splitSumOver': 'Tổng các phần: {sum} trên {total} (thừa {diff})',
'costs.toggleSign': 'Chuyển giữa khoản chi và khoản hoàn',
};
export default budget;
+1
View File
@@ -145,5 +145,6 @@ const budget: TranslationStrings = {
'costs.splitBalanced': '分攤金額與總額相符',
'costs.splitSumUnder': '分攤合計:{total} 中的 {sum}(少 {diff})',
'costs.splitSumOver': '分攤合計:{total} 中的 {sum}(多 {diff})',
'costs.toggleSign': '在支出與退款之間切換',
};
export default budget;
+1
View File
@@ -145,5 +145,6 @@ const budget: TranslationStrings = {
'costs.splitBalanced': '分摊金额与总额相符',
'costs.splitSumUnder': '分摊合计:{total} 中的 {sum}(少 {diff})',
'costs.splitSumOver': '分摊合计:{total} 中的 {sum}(多 {diff})',
'costs.toggleSign': '在支出和退款之间切换',
};
export default budget;