overflow.tsx 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import { FC, LegacyRef, memo } from 'react'
  2. import { Button, Overlay, Popover } from 'react-bootstrap'
  3. import classnames from 'classnames'
  4. import Icon from '../../../../shared/components/icon'
  5. export const ToolbarOverflow: FC<{
  6. overflowed: boolean
  7. target?: HTMLDivElement
  8. overflowOpen: boolean
  9. setOverflowOpen: (open: boolean) => void
  10. overflowRef?: LegacyRef<Popover>
  11. }> = memo(function ToolbarOverflow({
  12. overflowed,
  13. target,
  14. overflowOpen,
  15. setOverflowOpen,
  16. overflowRef,
  17. children,
  18. }) {
  19. const className = classnames(
  20. 'ol-cm-toolbar-button',
  21. 'ol-cm-toolbar-overflow-toggle',
  22. {
  23. 'ol-cm-toolbar-overflow-toggle-visible': overflowed,
  24. }
  25. )
  26. return (
  27. <>
  28. <Button
  29. type="button"
  30. id="toolbar-more"
  31. className={className}
  32. aria-label="More"
  33. bsStyle={null}
  34. onMouseDown={event => {
  35. event.preventDefault()
  36. event.stopPropagation()
  37. }}
  38. onClick={() => {
  39. setOverflowOpen(!overflowOpen)
  40. }}
  41. >
  42. <Icon type="ellipsis-h" fw />
  43. </Button>
  44. <Overlay
  45. show={overflowOpen}
  46. target={target}
  47. placement="bottom"
  48. container={document.querySelector('.cm-editor')}
  49. containerPadding={0}
  50. animation
  51. onHide={() => setOverflowOpen(false)}
  52. >
  53. <Popover id="popover-toolbar-overflow" ref={overflowRef}>
  54. <div className="ol-cm-toolbar-overflow">{children}</div>
  55. </Popover>
  56. </Overlay>
  57. </>
  58. )
  59. })