refactor(ui): validation as errors on attempt, help text behind the ? (#1561)

The founder flagged the app as bloated with standing instructional text.

Ny verifikation: the what's-missing lines (Ange en beskrivning, Minst
två rader...) rendered from the first frame because their only gate was
form validity, which an empty form fails: instructions dressed as
validation. The submit buttons now stay enabled and an attempt on an
incomplete form is what surfaces the lines, in destructive red, per the
error-on-submit idiom. The Enter-to-advance flow keeps the old
completeness predicate so navigation is untouched.

Matcha mot befintlig verifikation: the two-sentence explainer moved
behind a ? (HelpPopover, convention 7), the N:1 note tightened, the
Visa även matchade switch became a quiet link (switches are settings
idiom), and Stark träff, the normal auto-selected case, renders as
muted text instead of a chip (chips mark exceptions, convention 5).

Deleted always-visible paraphrase lines and their orphaned keys:
items_card_description, picker_description, references_subtitle,
sort_stack_hint, dimensions hints, document_help, and the dead
fill_balance_hint key that had no render site at all.

Co-authored-by: Jakob Wennberg <311770904+jakobwennberg-oss@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Jakob Wennberg
2026-08-13 11:20:00 +02:00
committed by GitHub
co-authored by Jakob Wennberg Claude Fable 5
parent 1e9f245f7c
commit abff8d90f6
10 changed files with 95 additions and 77 deletions
-9
View File
@@ -3370,7 +3370,6 @@
"row_menu_remove_account": "Remove posting account",
"row_menu_set_dimensions": "Set cost centre/project",
"row_menu_remove_dimensions": "Remove cost centre/project",
"dimensions_default_hint": "Cost centre/project applies to all rows without their own tagging.",
"row_dimensions_inherit_hint": "Empty fields inherit the invoice default ({dims}).",
"revenue_account_label": "Posting account",
"revenue_account_hint": "Leave blank to derive the sales account from the VAT rate. You may select an active balance-sheet or revenue account in class 1-3. Ignored for reverse charge and export.",
@@ -3409,7 +3408,6 @@
"load_customers_failed_title": "Could not load customers",
"load_customers_failed_description": "Check your connection and try again.",
"items_card_title": "Invoice lines",
"items_card_description": "Add products or services",
"more_references": "References & more",
"description_label": "Description",
"description_placeholder": "E.g. Instagram campaign",
@@ -4106,7 +4104,6 @@
"payment_reference_label": "OCR / Payment reference",
"payment_reference_placeholder": "OCR-nummer",
"document_label": "Invoice document",
"document_help": "Attach the supplier's PDF or an image. The document is stored with the invoice and automatically attached to the verifikation.",
"document_upload_in_progress_title": "The document is still uploading",
"document_upload_in_progress_description": "Wait for the upload to finish before registering the invoice.",
"document_upload_failed_title": "The document could not be uploaded",
@@ -4137,7 +4134,6 @@
"row_dimensions_aria": "Cost centre/project for row {index}",
"row_dimensions_title": "Cost centre/project",
"row_dimensions_inherit_hint": "Empty fields inherit the invoice default ({dims}).",
"dimensions_default_hint": "Cost centre/project applies to all rows without their own tagging.",
"ai_totals_label": "From invoice (AI):",
"ai_net": "Net {amount}",
"ai_vat": "VAT {amount}",
@@ -4452,7 +4448,6 @@
"sort_description_asc": "Description, A to Z",
"sort_description_desc": "Description, Z to A",
"sort_by": "Sort by {column}",
"sort_stack_hint": "Tip: Shift-click a column header to add it as a secondary sort.",
"date_from_placeholder": "From YYYY-MM-DD",
"date_to_placeholder": "To YYYY-MM-DD",
"filter": "Filter",
@@ -4600,7 +4595,6 @@
"replace_failed": "Could not upload new version.",
"choose_from_inbox": "Choose from inbox",
"picker_title": "Choose a document from the inbox",
"picker_description": "Documents received by email or upload that haven't been used yet.",
"picker_search_placeholder": "Search supplier or file name…",
"picker_results": "{count}",
"picker_empty": "No unused documents in the inbox.",
@@ -4704,7 +4698,6 @@
"no_attachments": "No documents attached",
"references_count": "{count, plural, one {# reference} other {# references}}",
"references_title": "Linked supporting documents",
"references_subtitle": "Reference to the invoice that identifies the transaction, part of the audit trail.",
"reference_invoice": "Customer invoice {number}",
"reference_supplier_invoice": "Supplier invoice {number}",
"currency_title": "Currency conversion",
@@ -4817,12 +4810,10 @@
"toast_draft_missing_docs_description": "The draft was saved, but {count} document(s) could not be attached: {files}. Open the draft to attach them again.",
"toast_open_entry": "Open the entry",
"fill_balance_tooltip": "Double-click to fill the balancing amount",
"fill_balance_hint": "Tip: double-click debit or credit to fill the remaining difference.",
"keyboard_hint": "Enter jumps to the next field: once the entry balances, Enter opens the review.",
"review_month_changed": "Note: different month than the previous voucher ({prev} → {current}).",
"review_period_locked": "This period is closed or locked: posting may be rejected.",
"add_dimensions": "Cost centre/Project",
"dimensions_apply_all_hint": "Applies to all rows without their own tag.",
"row_dimensions_aria": "Cost centre/project for this row"
},
"chart_of_accounts": {
-9
View File
@@ -3370,7 +3370,6 @@
"row_menu_remove_account": "Ta bort bokföringskonto",
"row_menu_set_dimensions": "Ange kostnadsställe/projekt",
"row_menu_remove_dimensions": "Ta bort kostnadsställe/projekt",
"dimensions_default_hint": "Kostnadsställe/projekt gäller alla rader utan egen märkning.",
"row_dimensions_inherit_hint": "Tomma fält ärver fakturans standard ({dims}).",
"revenue_account_label": "Bokföringskonto",
"revenue_account_hint": "Lämna tomt för att härleda försäljningskontot från momssatsen. Du kan välja ett aktivt balans- eller intäktskonto i klass 1-3. Ignoreras för omvänd skattskyldighet och export.",
@@ -3409,7 +3408,6 @@
"load_customers_failed_title": "Kunde inte ladda kunder",
"load_customers_failed_description": "Kontrollera din anslutning och försök igen.",
"items_card_title": "Fakturarader",
"items_card_description": "Lägg till produkter eller tjänster",
"more_references": "Referenser & mer",
"description_label": "Beskrivning",
"description_placeholder": "T.ex. Instagram-kampanj",
@@ -4106,7 +4104,6 @@
"payment_reference_label": "OCR / Betalningsreferens",
"payment_reference_placeholder": "OCR-nummer",
"document_label": "Fakturaunderlag",
"document_help": "Bifoga leverantörens PDF eller en bild. Underlaget sparas med fakturan och kopplas automatiskt till verifikationen.",
"document_upload_in_progress_title": "Underlaget laddas fortfarande upp",
"document_upload_in_progress_description": "Vänta tills uppladdningen är klar innan du registrerar fakturan.",
"document_upload_failed_title": "Underlaget kunde inte laddas upp",
@@ -4137,7 +4134,6 @@
"row_dimensions_aria": "Kostnadsställe/Projekt för rad {index}",
"row_dimensions_title": "Kostnadsställe/Projekt",
"row_dimensions_inherit_hint": "Tomma fält ärver fakturans standard ({dims}).",
"dimensions_default_hint": "Kostnadsställe/projekt gäller alla rader utan egen märkning.",
"ai_totals_label": "Från fakturan (AI):",
"ai_net": "Netto {amount}",
"ai_vat": "Moms {amount}",
@@ -4452,7 +4448,6 @@
"sort_description_asc": "Beskrivning, A till Ö",
"sort_description_desc": "Beskrivning, Ö till A",
"sort_by": "Sortera efter {column}",
"sort_stack_hint": "Tips: Shift-klicka på en kolumnrubrik för att lägga till den som sekundär sortering.",
"date_from_placeholder": "Från YYYY-MM-DD",
"date_to_placeholder": "Till YYYY-MM-DD",
"filter": "Filtrera",
@@ -4600,7 +4595,6 @@
"replace_failed": "Kunde inte ladda upp ny version.",
"choose_from_inbox": "Välj från inkorgen",
"picker_title": "Välj underlag från inkorgen",
"picker_description": "Underlag som kommit in via e-post eller uppladdning och ännu inte använts.",
"picker_search_placeholder": "Sök leverantör eller filnamn…",
"picker_results": "{count} st",
"picker_empty": "Inga oanvända underlag i inkorgen.",
@@ -4704,7 +4698,6 @@
"no_attachments": "Inga underlag bifogade",
"references_count": "{count, plural, one {# hänvisning} other {# hänvisningar}}",
"references_title": "Kopplat underlag",
"references_subtitle": "Hänvisning till fakturan som identifierar affärshändelsen, del av verifieringskedjan.",
"reference_invoice": "Kundfaktura {number}",
"reference_supplier_invoice": "Leverantörsfaktura {number}",
"currency_title": "Valutaomräkning",
@@ -4817,12 +4810,10 @@
"toast_draft_missing_docs_description": "Utkastet sparades, men {count} underlag kunde inte bifogas: {files}. Öppna utkastet för att bifoga på nytt.",
"toast_open_entry": "Öppna verifikatet",
"fill_balance_tooltip": "Dubbelklicka för att fylla i balanserande belopp",
"fill_balance_hint": "Tips: dubbelklicka på debet eller kredit för att fylla i differensen.",
"keyboard_hint": "Enter hoppar till nästa fält: när verifikatet balanserar öppnar Enter granskningen.",
"review_month_changed": "Obs: annan månad än föregående verifikat ({prev} → {current}).",
"review_period_locked": "Perioden är stängd eller låst: bokföring kan nekas.",
"add_dimensions": "Kostnadsställe/Projekt",
"dimensions_apply_all_hint": "Gäller alla rader utan egen märkning.",
"row_dimensions_aria": "Kostnadsställe/Projekt för raden"
},
"chart_of_accounts": {