file-tree-item-menu.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import { useState } from 'react'
  2. import { findDOMNode } from 'react-dom'
  3. import PropTypes from 'prop-types'
  4. import { useTranslation } from 'react-i18next'
  5. import withoutPropagation from '../../../../infrastructure/without-propagation'
  6. import { Dropdown, Overlay } from 'react-bootstrap'
  7. import Icon from '../../../../shared/components/icon'
  8. import FileTreeItemMenuItems from './file-tree-item-menu-items'
  9. function FileTreeItemMenu({ id }) {
  10. const { t } = useTranslation()
  11. const [dropdownOpen, setDropdownOpen] = useState(false)
  12. const [dropdownTarget, setDropdownTarget] = useState()
  13. function handleToggle(wantOpen) {
  14. setDropdownOpen(wantOpen)
  15. }
  16. function handleClick() {
  17. handleToggle(false)
  18. }
  19. const toggleRef = component => {
  20. if (component) {
  21. // eslint-disable-next-line react/no-find-dom-node
  22. setDropdownTarget(findDOMNode(component))
  23. }
  24. }
  25. return (
  26. <Dropdown
  27. onClick={withoutPropagation(handleClick)}
  28. pullRight
  29. open={dropdownOpen}
  30. id={`dropdown-${id}`}
  31. onToggle={handleToggle}
  32. >
  33. <Dropdown.Toggle
  34. noCaret
  35. className="dropdown-toggle-no-background entity-menu-toggle"
  36. onClick={withoutPropagation()}
  37. ref={toggleRef}
  38. >
  39. <Icon type="ellipsis-v" accessibilityLabel={t('menu')} />
  40. </Dropdown.Toggle>
  41. <Overlay
  42. bsRole="menu"
  43. show={dropdownOpen}
  44. target={dropdownTarget}
  45. container={document.body}
  46. >
  47. <Menu dropdownId={`dropdown-${id}`} />
  48. </Overlay>
  49. </Dropdown>
  50. )
  51. }
  52. FileTreeItemMenu.propTypes = {
  53. id: PropTypes.string.isRequired,
  54. }
  55. function Menu({ dropdownId, style, className }) {
  56. return (
  57. <div className={`dropdown open ${className}`} style={style}>
  58. <ul className="dropdown-menu" role="menu" aria-labelledby={dropdownId}>
  59. <FileTreeItemMenuItems />
  60. </ul>
  61. </div>
  62. )
  63. }
  64. Menu.propTypes = {
  65. dropdownId: PropTypes.string.isRequired,
  66. style: PropTypes.object,
  67. className: PropTypes.string,
  68. }
  69. export default FileTreeItemMenu