Material-UI Controls API
Github repo: https://github.com/concrete-form/mui
Controls
<Input />
an input of any type (text, number, password...). (text by default)
Render:<TextField />
Name | Type | Required | Default | Description | |
---|---|---|---|---|---|
name | string | Name of the control, forwarded to the form library | |||
fieldProps | object | Forwarded to the form library when registering the field (if available) | |||
{...props} | object | Forwarded to <TextField /> component |
Example
import Form from '@concrete-form/react-hook-form'
import Input from '@concrete-form/mui/Input'
const Demo = () => (
<Form>
<Input name="demo" label="I'm an input" />
</Form>
)
<Autocomplete />
a select control that can be filtered by typing
Render:<Autocomplete />
Name | Type | Required | Default | Description | |
---|---|---|---|---|---|
name | string | Name of the control, forwarded to the form library | |||
fieldProps | object | Forwarded to the form library when registering the field (if available) | |||
textFieldProps | object | Forwarded to <TextField /> inner component. | |||
{...props} | object | Forwarded to <Autocomplete /> component. |
Options format
Check Material-UI doc for options format.
Example
import Form from '@concrete-form/react-hook-form'
import Autocomplete from '@concrete-form/mui/Autocomplete'
const Demo = () => (
<Form>
<Autocomplete
name="demo"
options={[ 'foo', 'bar', 'baz' ]}
textFieldProps={{ label: 'I\'m an autocomplete field' }}
/>
</Form>
)
<DateTime />
a date, time or datetime picker. This control handles a date object.
Render:<DatePicker />
,<TimePicker />
, or<DateTimePicker />
,
Don't forget to install @mui/x-date-pickers
and to follow the setup instructions provided by Material-UI in order to use the Pickers components.
Name | Type | Required | Default | Description | |
---|---|---|---|---|---|
name | string | Name of the control, forwarded to the form library | |||
fieldProps | object | Forwarded to the form library when registering the field (if available) | |||
type | "date" | "date" | Type of input to render | ||
{...props} | object | Forwarded to <DatePicker /> , <TimePicker /> or <DateTimePicker /> component.(depending on type value) |
Example
import Form from '@concrete-form/react-hook-form'
import DateTime from '@concrete-form/mui/DateTime'
const Demo = () => (
<Form>
date: <DateTime name="date" type="date" />
time: <DateTime name="time" type="time" />
datetime: <DateTime name="datetime" type="datetime" />
</Form>
)
<FileInput />
a file(s) upload control
Render:<TextField type="file" />
At the moment, Material-UI doesn't have a proper File input component. They have a dropzone feature on their roadmap and we might implement a third party library in the future to offer a better experience.
Name | Type | Required | Default | Description | |
---|---|---|---|---|---|
name | string | Name of the control, forwarded to the form library | |||
fieldProps | object | Forwarded to the form library when registering the field (if available) | |||
{...props} | object | Forwarded to <TextField /> component |
Example
import Form from '@concrete-form/react-hook-form'
import FileInput from '@concrete-form/mui/FileInput'
const Demo = () => (
<Form>
<FileInput name="demo" />
</Form>
)
<Select />
a select that handles single or multiple values
Render:<TextField select />
Name | Type | Required | Default | Description | |
---|---|---|---|---|---|
name | string | Name of the control, forwarded to the form library | |||
fieldProps | object | Forwarded to the form library when registering the field (if available) | |||
options | object | Options to render in the select* | |||
allowEmpty | boolean | false | if set to true , an empty option will be rendered on top. | ||
children | node | An alternative to options . You can render your own children. | |||
textFieldProps | object | Forwarded to <TextField /> outer component. | |||
{...props} | object | Forwarded to <TextField SelectProps={...} /> property |
*Options format
See controls options for full options specs.
- Options props are forwarded to
<option />
or<MenuItem />
elements. (depending onnative
value.) - Group props are forwarded to
<optgroup />
or<ListSubheader />
elements. (depending onnative
value.)
Example
import Form from '@concrete-form/react-hook-form'
import Select from '@concrete-form/mui/Select'
const Demo = () => (
<Form>
Single select :
<Select name="select1" options={['foo', 'bar', 'baz', 'biz']} />
Multiple select :
<Select name="select2" options={['foo', 'bar', 'baz', 'biz']} multiple />
Native select :
<Select name="select3" native options={[
{ label: 'First option', value: 'foo' },
'bar',
{ label: 'Third option', value: 'baz', props: { disabled: true } },
]} />
Groups (allowEmpty) :
<Select name="select4" allowEmpty options={[
'foo',
{ group: 'Group 1', options: ['bar', 'baz'] }
]} />
Childrens (native + allowEmpty) :
<Select name="select5" native allowEmpty>
<option value="foo">Foo</option>
<option value="bar">Bar</option>
<option value="baz">Baz</option>
</Select>
</Form>
)
<SingleCheckbox />
a single checkbox that is similar to a toggle switch. Perfect for terms and conditions. This control handles
boolean
values.
Render:<Checkbox />
Great article about Checkbox vs Toggle Switch
Name | Type | Required | Default | Description | |
---|---|---|---|---|---|
name | string | Name of the control, forwarded to the form library | |||
fieldProps | object | Forwarded to the form library when registering the field (if available) | |||
label | node | Label of the checkbox | |||
labelPosition | "top" | "right" | Position of the label | ||
formControlProps | object | Forwarded to <FormControl /> wrapper | |||
{...props} | object | Forwarded to <Checkbox /> component |
Example
import Form from '@concrete-form/react-hook-form'
import SingleCheckbox from '@concrete-form/mui/SingleCheckbox'
const Demo = () => (
<Form>
<SingleCheckbox name="demo" label={(
<>I accept the <a href="#void">terms and conditions</a>.</>
)} />
</Form>
)
<Slider />
a slider to select a number within a range
Render:<Slider />
Name | Type | Required | Default | Description | |
---|---|---|---|---|---|
name | string | Name of the control, forwarded to the form library | |||
fieldProps | object | Forwarded to the form library when registering the field (if available) | |||
label | string | Label | |||
labelPosition | "top" | "top" | Position of the label | ||
orientation | "horizontal" | "horizontal" | Orientation of the slider (Material-UI Prop) | ||
height | number | Height of the slider in pixels. Required when orientation is set to vertical | |||
formControlProps | object | Forwarded to <FormControl /> wrapper | |||
{...props} | object | Forwarded to <Slider /> component |
Example
import Form from '@concrete-form/react-hook-form'
import Slider from '@concrete-form/mui/Slider'
const Demo = () => (
<Form>
<Slider name="demo" min={10} max={90} label="Label of the slider" />
</Form>
)
<Textarea />
a text input on multiple lines
Render:<Textfield multiple />
Name | Type | Required | Default | Description | |
---|---|---|---|---|---|
name | string | Name of the control, forwarded to the form library | |||
fieldProps | object | Forwarded to the form library when registering the field (if available) | |||
minRows | number | string | 2 | Material-UI minRows property defaulted to 2. | ||
{...props} | object | Forwarded to <TextField /> component |
Example
import Form from '@concrete-form/react-hook-form'
import Textarea from '@concrete-form/mui/Textarea'
const Demo = () => (
<Form>
<Textarea name="demo" label="I'm a textarea" />
</Form>
)
<ToggleSwitch />
a
boolean
control that can be toggled on or off
Render:<Switch />
Great article about Checkbox vs Toggle Switch
Name | Type | Required | Default | Description | |
---|---|---|---|---|---|
name | string | Name of the control, forwarded to the form library | |||
fieldProps | object | Forwarded to the form library when registering the field (if available) | |||
label | node | Label | |||
labelPosition | "top" | "right" | Position of the label | ||
formControlProps | object | Forwarded to <FormControl /> wrapper | |||
{...props} | object | Forwarded to <Switch /> component |
Example
import Form from '@concrete-form/react-hook-form'
import ToggleSwitch from '@concrete-form/mui/ToggleSwitch'
const Demo = () => (
<Form>
<ToggleSwitch name="demo" label="I'm a toggle switch" />
<ToggleSwitch name="disabled" disabled label="I'm a disabled toggle switch" />
<ToggleSwitch name="disabled-active" disabled label="I'm a disabled + active toggle switch" />
</Form>
)
}
Control Groups
<CheckboxGroup />
a group of checkboxes
Render multiple:<Checkbox />
Name | Type | Required | Default | Description | |
---|---|---|---|---|---|
name | string | Name of the control, forwarded to the form library | |||
fieldProps | object | Forwarded to the form library when registering the field (if available) | |||
options | object | Options to render* | |||
orientation | "vertical" | "vertical" | Orientation of the checkboxes | ||
labelPosition | "top" | "right" | Position of each label | ||
formControlProps | object | Forwarded to <FormControl /> wrapper | |||
{...props} | object | Forwarded to each <Checkbox /> components |
*Options format
See controls options for full options specs.
- Options props are forwarded to
<Checkbox />
component. - Options groups are not supported.
Example
import Form from '@concrete-form/react-hook-form'
import CheckboxGroup from '@concrete-form/mui/CheckboxGroup'
const Demo = () => (
<Form>
Vertical :
<CheckboxGroup name="demo-vertical" options={['foo', 'bar', 'baz']} />
<br /> Horizontal :
<CheckboxGroup name="demo-horizontal" orientation="horizontal" options={[
{ label: <span style={{ color: 'deeppink' }}>Foo</span>, value: 'foo' },
'bar',
{ label: 'baz', value: 'baz', props: { disabled: true } },
]} />
</Form>
)
<RadioGroup />
a group of radio buttons
Render multiple:<Radio />
Name | Type | Required | Default | Description | |
---|---|---|---|---|---|
name | string | Name of the control, forwarded to the form library | |||
fieldProps | object | Forwarded to the form library when registering the field (if available) | |||
options | object | Options to render* | |||
orientation | "vertical" | "vertical" | Orientation of the checkboxes | ||
labelPosition | "top" | "right" | Position of each label | ||
formControlProps | object | Forwarded to <FormControl /> wrapper | |||
{...props} | object | Forwarded to each <Radio /> components |
*Options format
See controls options for full options specs.
- Options props are forwarded to
<Radio />
component. - Options groups are not supported.
Example
import Form from '@concrete-form/react-hook-form'
import RadioGroup from '@concrete-form/mui/RadioGroup'
const Demo = () => (
<Form>
Vertical :
<RadioGroup name="demo-vertical" options={['foo', 'bar', 'baz']} />
<br /> Horizontal :
<RadioGroup name="demo-horizontal" orientation="horizontal" options={[
{ label: <span style={{ color: 'deeppink' }}>Foo</span>, value: 'foo' },
'bar',
{ label: 'baz', value: 'baz', props: { disabled: true } },
]} />
</Form>
)
Form Controls
<SubmitButton />
a submit button that displays a loading indicator while the form is submitting
Render<Button type="submit" />
When submitting, this button will always be disabled. disableWhileSubmitting
has no effect on this control. If the form contains errors, the button is also disabled.
Name | Type | Required | Default | Description | |
---|---|---|---|---|---|
displayLoading | boolean | true | If true , a loading indicator is added to the label.see loadingComponent below to customize what is appended. | ||
loadingComponent | node | <CircularProgress /> | Loading indicator to append to the label when the form is submitting. (default: <CircularProgress /> ) | ||
alternateLoadingContent | node | If provided, this replaces the whole label of the button when submitting. | |||
color | string | "primary" | Material-UI color property defaulted to "primary". | ||
variant | string | "contained" | Material-UI variant property defaulted to "contained". | ||
children | node | Content of the <Button /> | |||
{...props} | object | Forwarded to <Button /> component |
Example
import Form from '@concrete-form/react-hook-form'
import SubmitButton from '@concrete-form/mui/SubmitButton'
const wait = delay => new Promise(resolve => setTimeout(resolve, delay))
const Demo = () => (
<Form onSubmit={() => wait(3000)}>
<SubmitButton>Submit</SubmitButton>
</Form>
)
Layout
<LabelledControl />
a wrapper that helps you create a 2 columns form
Render:<Grid />
components for the columns
By default, both columns are the same size (width 50%). On small devices, they are rendered vertically (width 100%).
Name | Type | Required | Default | Description | |
---|---|---|---|---|---|
label | string | Label | |||
labelPosition | top | top | Position of the label | ||
children | node | Control to render | |||
mainGridProps | object | Forwarded to the main <Grid container /> component | |||
labelGridProps | object | Forwarded to the label <Grid item /> component | |||
controlGridProps | object | Forwarded to the control <Grid item /> component |
Example
import Form from '@concrete-form/react-hook-form'
import LabelledControl from '@concrete-form/mui/LabelledControl'
import Input from '@concrete-form/mui/Input'
import RadioGroup from '@concrete-form/mui/RadioGroup'
import SingleCheckbox from '@concrete-form/mui/SingleCheckbox'
const Demo = () => (
<Form>
<LabelledControl label="Label linked to the control" labelPosition="left">
<Input name="demo-single" />
</LabelledControl>
<LabelledControl label="Label NOT linked to the controls group" labelPosition="left">
<RadioGroup name="demo-group" options={['foo', 'bar', 'baz']} />
</LabelledControl>
<LabelledControl label="Label NOT linked to boolean controls" labelPosition="left">
<SingleCheckbox name="demo-bool" label="THIS is the real label" />
</LabelledControl>
</Form>
)