toolbar-items.tsx 6.8 KB

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