toolbar-items.tsx 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. import { FC, memo } from 'react'
  2. import { EditorState } from '@codemirror/state'
  3. import { useEditorContext } from '../../../../shared/context/editor-context'
  4. import { ToolbarButton } from './toolbar-button'
  5. import { redo, undo } from '@codemirror/commands'
  6. import * as commands from '../../extensions/toolbar/commands'
  7. import { SectionHeadingDropdown } from './section-heading-dropdown'
  8. import getMeta from '../../../../utils/meta'
  9. import { InsertFigureDropdown } from './insert-figure-dropdown'
  10. import { useTranslation } from 'react-i18next'
  11. import { MathDropdown } from './math-dropdown'
  12. import { TableInserterDropdown } from './table-inserter-dropdown'
  13. import { withinFormattingCommand } from '@/features/source-editor/utils/tree-operations/formatting'
  14. import { isMac } from '@/shared/utils/os'
  15. export const ToolbarItems: FC<{
  16. state: EditorState
  17. overflowed?: Set<string>
  18. languageName?: string
  19. visual: boolean
  20. listDepth: number
  21. }> = memo(function ToolbarItems({
  22. state,
  23. overflowed,
  24. languageName,
  25. visual,
  26. listDepth,
  27. }) {
  28. const { t } = useTranslation()
  29. const { toggleSymbolPalette, showSymbolPalette } = useEditorContext()
  30. const isActive = withinFormattingCommand(state)
  31. const symbolPaletteAvailable = getMeta('ol-symbolPaletteAvailable')
  32. const showGroup = (group: string) => !overflowed || overflowed.has(group)
  33. return (
  34. <>
  35. {showGroup('group-history') && (
  36. <div
  37. className="ol-cm-toolbar-button-group"
  38. aria-label={t('toolbar_undo_redo_actions')}
  39. >
  40. <ToolbarButton
  41. id="toolbar-undo"
  42. label={t('toolbar_undo')}
  43. command={undo}
  44. icon="undo"
  45. shortcut={isMac ? '⌘Z' : 'Ctrl+Z'}
  46. />
  47. <ToolbarButton
  48. id="toolbar-redo"
  49. label={t('toolbar_redo')}
  50. command={redo}
  51. icon="redo"
  52. shortcut={isMac ? '⇧⌘Z' : 'Ctrl+Y'}
  53. />
  54. </div>
  55. )}
  56. {languageName === 'latex' && (
  57. <>
  58. {showGroup('group-section') && (
  59. <div
  60. className="ol-cm-toolbar-button-group"
  61. data-overflow="group-section"
  62. aria-label={t('toolbar_text_formatting')}
  63. >
  64. <SectionHeadingDropdown />
  65. </div>
  66. )}
  67. {showGroup('group-format') && (
  68. <div
  69. className="ol-cm-toolbar-button-group"
  70. aria-label={t('toolbar_text_style')}
  71. >
  72. <ToolbarButton
  73. id="toolbar-format-bold"
  74. label={t('toolbar_format_bold')}
  75. command={commands.toggleBold}
  76. active={isActive('\\textbf')}
  77. icon="format_bold"
  78. shortcut={isMac ? '⌘B' : 'Ctrl+B'}
  79. />
  80. <ToolbarButton
  81. id="toolbar-format-italic"
  82. label={t('toolbar_format_italic')}
  83. command={commands.toggleItalic}
  84. active={isActive('\\textit')}
  85. icon="format_italic"
  86. shortcut={isMac ? '⌘I' : 'Ctrl+I'}
  87. />
  88. </div>
  89. )}
  90. {showGroup('group-math') && (
  91. <div
  92. className="ol-cm-toolbar-button-group"
  93. data-overflow="group-math"
  94. aria-label={t('toolbar_insert_math_and_symbols')}
  95. >
  96. <MathDropdown />
  97. {symbolPaletteAvailable && (
  98. <ToolbarButton
  99. id="toolbar-toggle-symbol-palette"
  100. label={t('toolbar_toggle_symbol_palette')}
  101. active={showSymbolPalette}
  102. command={toggleSymbolPalette}
  103. icon="Ω"
  104. textIcon
  105. className="ol-cm-toolbar-button-math"
  106. />
  107. )}
  108. </div>
  109. )}
  110. {showGroup('group-misc') && (
  111. <div
  112. className="ol-cm-toolbar-button-group"
  113. data-overflow="group-misc"
  114. aria-label={t('toolbar_insert_misc')}
  115. >
  116. <ToolbarButton
  117. id="toolbar-href"
  118. label={t('toolbar_insert_link')}
  119. command={commands.wrapInHref}
  120. icon="add_link"
  121. />
  122. <ToolbarButton
  123. id="toolbar-add-comment"
  124. label={t('add_comment')}
  125. disabled={state.selection.main.empty}
  126. command={commands.addComment}
  127. icon="add_comment"
  128. />
  129. <ToolbarButton
  130. id="toolbar-ref"
  131. label={t('toolbar_insert_cross_reference')}
  132. command={commands.insertRef}
  133. icon="sell"
  134. />
  135. <ToolbarButton
  136. id="toolbar-cite"
  137. label={t('toolbar_insert_citation')}
  138. command={commands.insertCite}
  139. icon="book_5"
  140. />
  141. <InsertFigureDropdown />
  142. <TableInserterDropdown />
  143. </div>
  144. )}
  145. {showGroup('group-list') && (
  146. <div
  147. className="ol-cm-toolbar-button-group"
  148. data-overflow="group-list"
  149. aria-label={t('toolbar_list_indentation')}
  150. >
  151. <ToolbarButton
  152. id="toolbar-bullet-list"
  153. label={t('toolbar_bullet_list')}
  154. command={commands.toggleBulletList}
  155. icon="format_list_bulleted"
  156. />
  157. <ToolbarButton
  158. id="toolbar-numbered-list"
  159. label={t('toolbar_numbered_list')}
  160. command={commands.toggleNumberedList}
  161. icon="format_list_numbered"
  162. />
  163. <ToolbarButton
  164. id="toolbar-format-indent-decrease"
  165. label={t('toolbar_decrease_indent')}
  166. command={commands.indentDecrease}
  167. icon="format_indent_decrease"
  168. shortcut={visual ? (isMac ? '⌘[' : 'Ctrl+[') : undefined}
  169. disabled={listDepth < 2}
  170. />
  171. <ToolbarButton
  172. id="toolbar-format-indent-increase"
  173. label={t('toolbar_increase_indent')}
  174. command={commands.indentIncrease}
  175. icon="format_indent_increase"
  176. shortcut={visual ? (isMac ? '⌘]' : 'Ctrl+]') : undefined}
  177. disabled={listDepth < 1}
  178. />
  179. </div>
  180. )}
  181. </>
  182. )}
  183. </>
  184. )
  185. })