toolbar-items.tsx 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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. const isMac = /Mac/.test(window.navigator?.platform)
  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 className="ol-cm-toolbar-button-group">
  37. <ToolbarButton
  38. id="toolbar-undo"
  39. label={t('toolbar_undo')}
  40. command={undo}
  41. icon="undo"
  42. shortcut={isMac ? '⌘Z' : 'Ctrl+Z'}
  43. />
  44. <ToolbarButton
  45. id="toolbar-redo"
  46. label={t('toolbar_redo')}
  47. command={redo}
  48. icon="repeat"
  49. shortcut={isMac ? '⇧⌘Z' : 'Ctrl+Y'}
  50. />
  51. </div>
  52. )}
  53. {languageName === 'latex' && (
  54. <>
  55. {showGroup('group-section') && (
  56. <div
  57. className="ol-cm-toolbar-button-group"
  58. data-overflow="group-section"
  59. >
  60. <SectionHeadingDropdown />
  61. </div>
  62. )}
  63. {showGroup('group-format') && (
  64. <div className="ol-cm-toolbar-button-group">
  65. <ToolbarButton
  66. id="toolbar-format-bold"
  67. label={t('toolbar_format_bold')}
  68. command={commands.toggleBold}
  69. active={isActive('\\textbf')}
  70. icon="bold"
  71. shortcut={isMac ? '⌘B' : 'Ctrl+B'}
  72. />
  73. <ToolbarButton
  74. id="toolbar-format-italic"
  75. label={t('toolbar_format_italic')}
  76. command={commands.toggleItalic}
  77. active={isActive('\\textit')}
  78. icon="italic"
  79. shortcut={isMac ? '⌘I' : 'Ctrl+I'}
  80. />
  81. </div>
  82. )}
  83. {showGroup('group-math') && (
  84. <div
  85. className="ol-cm-toolbar-button-group"
  86. data-overflow="group-math"
  87. >
  88. <MathDropdown />
  89. {symbolPaletteAvailable && (
  90. <ToolbarButton
  91. id="toolbar-toggle-symbol-palette"
  92. label={t('toolbar_toggle_symbol_palette')}
  93. active={showSymbolPalette}
  94. command={toggleSymbolPalette}
  95. icon="Ω"
  96. textIcon
  97. className="ol-cm-toolbar-button-math"
  98. />
  99. )}
  100. </div>
  101. )}
  102. {showGroup('group-misc') && (
  103. <div
  104. className="ol-cm-toolbar-button-group"
  105. data-overflow="group-misc"
  106. >
  107. <ToolbarButton
  108. id="toolbar-href"
  109. label={t('toolbar_insert_link')}
  110. command={commands.wrapInHref}
  111. icon="link"
  112. />
  113. <ToolbarButton
  114. id="toolbar-ref"
  115. label={t('toolbar_insert_cross_reference')}
  116. command={commands.insertRef}
  117. icon="tag"
  118. />
  119. <ToolbarButton
  120. id="toolbar-cite"
  121. label={t('toolbar_insert_citation')}
  122. command={commands.insertCite}
  123. icon="book"
  124. />
  125. <InsertFigureDropdown />
  126. <TableInserterDropdown />
  127. </div>
  128. )}
  129. {showGroup('group-list') && (
  130. <div
  131. className="ol-cm-toolbar-button-group"
  132. data-overflow="group-list"
  133. >
  134. <ToolbarButton
  135. id="toolbar-bullet-list"
  136. label={t('toolbar_bullet_list')}
  137. command={commands.toggleBulletList}
  138. icon="list-ul"
  139. />
  140. <ToolbarButton
  141. id="toolbar-numbered-list"
  142. label={t('toolbar_numbered_list')}
  143. command={commands.toggleNumberedList}
  144. icon="list-ol"
  145. />
  146. <ToolbarButton
  147. id="toolbar-format-indent-decrease"
  148. label={t('toolbar_decrease_indent')}
  149. command={commands.indentDecrease}
  150. icon="outdent"
  151. shortcut={visual ? (isMac ? '⌘[' : 'Ctrl+[') : undefined}
  152. disabled={listDepth < 2}
  153. />
  154. <ToolbarButton
  155. id="toolbar-format-indent-increase"
  156. label={t('toolbar_increase_indent')}
  157. command={commands.indentIncrease}
  158. icon="indent"
  159. shortcut={visual ? (isMac ? '⌘]' : 'Ctrl+]') : undefined}
  160. disabled={listDepth < 1}
  161. />
  162. </div>
  163. )}
  164. </>
  165. )}
  166. </>
  167. )
  168. })