refactoring of tree handling to recommended fancytree

This commit is contained in:
zadam 2020-01-03 21:15:45 +01:00
parent 10219fb9dd
commit 94a0a31f17
7 changed files with 44 additions and 46 deletions

8
package-lock.json generated
View File

@ -1,6 +1,6 @@
{ {
"name": "trilium", "name": "trilium",
"version": "0.39.0-beta", "version": "0.39.3",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
@ -9390,9 +9390,9 @@
"integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM="
}, },
"string-similarity": { "string-similarity": {
"version": "3.0.0", "version": "4.0.1",
"resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-3.0.0.tgz", "resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-4.0.1.tgz",
"integrity": "sha512-7kS7LyTp56OqOI2BDWQNVnLX/rCxIQn+/5M0op1WV6P8Xx6TZNdajpuqQdiJ7Xx+p1C5CsWMvdiBp9ApMhxzEQ==" "integrity": "sha512-v36MJzloekKVvKAsYi6O/qpn2mIuvwEFIT9Gx3yg4spkNjXYsk7yxc37g4ZTyMVIBvt/9PZGxnqEtme8XHK+Mw=="
}, },
"string-width": { "string-width": {
"version": "1.0.2", "version": "1.0.2",

View File

@ -69,7 +69,7 @@
"simple-node-logger": "18.12.23", "simple-node-logger": "18.12.23",
"sqlite": "3.0.3", "sqlite": "3.0.3",
"sqlite3": "4.1.1", "sqlite3": "4.1.1",
"string-similarity": "3.0.0", "string-similarity": "4.0.1",
"tar-stream": "2.1.0", "tar-stream": "2.1.0",
"turndown": "5.0.3", "turndown": "5.0.3",
"turndown-plugin-gfm": "1.0.2", "turndown-plugin-gfm": "1.0.2",

View File

@ -68,10 +68,15 @@ export async function showDialog() {
const note = await treeCache.getNote(change.noteId); const note = await treeCache.getNote(change.noteId);
const notePath = await treeService.getSomeNotePath(note); const notePath = await treeService.getSomeNotePath(note);
$noteLink = await linkService.createNoteLink(notePath, { if (notePath) {
title: change.title, $noteLink = await linkService.createNoteLink(notePath, {
showNotePath: true title: change.title,
}); showNotePath: true
});
}
else {
$noteLink = $("<span>").text(note.title);
}
} }
$changesList.append($('<li>') $changesList.append($('<li>')

View File

@ -37,12 +37,12 @@ $detail.on("click", ".close-detail-button",() => {
}); });
async function showTree() { async function showTree() {
const tree = await treeService.loadTree(); const treeData = await treeService.loadTreeData();
$tree.fancytree({ $tree.fancytree({
autoScroll: true, autoScroll: true,
extensions: ["dnd5", "clones"], extensions: ["dnd5", "clones"],
source: tree, source: treeData,
scrollParent: $tree, scrollParent: $tree,
minExpandLevel: 2, // root can't be collapsed minExpandLevel: 2, // root can't be collapsed
click: (event, data) => { click: (event, data) => {

View File

@ -1,4 +1,4 @@
import treeUtils from "./tree_utils.js"; import treeService from "./tree.js";
import treeChangesService from "./branches.js"; import treeChangesService from "./branches.js";
import cloningService from "./cloning.js"; import cloningService from "./cloning.js";
import toastService from "./toast.js"; import toastService from "./toast.js";
@ -19,7 +19,7 @@ async function pasteAfter(afterNode) {
} }
if (clipboardMode === 'cut') { if (clipboardMode === 'cut') {
const nodes = clipboardNodeKeys.map(nodeKey => treeUtils.getNodeByKey(nodeKey)); const nodes = clipboardNodeKeys.map(nodeKey => treeService.getNodeByKey(nodeKey));
await treeChangesService.moveAfterNode(nodes, afterNode); await treeChangesService.moveAfterNode(nodes, afterNode);
@ -28,7 +28,7 @@ async function pasteAfter(afterNode) {
} }
else if (clipboardMode === 'copy') { else if (clipboardMode === 'copy') {
for (const nodeKey of clipboardNodeKeys) { for (const nodeKey of clipboardNodeKeys) {
const clipNode = treeUtils.getNodeByKey(nodeKey); const clipNode = treeService.getNodeByKey(nodeKey);
await cloningService.cloneNoteAfter(clipNode.data.noteId, afterNode.data.branchId); await cloningService.cloneNoteAfter(clipNode.data.noteId, afterNode.data.branchId);
} }
@ -46,7 +46,7 @@ async function pasteInto(parentNode) {
} }
if (clipboardMode === 'cut') { if (clipboardMode === 'cut') {
const nodes = clipboardNodeKeys.map(nodeKey => treeUtils.getNodeByKey(nodeKey)); const nodes = clipboardNodeKeys.map(nodeKey => treeService.getNodeByKey(nodeKey));
await treeChangesService.moveToNode(nodes, parentNode); await treeChangesService.moveToNode(nodes, parentNode);
@ -57,7 +57,7 @@ async function pasteInto(parentNode) {
} }
else if (clipboardMode === 'copy') { else if (clipboardMode === 'copy') {
for (const nodeKey of clipboardNodeKeys) { for (const nodeKey of clipboardNodeKeys) {
const clipNode = treeUtils.getNodeByKey(nodeKey); const clipNode = treeService.getNodeByKey(nodeKey);
await cloningService.cloneNoteTo(clipNode.data.noteId, parentNode.data.noteId); await cloningService.cloneNoteTo(clipNode.data.noteId, parentNode.data.noteId);
} }
@ -92,7 +92,7 @@ function cut(nodes) {
} }
function isClipboardEmpty() { function isClipboardEmpty() {
clipboardNodeKeys = clipboardNodeKeys.filter(key => !!treeUtils.getNodeByKey(key)); clipboardNodeKeys = clipboardNodeKeys.filter(key => !!treeService.getNodeByKey(key));
return clipboardNodeKeys.length === 0; return clipboardNodeKeys.length === 0;
} }

View File

@ -16,6 +16,8 @@ import TreeContextMenu from "./tree_context_menu.js";
import bundle from "./bundle.js"; import bundle from "./bundle.js";
import keyboardActionService from "./keyboard_actions.js"; import keyboardActionService from "./keyboard_actions.js";
let tree;
const $tree = $("#tree"); const $tree = $("#tree");
const $createTopLevelNoteButton = $("#create-top-level-note-button"); const $createTopLevelNoteButton = $("#create-top-level-note-button");
const $collapseTreeButton = $("#collapse-tree-button"); const $collapseTreeButton = $("#collapse-tree-button");
@ -30,8 +32,6 @@ const frontendLoaded = new Promise(resolve => { setFrontendAsLoaded = resolve; }
* @return {FancytreeNode|null} * @return {FancytreeNode|null}
*/ */
function getFocusedNode() { function getFocusedNode() {
const tree = $tree.fancytree("getTree");
return tree.getFocusNode(); return tree.getFocusNode();
} }
@ -40,7 +40,7 @@ function getFocusedNode() {
* @return {FancytreeNode|null} * @return {FancytreeNode|null}
*/ */
function getActiveNode() { function getActiveNode() {
return $tree.fancytree("getActiveNode"); return tree.getActiveNode();
} }
/** @return {FancytreeNode[]} */ /** @return {FancytreeNode[]} */
@ -56,7 +56,7 @@ async function getNodesByBranchId(branchId) {
function getNodesByNoteId(noteId) { function getNodesByNoteId(noteId) {
utils.assertArguments(noteId); utils.assertArguments(noteId);
const list = getTree().getNodesByRef(noteId); const list = tree.getNodesByRef(noteId);
return list ? list : []; // if no nodes with this refKey are found, fancy tree returns null return list ? list : []; // if no nodes with this refKey are found, fancy tree returns null
} }
@ -309,7 +309,7 @@ async function getSomeNotePath(note) {
const parents = await cur.getParentNotes(); const parents = await cur.getParentNotes();
if (!parents.length) { if (!parents.length) {
toastService.throwError(`Can't find parents for note ${cur.noteId}`); console.error(`Can't find parents for note ${cur.noteId}`);
return; return;
} }
@ -331,7 +331,7 @@ async function setExpandedToServer(branchId, isExpanded) {
/** @return {FancytreeNode[]} */ /** @return {FancytreeNode[]} */
function getSelectedNodes(stopOnParents = false) { function getSelectedNodes(stopOnParents = false) {
return getTree().getSelectedNodes(stopOnParents); return tree.getSelectedNodes(stopOnParents);
} }
/** @return {FancytreeNode[]} */ /** @return {FancytreeNode[]} */
@ -429,14 +429,14 @@ async function treeInitialized() {
setFrontendAsLoaded(); setFrontendAsLoaded();
} }
async function initFancyTree(tree) { async function initFancyTree(treeData) {
utils.assertArguments(tree); utils.assertArguments(treeData);
$tree.fancytree({ $tree.fancytree({
autoScroll: true, autoScroll: true,
keyboard: false, // we takover keyboard handling in the hotkeys plugin keyboard: false, // we takover keyboard handling in the hotkeys plugin
extensions: ["hotkeys", "dnd5", "clones"], extensions: ["hotkeys", "dnd5", "clones"],
source: tree, source: treeData,
scrollParent: $tree, scrollParent: $tree,
minExpandLevel: 2, // root can't be collapsed minExpandLevel: 2, // root can't be collapsed
click: (event, data) => { click: (event, data) => {
@ -523,19 +523,16 @@ async function initFancyTree(tree) {
return false; // blocks default browser right click menu return false; // blocks default browser right click menu
}); });
}
/** @return {Fancytree} */ tree = $.ui.fancytree.getTree("#tree");
function getTree() {
return $tree.fancytree('getTree');
} }
async function reload() { async function reload() {
const notes = await loadTree(); const notes = await loadTreeData();
const activeNotePath = getActiveNode() !== null ? await treeUtils.getNotePath(getActiveNode()) : null; const activeNotePath = getActiveNode() !== null ? await treeUtils.getNotePath(getActiveNode()) : null;
await getTree().reload(notes); await tree.reload(notes);
// reactivate originally activated node, but don't trigger note loading // reactivate originally activated node, but don't trigger note loading
if (activeNotePath) { if (activeNotePath) {
@ -559,7 +556,7 @@ function getHashValueFromAddress() {
return str.split("-"); return str.split("-");
} }
async function loadTree() { async function loadTreeData() {
const resp = await server.get('tree'); const resp = await server.get('tree');
treeCache.load(resp.notes, resp.branches); treeCache.load(resp.notes, resp.branches);
@ -580,7 +577,7 @@ async function collapseTree(node = null) {
} }
function focusTree() { function focusTree() {
getTree().setFocus(); tree.setFocus();
} }
async function scrollToActiveNote() { async function scrollToActiveNote() {
@ -754,9 +751,9 @@ async function sortAlphabetically(noteId) {
} }
async function showTree() { async function showTree() {
const tree = await loadTree(); const treeData = await loadTreeData();
await initFancyTree(tree); await initFancyTree(treeData);
} }
ws.subscribeToMessages(message => { ws.subscribeToMessages(message => {
@ -912,6 +909,9 @@ async function duplicateNote(noteId, parentNoteId) {
toastService.showMessage(`Note "${origNote.title}" has been duplicated`); toastService.showMessage(`Note "${origNote.title}" has been duplicated`);
} }
function getNodeByKey(key) {
return tree.getNodeByKey(key);
}
keyboardActionService.setGlobalActionHandler('CollapseTree', () => collapseTree()); // don't use shortened form since collapseTree() accepts argument keyboardActionService.setGlobalActionHandler('CollapseTree', () => collapseTree()); // don't use shortened form since collapseTree() accepts argument
$collapseTreeButton.on('click', () => collapseTree()); $collapseTreeButton.on('click', () => collapseTree());
@ -931,13 +931,12 @@ export default {
setNoteTitle, setNoteTitle,
setPrefix, setPrefix,
createNote, createNote,
createNoteInto,
getSelectedNodes, getSelectedNodes,
getSelectedOrActiveNodes, getSelectedOrActiveNodes,
clearSelectedNodes, clearSelectedNodes,
sortAlphabetically, sortAlphabetically,
showTree, showTree,
loadTree, loadTreeData,
treeInitialized, treeInitialized,
setExpandedToServer, setExpandedToServer,
getNodesByNoteId, getNodesByNoteId,
@ -949,5 +948,6 @@ export default {
getSomeNotePath, getSomeNotePath,
focusTree, focusTree,
scrollToActiveNote, scrollToActiveNote,
duplicateNote duplicateNote,
getNodeByKey
}; };

View File

@ -2,16 +2,10 @@ import utils from './utils.js';
import hoistedNoteService from './hoisted_note.js'; import hoistedNoteService from './hoisted_note.js';
import treeCache from "./tree_cache.js"; import treeCache from "./tree_cache.js";
const $tree = $("#tree");
async function getParentProtectedStatus(node) { async function getParentProtectedStatus(node) {
return await hoistedNoteService.isRootNode(node) ? 0 : node.getParent().data.isProtected; return await hoistedNoteService.isRootNode(node) ? 0 : node.getParent().data.isProtected;
} }
function getNodeByKey(key) {
return $tree.fancytree('getNodeByKey', key);
}
function getNoteIdFromNotePath(notePath) { function getNoteIdFromNotePath(notePath) {
if (!notePath) { if (!notePath) {
return null; return null;
@ -123,7 +117,6 @@ async function getNotePathTitle(notePath) {
export default { export default {
getParentProtectedStatus, getParentProtectedStatus,
getNodeByKey,
getNotePath, getNotePath,
getNoteIdFromNotePath, getNoteIdFromNotePath,
getNoteIdAndParentIdFromNotePath, getNoteIdAndParentIdFromNotePath,