toolbar-items.tsx 7.0 KB

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