toolbar-items.tsx 7.1 KB

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