Context Menu
- Usage
- Styling
Context Menu is a component that you can attach to any component to display a context menu. The menu appears on right (default) or left click. On a touch device, a long press opens the context menu.
Important
| Open the Context Menu by right-clicking (mouse) or long-pressing (touch) a Grid row. |
new tab
const items = [{ text: 'View' }, { text: 'Edit' }, { text: 'Delete' }];
return (
<ContextMenu items={items}>
<Grid allRowsVisible items={gridItems} ref={gridRef}>
<GridColumn path="firstName" />
<GridColumn path="lastName" />
<GridColumn path="email" />
<GridColumn header="Phone number" path="address.phone" />
</Grid>
</ContextMenu>
);
Dividers
You can use dividers to separate and group related content. Use dividers sparingly to avoid creating unnecessary visual clutter.
Important
| Open the Context Menu by right-clicking (mouse) or long-pressing (touch) a Grid row. |
new tab
<ContextMenu
items={[
{ text: 'View' },
{ component: 'hr' },
{ text: 'Edit' },
{ text: 'Delete' },
{ component: 'hr' },
{ text: 'Email' },
{ text: 'Call' },
]}
>
<Grid allRowsVisible items={gridItems} ref={gridRef}>
<GridColumn path="firstName" />
<GridColumn path="lastName" />
<GridColumn path="email" />
<GridColumn header="Phone number" path="address.phone" />
</Grid>
</ContextMenu>
Checkable Menu Items
Checkable Menu Items can be used to toggle a setting on and off.
new tab
const [items, setItems] = useState<ContextMenuItem[]>([
{ text: 'Abigail Lewis', checked: true },
{ text: 'Allison Torres' },
{ text: 'Anna Myers' },
{ text: 'Lauren Wright' },
{ text: 'Tamaki Ryushi' },
]);
const selectedItem = items.find((item) => item.checked);
function itemSelected(e: ContextMenuItemSelectedEvent) {
setItems(items.map((item) => ({ ...item, checked: item === e.detail.value })));
}
return (
<ContextMenu items={items} onItemSelected={itemSelected}>
<span>
Assignee: <b>{selectedItem?.text}</b>
</span>
</ContextMenu>
);
Hierarchical Menu
Context Menu, like Menu Bar, supports multi-level sub-menus. You can use a hierarchical menu to organize a large set of options and group related items.
Important
| Open the Context Menu by right-clicking (mouse) or long-pressing (touch) a Grid row. |
new tab
const items = [
{ text: 'Preview' },
{ text: 'Edit' },
{ component: 'hr' },
{
text: 'Export',
children: [
{ text: 'Portable Document Format (.pdf)' },
{ text: 'Rich Text Format (.rtf)' },
{ text: 'Plain text (.txt)' },
],
},
{ text: 'Share', children: [{ text: 'Copy link' }, { text: 'Email' }] },
{ component: 'hr' },
{ text: 'Delete' },
];
const gridItems: FileItem[] = [
{ name: 'Annual Report.docx', size: '24 MB' },
{ name: 'Financials.xlsx', size: '42 MB' },
];
return (
<ContextMenu items={items}>
<Grid allRowsVisible items={gridItems} ref={gridRef}>
<GridColumn path="name" />
<GridColumn path="size" />
</Grid>
</ContextMenu>
);
Custom Items
You can customize the items to include more than a single line of text.
Important
| Open the Context Menu by right-clicking (mouse) or long-pressing (touch) a Grid row. |
new tab
const contextMenuItems: ContextMenuItem[] = [
{ component: menuComponent(createItem('vaadin:file-search', 'Open')) },
{
component: menuComponent(createItem('vaadin:user-check', 'Assign')),
children: [
{ component: menuComponent(<Item person={people[0]} />) },
{ component: menuComponent(<Item person={people[1]} />) },
{ component: menuComponent(<Item person={people[2]} />) },
{ component: menuComponent(<Item person={people[3]} />) },
{ component: menuComponent(<Item person={people[4]} />) },
],
},
{ component: 'hr' },
{ component: menuComponent(createItem('vaadin:trash', 'Delete')) },
];
setItems(contextMenuItems);
return (
<ContextMenu items={items}>
<Grid allRowsVisible items={gridItems} ref={gridRef}>
<GridColumn header="Applicant">
{({ item }) => (
<span>
{item.firstName} {item.lastName}
</span>
)}
</GridColumn>
<GridColumn path="email" />
<GridColumn header="Phone number" path="address.phone" />
</Grid>
</ContextMenu>
);
Disabled Menu Items
You can disable menu items to show that they are unavailable.
Important
| Open the Context Menu by right-clicking (mouse) or long-pressing (touch) a Grid row. |
new tab
const items = [
{ text: 'Preview' },
{ text: 'Edit' },
{ component: 'hr' },
{
text: 'Export',
children: [
{ text: 'Portable Document Format (.pdf)', disabled: true },
{ text: 'Rich Text Format (.rtf)' },
{ text: 'Plain text (.txt)' },
],
},
{ text: 'Share', children: [{ text: 'Copy link' }, { text: 'Email' }] },
{ component: 'hr' },
{ text: 'Delete', disabled: true },
];
const gridItems: FileItem[] = [
{ name: 'Annual Report.pdf', size: '24 MB' },
{ name: 'Financials.pdf', size: '42 MB' },
];
return (
<ContextMenu items={items}>
<Grid allRowsVisible items={gridItems} ref={gridRef}>
<GridColumn path="name" />
<GridColumn path="size" />
</Grid>
</ContextMenu>
);
Left-Click
You can use left-click to open Context Menu in situations where left-click doesn’t have any other function, for example a Grid without selection support.
Important
| Open the Context Menu by clicking a Grid row. |
new tab
return (
<ContextMenu openOn="click" items={items}>
<Grid allRowsVisible items={gridItems} ref={gridRef}>
<GridColumn path="firstName" />
<GridColumn path="lastName" />
<GridColumn path="email" />
<GridColumn header="Phone number" path="address.phone" />
</Grid>
</ContextMenu>
);
Best Practices
Context Menu is used to provide shortcuts to the user. You shouldn’t use it as the only or primary means to complete a task. The primary way should be accessible elsewhere in the UI.
Important
| Open the Context Menu by right-clicking (desktop) or long-pressing (mobile) a Grid row, or use the Menu Bar in the last column. |
new tab
<ContextMenu items={items}>
<Grid allRowsVisible items={gridItems}>
<GridColumn path="name" />
<GridColumn path="size" />
<GridColumn width="70px" flexGrow={0}>
{() => <MenuBar items={items} theme="tertiary" />}
</GridColumn>
</Grid>
</ContextMenu>
Context Menu vs Menu Bar
You should use Context Menu when there is no dedicated button for opening an overlay menu, such as right-clicking a grid row. When there is a dedicated element/component, such as an overflow menu, use Menu Bar.
Related Components
Component | Usage recommendations |
---|---|
Component for displaying a horizontal menu with multi-level sub-menus. |