|
|
@@ -7,7 +7,7 @@ import {
|
|
|
findCurrentSectionHeadingLevel,
|
|
|
setSectionHeadingLevel,
|
|
|
} from '../../extensions/toolbar/sections'
|
|
|
-import { useCallback, useRef } from 'react'
|
|
|
+import { useCallback, useMemo, useRef } from 'react'
|
|
|
import { Overlay, Popover } from 'react-bootstrap'
|
|
|
import useEventListener from '../../../../shared/hooks/use-event-listener'
|
|
|
import useDropdown from '../../../../shared/hooks/use-dropdown'
|
|
|
@@ -42,7 +42,11 @@ export const SectionHeadingDropdown = () => {
|
|
|
|
|
|
const toggleButtonRef = useRef<HTMLButtonElement | null>(null)
|
|
|
|
|
|
- const currentLevel = findCurrentSectionHeadingLevel(state)
|
|
|
+ const currentLevel = useMemo(
|
|
|
+ () => findCurrentSectionHeadingLevel(state),
|
|
|
+ [state]
|
|
|
+ )
|
|
|
+
|
|
|
const currentLabel = currentLevel
|
|
|
? levels.get(currentLevel.level) ?? currentLevel.level
|
|
|
: '---'
|
|
|
@@ -64,52 +68,54 @@ export const SectionHeadingDropdown = () => {
|
|
|
<Icon type="caret-down" fw />
|
|
|
</button>
|
|
|
|
|
|
- <Overlay
|
|
|
- show={overflowOpen}
|
|
|
- onHide={() => setOverflowOpen(false)}
|
|
|
- animation={false}
|
|
|
- container={document.querySelector('.cm-editor')}
|
|
|
- containerPadding={0}
|
|
|
- placement="bottom"
|
|
|
- rootClose
|
|
|
- target={toggleButtonRef.current ?? undefined}
|
|
|
- >
|
|
|
- <Popover
|
|
|
- id="popover-toolbar-section-heading"
|
|
|
- className="ol-cm-toolbar-menu-popover"
|
|
|
+ {overflowOpen && (
|
|
|
+ <Overlay
|
|
|
+ show
|
|
|
+ onHide={() => setOverflowOpen(false)}
|
|
|
+ animation={false}
|
|
|
+ container={view.dom}
|
|
|
+ containerPadding={0}
|
|
|
+ placement="bottom"
|
|
|
+ rootClose
|
|
|
+ target={toggleButtonRef.current ?? undefined}
|
|
|
>
|
|
|
- <div
|
|
|
- className="ol-cm-toolbar-menu"
|
|
|
- id="section-heading-menu"
|
|
|
- role="menu"
|
|
|
- aria-labelledby="section-heading-menu-button"
|
|
|
+ <Popover
|
|
|
+ id="popover-toolbar-section-heading"
|
|
|
+ className="ol-cm-toolbar-menu-popover"
|
|
|
>
|
|
|
- {levelsEntries.map(([level, label]) => (
|
|
|
- <button
|
|
|
- type="button"
|
|
|
- role="menuitem"
|
|
|
- key={level}
|
|
|
- onClick={() => {
|
|
|
- emitToolbarEvent(view, 'section-level-change')
|
|
|
- setSectionHeadingLevel(view, level)
|
|
|
- view.focus()
|
|
|
- setOverflowOpen(false)
|
|
|
- }}
|
|
|
- className={classnames(
|
|
|
- 'ol-cm-toolbar-menu-item',
|
|
|
- `section-level-${level}`,
|
|
|
- {
|
|
|
- 'ol-cm-toolbar-menu-item-active':
|
|
|
- level === currentLevel?.level,
|
|
|
- }
|
|
|
- )}
|
|
|
- >
|
|
|
- {label}
|
|
|
- </button>
|
|
|
- ))}
|
|
|
- </div>
|
|
|
- </Popover>
|
|
|
- </Overlay>
|
|
|
+ <div
|
|
|
+ className="ol-cm-toolbar-menu"
|
|
|
+ id="section-heading-menu"
|
|
|
+ role="menu"
|
|
|
+ aria-labelledby="section-heading-menu-button"
|
|
|
+ >
|
|
|
+ {levelsEntries.map(([level, label]) => (
|
|
|
+ <button
|
|
|
+ type="button"
|
|
|
+ role="menuitem"
|
|
|
+ key={level}
|
|
|
+ onClick={() => {
|
|
|
+ emitToolbarEvent(view, 'section-level-change')
|
|
|
+ setSectionHeadingLevel(view, level)
|
|
|
+ view.focus()
|
|
|
+ setOverflowOpen(false)
|
|
|
+ }}
|
|
|
+ className={classnames(
|
|
|
+ 'ol-cm-toolbar-menu-item',
|
|
|
+ `section-level-${level}`,
|
|
|
+ {
|
|
|
+ 'ol-cm-toolbar-menu-item-active':
|
|
|
+ level === currentLevel?.level,
|
|
|
+ }
|
|
|
+ )}
|
|
|
+ >
|
|
|
+ {label}
|
|
|
+ </button>
|
|
|
+ ))}
|
|
|
+ </div>
|
|
|
+ </Popover>
|
|
|
+ </Overlay>
|
|
|
+ )}
|
|
|
</>
|
|
|
)
|
|
|
}
|