From 47745cb79c34239b58df61083e1af2c0d2ba1d16 Mon Sep 17 00:00:00 2001 From: Aman Harwara Date: Sat, 17 Feb 2024 19:20:16 +0530 Subject: [PATCH] feat: Added "Find in note" option to note options/context menu for Super notes --- .../Components/NotesOptions/NotesOptions.tsx | 20 +--------- .../NotesOptions/SuperNoteOptions.tsx | 34 ++++++++++++++--- .../Plugins/SearchPlugin/SearchDialog.tsx | 38 +++++++++++-------- .../Plugins/SearchPlugin/SearchPlugin.tsx | 22 +---------- 4 files changed, 53 insertions(+), 61 deletions(-) diff --git a/packages/web/src/javascripts/Components/NotesOptions/NotesOptions.tsx b/packages/web/src/javascripts/Components/NotesOptions/NotesOptions.tsx index 8b1d92782..39905eb0d 100644 --- a/packages/web/src/javascripts/Components/NotesOptions/NotesOptions.tsx +++ b/packages/web/src/javascripts/Components/NotesOptions/NotesOptions.tsx @@ -8,7 +8,6 @@ import { PIN_NOTE_COMMAND, SHOW_HIDDEN_OPTIONS_KEYBOARD_COMMAND, STAR_NOTE_COMMAND, - SUPER_SHOW_MARKDOWN_PREVIEW, } from '@standardnotes/ui-services' import ChangeEditorOption from './ChangeEditorOption' import ListedActionsOption from './Listed/ListedActionsOption' @@ -24,7 +23,6 @@ import { KeyboardShortcutIndicator } from '../KeyboardShortcutIndicator/Keyboard import { NoteAttributes } from './NoteAttributes' import { SpellcheckOptions } from './SpellcheckOptions' import { NoteSizeWarning } from './NoteSizeWarning' -import { useCommandService } from '../CommandProvider' import { iconClass } from './ClassNames' import SuperNoteOptions from './SuperNoteOptions' import MenuSwitchButtonItem from '../Menu/MenuSwitchButtonItem' @@ -48,12 +46,6 @@ const NotesOptions = ({ notes, closeMenu }: NotesOptionsProps) => { const [altKeyDown, setAltKeyDown] = useState(false) const { toggleAppPane } = useResponsiveAppPane() - const commandService = useCommandService() - - const markdownShortcut = useMemo( - () => commandService.keyboardShortcutForCommand(SUPER_SHOW_MARKDOWN_PREVIEW), - [commandService], - ) const toggleOn = (condition: (note: SNNote) => boolean) => { const notesMatchingAttribute = notes.filter(condition) @@ -213,10 +205,6 @@ const NotesOptions = ({ notes, closeMenu }: NotesOptionsProps) => { [application], ) - const enableSuperMarkdownPreview = useCallback(() => { - commandService.triggerCommand(SUPER_SHOW_MARKDOWN_PREVIEW) - }, [commandService]) - const toggleLineWidthModal = useCallback(() => { application.keyboardService.triggerCommand(CHANGE_EDITOR_WIDTH_COMMAND) }, [application.keyboardService]) @@ -468,13 +456,7 @@ const NotesOptions = ({ notes, closeMenu }: NotesOptionsProps) => { {notes.length === 1 && ( <> - {notes[0].noteType === NoteType.Super && ( - - )} + {notes[0].noteType === NoteType.Super && } {!areSomeNotesInSharedVault && ( diff --git a/packages/web/src/javascripts/Components/NotesOptions/SuperNoteOptions.tsx b/packages/web/src/javascripts/Components/NotesOptions/SuperNoteOptions.tsx index 9182520a2..7cc2f2969 100644 --- a/packages/web/src/javascripts/Components/NotesOptions/SuperNoteOptions.tsx +++ b/packages/web/src/javascripts/Components/NotesOptions/SuperNoteOptions.tsx @@ -1,20 +1,42 @@ -import { SNNote } from '@standardnotes/snjs' -import { PlatformedKeyboardShortcut } from '@standardnotes/ui-services' import Icon from '../Icon/Icon' import { KeyboardShortcutIndicator } from '../KeyboardShortcutIndicator/KeyboardShortcutIndicator' import MenuItem from '../Menu/MenuItem' import { iconClass } from './ClassNames' import MenuSection from '../Menu/MenuSection' +import { SUPER_SHOW_MARKDOWN_PREVIEW, SUPER_TOGGLE_SEARCH } from '@standardnotes/ui-services' +import { useMemo, useCallback } from 'react' +import { useCommandService } from '../CommandProvider' type Props = { - note: SNNote - markdownShortcut?: PlatformedKeyboardShortcut - enableSuperMarkdownPreview: () => void + closeMenu: () => void } -const SuperNoteOptions = ({ markdownShortcut, enableSuperMarkdownPreview }: Props) => { +const SuperNoteOptions = ({ closeMenu }: Props) => { + const commandService = useCommandService() + + const markdownShortcut = useMemo( + () => commandService.keyboardShortcutForCommand(SUPER_SHOW_MARKDOWN_PREVIEW), + [commandService], + ) + + const findShortcut = useMemo(() => commandService.keyboardShortcutForCommand(SUPER_TOGGLE_SEARCH), [commandService]) + + const enableSuperMarkdownPreview = useCallback(() => { + commandService.triggerCommand(SUPER_SHOW_MARKDOWN_PREVIEW) + }, [commandService]) + + const findInNote = useCallback(() => { + commandService.triggerCommand(SUPER_TOGGLE_SEARCH) + closeMenu() + }, [closeMenu, commandService]) + return ( + + + Find in note + {findShortcut && } + Show Markdown diff --git a/packages/web/src/javascripts/Components/SuperEditor/Plugins/SearchPlugin/SearchDialog.tsx b/packages/web/src/javascripts/Components/SuperEditor/Plugins/SearchPlugin/SearchDialog.tsx index d1bc86c1b..f1912e357 100644 --- a/packages/web/src/javascripts/Components/SuperEditor/Plugins/SearchPlugin/SearchDialog.tsx +++ b/packages/web/src/javascripts/Components/SuperEditor/Plugins/SearchPlugin/SearchDialog.tsx @@ -14,8 +14,11 @@ import { import { classNames } from '@standardnotes/utils' import { useCallback, useMemo, useState } from 'react' import { useSuperSearchContext } from './Context' +import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext' export const SearchDialog = ({ open, closeDialog }: { open: boolean; closeDialog: () => void }) => { + const [editor] = useLexicalComposerContext() + const { query, results, currentResultIndex, isCaseSensitive, isReplaceMode, dispatch, dispatchReplaceEvent } = useSuperSearchContext() @@ -53,22 +56,27 @@ export const SearchDialog = ({ open, closeDialog }: { open: boolean; closeDialog return (
- + {editor.isEditable() && ( + + )}
{ @@ -171,7 +179,7 @@ export const SearchDialog = ({ open, closeDialog }: { open: boolean; closeDialog
{isReplaceMode && ( -
+
{ const resultsRef = useStateRef(results) useEffect(() => { - const isFocusInEditor = () => { - if (!document.activeElement || !document.activeElement.closest('.blocks-editor')) { - return false - } - return true - } - return application.keyboardService.addCommandHandlers([ { command: SUPER_TOGGLE_SEARCH, category: 'Super notes', description: 'Search in current note', onKeyDown: (event) => { - if (!isFocusInEditor()) { - return - } event.preventDefault() event.stopPropagation() dispatch({ type: 'toggle-search' }) - editor.focus() }, }, { @@ -55,7 +44,7 @@ export const SearchPlugin = () => { category: 'Super notes', description: 'Search and replace in current note', onKeyDown: (event) => { - if (!isFocusInEditor()) { + if (!editor.isEditable()) { return } event.preventDefault() @@ -66,9 +55,6 @@ export const SearchPlugin = () => { { command: SUPER_SEARCH_TOGGLE_CASE_SENSITIVE, onKeyDown() { - if (!isFocusInEditor()) { - return - } dispatch({ type: 'toggle-case-sensitive', }) @@ -79,9 +65,6 @@ export const SearchPlugin = () => { category: 'Super notes', description: 'Go to next search result', onKeyDown(event) { - if (!isFocusInEditor()) { - return - } event.preventDefault() event.stopPropagation() dispatch({ @@ -94,9 +77,6 @@ export const SearchPlugin = () => { category: 'Super notes', description: 'Go to previous search result', onKeyDown(event) { - if (!isFocusInEditor()) { - return - } event.preventDefault() event.stopPropagation() dispatch({