diff options
| author | bob <bcz@cs.brown.edu> | 2019-06-11 10:53:36 -0400 | 
|---|---|---|
| committer | bob <bcz@cs.brown.edu> | 2019-06-11 10:53:36 -0400 | 
| commit | 95674ee7f68782d1ce85858120efea956825bcb9 (patch) | |
| tree | 0d2ddc9838b45278d6533099f7030a9713d6413f /src/client/views/ContextMenuItem.tsx | |
| parent | 4dacd1220e6a0ef73167f187f52f3b4c222c2586 (diff) | |
| parent | 06d5bb5c65da6f4a115ebf8118989115420bccef (diff) | |
merged embedded linking with master
Diffstat (limited to 'src/client/views/ContextMenuItem.tsx')
| -rw-r--r-- | src/client/views/ContextMenuItem.tsx | 59 | 
1 files changed, 53 insertions, 6 deletions
diff --git a/src/client/views/ContextMenuItem.tsx b/src/client/views/ContextMenuItem.tsx index 70813f0dd..fcda0db89 100644 --- a/src/client/views/ContextMenuItem.tsx +++ b/src/client/views/ContextMenuItem.tsx @@ -1,25 +1,72 @@  import React = require("react"); +import { observable, action } from "mobx"; +import { observer } from "mobx-react"; +import { IconProp } from '@fortawesome/fontawesome-svg-core'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -export interface ContextMenuProps { +export interface OriginalMenuProps {      description: string;      event: (e: React.MouseEvent<HTMLDivElement>) => void; +    icon?: IconProp; //maybe should be optional (icon?) +    closeMenu?: () => void;  }  export interface SubmenuProps {      description: string;      subitems: ContextMenuProps[]; +    closeMenu?: () => void;  }  export interface ContextMenuItemProps {      type: ContextMenuProps | SubmenuProps;  } +export type ContextMenuProps = OriginalMenuProps | SubmenuProps; +@observer  export class ContextMenuItem extends React.Component<ContextMenuProps> { +    @observable private _items: Array<ContextMenuProps> = []; +    @observable private overItem = false; + +    constructor(props: ContextMenuProps | SubmenuProps) { +        super(props); +        if ("subitems" in this.props) { +            this.props.subitems.forEach(i => this._items.push(i)); +        } +    } + +    handleEvent = (e: React.MouseEvent<HTMLDivElement>) => { +        if ("event" in this.props) { +            this.props.event(e); +            this.props.closeMenu && this.props.closeMenu(); +        } +    } +      render() { -        return ( -            <div className="contextMenu-item" onClick={this.props.event}> -                <div className="contextMenu-description">{this.props.description}</div> -            </div> -        ); +        if ("event" in this.props) { +            return ( +                <div className="contextMenu-item" onClick={this.handleEvent}> +                    <span className="icon-background"> +                        {this.props.icon ? <FontAwesomeIcon icon={this.props.icon} size="sm" /> : <FontAwesomeIcon icon="circle" size="sm" />} +                    </span> +                    <div className="contextMenu-description"> +                        {this.props.description} +                    </div> +                </div> +            ); +        } +        else { +            let submenu = !this.overItem ? (null) : +                <div className="contextMenu-subMenu-cont" style={{ marginLeft: "100.5%", left: "0px" }}> +                    {this._items.map(prop => <ContextMenuItem {...prop} key={prop.description} closeMenu={this.props.closeMenu} />)} +                </div>; +            return ( +                <div className="contextMenu-item" onMouseEnter={action(() => { this.overItem = true; })} onMouseLeave={action(() => this.overItem = false)}> +                    <div className="contextMenu-description"> +                        {this.props.description} +                    </div> +                    {submenu} +                </div> +            ); +        }      }  }
\ No newline at end of file  | 
