fix tree clipboard

This commit is contained in:
zadam 2019-11-20 19:24:23 +01:00
parent d357943ebb
commit 522f71cb91
2 changed files with 44 additions and 30 deletions

View File

@ -4,83 +4,97 @@ import cloningService from "./cloning.js";
import toastService from "./toast.js"; import toastService from "./toast.js";
import hoistedNoteService from "./hoisted_note.js"; import hoistedNoteService from "./hoisted_note.js";
let clipboardIds = []; /*
* Clipboard contains node keys which are not stable. If a (part of the) tree is reloaded,
* node keys in the clipboard might not exist anymore. Code here should then be ready to deal
* with this.
*/
let clipboardNodeKeys = [];
let clipboardMode = null; let clipboardMode = null;
async function pasteAfter(node) { async function pasteAfter(afterNode) {
if (isClipboardEmpty()) {
return;
}
if (clipboardMode === 'cut') { if (clipboardMode === 'cut') {
const nodes = clipboardIds.map(nodeKey => treeUtils.getNodeByKey(nodeKey)); const nodes = clipboardNodeKeys.map(nodeKey => treeUtils.getNodeByKey(nodeKey));
await treeChangesService.moveAfterNode(nodes, node); await treeChangesService.moveAfterNode(nodes, afterNode);
clipboardIds = []; clipboardNodeKeys = [];
clipboardMode = null; clipboardMode = null;
} }
else if (clipboardMode === 'copy') { else if (clipboardMode === 'copy') {
for (const noteId of clipboardIds) { for (const nodeKey of clipboardNodeKeys) {
await cloningService.cloneNoteAfter(noteId, node.data.branchId); const clipNode = treeUtils.getNodeByKey(nodeKey);
await cloningService.cloneNoteAfter(clipNode.data.noteId, afterNode.data.branchId);
} }
// copy will keep clipboardIds and clipboardMode so it's possible to paste into multiple places // copy will keep clipboardIds and clipboardMode so it's possible to paste into multiple places
} }
else if (clipboardIds.length === 0) {
// just do nothing
}
else { else {
toastService.throwError("Unrecognized clipboard mode=" + clipboardMode); toastService.throwError("Unrecognized clipboard mode=" + clipboardMode);
} }
} }
async function pasteInto(node) { async function pasteInto(parentNode) {
if (isClipboardEmpty()) {
return;
}
if (clipboardMode === 'cut') { if (clipboardMode === 'cut') {
const nodes = clipboardIds.map(nodeKey => treeUtils.getNodeByKey(nodeKey)); const nodes = clipboardNodeKeys.map(nodeKey => treeUtils.getNodeByKey(nodeKey));
await treeChangesService.moveToNode(nodes, node); await treeChangesService.moveToNode(nodes, parentNode);
await node.setExpanded(true); await parentNode.setExpanded(true);
clipboardIds = []; clipboardNodeKeys = [];
clipboardMode = null; clipboardMode = null;
} }
else if (clipboardMode === 'copy') { else if (clipboardMode === 'copy') {
for (const noteId of clipboardIds) { for (const nodeKey of clipboardNodeKeys) {
await cloningService.cloneNoteTo(noteId, node.data.noteId); const clipNode = treeUtils.getNodeByKey(nodeKey);
await cloningService.cloneNoteTo(clipNode.data.noteId, parentNode.data.noteId);
} }
await node.setExpanded(true); await parentNode.setExpanded(true);
// copy will keep clipboardIds and clipboardMode so it's possible to paste into multiple places // copy will keep clipboardIds and clipboardMode so it's possible to paste into multiple places
} }
else if (clipboardIds.length === 0) {
// just do nothing
}
else { else {
toastService.throwError("Unrecognized clipboard mode=" + mode); toastService.throwError("Unrecognized clipboard mode=" + mode);
} }
} }
function copy(nodes) { function copy(nodes) {
clipboardIds = nodes.map(node => node.data.noteId); clipboardNodeKeys = nodes.map(node => node.key);
clipboardMode = 'copy'; clipboardMode = 'copy';
toastService.showMessage("Note(s) have been copied into clipboard."); toastService.showMessage("Note(s) have been copied into clipboard.");
} }
function cut(nodes) { function cut(nodes) {
clipboardIds = nodes clipboardNodeKeys = nodes
.filter(node => node.data.noteId !== hoistedNoteService.getHoistedNoteNoPromise()) .filter(node => node.data.noteId !== hoistedNoteService.getHoistedNoteNoPromise())
.filter(node => node.getParent().data.noteType !== 'search') .filter(node => node.getParent().data.noteType !== 'search')
.map(node => node.data.noteId); .map(node => node.key);
if (clipboardIds.length > 0) { if (clipboardNodeKeys.length > 0) {
clipboardMode = 'cut'; clipboardMode = 'cut';
toastService.showMessage("Note(s) have been cut into clipboard."); toastService.showMessage("Note(s) have been cut into clipboard.");
} }
} }
function isEmpty() { function isClipboardEmpty() {
return clipboardIds.length === 0; clipboardNodeKeys = clipboardNodeKeys.filter(key => !!treeUtils.getNodeByKey(key));
return clipboardNodeKeys.length === 0;
} }
export default { export default {
@ -88,5 +102,5 @@ export default {
pasteInto, pasteInto,
cut, cut,
copy, copy,
isEmpty isClipboardEmpty
} }

View File

@ -75,9 +75,9 @@ class TreeContextMenu {
{ title: "Move to ... <kbd>Ctrl+Shift+X</kbd>", cmd: "moveTo", uiIcon: "empty", { title: "Move to ... <kbd>Ctrl+Shift+X</kbd>", cmd: "moveTo", uiIcon: "empty",
enabled: isNotRoot && !isHoisted && parentNotSearch }, enabled: isNotRoot && !isHoisted && parentNotSearch },
{ title: "Paste into <kbd>Ctrl+V</kbd>", cmd: "pasteInto", uiIcon: "paste", { title: "Paste into <kbd>Ctrl+V</kbd>", cmd: "pasteInto", uiIcon: "paste",
enabled: !clipboard.isEmpty() && notSearch && noSelectedNotes }, enabled: !clipboard.isClipboardEmpty() && notSearch && noSelectedNotes },
{ title: "Paste after", cmd: "pasteAfter", uiIcon: "paste", { title: "Paste after", cmd: "pasteAfter", uiIcon: "paste",
enabled: !clipboard.isEmpty() && isNotRoot && parentNotSearch && noSelectedNotes }, enabled: !clipboard.isClipboardEmpty() && isNotRoot && !isHoisted && parentNotSearch && noSelectedNotes },
{ title: "Duplicate note here", cmd: "duplicateNote", uiIcon: "empty", { title: "Duplicate note here", cmd: "duplicateNote", uiIcon: "empty",
enabled: noSelectedNotes && parentNotSearch && (!note.isProtected || protectedSessionHolder.isProtectedSessionAvailable()) }, enabled: noSelectedNotes && parentNotSearch && (!note.isProtected || protectedSessionHolder.isProtectedSessionAvailable()) },
{ title: "----" }, { title: "----" },