diff --git a/src/public/javascripts/dialogs/add_link.js b/src/public/javascripts/dialogs/add_link.js index b99608ce9..76f7d7436 100644 --- a/src/public/javascripts/dialogs/add_link.js +++ b/src/public/javascripts/dialogs/add_link.js @@ -6,7 +6,7 @@ import utils from "../services/utils.js"; const $dialog = $("#add-link-dialog"); const $form = $("#add-link-form"); -const $autoComplete = $("#note-autocomplete"); +const $autoComplete = $("#add-link-note-autocomplete"); const $linkTitle = $("#link-title"); const $addLinkTitleFormGroup = $("#add-link-title-form-group"); diff --git a/src/public/javascripts/dialogs/clone_to.js b/src/public/javascripts/dialogs/clone_to.js new file mode 100644 index 000000000..d17dbff74 --- /dev/null +++ b/src/public/javascripts/dialogs/clone_to.js @@ -0,0 +1,55 @@ +import noteAutocompleteService from "../services/note_autocomplete.js"; +import utils from "../services/utils.js"; +import cloningService from "../services/cloning.js"; +import treeUtils from "../services/tree_utils.js"; +import noteDetailService from "../services/note_detail.js"; +import toastService from "../services/toast.js"; +import treeCache from "../services/tree_cache.js"; + +const $dialog = $("#clone-to-dialog"); +const $form = $("#clone-to-form"); +const $noteAutoComplete = $("#clone-to-note-autocomplete"); +const $clonePrefix = $("#clone-prefix"); + +let clonedNoteId; + +export async function showDialog(noteId) { + clonedNoteId = noteId || noteDetailService.getActiveTabNoteId(); + + if (!clonedNoteId) { + return; + } + + utils.closeActiveDialog(); + + glob.activeDialog = $dialog; + + $dialog.modal(); + + $noteAutoComplete.val('').focus(); + + noteAutocompleteService.initNoteAutocomplete($noteAutoComplete); + noteAutocompleteService.showRecentNotes($noteAutoComplete); +} + +$form.submit(() => { + const notePath = $noteAutoComplete.getSelectedPath(); + + if (notePath) { + $dialog.modal('hide'); + + const targetNoteId = treeUtils.getNoteIdFromNotePath(notePath); + + cloningService.cloneNoteTo(clonedNoteId, targetNoteId, $clonePrefix.val()).then(async () => { + const clonedNote = await treeCache.getNote(clonedNoteId); + const targetNote = await treeCache.getNote(targetNoteId); + + toastService.showMessage(`Note "${clonedNote.title}" has been cloned into ${targetNote.title}`); + }); + } + else { + console.error("No path to clone to."); + } + + return false; +}); \ No newline at end of file diff --git a/src/public/javascripts/services/entrypoints.js b/src/public/javascripts/services/entrypoints.js index 11b9e17a4..6dfd7b53d 100644 --- a/src/public/javascripts/services/entrypoints.js +++ b/src/public/javascripts/services/entrypoints.js @@ -16,6 +16,7 @@ const HELP = "../dialogs/help.js"; const NOTE_INFO = "../dialogs/note_info.js"; const ABOUT = "../dialogs/about.js"; const LINK_MAP = "../dialogs/link_map.js"; +const CLONE_TO = "../dialogs/clone_to.js"; function registerEntrypoints() { // hot keys are active also inside inputs and content editables @@ -185,6 +186,7 @@ function registerEntrypoints() { return false; }); + utils.bindGlobalShortcut('ctrl+e', () => import(CLONE_TO).then(d => d.showDialog())); } export default { diff --git a/src/public/javascripts/services/note_autocomplete.js b/src/public/javascripts/services/note_autocomplete.js index 408e9745d..be262c5bd 100644 --- a/src/public/javascripts/services/note_autocomplete.js +++ b/src/public/javascripts/services/note_autocomplete.js @@ -57,7 +57,7 @@ function initNoteAutocomplete($el, options) { .prop("title", "Show recent notes"); const $goToSelectedNoteButton = $("") - .addClass("input-group-text go-to-selected-note-button bx bx-right-arrow") + .addClass("input-group-text go-to-selected-note-button bx bx-arrow-to-right") .attr("data-action", "note"); const $sideButtons = $("
") diff --git a/src/public/stylesheets/style.css b/src/public/stylesheets/style.css index 594de53ac..3fc0a575b 100644 --- a/src/public/stylesheets/style.css +++ b/src/public/stylesheets/style.css @@ -487,6 +487,10 @@ pre:not(.CodeMirror-line) { cursor: pointer; } +.show-recent-notes-button, .input-clearer-button, .go-to-selected-note-button { + padding-top: 8px; +} + .show-recent-notes-button { cursor: pointer; font-size: 1.3em; diff --git a/src/views/desktop.ejs b/src/views/desktop.ejs index 076e8ce49..a1840bb39 100644 --- a/src/views/desktop.ejs +++ b/src/views/desktop.ejs @@ -175,6 +175,7 @@ <% include dialogs/help.ejs %> <% include dialogs/note_info.ejs %> <% include dialogs/link_map.ejs %> + <% include dialogs/clone_to.ejs %>