Select
Selects are used to choose one or more items from a list of options.
Demo
Usage
When to use
- Choosing one or several options from a list of many. Use a select if there are many options to choose from, especially in compact layouts.
When not to use
- Ordering selections. Don't use a select to choose options when their order is important. Use a Transferinstead.
Variants
Single select
Demo
<SingleSelectField label="Aggregation type">
    <SingleSelectOption label="One" value="1" />
    <SingleSelectOption label="Two" value="2" />
    <SingleSelectOption label="Three" value="3" />
</SingleSelectField>
- Use a single select if the user can only choose one option.
Multi select
Demo
<MultiSelectField label="Priority" selected={['1']}>
    <MultiSelectOption label="Very low" value="1" />
    <MultiSelectOption label="High" value="4" />
    <MultiSelectOption label="Very high" value="5" />
    <MultiSelectOption label="Critical" value="6" />
</MultiSelectField>
- Use a multi select if the user can choose one or more options.
Format
Label
- Show a label above the select to show what it's for.
- Labels should clearly describe the selection to be made. Don't use long sentences.
- A noun is often the simplest choice of label, rather than a verb. For example, Period type is more concise in a layout than Choose a period type. Only use a verb if the use of the control is ambiguous.
Placeholder
Demo
<SingleSelectField label="Label" placeholder="Choose an option">
    <SingleSelectOption label="Option one" value="1" />
    <SingleSelectOption label="Option two" value="2" />
    <SingleSelectOption label="Option three" value="3" />
</SingleSelectField>
- Only use placeholder text to clarify what kind of content is expected.
- Placeholder text shouldn't repeat the label.
- Always use placeholder text if a label isn't used.
- Placeholder text disappears when choosing an option, so make sure it's not critical.
Help text
Demo
<SingleSelectField
    label="Aggregation type"
    helpText="Choose the aggregation type to apply to imported data."
>
    <SingleSelectOption label="Option one" value="1" />
    <SingleSelectOption label="Option two" value="2" />
    <SingleSelectOption label="Option three" value="3" />
</SingleSelectField>
- Use help text to tell the user about any limitations or expectations for the content.
- Help text can also be used to clarify what the input is for if it's a complex concept.
Size
Demo
<SingleSelectField dense label="Dense sized select">
    <SingleSelectOption label="Option one" value="1" />
    <SingleSelectOption label="Option two" value="2" />
    <SingleSelectOption label="Option three" value="3" />
</SingleSelectField>
- Selects are available in two sizes, regular and dense. Regular sized selects are useful when there's space available. Usedensesized selects in compact, information-dense interfaces.
Width
- A selects width should reflect the expected content.
- Avoid full-width selects, which can be visually unclear.
Options
Filtering
Demo
<SingleSelectField filterable label="Label">
    <SingleSelectOption label="Option one" value="1" />
    <SingleSelectOption label="Option two" value="2" />
    <SingleSelectOption label="Option three" value="3" />
    <SingleSelectOption label="Option nine" value="9" />
    <SingleSelectOption label="Option ten" value="10" />
</SingleSelectField>
- A select can show a filter control that filters the available options.
- Use a filter when there's many options, more than 10, to choose from.
Clearing
Demo
<SingleSelectField clearable label="Label" selected="1">
    <SingleSelectOption label="Option one" value="1" />
    <SingleSelectOption label="Option two" value="2" />
    <SingleSelectOption label="Option three" value="3" />
    <SingleSelectOption label="Option nine" value="9" />
    <SingleSelectOption label="Option ten" value="10" />
</SingleSelectField>
- A select can show a Clear button that removes the current selection.
- Use a clearable select if there isn't a None choice in the options.
Prefix
Demo
<SingleSelectField prefix="Data type" selected="3">
    <SingleSelectOption label="Data element" value="1" />
    <SingleSelectOption label="Event data item" value="2" />
    <SingleSelectOption label="Program indicator" value="3" />
    <SingleSelectOption label="Option ten" value="10" />
</SingleSelectField>
- A select can show a label that prefixes the chosen option label.
- Use a prefix when there is limited space and a label above the select would take up too much space.
- Prefix labels should be short and clear.
State: Error
Demo
<SingleSelectField
    error
    validationText="That value is wrong. Sorry!"
    label="Label"
>
    <SingleSelectOption label="Option one" value="1" />
    <SingleSelectOption label="Option two" value="2" />
    <SingleSelectOption label="Option three" value="3" />
    <SingleSelectOption label="Option ten" value="10" />
</SingleSelectField>
- Use an error state if there's a problem with the chosen option, or if it's required but empty.
- Don't show an error too early, give the user a chance to make a choice.
- The error text should help the user fix the problem. Refer to the error writing guidelines for examples.
State: Disabled
Demo
<SingleSelectField disabled label="Label">
    <SingleSelectOption label="Option one" value="1" />
    <SingleSelectOption label="Option eight" value="8" />
    <SingleSelectOption label="Option nine" value="9" />
    <SingleSelectOption label="Option ten" value="10" />
</SingleSelectField>
- Use a disabled state if the select temporarily can't be used.
- Show a Tooltipon hover or focus to explain why the select is disabled.
API Reference
MultiSelect
Usage
To use MultiSelect, you can import the component from the @dhis2/ui library
import { MultiSelect } from '@dhis2/ui'
Props
| Name | Type | Default | Required | Description | 
|---|---|---|---|---|
| children | node | |||
| className | string | |||
| clearText | custom(function) | Required if clearableprop istrue | ||
| clearable | boolean | Adds a 'clear' option to the menu | ||
| dataTest | string | 'dhis2-uicore-multiselect' | ||
| dense | boolean | |||
| disabled | boolean | |||
| empty | node | |||
| error | custom | |||
| filterPlaceholder | string | |||
| filterable | boolean | Adds a 'filter' field to the menu | ||
| initialFocus | boolean | |||
| inputMaxHeight | string | |||
| loading | boolean | |||
| loadingText | string | |||
| maxHeight | string | |||
| noMatchText | custom(function) | Required if filterableprop istrue | ||
| placeholder | string | |||
| prefix | string | |||
| selected | arrayOf(string) | [] | ||
| tabIndex | string | |||
| valid | custom | |||
| warning | custom | |||
| onBlur | function | |||
| onChange | function | |||
| onFocus | function | |||
| onKeyDown | function |