Dropdown
Dropdowns provide compact selection of pre-set state configurations.
Usage
The parent Dropdown
properties specifies the controlled variable, and the 'collapsed' placeholder text for the button.
Child Dropdown.Option
elements provide control over the expanded options list. Each Option
specifies it's selection value, along with formatting controls for a string and icon.
The underlying behaviour is identical to a RadioGroup
.
import { Dropdown } from '@electricui/components-desktop-blueprint' <Dropdown accessor ="led_blink" placeholder ={() => 'Blink Control'}> <Dropdown .Option value ={1} text ="Blinking" /> <Dropdown .Option value ={0} text ="Manual" /></Dropdown >
The order of the child Dropdown.Option
components sets the ordering in the rendered dropdown.
For structured data, normal accessor syntax applies.
<Dropdown accessor ="led_blink" placeholder ={() => 'Blink Control'} writer ={(state , value ) => { state .led_blink = value }}> <Dropdown .Option value ={1} text ="Blinking" /> <Dropdown .Option value ={0} text ="Manual" /></Dropdown >
In situations such as mode selection, it's acceptable to read the mode status from one ID, and write the selection 'request' to a different one.
Formatting Placeholder
The placeholder text displayed on the collapsed dropdown element can be heavily styled by providing the placeholder
property.
This shows the selected mode while collapsed, or provides a call to action to switch modes.
The placeholder string renders until the user selects an option, after which the Dropdown.Option
text overrides it.
<Dropdown accessor ="led_blink" placeholder ={selectedOption => selectedOption ? `Mode: ${selectedOption .text }` : 'Select Mode' }> <Dropdown .Option value ={1} text ="Blink" /> <Dropdown .Option value ={0} text ="Manual" /></Dropdown >
Optionally, customise the placeholder behaviour by providing a function which accepts the selected object properties, and return a string.
<Dropdown accessor ="led_blink" placeholder ={selectedOption => selectedOption ? `Mode: ${selectedOption .text }` : 'Select Mode' }> <Dropdown .Option value ={1} text ="Blink" /> <Dropdown .Option value ={0} text ="Manual" /></Dropdown >
To display a constant string regardless of the selected option, the placeholder can return a constant string.
<Dropdown accessor ="call_action" placeholder ={() => 'Action Options'}> <Dropdown .Option value ={1} text ="Blink Five Times" /> <Dropdown .Option value ={0} text ="Blink Ten Times" /></Dropdown >
Formatting Options
Style the selectable options by providing the label
property with text, or passing a React component to the labelElement
property.
The element renders to the right of the option.
// No Label<Dropdown.Option value={0} text="None" />
// Descriptive Label<Dropdown.Option value={1} text="Autodetect" label="I2C" />
// Icon<Dropdown.Option value={2} text="UART4" labelElement={<Icon icon="small-cross" color={Colors.RED4} />}/>
// Print eUI strings<Dropdown.Option value={4} text="CAN" labelElement={ <> <Printer accessor="can_m" />: <Printer accessor="can_r" /> Mb/s <Icon icon="small-tick" color={Colors.GREEN4} /> </> }/>
// Any legal UI components will also work<Dropdown.Option value={5} text="WiFi" labelElement={ <div style={{ width: '140px', maxWidth: '90px', marginLeft: 'auto', paddingTop: '0.4em', }} > <ProgressBar accessor="progress" intent="warning" /> </div> }/>
Positions
The popoverProps
property on the Dropdown
parent allows for repositioning of the expanded content.
Under the hood, dropdowns use Popover
, which means minimal
specifies if a handle renders, and the position
is also developer controllable.
<Dropdown accessor ="speed" placeholder ={() => 'Jog Speed'} popoverProps ={{ position : 'right', minimal : false }}> <Dropdown .Option value ={10} text ="Crawl" /> <Dropdown .Option value ={80} text ="Jog" /></Dropdown >
The position
property accepts string "right" or enum Position.RIGHT
arguments as described in the Popover Position Control documentation.