@patternfly/react-core
Version:
This library provides a set of common React components for use with the PatternFly reference implementation.
575 lines (504 loc) • 19.3 kB
Markdown
---
id: Options menu
section: components
subsection: menus
cssPrefix: pf-v5-c-options-menu
propComponents: ['OptionsMenu', 'OptionsMenuItem', 'OptionsMenuSeparator', 'OptionsMenuToggle', 'OptionsMenuToggleWithText']
ouia: true
deprecated: true
---
import CaretDownIcon from '@patternfly/react-icons/dist/esm/icons/caret-down-icon';
import SortAmountDownIcon from '@patternfly/react-icons/dist/esm/icons/sort-amount-down-icon';
## Examples
### Single option
```js
import React from 'react';
import { OptionsMenu, OptionsMenuItem, OptionsMenuToggle } from '@patternfly/react-core/deprecated';
class SingleOption extends React.Component {
constructor(props) {
super(props);
this.state = {
isOpen: false,
toggleTemplateText: "Options menu",
selectedOption: "singleOption1"
};
this.onToggle = () => {
this.setState({
isOpen: !this.state.isOpen
});
};
this.onSelect = event => {
const id = event.currentTarget.id;
this.setState(() => {
return { selectedOption: id };
});
};
}
render() {
const { selectedOption, toggleTemplateText, isOpen } = this.state;
const menuItems = [
<OptionsMenuItem onSelect={this.onSelect} isSelected={selectedOption === "singleOption1"} id="singleOption1" key="option 1">Option 1</OptionsMenuItem>,
<OptionsMenuItem onSelect={this.onSelect} isSelected={selectedOption === "singleOption2"} id="singleOption2" key="option 2">Option 2</OptionsMenuItem>,
<OptionsMenuItem onSelect={this.onSelect} isSelected={selectedOption === "singleOption3"} id="singleOption3" key="option 3">Option 3</OptionsMenuItem>
];
const toggle = <OptionsMenuToggle onToggle={this.onToggle} toggleTemplate={toggleTemplateText} />
return (
<OptionsMenu
id="single-option-example"
menuItems={menuItems}
isOpen={isOpen}
toggle={toggle}
ouiaId="OptionsMenu"/>
);
}
}
```
### Disabled
```js
import React from 'react';
import { OptionsMenu, OptionsMenuItem, OptionsMenuToggle } from '@patternfly/react-core/deprecated';
class DisabledOptionsMenu extends React.Component {
constructor(props) {
super(props);
this.state = {
isOpen: false,
toggleTemplateText: "Disabled options menu"
};
this.onToggle = () => {
this.setState({
isOpen: !this.state.isOpen
});
};
}
render() {
const { toggleTemplateText, isOpen } = this.state;
const menuItems = [];
const toggle = <OptionsMenuToggle isDisabled onToggle={this.onToggle} toggleTemplate={toggleTemplateText} />
return (
<OptionsMenu
id="single-disabled-example"
isOpen={isOpen}
menuItems={menuItems}
toggle={toggle}/>
);
}
}
```
### Multiple options
```js
import React from 'react';
import { OptionsMenu, OptionsMenuItem, OptionsMenuSeparator, OptionsMenuItemGroup, OptionsMenuToggle} from '@patternfly/react-core/deprecated';
class MultipleOptions extends React.Component {
constructor(props) {
super(props);
this.state = {
isOpen: false,
toggleTemplateText: "Sort by",
sortColumn: "date",
sortDirection: "ascending"
};
this.onToggle = () => {
this.setState({
isOpen: !this.state.isOpen
});
};
this.onSelectColumn = event => {
const id = event.currentTarget.id;
this.setState(() => {
return { sortColumn: id };
});
};
this.onSelectDirection = event => {
const id = event.currentTarget.id;
this.setState(() => {
return { sortDirection: id };
});
};
}
render() {
const { sortColumn, sortDirection, toggleTemplateText, isOpen } = this.state;
const menuItems = [
<OptionsMenuItemGroup key="first group" aria-label="Sort Column">
<OptionsMenuItem onSelect={this.onSelectColumn} isSelected={sortColumn === "name"} id="name" key="name">Name</OptionsMenuItem>
<OptionsMenuItem onSelect={this.onSelectColumn} isSelected={sortColumn === "date"} id="date" key="date">Date</OptionsMenuItem>
<OptionsMenuItem isDisabled onSelect={this.onSelectColumn} isSelected={sortColumn === "disabled"} id="disabled" key="disabled">Disabled</OptionsMenuItem>
<OptionsMenuItem onSelect={this.onSelectColumn} isSelected={sortColumn === "size"} id="size" key="size">Size</OptionsMenuItem>
</OptionsMenuItemGroup>,
<OptionsMenuSeparator key="separator"/>,
<OptionsMenuItemGroup key="second group" aria-label="Sort Direction">
<OptionsMenuItem onSelect={this.onSelectDirection} isSelected={sortDirection === "ascending"} id="ascending" key="ascending">Ascending</OptionsMenuItem>
<OptionsMenuItem onSelect={this.onSelectDirection} isSelected={sortDirection === "descending"} id="descending" key="descending">Descending</OptionsMenuItem>
</OptionsMenuItemGroup>
];
const toggle = <OptionsMenuToggle onToggle={this.onToggle} toggleTemplate={toggleTemplateText} />
return (
<OptionsMenu
id="multiple-options-example"
menuItems={menuItems}
isOpen={isOpen}
toggle={toggle}
isGrouped />
);
}
}
```
### Plain
```js
import React from 'react';
import { OptionsMenu, OptionsMenuItem, OptionsMenuToggle } from '@patternfly/react-core/deprecated';
import SortAmountDownIcon from '@patternfly/react-icons/dist/esm/icons/sort-amount-down-icon';
class Plain extends React.Component {
constructor(props) {
super(props);
this.state = {
isOpen: false,
isDisabledOpen: false,
plainOption1: true,
plainOption2: false,
plainOption3: false,
disabledPlainOption1: true,
disabledPlainOption2: false,
disabledPlainOption3: false
};
this.onToggle = () => {
this.setState({
isOpen: !this.state.isOpen
});
};
this.onDisabledToggle = () => {
this.setState({
isDisabledOpen: !this.state.isDisabledOpen
});
};
this.onSelect = event => {
const id = event.currentTarget.id;
this.setState((prevState) => {
return { [id]: !prevState[id] };
});
};
}
render() {
const { isOpen, isDisabledOpen, plainOption1, plainOption2, plainOption3, disabledPlainOption1, disabledPlainOption2, disabledPlainOption3 } = this.state
const menuItems = [
<OptionsMenuItem onSelect={this.onSelect} isSelected={plainOption1} id="plainOption1" key="option 1">Option 1</OptionsMenuItem>,
<OptionsMenuItem onSelect={this.onSelect} isSelected={plainOption2} id="plainOption2" key="option 2">Option 2</OptionsMenuItem>,
<OptionsMenuItem onSelect={this.onSelect} isSelected={plainOption3} id="plainOption3" key="option 3">Option 3</OptionsMenuItem>
];
const disabledMenuItems = [
<OptionsMenuItem onSelect={this.onSelect} isSelected={disabledPlainOption1} id="disabledPlainOption1" key="disabled option 1">Option 1</OptionsMenuItem>,
<OptionsMenuItem onSelect={this.onSelect} isSelected={disabledPlainOption2} id="disabledPlainOption2" key="disabled option 2">Option 2</OptionsMenuItem>,
<OptionsMenuItem onSelect={this.onSelect} isSelected={disabledPlainOption3} id="disabledPlainOption3" key="disabled option 3">Option 3</OptionsMenuItem>
];
const toggleTemplate = <SortAmountDownIcon aria-hidden="true"/>
const toggle = <OptionsMenuToggle onToggle={this.onToggle} toggleTemplate={toggleTemplate} aria-label="Sort by" hideCaret/>
const disabledToggle = <OptionsMenuToggle isDisabled onToggle={this.onDisabledToggle} toggleTemplate={toggleTemplate} aria-label="Sort by" hideCaret/>
return (
<React.Fragment>
<OptionsMenu id="plain-disabled-example"
isPlain
menuItems={disabledMenuItems}
isOpen={isDisabledOpen}
toggle={disabledToggle}/>
<OptionsMenu id="plain-example"
isPlain
menuItems={menuItems}
isOpen={isOpen}
toggle={toggle}/>
</React.Fragment>
);
}
}
```
### Align top
```js
import React from 'react';
import { OptionsMenu, OptionsMenuItem, OptionsMenuDirection, OptionsMenuToggle } from '@patternfly/react-core/deprecated';
class Top extends React.Component {
constructor(props) {
super(props);
this.state = {
isOpen: false,
toggleTemplateText: "Options menu",
topOption1: false,
topOption2: false,
topOption3: false
};
this.onToggle = () => {
this.setState({
isOpen: !this.state.isOpen
});
};
this.onSelect = event => {
const id = event.currentTarget.id;
this.setState((prevState) => {
return { [id]: !prevState[id] };
});
};
}
render() {
const { isOpen, topOption1, topOption2, topOption3, toggleTemplateText } = this.state
const menuItems = [
<OptionsMenuItem onSelect={this.onSelect} isSelected={topOption1} id="topOption1" key="option 1">Option 1</OptionsMenuItem>,
<OptionsMenuItem onSelect={this.onSelect} isSelected={topOption2} id="topOption2" key="option 2">Option 2</OptionsMenuItem>,
<OptionsMenuItem onSelect={this.onSelect} isSelected={topOption3} id="topOption3" key="option 3">Option 3</OptionsMenuItem>
];
const toggle = <OptionsMenuToggle onToggle={this.onToggle} toggleTemplate={toggleTemplateText} />
return (
<OptionsMenu
id="top-example"
direction={OptionsMenuDirection.up}
menuItems={menuItems}
toggle={toggle}
isOpen={isOpen} />
);
}
}
```
### Align right
```js
import React from 'react';
import { OptionsMenu, OptionsMenuItem, OptionsMenuPosition, OptionsMenuToggle } from '@patternfly/react-core/deprecated';
class AlignRight extends React.Component {
constructor(props) {
super(props);
this.state = {
isOpen: false,
toggleTemplateText: "Align right",
rightOption1: true,
rightOption2: false,
rightOption3: false
};
this.onToggle = () => {
this.setState({
isOpen: !this.state.isOpen
});
};
this.onSelect = event => {
const id = event.currentTarget.id;
this.setState((prevState) => {
return { [id]: !prevState[id] };
});
};
}
render() {
const { isOpen, toggleTemplateText, rightOption1, rightOption2, rightOption3 } = this.state;
const menuItems = [
<OptionsMenuItem onSelect={this.onSelect} isSelected={rightOption1} id="rightOption1" key="option 1">Right option 1</OptionsMenuItem>,
<OptionsMenuItem onSelect={this.onSelect} isSelected={rightOption2} id="rightOption2" key="option 2">Right option 2</OptionsMenuItem>,
<OptionsMenuItem onSelect={this.onSelect} isSelected={rightOption3} id="rightOption3" key="option 3">Right option 3</OptionsMenuItem>
];
const toggle = <OptionsMenuToggle onToggle={this.onToggle} toggleTemplate={toggleTemplateText} />
return (
<OptionsMenu
id="align-right-example"
position={OptionsMenuPosition.right}
menuItems={menuItems}
toggle={toggle}
isOpen={isOpen} />
);
}
}
```
### Plain with text
```js
import React from 'react';
import { OptionsMenu, OptionsMenuItem, OptionsMenuToggleWithText } from '@patternfly/react-core/deprecated';
import CaretDownIcon from '@patternfly/react-icons/dist/esm/icons/caret-down-icon';
class PlainWithText extends React.Component {
constructor(props) {
super(props);
this.state = {
isOpen: false,
toggleText: <React.Fragment>Custom text</React.Fragment>,
buttonContents: <CaretDownIcon/>,
customOption1: true,
customOption2: false,
customOption3: false
};
this.onToggle = () => {
this.setState({
isOpen: !this.state.isOpen
});
};
this.onSelect = event => {
const id = event.currentTarget.id;
this.setState((prevState) => {
return { [id]: !prevState[id] };
});
};
this.onToggle = () => {
this.setState({
isOpen: !this.state.isOpen
});
};
}
render() {
const { isOpen, toggleText, buttonContents } = this.state;
const menuItems = [
<OptionsMenuItem onSelect={this.onSelect} isSelected={this.state.customOption1} id="customOption1" key="option 1">Option 1</OptionsMenuItem>,
<OptionsMenuItem onSelect={this.onSelect} isSelected={this.state.customOption2} id="customOption2" key="option 2">Option 2</OptionsMenuItem>,
<OptionsMenuItem onSelect={this.onSelect} isSelected={this.state.customOption3} id="customOption3" key="option 3">Option 3</OptionsMenuItem>
];
const toggle = <OptionsMenuToggleWithText toggleText={toggleText} toggleButtonContents={buttonContents} onToggle={this.onToggle} />;
return (
<OptionsMenu
id="plain-with-text-example"
menuItems={menuItems}
isOpen={isOpen}
isPlain
isText
toggle={toggle} />
);
}
}
```
### Plain with text disabled
```js
import React from 'react';
import { OptionsMenu, OptionsMenuItem, OptionsMenuToggleWithText } from '@patternfly/react-core/deprecated';
import CaretDownIcon from '@patternfly/react-icons/dist/esm/icons/caret-down-icon';
class PlainWithText extends React.Component {
constructor(props) {
super(props);
this.state = {
isOpen: false,
toggleText: <React.Fragment>Custom text</React.Fragment>,
buttonContents: <CaretDownIcon/>,
customOption1: true,
customOption2: false,
customOption3: false
};
this.onToggle = () => {
this.setState({
isOpen: !this.state.isOpen
});
};
this.onSelect = event => {
const id = event.currentTarget.id;
this.setState((prevState) => {
return { [id]: !prevState[id] };
});
};
this.onToggle = () => {
this.setState({
isOpen: !this.state.isOpen
});
};
}
render() {
const { isOpen, toggleText, buttonContents } = this.state;
const menuItems = [
<OptionsMenuItem onSelect={this.onSelect} isSelected={this.state.customOption1} id="customOption1" key="option 1">Option 1</OptionsMenuItem>,
<OptionsMenuItem onSelect={this.onSelect} isSelected={this.state.customOption2} id="customOption2" key="option 2">Option 2</OptionsMenuItem>,
<OptionsMenuItem onSelect={this.onSelect} isSelected={this.state.customOption3} id="customOption3" key="option 3">Option 3</OptionsMenuItem>
];
const toggle = <OptionsMenuToggleWithText isDisabled toggleText={toggleText} toggleButtonContents={buttonContents} onToggle={this.onToggle} />;
return (
<OptionsMenu
id="plain-with-text-disabled-example"
menuItems={menuItems}
isOpen={isOpen}
isPlain
isText
toggle={toggle} />
);
}
}
```
### Grouped items with titles
```js
import React from 'react';
import { OptionsMenu, OptionsMenuItem, OptionsMenuToggle, OptionsMenuItemGroup } from '@patternfly/react-core/deprecated';
class GroupedItems extends React.Component {
constructor(props) {
super(props);
this.state = {
isOpen: false,
toggleTemplateText: "Options menu",
selectedOption: "groupOption1"
};
this.onToggle = () => {
this.setState({
isOpen: !this.state.isOpen
});
};
this.onSelect = event => {
const id = event.currentTarget.id;
this.setState(() => {
return { selectedOption: id };
});
};
}
render() {
const { isOpen, selectedOption, toggleTemplateText } = this.state;
const menuGroups = [
<OptionsMenuItemGroup hasSeparator key="group0">
<OptionsMenuItem onSelect={this.onSelect} isSelected={selectedOption === "groupOption1"} id="groupOption1" key="option 1">Option 1</OptionsMenuItem>
<OptionsMenuItem onSelect={this.onSelect} isSelected={selectedOption === "groupOption2"} id="groupOption2" key="option 2">Option 2</OptionsMenuItem>
</OptionsMenuItemGroup>,
<OptionsMenuItemGroup groupTitle="Group 1" hasSeparator key="group1">
<OptionsMenuItem onSelect={this.onSelect} isSelected={selectedOption === "groupOption3"} id="groupOption3" key="option 3">Option 1</OptionsMenuItem>
<OptionsMenuItem onSelect={this.onSelect} isSelected={selectedOption === "groupOption4"} id="groupOption4" key="option 4">Option 2</OptionsMenuItem>
</OptionsMenuItemGroup>,
<OptionsMenuItemGroup groupTitle="Group 2" key="group2">
<OptionsMenuItem onSelect={this.onSelect} isSelected={selectedOption === "groupOption5"} id="groupOption5" key="option 5">Option 1</OptionsMenuItem>
<OptionsMenuItem onSelect={this.onSelect} isSelected={selectedOption === "groupOption6"} id="groupOption6" key="option 6">Option 2</OptionsMenuItem>
</OptionsMenuItemGroup>
];
const toggle = <OptionsMenuToggle onToggle={this.onToggle} toggleTemplate={toggleTemplateText} />
return (
<OptionsMenu
id="grouped-items-example"
position={OptionsMenuPosition.right}
menuItems={menuGroups}
toggle={toggle}
isOpen={isOpen}
isGrouped />
);
}
}
```
### Single option with menu on document body
```js
import React from 'react';
import { OptionsMenu, OptionsMenuItem, OptionsMenuToggle } from '@patternfly/react-core/deprecated';
class SingleOption extends React.Component {
constructor(props) {
super(props);
this.state = {
isOpen: false,
toggleTemplateText: "Options menu",
selectedOption: "singleOption1"
};
this.onToggle = () => {
this.setState({
isOpen: !this.state.isOpen
});
};
this.onSelect = event => {
const id = event.currentTarget.id;
this.setState(() => {
return { selectedOption: id };
});
};
}
render() {
const { selectedOption, toggleTemplateText, isOpen } = this.state;
const menuItems = [
<OptionsMenuItem onSelect={this.onSelect} isSelected={selectedOption === "singleOption1"} id="singleOption1" key="option 1">Option 1</OptionsMenuItem>,
<OptionsMenuItem onSelect={this.onSelect} isSelected={selectedOption === "singleOption2"} id="singleOption2" key="option 2">Option 2</OptionsMenuItem>,
<OptionsMenuItem onSelect={this.onSelect} isSelected={selectedOption === "singleOption3"} id="singleOption3" key="option 3">Option 3</OptionsMenuItem>
];
const toggle = <OptionsMenuToggle onToggle={this.onToggle} toggleTemplate={toggleTemplateText} />
return (
<OptionsMenu
id="document-body-example"
menuItems={menuItems}
isOpen={isOpen}
toggle={toggle}
menuAppendTo={() => document.body}
/>
);
}
}
```