feat(10-03): tabs, toggles, relation fields, form lifecycle and settings pages

- FormTabs groups fields by tab (untabbed fields in the default tab) as a
  segmented tablist; a tab holding invalid fields after a 422 shows a
  count badge and the form switches to the first invalid field
- switch, checkbox and relation join the renderer registry: toggle cards
  (role=switch, 20px checkbox) keep a numeric value numeric; relation
  fields are read-only labels from meta.labels, a searchable single
  select over fields/{field}/options with emptyOption first, or ordered
  removable chips with an appending search (300 ms debounce, 20 per
  page, more on scroll or the more action)
- FormView gets the back button, record title and update subtitle, a
  sticky footer (Usuń with deleteConfirm then DELETE, Anuluj, Zapisz i
  zamknij to the mapped redirectClose, Zapisz), and asks before leaving a
  dirty form on any route change plus a beforeunload guard
- Settings: the rail pins Ustawienia to the bottom when /settings is
  non-empty; /settings lists pages by category; /settings/:code renders
  the settings schema through FormGrid and the registry, PUTs the values
  and maps a 422 like the record form
- New backend::lang keys (form.more_options, tab_default, discard,
  settings.back); form and settings smoke tests; boardwalk/dist rebuilt
This commit is contained in:
Jakub Zych
2026-09-27 17:00:18 +02:00
parent 8b5f85603f
commit 8f32416f4f
30 changed files with 1898 additions and 58 deletions

View File

@@ -45,6 +45,9 @@
"backend::lang.form.deleting": {
"other": "Usuwanie…"
},
"backend::lang.form.discard": {
"other": "Porzuć zmiany"
},
"backend::lang.form.error_fields": {
"one": "Popraw :count pole oznaczone poniżej.",
"few": "Popraw :count pola oznaczone poniżej.",
@@ -63,6 +66,9 @@
"backend::lang.form.loading_options": {
"other": "Wczytywanie…"
},
"backend::lang.form.more_options": {
"other": "Więcej wyników"
},
"backend::lang.form.no_options": {
"other": "Brak wyników"
},
@@ -87,6 +93,9 @@
"backend::lang.form.select_placeholder": {
"other": "Wybierz…"
},
"backend::lang.form.tab_default": {
"other": "Podstawowe"
},
"backend::lang.form.tab_errors": {
"one": ":count błąd",
"few": ":count błędy",
@@ -309,6 +318,9 @@
"backend::lang.relation.unlink": {
"other": "Odłącz"
},
"backend::lang.settings.back": {
"other": "Wróć do ustawień"
},
"backend::lang.settings.empty": {
"other": "Brak dostępnych ustawień."
},