import { Field } from '@sky-uk/ui-core' ;
The Field component is used to decorate Text Input , Textarea and Select components with a label, message and validation.
Sub-components
Field.Label – label of the input element
Field.Control – input element
Field.Validation – error message of the input element
Field.Message – inline message of the input element
Control
Either a Text Input , Textarea or Select needs to be passed to the as prop of the Field.Control.
TextInput
Copy
< Field >
< Field.Label htmlFor = " my-input " > Label </ Field.Label >
< Field.Control as = { TextInput } value = " My Value " id = " my-input " aria-describedby = " message " />
< Field.Message id = " message " > Inline message providing addition context on the input field. </ Field.Message >
</ Field >
Textarea
Copy
< Field >
< Field.Label htmlFor = " my-input " > Label </ Field.Label >
< Field.Control as = { Textarea } value = " My Value " id = " my-input " aria-describedby = " message " />
< Field.Message id = " message " > Inline message providing addition context on the input field. </ Field.Message >
</ Field >
Select
Copy
< Field >
< Field.Label htmlFor = " my-input " > Label </ Field.Label >
< Field.Control as = { Select } id = " my-input " aria-describedby = " message " >
< Select.Option defaultValue > Please select an option... </ Select.Option >
< Select.Option > Option 1 </ Select.Option >
< Select.Option > Option 2 </ Select.Option >
< Select.Option > Option 3 </ Select.Option >
</ Field.Control >
< Field.Message id = " message " > Inline message providing addition context on the input field. </ Field.Message >
</ Field >
Using a disabled, defaultValue on an uncontrolled Select input is not possbile with React. Once disabled is applied, React then considered the option no longer selectable by default and this option will only appear once a user has interacted with the Select.
Using a controlled field allows the Select to have a selected, but disabled option.
Copy
function Example ( ) {
const [ value , setValue ] = React . useState ( 'unselectable' )
const handleChange = ( e ) => {
setValue ( e . target . value )
}
return (
< Field >
< Field.Label htmlFor = " my-input " > Label </ Field.Label >
< Field.Control as = { Select } value = { value } id = " my-input " aria-describedby = " message " onChange = { handleChange } >
< Select.Option value = " unselectable " disabled > Please select an option... </ Select.Option >
< Select.Option > Option 1 </ Select.Option >
< Select.Option > Option 2 </ Select.Option >
< Select.Option > Option 3 </ Select.Option >
</ Field.Control >
< Field.Message id = " message " > Inline message providing addition context on the input field. </ Field.Message >
</ Field >
)
}
State and Validation
state can be confirmed or error.
The Field component will ensure the Validation and Label have the same state as the input component.
It is best practice to validate input fields only upon form submission.
Copy
< Field state = " error " >
< Field.Label htmlFor = " my-input " > Label </ Field.Label >
< Field.Control as = { Select } id = " my-input " aria-describedby = " validation message " >
< Select.Option defaultValue > Please select an option... </ Select.Option >
< Select.Option > Option 1 </ Select.Option >
< Select.Option > Option 2 </ Select.Option >
< Select.Option > Option 3 </ Select.Option >
</ Field.Control >
< Field.Message id = " message " > Your inline message goes here. </ Field.Message >
< Field.Validation id = " validation " > Something is not quite right. </ Field.Validation >
</ Field >
Inline Message
Field.Message could be used to display inline message related to the field. These will always be displayed as the bottom most element on the input field.
Copy
< Field state = " confirmed " >
< Field.Label htmlFor = " my-input " > Label </ Field.Label >
< Field.Control as = { TextInput } value = " My Value " id = " my-input " aria-describedby = " validation message " />
< Field.Validation id = " validation " > Input is validated! </ Field.Validation >
< Field.Message id = " message " > Your inline message goes here. </ Field.Message >
</ Field >
Required Fields
Adding required attribute on the Field.Control will render an asterisk to signify that a field is required. The asterisk color will also change based on the input status.
Copy
< Field >
< Field.Label htmlFor = " my-input " > Label </ Field.Label >
< Field.Control as = { TextInput } required id = " my-input " aria-describedby = " message " />
< Field.Message id = " message " > * required field </ Field.Message >
</ Field >
Disabled and Read-only
You can provide disabled or readOnly properties to make text input or textarea non-interactive. Select component only has disabled property.
Copy
< Field >
< Field.Label htmlFor = " my-input " > Label </ Field.Label >
< Field.Control as = { TextInput } disabled value = " my value " id = " my-input " aria-describedby = " message " />
< Field.Message id = " message " > Your message goes here! </ Field.Message >
</ Field >
Accessibility
Please refer to the W3C Forms Concepts guide when working with forms.