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:
104
admin/tests/fixtures/settings.json
vendored
Normal file
104
admin/tests/fixtures/settings.json
vendored
Normal file
@@ -0,0 +1,104 @@
|
||||
{
|
||||
"list": {
|
||||
"data": [
|
||||
{
|
||||
"code": "search",
|
||||
"label": "Search",
|
||||
"description": "Search engine options",
|
||||
"icon": "search",
|
||||
"category": "System",
|
||||
"keywords": [],
|
||||
"model": "Acme\\Demo\\Models\\Settings",
|
||||
"order": 20
|
||||
},
|
||||
{
|
||||
"code": "mail",
|
||||
"label": "Mail",
|
||||
"description": "Outgoing mail",
|
||||
"icon": "icon-cog",
|
||||
"category": "System",
|
||||
"keywords": [],
|
||||
"model": "Acme\\Demo\\Models\\MailSettings",
|
||||
"order": 10
|
||||
},
|
||||
{
|
||||
"code": "branding",
|
||||
"label": "Branding",
|
||||
"description": "Logo and colours",
|
||||
"icon": "palette",
|
||||
"category": "Appearance",
|
||||
"keywords": [],
|
||||
"model": "Acme\\Demo\\Models\\Branding",
|
||||
"order": 5
|
||||
}
|
||||
],
|
||||
"meta": {
|
||||
"locale": "en"
|
||||
}
|
||||
},
|
||||
"schema": {
|
||||
"data": {
|
||||
"name": "Search",
|
||||
"fields": [
|
||||
{
|
||||
"name": "use_engine",
|
||||
"label": "Use the search engine",
|
||||
"type": "switch",
|
||||
"default": 0,
|
||||
"comment": "Queries go to the external engine",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"name": "engine_host",
|
||||
"label": "Engine host",
|
||||
"type": "text",
|
||||
"span": "full"
|
||||
}
|
||||
],
|
||||
"messages": {
|
||||
"create": {
|
||||
"other": "New record"
|
||||
},
|
||||
"update": {
|
||||
"other": "Edit record"
|
||||
},
|
||||
"saved": {
|
||||
"other": "Saved"
|
||||
},
|
||||
"deleteConfirm": {
|
||||
"other": "Delete?"
|
||||
},
|
||||
"deleted": {
|
||||
"other": "Deleted"
|
||||
}
|
||||
},
|
||||
"meta": {
|
||||
"locale": "en"
|
||||
},
|
||||
"redirects": {
|
||||
"create": {
|
||||
"redirect": "",
|
||||
"redirectClose": ""
|
||||
},
|
||||
"update": {
|
||||
"redirect": "",
|
||||
"redirectClose": ""
|
||||
},
|
||||
"default": ""
|
||||
}
|
||||
},
|
||||
"meta": {
|
||||
"locale": "en"
|
||||
}
|
||||
},
|
||||
"values": {
|
||||
"data": {
|
||||
"data": {
|
||||
"use_engine": 0,
|
||||
"engine_host": "search.local"
|
||||
},
|
||||
"exists": true
|
||||
},
|
||||
"meta": {}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user