mirror of
https://github.com/zadam/trilium.git
synced 2025-03-01 14:22:32 +01:00
fix tree clipboard
This commit is contained in:
parent
d357943ebb
commit
522f71cb91
@ -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
|
||||||
}
|
}
|
@ -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: "----" },
|
||||||
|
Loading…
x
Reference in New Issue
Block a user