From 79f572f66f42dfaf949b8da8a4b5dcfdec055599 Mon Sep 17 00:00:00 2001 From: Mathias Jakobsen Date: Wed, 9 Apr 2025 14:45:14 +0100 Subject: [PATCH] Merge pull request #24678 from overleaf/mj-ide-view-help-menu [web] Add remaining options to menu bar GitOrigin-RevId: cf6cc6c2aaf450e362588c514e1a87e923a611b4 --- .../web/frontend/extracted-translations.json | 2 + .../components/toolbar/command-dropdown.tsx | 22 +++++- .../components/toolbar/menu-bar.tsx | 79 ++++++++++++++++--- .../pdf-viewer-controls-toolbar.tsx | 34 ++++++++ .../components/menu-bar/menu-bar-option.tsx | 6 ++ services/web/locales/en.json | 2 + 6 files changed, 131 insertions(+), 14 deletions(-) diff --git a/services/web/frontend/extracted-translations.json b/services/web/frontend/extracted-translations.json index 009135b840..35e6dad990 100644 --- a/services/web/frontend/extracted-translations.json +++ b/services/web/frontend/extracted-translations.json @@ -1170,6 +1170,7 @@ "pdf_in_separate_tab": "", "pdf_only": "", "pdf_only_hide_editor": "", + "pdf_preview": "", "pdf_preview_error": "", "pdf_rendering_error": "", "pdf_unavailable_for_download": "", @@ -1512,6 +1513,7 @@ "shortcut_to_open_advanced_reference_search": "", "show_all_projects": "", "show_document_preamble": "", + "show_equation_preview": "", "show_file_tree": "", "show_hotkeys": "", "show_in_code": "", diff --git a/services/web/frontend/js/features/ide-redesign/components/toolbar/command-dropdown.tsx b/services/web/frontend/js/features/ide-redesign/components/toolbar/command-dropdown.tsx index 8293d2878e..53ada1475b 100644 --- a/services/web/frontend/js/features/ide-redesign/components/toolbar/command-dropdown.tsx +++ b/services/web/frontend/js/features/ide-redesign/components/toolbar/command-dropdown.tsx @@ -21,7 +21,7 @@ type GroupStructure = { title: string children: Array> } -type MenuSectionStructure = { +export type MenuSectionStructure = { title?: string id: string children: Array> @@ -62,6 +62,26 @@ const CommandDropdown = ({ ) } +export const CommandSection = ({ + section: sectionStructure, +}: { + section: MenuSectionStructure +}) => { + const { registry } = useCommandRegistry() + const section = populateSectionOrGroup(sectionStructure, registry) + if (section.children.length === 0) { + return null + } + return ( + <> + {section.title && {section.title}} + {section.children.map(child => ( + + ))} + + ) +} + const CommandDropdownChild = ({ item }: { item: Entry }) => { const onClickHandler = useCallback(() => { if (isTaggedCommand(item)) { diff --git a/services/web/frontend/js/features/ide-redesign/components/toolbar/menu-bar.tsx b/services/web/frontend/js/features/ide-redesign/components/toolbar/menu-bar.tsx index 6d8f999aed..d75dfeb632 100644 --- a/services/web/frontend/js/features/ide-redesign/components/toolbar/menu-bar.tsx +++ b/services/web/frontend/js/features/ide-redesign/components/toolbar/menu-bar.tsx @@ -14,7 +14,13 @@ import MaterialIcon from '@/shared/components/material-icon' import OLSpinner from '@/features/ui/components/ol/ol-spinner' import { useLayoutContext } from '@/shared/context/layout-context' import { useCommandProvider } from '@/features/ide-react/hooks/use-command-provider' -import CommandDropdown, { MenuStructure } from './command-dropdown' +import CommandDropdown, { + CommandSection, + MenuSectionStructure, + MenuStructure, +} from './command-dropdown' +import { useUserSettingsContext } from '@/shared/context/user-settings-context' +import { useRailContext } from '../../contexts/rail-context' export const ToolbarMenuBar = () => { const { t } = useTranslation() @@ -132,6 +138,42 @@ export const ToolbarMenuBar = () => { [t] ) + const pdfControlsMenuSectionStructure: MenuSectionStructure = useMemo( + () => ({ + title: t('pdf_preview'), + id: 'pdf-controls', + children: [ + 'view-pdf-presentation-mode', + 'view-pdf-zoom-in', + 'view-pdf-zoom-out', + 'view-pdf-fit-width', + 'view-pdf-fit-height', + ], + }), + [t] + ) + + const { + userSettings: { mathPreview }, + setUserSettings, + } = useUserSettingsContext() + + const toggleMathPreview = useCallback(() => { + setUserSettings(prev => { + return { + ...prev, + mathPreview: !prev.mathPreview, + } + }) + }, [setUserSettings]) + + const { setActiveModal } = useRailContext() + const openKeyboardShortcutsModal = useCallback(() => { + setActiveModal('keyboard-shortcuts') + }, [setActiveModal]) + const openContactUsModal = useCallback(() => { + setActiveModal('contact-us') + }, [setActiveModal]) return ( { > Editor settings - - - PDF preview - - - - - + + { id="help" className="ide-redesign-toolbar-dropdown-toggle-subdued ide-redesign-toolbar-button-subdued" > - - + + - - + + void @@ -26,6 +28,7 @@ function PdfViewerControlsToolbar({ totalPages, pdfContainer, }: PdfViewerControlsToolbarProps) { + const { t } = useTranslation() const { showLogs } = useCompileContext() const toolbarControlsElement = document.querySelector('#toolbar-pdf-controls') @@ -41,6 +44,37 @@ function PdfViewerControlsToolbar({ const { elementRef: pdfControlsRef } = useResizeObserver(handleResize) + useCommandProvider( + () => [ + { + id: 'view-pdf-presentation-mode', + label: t('presentation_mode'), + handler: requestPresentationMode, + }, + { + id: 'view-pdf-zoom-in', + label: t('zoom_in'), + handler: () => setZoom('zoom-in'), + }, + { + id: 'view-pdf-zoom-out', + label: t('zoom_out'), + handler: () => setZoom('zoom-out'), + }, + { + id: 'view-pdf-fit-width', + label: t('fit_to_width'), + handler: () => setZoom('page-width'), + }, + { + id: 'view-pdf-fit-height', + label: t('fit_to_height'), + handler: () => setZoom('page-height'), + }, + ], + [t, requestPresentationMode, setZoom] + ) + if (!toolbarControlsElement) { return null } diff --git a/services/web/frontend/js/shared/components/menu-bar/menu-bar-option.tsx b/services/web/frontend/js/shared/components/menu-bar/menu-bar-option.tsx index d553a3d263..692f555ea7 100644 --- a/services/web/frontend/js/shared/components/menu-bar/menu-bar-option.tsx +++ b/services/web/frontend/js/shared/components/menu-bar/menu-bar-option.tsx @@ -9,6 +9,8 @@ type MenuBarOptionProps = { disabled?: boolean trailingIcon?: ReactNode href?: string + target?: string + rel?: string } export const MenuBarOption = ({ @@ -17,6 +19,8 @@ export const MenuBarOption = ({ href, disabled, trailingIcon, + target, + rel, }: MenuBarOptionProps) => { const { setSelected } = useNestableDropdown() return ( @@ -27,6 +31,8 @@ export const MenuBarOption = ({ disabled={disabled} trailingIcon={trailingIcon} href={href} + rel={rel} + target={target} > {title} diff --git a/services/web/locales/en.json b/services/web/locales/en.json index dca1bf2a21..3a3550a030 100644 --- a/services/web/locales/en.json +++ b/services/web/locales/en.json @@ -1559,6 +1559,7 @@ "pdf_in_separate_tab": "PDF in separate tab", "pdf_only": "PDF only", "pdf_only_hide_editor": "PDF only <0>(hide editor)", + "pdf_preview": "PDF preview", "pdf_preview_error": "There was a problem displaying the compilation results for this project.", "pdf_rendering_error": "PDF Rendering Error", "pdf_unavailable_for_download": "PDF unavailable for download", @@ -1984,6 +1985,7 @@ "shortcut_to_open_advanced_reference_search": "(__ctrlSpace__ or __altSpace__)", "show_all_projects": "Show all projects", "show_document_preamble": "Show document preamble", + "show_equation_preview": "Show equation preview", "show_file_tree": "Show file tree", "show_hotkeys": "Show Hotkeys", "show_in_code": "Show in code",