2020-01-04 04:15:45 +08:00
|
|
|
import treeService from "./tree.js";
|
2019-05-04 02:27:38 +08:00
|
|
|
import treeChangesService from "./branches.js";
|
|
|
|
import cloningService from "./cloning.js";
|
2019-10-20 16:00:18 +08:00
|
|
|
import toastService from "./toast.js";
|
2019-11-05 05:41:06 +08:00
|
|
|
import hoistedNoteService from "./hoisted_note.js";
|
2019-05-04 02:27:38 +08:00
|
|
|
|
2019-11-21 02:24:23 +08:00
|
|
|
/*
|
|
|
|
* 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 = [];
|
2019-05-04 02:27:38 +08:00
|
|
|
let clipboardMode = null;
|
|
|
|
|
2019-11-21 02:24:23 +08:00
|
|
|
async function pasteAfter(afterNode) {
|
|
|
|
if (isClipboardEmpty()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2019-05-04 02:27:38 +08:00
|
|
|
if (clipboardMode === 'cut') {
|
2020-01-04 04:15:45 +08:00
|
|
|
const nodes = clipboardNodeKeys.map(nodeKey => treeService.getNodeByKey(nodeKey));
|
2019-05-04 02:27:38 +08:00
|
|
|
|
2019-11-21 02:24:23 +08:00
|
|
|
await treeChangesService.moveAfterNode(nodes, afterNode);
|
2019-05-04 02:27:38 +08:00
|
|
|
|
2019-11-21 02:24:23 +08:00
|
|
|
clipboardNodeKeys = [];
|
2019-05-04 02:27:38 +08:00
|
|
|
clipboardMode = null;
|
|
|
|
}
|
|
|
|
else if (clipboardMode === 'copy') {
|
2019-11-21 02:24:23 +08:00
|
|
|
for (const nodeKey of clipboardNodeKeys) {
|
2020-01-04 04:15:45 +08:00
|
|
|
const clipNode = treeService.getNodeByKey(nodeKey);
|
2019-11-21 02:24:23 +08:00
|
|
|
|
|
|
|
await cloningService.cloneNoteAfter(clipNode.data.noteId, afterNode.data.branchId);
|
2019-05-04 02:27:38 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// copy will keep clipboardIds and clipboardMode so it's possible to paste into multiple places
|
|
|
|
}
|
|
|
|
else {
|
2019-10-20 16:00:18 +08:00
|
|
|
toastService.throwError("Unrecognized clipboard mode=" + clipboardMode);
|
2019-05-04 02:27:38 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-11-21 02:24:23 +08:00
|
|
|
async function pasteInto(parentNode) {
|
|
|
|
if (isClipboardEmpty()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2019-05-04 02:27:38 +08:00
|
|
|
if (clipboardMode === 'cut') {
|
2020-01-04 04:15:45 +08:00
|
|
|
const nodes = clipboardNodeKeys.map(nodeKey => treeService.getNodeByKey(nodeKey));
|
2019-05-04 02:27:38 +08:00
|
|
|
|
2019-11-21 02:24:23 +08:00
|
|
|
await treeChangesService.moveToNode(nodes, parentNode);
|
2019-05-04 02:27:38 +08:00
|
|
|
|
2019-11-21 02:24:23 +08:00
|
|
|
await parentNode.setExpanded(true);
|
2019-05-04 02:27:38 +08:00
|
|
|
|
2019-11-21 02:24:23 +08:00
|
|
|
clipboardNodeKeys = [];
|
2019-05-04 02:27:38 +08:00
|
|
|
clipboardMode = null;
|
|
|
|
}
|
|
|
|
else if (clipboardMode === 'copy') {
|
2019-11-21 02:24:23 +08:00
|
|
|
for (const nodeKey of clipboardNodeKeys) {
|
2020-01-04 04:15:45 +08:00
|
|
|
const clipNode = treeService.getNodeByKey(nodeKey);
|
2019-11-21 02:24:23 +08:00
|
|
|
|
|
|
|
await cloningService.cloneNoteTo(clipNode.data.noteId, parentNode.data.noteId);
|
2019-05-04 02:27:38 +08:00
|
|
|
}
|
|
|
|
|
2019-11-21 02:24:23 +08:00
|
|
|
await parentNode.setExpanded(true);
|
2019-05-04 02:27:38 +08:00
|
|
|
|
|
|
|
// copy will keep clipboardIds and clipboardMode so it's possible to paste into multiple places
|
|
|
|
}
|
|
|
|
else {
|
2019-10-20 16:00:18 +08:00
|
|
|
toastService.throwError("Unrecognized clipboard mode=" + mode);
|
2019-05-04 02:27:38 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function copy(nodes) {
|
2019-11-21 02:24:23 +08:00
|
|
|
clipboardNodeKeys = nodes.map(node => node.key);
|
2019-05-04 02:27:38 +08:00
|
|
|
clipboardMode = 'copy';
|
|
|
|
|
2019-10-20 16:00:18 +08:00
|
|
|
toastService.showMessage("Note(s) have been copied into clipboard.");
|
2019-05-04 02:27:38 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
function cut(nodes) {
|
2019-11-21 02:24:23 +08:00
|
|
|
clipboardNodeKeys = nodes
|
2019-11-05 05:41:06 +08:00
|
|
|
.filter(node => node.data.noteId !== hoistedNoteService.getHoistedNoteNoPromise())
|
|
|
|
.filter(node => node.getParent().data.noteType !== 'search')
|
2019-11-21 02:24:23 +08:00
|
|
|
.map(node => node.key);
|
2019-05-04 02:27:38 +08:00
|
|
|
|
2019-11-21 02:24:23 +08:00
|
|
|
if (clipboardNodeKeys.length > 0) {
|
2019-11-05 05:41:06 +08:00
|
|
|
clipboardMode = 'cut';
|
|
|
|
|
|
|
|
toastService.showMessage("Note(s) have been cut into clipboard.");
|
|
|
|
}
|
2019-05-04 02:27:38 +08:00
|
|
|
}
|
|
|
|
|
2019-11-21 02:24:23 +08:00
|
|
|
function isClipboardEmpty() {
|
2020-01-04 04:15:45 +08:00
|
|
|
clipboardNodeKeys = clipboardNodeKeys.filter(key => !!treeService.getNodeByKey(key));
|
2019-11-21 02:24:23 +08:00
|
|
|
|
|
|
|
return clipboardNodeKeys.length === 0;
|
2019-05-04 02:27:38 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
export default {
|
|
|
|
pasteAfter,
|
|
|
|
pasteInto,
|
|
|
|
cut,
|
|
|
|
copy,
|
2019-11-21 02:24:23 +08:00
|
|
|
isClipboardEmpty
|
2019-05-04 02:27:38 +08:00
|
|
|
}
|