overflow.tsx 1.5 KB

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