office-ui-fabric-react
Version:
Reusable React components for building experiences for Office 365.
152 lines (140 loc) • 3.59 kB
Plain Text
let {
DefaultButton,
SearchBox,
Icon,
IContextualMenuListProps,
IContextualMenuItem,
IRenderFunction,
Fabric
} = window.Fabric;
const ITEMS: IContextualMenuItem[] = [
{
key: 'newItem',
text: 'New',
onClick: () => console.log('New clicked')
},
{
key: 'rename',
text: 'Rename',
onClick: () => console.log('Rename clicked')
},
{
key: 'edit',
text: 'Edit',
onClick: () => console.log('Edit clicked')
},
{
key: 'properties',
text: 'Properties',
onClick: () => console.log('Properties clicked')
},
{
key: 'linkNoTarget',
text: 'Link same window',
href: 'http://bing.com'
},
{
key: 'linkWithTarget',
text: 'Link new window',
href: 'http://bing.com',
target: '_blank'
},
{
key: 'linkWithOnClick',
name: 'Link click',
href: 'http://bing.com',
onClick: (ev: React.MouseEvent<HTMLAnchorElement | HTMLButtonElement>) => {
alert('Link clicked');
ev.preventDefault();
},
target: '_blank'
},
{
key: 'disabled',
text: 'Disabled item',
disabled: true,
onClick: () => console.error('Disabled item should not be clickable.')
}
];
class ContextualMenuWithCustomMenuListExample extends React.Component<
{},
{
items: IContextualMenuItem[];
}
> {
constructor(props: {}) {
super(props);
this._renderMenuList = this._renderMenuList.bind(this);
this._onAbort = this._onAbort.bind(this);
this._onChange = this._onChange.bind(this);
this.state = {
items: ITEMS
};
}
public render(): JSX.Element {
return (
<div>
<DefaultButton
id="ContextualMenuButton1"
text="Click for ContextualMenu"
menuProps={{
onRenderMenuList: this._renderMenuList,
title: 'Actions',
shouldFocusOnMount: true,
items: this.state.items
}}
/>
</div>
);
}
private _onAbort() {
this.setState({ items: ITEMS });
}
private _onChange(newValue: any) {
const filteredItems = ITEMS.filter(item => item.text && item.text.toLowerCase().includes(newValue.toLowerCase()));
if (!filteredItems || !filteredItems.length) {
filteredItems.push({
key: 'no_results',
onRender: (item, dismissMenu) => (
<div
key="no_results"
style={{
width: '100%',
height: '100px',
display: 'flex',
alignItems: 'center',
justifyContent: 'center'
}}
>
<Icon iconName="SearchIssue" title="No actions found" />
<span>No actions found</span>
</div>
)
});
}
this.setState((prevState, props) => ({
items: filteredItems
}));
}
private _renderMenuList(
menuListProps: IContextualMenuListProps,
defaultRender: IRenderFunction<IContextualMenuListProps>
) {
return (
<div>
<div style={{ borderBottom: '1px solid #ccc' }}>
<SearchBox
placeholder="Filter actions"
onAbort={this._onAbort}
onChange={this._onChange}
styles={{
root: [{ margin: '8px' }]
}}
/>
</div>
{defaultRender(menuListProps)}
</div>
);
}
}
ReactDOM.render(<ContextualMenuWithCustomMenuListExample />, document.getElementById('content'));