diff --git a/public/javascripts/context_menu.js b/public/javascripts/context_menu.js index a2e7b639e..495929a91 100644 --- a/public/javascripts/context_menu.js +++ b/public/javascripts/context_menu.js @@ -1,3 +1,23 @@ +function pasteAfter(node) { + const subjectNode = getNodeByKey(globalClipboardNoteId); + + moveAfterNode(subjectNode, node); + + globalClipboardNoteId = null; +} + +function pasteInto(node) { + const subjectNode = getNodeByKey(globalClipboardNoteId); + + moveToNode(subjectNode, node); + + globalClipboardNoteId = null; +} + +function cut(node) { + globalClipboardNoteId = node.key; +} + const contextMenuSetup = { delegate: "span.fancytree-title", autoFocus: true, @@ -46,21 +66,13 @@ const contextMenuSetup = { decryptSubTree(node.key); } else if (ui.cmd === "cut") { - globalClipboardNoteId = node.key; + cut(node); } else if (ui.cmd === "pasteAfter") { - const subjectNode = getNodeByKey(globalClipboardNoteId); - - moveAfterNode(subjectNode, node); - - globalClipboardNoteId = null; + pasteAfter(node); } else if (ui.cmd === "pasteInto") { - const subjectNode = getNodeByKey(globalClipboardNoteId); - - moveToNode(subjectNode, node); - - globalClipboardNoteId = null; + pasteInto(node); } else if (ui.cmd === "delete") { deleteNode(node); diff --git a/public/javascripts/tree.js b/public/javascripts/tree.js index 53ed7acad..40c629a98 100644 --- a/public/javascripts/tree.js +++ b/public/javascripts/tree.js @@ -165,7 +165,53 @@ $(() => { nodata: true, // Display a 'no data' status node if result is empty mode: "hide" // Grayout unmatched nodes (pass "hide" to remove unmatched node instead) }, - dnd: dragAndDropSetup + dnd: dragAndDropSetup, + keydown: (event, data) => { + const node = data.node; + // Eat keyboard events, when a menu is open + if ($(".contextMenu:visible").length > 0) + return false; + + switch (event.which) { + // Open context menu on [Space] key (simulate right click) + case 32: // [Space] + $(node.span).trigger("mousedown", { + preventDefault: true, + button: 2 + }) + .trigger("mouseup", { + preventDefault: true, + pageX: node.span.offsetLeft, + pageY: node.span.offsetTop, + button: 2 + }); + return false; + + // Handle Ctrl-C, -X and -V + // case 67: + // if (event.ctrlKey) { // Ctrl-C + // copyPaste("copy", node); + // return false; + // } + // break; + case 86: + console.log("CTRL-V"); + + if (event.ctrlKey) { // Ctrl-V + pasteAfter(node); + return false; + } + break; + case 88: + console.log("CTRL-X"); + + if (event.ctrlKey) { // Ctrl-X + cut(node); + return false; + } + break; + } + } }); globalTree.contextmenu(contextMenuSetup);