import React, { Component } from 'react' import PropTypes from 'prop-types' import MetacodeSelect from '../MetacodeSelect' class ContextMenu extends Component { static propTypes = { topicId: PropTypes.string, mapId: PropTypes.string, currentUser: PropTypes.object, map: PropTypes.object, contextNode: PropTypes.object, contextEdge: PropTypes.object, contextPos: PropTypes.object, contextFetchingSiblingsData: PropTypes.bool, contextSiblingsData: PropTypes.object, metacodeSets: PropTypes.array, contextDelete: PropTypes.func, contextRemove: PropTypes.func, contextHide: PropTypes.func, contextCenterOn: PropTypes.func, contextPopoutTopic: PropTypes.func, contextUpdatePermissions: PropTypes.func, contextOnMetacodeSelect: PropTypes.func, contextFetchSiblings: PropTypes.func, contextPopulateSiblings: PropTypes.func } constructor(props) { super(props) this.state = { populateSiblingsSent: false } } render () { const { contextNode, contextPos, contextOnMetacodeSelect, metacodeSets, contextDelete, contextHide, contextRemove, contextCenterOn, contextPopoutTopic, contextSiblingsData, contextFetchSiblings, currentUser, contextPopulateSiblings, contextFetchingSiblingsData, topicId, map, mapId, contextUpdatePermissions } = this.props const canEditMap = map && map.authorizeToEdit(currentUser) const style = { position: 'absolute', top: contextPos.y + 'px', left: contextPos.x + 'px' } const populateSiblings = () => { if (!this.state.populateSiblingsSent) { contextPopulateSiblings(contextNode.id) this.setState({populateSiblingsSent: true}) } } return <div className="rightclickmenu" style={style}> <ul> <li className="rc-hide" onClick={contextHide}> <div className="rc-icon" />Hide until refresh <div className="rc-keyboard">Ctrl+H</div> </li> {canEditMap && <li className="rc-remove" onClick={contextRemove}> <div className="rc-icon" />Remove from map <div className="rc-keyboard">Ctrl+M</div> </li>} {canEditMap && <li className="rc-delete" onClick={contextDelete}> <div className="rc-icon" />Delete <div className="rc-keyboard">Ctrl+D</div> </li>} {contextNode && topicId && <li className="rc-center" onClick={() => contextCenterOn(contextNode.id)}> <div className="rc-icon" />Center this topic <div className="rc-keyboard">Alt+E</div> </li>} {contextNode && <li className="rc-popout" onClick={() => contextPopoutTopic(contextNode.id)}> <div className="rc-icon" />Open in new tab </li>} {(currentUser || (contextNode && topicId)) && <li className="rc-spacer"> </li>} {currentUser && <li className="rc-permission"> <div className="rc-icon" />Change permissions <ul> <li className="changeP toCommons" onClick={() => contextUpdatePermissions('commons')}> <div className="rc-perm-icon" />commons </li> <li className="changeP toPublic" onClick={() => contextUpdatePermissions('public')}> <div className="rc-perm-icon" />public </li> <li className="changeP toPrivate" onClick={() => contextUpdatePermissions('private')}> <div className="rc-perm-icon" />private </li> </ul> <div className="expandLi" /> </li>} {currentUser && <li className="rc-metacode"> <div className="rc-icon" />Change metacode <div id="metacodeOptionsWrapper"> <MetacodeSelect onMetacodeSelect={id => { contextOnMetacodeSelect(contextNode && contextNode.id, id) }} metacodeSets={metacodeSets} /> </div> <div className="expandLi" /> </li>} {contextNode && topicId && <li className="rc-siblings" onMouseOver={populateSiblings}> <div className="rc-icon" />Reveal siblings <ul id="fetchSiblingList"> <li className="fetchAll" onClick={() => contextFetchSiblings(contextNode)}>All <div className="rc-keyboard">Alt+R</div> </li> {contextSiblingsData && Object.keys(contextSiblingsData).map(key => { return <li key={key} onClick={() => contextFetchSiblings(contextNode, key)}> {contextSiblingsData[key]} </li> })} {contextFetchingSiblingsData && <li id="loadingSiblings">loading...</li>} </ul> <div className="expandLi" /> </li>} </ul> </div> // position the menu where the click happened /*const position = {} const RIGHTCLICK_WIDTH = 300 const RIGHTCLICK_HEIGHT = 144 // this does vary somewhat, but we can use static const SUBMENUS_WIDTH = 256 const MAX_SUBMENU_HEIGHT = 270 const windowWidth = $(window).width() const windowHeight = $(window).height() if (windowWidth - e.clientX < SUBMENUS_WIDTH) { position.right = windowWidth - e.clientX $(rightclickmenu).addClass('moveMenusToLeft') } else if (windowWidth - e.clientX < RIGHTCLICK_WIDTH) { position.right = windowWidth - e.clientX } else if (windowWidth - e.clientX < RIGHTCLICK_WIDTH + SUBMENUS_WIDTH) { position.left = e.clientX $(rightclickmenu).addClass('moveMenusToLeft') } else { position.left = e.clientX } if (windowHeight - e.clientY < MAX_SUBMENU_HEIGHT) { position.bottom = windowHeight - e.clientY $(rightclickmenu).addClass('moveMenusUp') } else if (windowHeight - e.clientY < RIGHTCLICK_HEIGHT + MAX_SUBMENU_HEIGHT) { position.top = e.clientY $(rightclickmenu).addClass('moveMenusUp') } else { position.top = e.clientY }*/ } } export default ContextMenu