metamaps--metamaps/frontend/src/components/common/ContextMenu.js

166 lines
6 KiB
JavaScript
Raw Normal View History

2017-09-18 23:30:33 -04:00
import React, { Component } from 'react'
import PropTypes from 'prop-types'
import MetacodeSelect from '../MetacodeSelect'
2017-09-12 15:17:15 -04:00
class ContextMenu extends Component {
static propTypes = {
2017-09-18 23:30:33 -04:00
topicId: PropTypes.string,
mapId: PropTypes.string,
currentUser: PropTypes.object,
map: PropTypes.object,
2017-09-18 23:30:33 -04:00
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
}
2017-09-12 15:17:15 -04:00
}
render () {
2017-09-18 23:30:33 -04:00
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)
2017-09-12 15:17:15 -04:00
const style = {
position: 'absolute',
2017-09-18 23:30:33 -04:00
top: contextPos.y + 'px',
left: contextPos.x + 'px'
2017-09-12 15:17:15 -04:00
}
2017-09-18 23:30:33 -04:00
const populateSiblings = () => {
if (!this.state.populateSiblingsSent) {
contextPopulateSiblings(contextNode.id)
this.setState({populateSiblingsSent: true})
}
}
2017-09-12 15:17:15 -04:00
return <div className="rightclickmenu" style={style}>
<ul>
<li className="rc-hide" onClick={contextHide}>
2017-09-18 23:30:33 -04:00
<div className="rc-icon" />Hide until refresh
<div className="rc-keyboard">Ctrl+H</div>
2017-09-12 15:17:15 -04:00
</li>
{canEditMap && <li className="rc-remove" onClick={contextRemove}>
2017-09-18 23:30:33 -04:00
<div className="rc-icon" />Remove from map
<div className="rc-keyboard">Ctrl+M</div>
</li>}
{canEditMap && <li className="rc-delete" onClick={contextDelete}>
2017-09-18 23:30:33 -04:00
<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)}>
2017-09-18 23:30:33 -04:00
<div className="rc-icon" />Open in new tab
</li>}
{(currentUser || (contextNode && topicId)) && <li className="rc-spacer">
</li>}
{currentUser && <li className="rc-permission">
2017-09-18 23:30:33 -04:00
<div className="rc-icon" />Change permissions
2017-09-12 15:17:15 -04:00
<ul>
<li className="changeP toCommons"
onClick={() => contextUpdatePermissions('commons')}>
2017-09-18 23:30:33 -04:00
<div className="rc-perm-icon" />commons
</li>
<li className="changeP toPublic"
onClick={() => contextUpdatePermissions('public')}>
2017-09-18 23:30:33 -04:00
<div className="rc-perm-icon" />public
</li>
<li className="changeP toPrivate"
onClick={() => contextUpdatePermissions('private')}>
2017-09-18 23:30:33 -04:00
<div className="rc-perm-icon" />private
</li>
2017-09-12 15:17:15 -04:00
</ul>
2017-09-18 23:30:33 -04:00
<div className="expandLi" />
</li>}
{currentUser && <li className="rc-metacode">
2017-09-18 23:30:33 -04:00
<div className="rc-icon" />Change metacode
<div id="metacodeOptionsWrapper">
<MetacodeSelect
onMetacodeSelect={id => {
contextOnMetacodeSelect(contextNode && contextNode.id, id)
}}
2017-09-18 23:30:33 -04:00
metacodeSets={metacodeSets} />
</div>
<div className="expandLi" />
</li>}
2017-09-18 23:30:33 -04:00
{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>}
2017-09-18 23:30:33 -04:00
</ul>
<div className="expandLi" />
</li>}
2017-09-12 15:17:15 -04:00
</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