/** * Created by rburson on 3/30/16. */ import * as React from 'react' import { CvState, CvProps, CvBaseMixin, CvMenuItem, CvMenuItemProps, CvEvent, CvActionFiredResult, CvNavigationResult, CvContext, CvActionCallback, CvValueProvider, CvValueListener, CvActionHandlerParams, CvStateChangeResult } from 'catreact' import {MenuDef, PaneContext, EntityRec} from 'catavolt-sdk' import ReactElement = React.ReactElement; export let CvMenuBase = {} export interface CvMenuState extends CvState { } export interface CvMenuProps extends CvProps { actionListeners?:Array<(event:CvEvent)=>void> menuDef?:MenuDef; title?:string; navigationListeners?:Array<(event:CvEvent)=>void> stateChangeListeners?:Array<(event:CvEvent)=>void> navTarget?:string; paneContext?:PaneContext; selectionProvider?:CvValueProvider>; actionHandler?:CvValueListener; initOpen?:boolean; launchMenuElement?:ReactElement; openLeft?:boolean; } /* *************************************************** * Render a Menu *************************************************** */ export let CvDropdownMenu = React.createClass({ mixins: [CvBaseMixin, CvMenuBase], getDefaultProps: function () { return { paneContext: null, navTarget: null, menuDef: null, title: null, actionListeners: [], navigationListeners: [], stateChangeListeners: [], selectionProvider: null, actionHandler: null, initOpen: false, launchMenuElement: null, openLeft: false } }, render: function () { const itemProps:CvMenuItemProps = { paneContext: this.props.paneContext, navTarget: this.props.navTarget, actionListeners: this.props.actionListeners, navigationListeners: this.props.navigationListeners, stateChangeListeners: this.props.stateChangeListeners, selectionProvider: this.props.selectionProvider, actionHandler: this.props.actionHandler, catavolt: this.props.catavolt, eventRegistry: this.props.eventRegistry }; let menuItemClassName = 'dropdown-menu cv-dropdown-menu'; if (this.props.openLeft) menuItemClassName += ' dropdown-menu-right'; const itemRenderer = (cvContext:CvContext, callback:CvActionCallback)=> { const menuDef:MenuDef = cvContext.scopeCtx.scopeObj; if (menuDef.isSeparator) { return
  • } else if (menuDef.menuDefs && menuDef.menuDefs.length > 0) { return
  • {menuDef.label} { return }}/>
  • } else { return
  • {callback.fireAction()}}>{menuDef.label}
  • } }; return ( { if(this.props.initOpen) { ($(d) as any).dropdown('toggle'); } }}> {(()=>{ if(this.props.launchMenuElement) { return this.props.launchMenuElement; } else { return
    {this.props.title}
    } })()}
    { return }}/>
    ); } }); /* *************************************************** * Render a Toolbar *************************************************** */ export let CvToolbarMenu = React.createClass({ mixins: [CvBaseMixin, CvMenuBase], getDefaultProps: function () { return { paneContext: null, navTarget: null, menuDef: null, title: null, actionListeners: [], navigationListeners: [], stateChangeListeners: [], selectionProvider: null, actionHandler: null } }, render: function () { const itemProps:CvMenuItemProps = { paneContext: this.props.paneContext, navTarget: this.props.navTarget, actionListeners: this.props.actionListeners, navigationListeners: this.props.navigationListeners, stateChangeListeners: this.props.stateChangeListeners, selectionProvider: this.props.selectionProvider, actionHandler: this.props.actionHandler, catavolt: this.props.catavolt, eventRegistry: this.props.eventRegistry }; const itemRenderer = (cvContext:CvContext, callback:CvActionCallback)=> { const menuDef:MenuDef = cvContext.scopeCtx.scopeObj; if (menuDef.isSeparator) { return
  • } else if (menuDef.menuDefs && menuDef.menuDefs.length > 0) { return null; // Not supporting a tool that is a menu } else { // return
  • {callback.fireAction()}}>{menuDef.label}
  • return } }; let tools = []; if (this.props.menuDef && this.props.menuDef.menuDefs) { this.props.menuDef.menuDefs.forEach((md: MenuDef, i: number) => { tools.push( ); }); } return (
    {tools}
    ); } });