diff --git a/.gitignore b/.gitignore index c1d60d6e9c..dc39189a31 100644 --- a/.gitignore +++ b/.gitignore @@ -549,6 +549,7 @@ packages/app-desktop/gui/WindowCommandsAndDialogs/commands/renameTag.js packages/app-desktop/gui/WindowCommandsAndDialogs/commands/resetLayout.js packages/app-desktop/gui/WindowCommandsAndDialogs/commands/restoreFolder.js packages/app-desktop/gui/WindowCommandsAndDialogs/commands/restoreNote.js +packages/app-desktop/gui/WindowCommandsAndDialogs/commands/revealInNotebook.js packages/app-desktop/gui/WindowCommandsAndDialogs/commands/revealResourceFile.js packages/app-desktop/gui/WindowCommandsAndDialogs/commands/search.js packages/app-desktop/gui/WindowCommandsAndDialogs/commands/setTags.js diff --git a/.ignore.eslint b/.ignore.eslint index 4c15fa89d1..e20cfe7a9c 100644 --- a/.ignore.eslint +++ b/.ignore.eslint @@ -575,6 +575,7 @@ packages/app-desktop/gui/WindowCommandsAndDialogs/commands/renameTag.js packages/app-desktop/gui/WindowCommandsAndDialogs/commands/resetLayout.js packages/app-desktop/gui/WindowCommandsAndDialogs/commands/restoreFolder.js packages/app-desktop/gui/WindowCommandsAndDialogs/commands/restoreNote.js +packages/app-desktop/gui/WindowCommandsAndDialogs/commands/revealInNotebook.js packages/app-desktop/gui/WindowCommandsAndDialogs/commands/revealResourceFile.js packages/app-desktop/gui/WindowCommandsAndDialogs/commands/search.js packages/app-desktop/gui/WindowCommandsAndDialogs/commands/setTags.js diff --git a/packages/app-desktop/gui/MenuBar.tsx b/packages/app-desktop/gui/MenuBar.tsx index 2752f145b0..25662c654b 100644 --- a/packages/app-desktop/gui/MenuBar.tsx +++ b/packages/app-desktop/gui/MenuBar.tsx @@ -877,6 +877,7 @@ function useMenu(props: Props) { separator(), menuItemDic.showNoteProperties, menuItemDic.showNoteContentProperties, + menuItemDic.revealInNotebook, separator(), menuItemDic.permanentlyDeleteNote, ], diff --git a/packages/app-desktop/gui/WindowCommandsAndDialogs/commands/index.ts b/packages/app-desktop/gui/WindowCommandsAndDialogs/commands/index.ts index 1af1ea4ca6..1e41c0fc49 100644 --- a/packages/app-desktop/gui/WindowCommandsAndDialogs/commands/index.ts +++ b/packages/app-desktop/gui/WindowCommandsAndDialogs/commands/index.ts @@ -33,6 +33,7 @@ import * as renameTag from './renameTag'; import * as resetLayout from './resetLayout'; import * as restoreFolder from './restoreFolder'; import * as restoreNote from './restoreNote'; +import * as revealInNotebook from './revealInNotebook'; import * as revealResourceFile from './revealResourceFile'; import * as search from './search'; import * as setTags from './setTags'; @@ -92,6 +93,7 @@ const index: any[] = [ resetLayout, restoreFolder, restoreNote, + revealInNotebook, revealResourceFile, search, setTags, diff --git a/packages/app-desktop/gui/WindowCommandsAndDialogs/commands/revealInNotebook.ts b/packages/app-desktop/gui/WindowCommandsAndDialogs/commands/revealInNotebook.ts new file mode 100644 index 0000000000..4f3f37e9ad --- /dev/null +++ b/packages/app-desktop/gui/WindowCommandsAndDialogs/commands/revealInNotebook.ts @@ -0,0 +1,41 @@ +import CommandService, { CommandRuntime, CommandDeclaration, CommandContext } from '@joplin/lib/services/CommandService'; +import { _ } from '@joplin/lib/locale'; +import Folder from '@joplin/lib/models/Folder'; +import Note from '@joplin/lib/models/Note'; +import { defaultWindowId, stateUtils } from '@joplin/lib/reducer'; +import { getDisplayParentId } from '@joplin/lib/services/trash'; +import bridge from '../../../services/bridge'; + +export const declaration: CommandDeclaration = { + name: 'revealInNotebook', + label: () => _('Reveal in notebook'), +}; + +export const runtime = (): CommandRuntime => { + return { + execute: async (context: CommandContext, noteId: string = null) => { + noteId = noteId || stateUtils.selectedNoteId(context.state); + const note = await Note.load(noteId); + if (!note) throw new Error(`No such note: ${noteId}`); + const parentFolder = await Folder.load(note.parent_id); + const folderId = note.is_conflict && !note.deleted_time ? Folder.conflictFolderId() : getDisplayParentId(note, parentFolder); + const mainWindowState = stateUtils.windowStateById(context.state, defaultWindowId); + const folderAlreadySelected = mainWindowState.selectedFolderId === folderId; + const noteAlreadySelected = stateUtils.selectedNoteId(mainWindowState) === note.id; + + context.dispatch({ + type: 'WINDOW_FOCUS', + windowId: defaultWindowId, + }); + context.dispatch({ + type: 'FOLDER_AND_NOTE_SELECT', + folderId, + noteId: note.id, + }); + bridge().switchToMainWindow(); + if (folderAlreadySelected) await CommandService.instance().execute('focusElementSideBar'); + if (folderAlreadySelected && noteAlreadySelected) await CommandService.instance().execute('focusElementNoteList', note.id); + }, + enabledCondition: 'someNotesSelected && !multipleNotesSelected', + }; +}; diff --git a/packages/app-desktop/gui/menuCommandNames.ts b/packages/app-desktop/gui/menuCommandNames.ts index c26efb32b2..25c9ac5075 100644 --- a/packages/app-desktop/gui/menuCommandNames.ts +++ b/packages/app-desktop/gui/menuCommandNames.ts @@ -80,6 +80,7 @@ export default function() { 'exportDeletionLog', 'toggleSafeMode', 'showShareNoteDialog', + 'revealInNotebook', 'showShareFolderDialog', 'leaveSharedFolder', 'gotoAnything',