import {MDCMenu} from '@material/menu'; import {bind} from 'bind-decorator'; import {h} from 'preact'; import MaterialComponent from '../Base/MaterialComponent'; import {List, ListItem} from '../List'; export interface IMenuAnchorProps {} export interface IMenuAnchorState {} export class MenuAnchor extends MaterialComponent< IMenuAnchorProps, IMenuAnchorState > { protected componentName = 'menu-surface--anchor'; protected mdcProps = []; protected materialDom(props) { return
{this.props.children}
; } } export {ListItem as MenuItem} from '../List'; export interface IMenuProps { open?: boolean; 'open-from-top-left'?: boolean; // TODO: Add to docs / remove from here 'open-from-top-right'?: boolean; // TODO: Add to docs / remove from here 'open-from-bottom-left'?: boolean; // TODO: Add to docs / remove from here 'open-from-bottom-right'?: boolean; // TODO: Add to docs / remove from here onSelect?: (e: Event) => void; onCancel?: (e: Event) => void; onMenuClosed?: (e: Event) => void; } export interface IMenuState {} export class Menu extends MaterialComponent { public MDComponent?: MDCMenu; protected componentName = 'menu'; protected mdcProps = [ 'open', 'open-from-top-left', 'open-from-top-right', 'open-from-bottom-left', 'open-from-bottom-right' ]; protected mdcNotifyProps = ['open']; public componentDidMount() { super.componentDidMount(); if (this.control) { this.MDComponent = new MDCMenu(this.control); this.MDComponent.listen('MDCMenu:selected', this.onSelect); this.MDComponent.listen('MDCMenu:cancel', this.onCancel); } this.afterComponentDidMount(); } public componentWillUnmount() { super.componentWillUnmount(); if (this.MDComponent) { this.MDComponent.unlisten('MDCMenu:selected', this.onSelect); this.MDComponent.unlisten('MDCMenu:cancel', this.onCancel); this.MDComponent.destroy(); } } @bind protected onSelect(e) { if (this.props.onSelect) { this.props.onSelect(e); } this.onMenuClosed(e); } @bind protected onCancel(e) { if (this.props.onCancel) { this.props.onCancel(e); } this.onMenuClosed(e); } @bind protected onMenuClosed(e) { if (this.props.onMenuClosed) { this.props.onMenuClosed(e); } } protected materialDom(props) { return (
); } } export default class extends Menu { public static readonly Anchor = MenuAnchor; public static readonly Item = ListItem; }