feat: Schlagwörter je Kategorie + auf-/zuklappbares Kategorie-Dropdown

- Manuelle Schlagwörter je Kategorie (Popup mit Chips, Doppelklick zum Bearbeiten)
- Treffer über Empfänger ODER Verwendungszweck; längstes Schlagwort gewinnt;
  Kind-Filter (Ausgabe/Einnahme); wirken nur bei künftigen Importen
- Lernende Korrektur-Erkennung: ab 5 Anwendungen und >= 1/3 Korrekturen
  erscheint eine Prüf-Meldung in den Einstellungen (Behalten/Entfernen)
- Neue CategorySelect-Komponente (Baum + Suche, per Portal) ersetzt die
  nativen optgroup-Selects in Buchungen und Import-Prüfansicht
- Migration 0006 (source/applied_count/overridden_count/confirmed, match_field any)
- Endpunkte, i18n DE/EN, Tests (test_keywords: 7 neu, gesamt 27 grün)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Guido
2026-08-19 21:31:29 +02:00
co-authored by Claude Opus 4.8
parent f375fc5eaa
commit 37f64999cd
17 changed files with 1137 additions and 45 deletions
+14 -2
View File
@@ -79,7 +79,12 @@
"exportTxnJson": "Transactions (JSON)",
"exportAll": "All data (JSON)",
"dbBackup": "Download full DB backup",
"dbBackupHint": "Complete database of all users (admin only) — keep it for restore."
"dbBackupHint": "Complete database of all users (admin only) — keep it for restore.",
"keywordReview": "Review keywords",
"keywordReviewHint": "These keywords keep getting corrected away — maybe they no longer fit?",
"keywordCorrected": "{{overridden}} of {{applied}} transactions corrected",
"keep": "Keep",
"remove": "Remove"
},
"dashboard": {
"title": "Overview",
@@ -153,7 +158,14 @@
"expense": "Expense",
"emptyGroup": "No categories in this group.",
"deleteConfirm": "Delete this category?",
"deleteGroupConfirm": "Delete this group and all its categories?"
"deleteGroupConfirm": "Delete this group and all its categories?",
"keywordsBtn": "Keywords",
"keywordsTitle": "Keywords – {{name}}",
"keywordsHint": "Transactions whose payee or description contains one of these words are automatically assigned to this category on future imports.",
"keywordAdd": "Type a word and press Enter",
"keywordEmpty": "No keywords yet.",
"keywordEditHint": "Double-click a keyword to edit it.",
"searchPlaceholder": "Search category …"
},
"transactions": {
"title": "Transactions",