diff --git a/src/public/app/dialogs/jump_to_note.js b/src/public/app/dialogs/jump_to_note.js deleted file mode 100644 index 0d9fb13cf..000000000 --- a/src/public/app/dialogs/jump_to_note.js +++ /dev/null @@ -1,60 +0,0 @@ -import noteAutocompleteService from '../services/note_autocomplete.js'; -import utils from "../services/utils.js"; -import appContext from "../services/app_context.js"; - -const $dialog = $("#jump-to-note-dialog"); -const $autoComplete = $("#jump-to-note-autocomplete"); -const $showInFullTextButton = $("#show-in-full-text-button"); - -let lastOpenedTs = 0; -const KEEP_LAST_SEARCH_FOR_X_SECONDS = 120; - -export async function showDialog() { - utils.openDialog($dialog); - - noteAutocompleteService.initNoteAutocomplete($autoComplete, { hideGoToSelectedNoteButton: true }) - // clear any event listener added in previous invocation of this function - .off('autocomplete:noteselected') - .on('autocomplete:noteselected', function(event, suggestion, dataset) { - if (!suggestion.notePath) { - return false; - } - - appContext.tabManager.getActiveContext().setNote(suggestion.notePath); - }); - - // if you open the Jump To dialog soon after using it previously it can often mean that you - // actually want to search for the same thing (e.g. you opened the wrong note at first try) - // so we'll keep the content. - // if it's outside of this time limit then we assume it's a completely new search and show recent notes instead. - if (Date.now() - lastOpenedTs > KEEP_LAST_SEARCH_FOR_X_SECONDS * 1000) { - noteAutocompleteService.showRecentNotes($autoComplete); - } - else { - $autoComplete - // hack, the actual search value is stored in
element next to the search input - // this is important because the search input value is replaced with the suggestion note's title - .autocomplete("val", $autoComplete.next().text()) - .trigger('focus') - .trigger('select'); - } - - lastOpenedTs = Date.now(); -} - -function showInFullText(e) { - // stop from propagating upwards (dangerous especially with ctrl+enter executable javascript notes) - e.preventDefault(); - e.stopPropagation(); - - const searchString = $autoComplete.val(); - - appContext.triggerCommand('searchNotes', {searchString}); - - $dialog.modal('hide'); -} - - -$showInFullTextButton.on('click', showInFullText); - -utils.bindElShortcut($dialog, 'ctrl+return', showInFullText); diff --git a/src/public/app/layouts/desktop_layout.js b/src/public/app/layouts/desktop_layout.js index 38f41f2c2..99df11756 100644 --- a/src/public/app/layouts/desktop_layout.js +++ b/src/public/app/layouts/desktop_layout.js @@ -61,6 +61,7 @@ import SortChildNotesDialog from "../widgets/dialogs/sort_child_notes.js"; import PasswordNoteSetDialog from "../widgets/dialogs/password_not_set.js"; import IncludeNoteDialog from "../widgets/dialogs/include_note.js"; import NoteTypeChooserDialog from "../widgets/dialogs/note_type_chooser.js"; +import JumpToNoteDialog from "../widgets/dialogs/jump_to_note.js"; export default class DesktopLayout { constructor(customWidgets) { @@ -196,6 +197,7 @@ export default class DesktopLayout { .child(new SortChildNotesDialog()) .child(new PasswordNoteSetDialog()) .child(new IncludeNoteDialog()) - .child(new NoteTypeChooserDialog()); + .child(new NoteTypeChooserDialog()) + .child(new JumpToNoteDialog()); } } diff --git a/src/public/app/services/root_command_executor.js b/src/public/app/services/root_command_executor.js index 5de1313c5..2a66e69ff 100644 --- a/src/public/app/services/root_command_executor.js +++ b/src/public/app/services/root_command_executor.js @@ -8,10 +8,6 @@ import options from "./options.js"; import froca from "./froca.js"; export default class RootCommandExecutor extends Component { - jumpToNoteCommand() { - import("../dialogs/jump_to_note.js").then(d => d.showDialog()); - } - showNoteRevisionsCommand() { import("../dialogs/note_revisions.js").then(d => d.showCurrentNoteRevisions()); } diff --git a/src/public/app/widgets/dialogs/jump_to_note.js b/src/public/app/widgets/dialogs/jump_to_note.js new file mode 100644 index 000000000..4db606c01 --- /dev/null +++ b/src/public/app/widgets/dialogs/jump_to_note.js @@ -0,0 +1,96 @@ +import noteAutocompleteService from '../../services/note_autocomplete.js'; +import utils from "../../services/utils.js"; +import appContext from "../../services/app_context.js"; +import BasicWidget from "../basic_widget.js"; + +const TPL = `+`; + +const KEEP_LAST_SEARCH_FOR_X_SECONDS = 120; + +export default class JumpToNoteDialog extends BasicWidget { + constructor() { + super(); + + this.lastOpenedTs = 0; + } + + doRender() { + this.$widget = $(TPL); + this.$autoComplete = this.$widget.find(".jump-to-note-autocomplete"); + this.$showInFullTextButton = this.$widget.find(".show-in-full-text-button"); + this.$showInFullTextButton.on('click', e => this.showInFullText(e)); + + utils.bindElShortcut(this.$widget, 'ctrl+return', e => this.showInFullText(e)); + } + + async jumpToNoteEvent() { + utils.openDialog(this.$widget); + + // first open dialog, then refresh since refresh is doing focus which should be visible + this.refresh(); + + this.lastOpenedTs = Date.now(); + } + + async refresh() { + noteAutocompleteService.initNoteAutocomplete(this.$autoComplete, {hideGoToSelectedNoteButton: true}) + // clear any event listener added in previous invocation of this function + .off('autocomplete:noteselected') + .on('autocomplete:noteselected', function (event, suggestion, dataset) { + if (!suggestion.notePath) { + return false; + } + + appContext.tabManager.getActiveContext().setNote(suggestion.notePath); + }); + + // if you open the Jump To dialog soon after using it previously it can often mean that you + // actually want to search for the same thing (e.g. you opened the wrong note at first try) + // so we'll keep the content. + // if it's outside of this time limit then we assume it's a completely new search and show recent notes instead. + if (Date.now() - this.lastOpenedTs > KEEP_LAST_SEARCH_FOR_X_SECONDS * 1000) { + noteAutocompleteService.showRecentNotes(this.$autoComplete); + } else { + this.$autoComplete + // hack, the actual search value is stored in++ +element next to the search input + // this is important because the search input value is replaced with the suggestion note's title + .autocomplete("val", this.$autoComplete.next().text()) + .trigger('focus') + .trigger('select'); + } + } + + showInFullText(e) { + // stop from propagating upwards (dangerous especially with ctrl+enter executable javascript notes) + e.preventDefault(); + e.stopPropagation(); + + const searchString = this.$autoComplete.val(); + + this.triggerCommand('searchNotes', {searchString}); + + this.$widget.modal('hide'); + } +} diff --git a/src/views/desktop.ejs b/src/views/desktop.ejs index b74be0d5d..f80e460c6 100644 --- a/src/views/desktop.ejs +++ b/src/views/desktop.ejs @@ -20,7 +20,6 @@ <%- include('dialogs/add_link.ejs') %> <%- include('dialogs/export.ejs') %> <%- include('dialogs/import.ejs') %> -<%- include('dialogs/jump_to_note.ejs') %> <%- include('dialogs/markdown_import.ejs') %> <%- include('dialogs/note_revisions.ejs') %> <%- include('dialogs/options.ejs') %> diff --git a/src/views/dialogs/jump_to_note.ejs b/src/views/dialogs/jump_to_note.ejs deleted file mode 100644 index 90549300d..000000000 --- a/src/views/dialogs/jump_to_note.ejs +++ /dev/null @@ -1,23 +0,0 @@ ---- -