Layouts
Layout elements in the UI Schema contain other UI Schema elements like controls or other layouts and serve the purpose of defining the layout of those, e.g. a layout could arrange all its contained UI Schema Elements into a horizontal alignment.
elements
All layouts need to declare an elements
property which contains the children which are to be arranged by the layout.
It is expected to be an array of UI Schema elements, e.g. controls or other layouts.
type
By default, JSON Forms supports four different kinds of layouts: VerticalLayout
and HorizontalLayout
, a slightly modified version of the vertical layout called Group
as well Categorization
, which is often used to bundle related data, for instance by means of Tabs.
Those four core layouts are detailed in the following.
HorizontalLayout
APIHorizontal layouts use the HorizontalLayout
type and arranges its contained elements
in a horizontal fashion.
Each child occupies the same amount of space, i.e. for n children a child occupies 1/n space.
{
"type": "HorizontalLayout",
"elements": [
{
"type": "Control",
"label": "Name",
"scope": "#/properties/name"
},
{
"type": "Control",
"label": "Birth Date",
"scope": "#/properties/birthDate"
}
]
}
VerticalLayout
APIVertical Layouts use the VerticalLayout
type and arranges its elements
in a vertical fashion, i.e. all elements are placed beneath each other.
{
"type": "VerticalLayout",
"elements": [
{
"type": "Control",
"label": "Name",
"scope": "#/properties/name"
},
{
"type": "Control",
"label": "Birth Date",
"scope": "#/properties/birthDate"
}
]
}
Group
APIGroups are very similar to VerticalLayout
s but feature an additional mandatory label
property
that is used to describe the elements
.
label
The label property defines an additional string that is used to describe the elements of the Group.
{
"type": "Group",
"label": "My Group",
"elements": [
{
"type": "Control",
"label": "Name",
"scope": "#/properties/name"
},
{
"type": "Control",
"label": "Birth Date",
"scope": "#/properties/birthDate"
}
]
}
Categorization
APICategorization uses the Categorization
type and can only contain elements
of type Category
. A Category
itself acts as a container and has an elements
of its own as well as a label
that describes the contained data.
Categorizations are typically used to structure controls with related data, e.g. 'Personal Data' and 'Dietary requirements' as demonstrated in example below.
{
"type": "Categorization",
"elements": [
{
"type": "Category",
"label": "Personal Data",
"elements": [
{
"type": "Control",
"scope": "#/properties/firstName"
},
{
"type": "Control",
"scope": "#/properties/lastName"
},
{
"type": "Control",
"scope": "#/properties/age"
},
{
"type": "Control",
"scope": "#/properties/height"
},
{
"type": "Control",
"scope": "#/properties/dateOfBirth"
}
]
},
{
"type": "Category",
"label": "Dietary requirements",
"elements": [
{
"type": "Control",
"scope": "#/properties/diet"
},
{
"type": "Control",
"scope": "allergicToPeanuts"
}
]
}
]
}
In the example above note how each child within the elements is of type Category.
Demo