mirror of
				https://github.com/TriliumNext/Notes.git
				synced 2025-11-04 15:11:31 +08:00 
			
		
		
		
	split up autocomplete related functionality
This commit is contained in:
		
							parent
							
								
									35998058ce
								
							
						
					
					
						commit
						68bba623b6
					
				@ -3,6 +3,7 @@ import cloningService from '../services/cloning.js';
 | 
				
			|||||||
import linkService from '../services/link.js';
 | 
					import linkService from '../services/link.js';
 | 
				
			||||||
import noteDetailService from '../services/note_detail.js';
 | 
					import noteDetailService from '../services/note_detail.js';
 | 
				
			||||||
import treeUtils from '../services/tree_utils.js';
 | 
					import treeUtils from '../services/tree_utils.js';
 | 
				
			||||||
 | 
					import autocompleteService from '../services/autocomplete.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const $dialog = $("#add-link-dialog");
 | 
					const $dialog = $("#add-link-dialog");
 | 
				
			||||||
const $form = $("#add-link-form");
 | 
					const $form = $("#add-link-form");
 | 
				
			||||||
@ -46,13 +47,13 @@ async function showDialog() {
 | 
				
			|||||||
    $linkTitle.val('');
 | 
					    $linkTitle.val('');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function setDefaultLinkTitle(noteId) {
 | 
					    function setDefaultLinkTitle(noteId) {
 | 
				
			||||||
        const noteTitle = treeService.getNoteTitle(noteId);
 | 
					        const noteTitle = treeUtils.getNoteTitle(noteId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $linkTitle.val(noteTitle);
 | 
					        $linkTitle.val(noteTitle);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $autoComplete.autocomplete({
 | 
					    $autoComplete.autocomplete({
 | 
				
			||||||
        source: await treeService.getAutocompleteItems(),
 | 
					        source: await autocompleteService.getAutocompleteItems(),
 | 
				
			||||||
        minLength: 0,
 | 
					        minLength: 0,
 | 
				
			||||||
        change: () => {
 | 
					        change: () => {
 | 
				
			||||||
            const val = $autoComplete.val();
 | 
					            const val = $autoComplete.val();
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,7 @@
 | 
				
			|||||||
import treeService from '../services/tree.js';
 | 
					import treeService from '../services/tree.js';
 | 
				
			||||||
import server from '../services/server.js';
 | 
					import server from '../services/server.js';
 | 
				
			||||||
import treeCache from "../services/tree_cache.js";
 | 
					import treeCache from "../services/tree_cache.js";
 | 
				
			||||||
 | 
					import treeUtils from "../services/tree_utils.js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const $dialog = $("#edit-tree-prefix-dialog");
 | 
					const $dialog = $("#edit-tree-prefix-dialog");
 | 
				
			||||||
const $form = $("#edit-tree-prefix-form");
 | 
					const $form = $("#edit-tree-prefix-form");
 | 
				
			||||||
@ -24,7 +25,7 @@ async function showDialog() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    $treePrefixInput.val(branch.prefix).focus();
 | 
					    $treePrefixInput.val(branch.prefix).focus();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const noteTitle = treeService.getNoteTitle(currentNode.data.noteId);
 | 
					    const noteTitle = treeUtils.getNoteTitle(currentNode.data.noteId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $noteTitle.html(noteTitle);
 | 
					    $noteTitle.html(noteTitle);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,7 @@
 | 
				
			|||||||
import treeService from '../services/tree.js';
 | 
					import treeService from '../services/tree.js';
 | 
				
			||||||
import linkService from '../services/link.js';
 | 
					import linkService from '../services/link.js';
 | 
				
			||||||
import utils from '../services/utils.js';
 | 
					import utils from '../services/utils.js';
 | 
				
			||||||
 | 
					import autocompleteService from '../services/autocomplete.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const $dialog = $("#jump-to-note-dialog");
 | 
					const $dialog = $("#jump-to-note-dialog");
 | 
				
			||||||
const $autoComplete = $("#jump-to-note-autocomplete");
 | 
					const $autoComplete = $("#jump-to-note-autocomplete");
 | 
				
			||||||
@ -17,7 +18,7 @@ async function showDialog() {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    await $autoComplete.autocomplete({
 | 
					    await $autoComplete.autocomplete({
 | 
				
			||||||
        source: await utils.stopWatch("building autocomplete", treeService.getAutocompleteItems),
 | 
					        source: await utils.stopWatch("building autocomplete", autocompleteService.getAutocompleteItems),
 | 
				
			||||||
        minLength: 0
 | 
					        minLength: 0
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -2,6 +2,7 @@ import treeService from '../services/tree.js';
 | 
				
			|||||||
import messagingService from '../services/messaging.js';
 | 
					import messagingService from '../services/messaging.js';
 | 
				
			||||||
import server from '../services/server.js';
 | 
					import server from '../services/server.js';
 | 
				
			||||||
import utils from "../services/utils.js";
 | 
					import utils from "../services/utils.js";
 | 
				
			||||||
 | 
					import treeUtils from "../services/tree_utils.js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const $dialog = $("#recent-notes-dialog");
 | 
					const $dialog = $("#recent-notes-dialog");
 | 
				
			||||||
const $searchInput = $('#recent-notes-search-input');
 | 
					const $searchInput = $('#recent-notes-search-input');
 | 
				
			||||||
@ -46,7 +47,7 @@ async function showDialog() {
 | 
				
			|||||||
        let noteTitle;
 | 
					        let noteTitle;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            noteTitle = await treeService.getNotePathTitle(notePath);
 | 
					            noteTitle = await treeUtils.getNotePathTitle(notePath);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        catch (e) {
 | 
					        catch (e) {
 | 
				
			||||||
            noteTitle = "[error - can't find note title]";
 | 
					            noteTitle = "[error - can't find note title]";
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										100
									
								
								src/public/javascripts/services/autocomplete.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								src/public/javascripts/services/autocomplete.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,100 @@
 | 
				
			|||||||
 | 
					import treeCache from "./tree_cache.js";
 | 
				
			||||||
 | 
					import treeUtils from "./tree_utils.js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async function getAutocompleteItems(parentNoteId, notePath, titlePath) {
 | 
				
			||||||
 | 
					    if (!parentNoteId) {
 | 
				
			||||||
 | 
					        parentNoteId = 'root';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const parentNote = await treeCache.getNote(parentNoteId);
 | 
				
			||||||
 | 
					    const childNotes = await parentNote.getChildNotes();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!childNotes.length) {
 | 
				
			||||||
 | 
					        return [];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!notePath) {
 | 
				
			||||||
 | 
					        notePath = '';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!titlePath) {
 | 
				
			||||||
 | 
					        titlePath = '';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // https://github.com/zadam/trilium/issues/46
 | 
				
			||||||
 | 
					    // unfortunately not easy to implement because we don't have an easy access to note's isProtected property
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const autocompleteItems = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (const childNote of childNotes) {
 | 
				
			||||||
 | 
					        if (childNote.hideInAutocomplete) {
 | 
				
			||||||
 | 
					            continue;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const childNotePath = (notePath ? (notePath + '/') : '') + childNote.noteId;
 | 
				
			||||||
 | 
					        const childTitlePath = (titlePath ? (titlePath + ' / ') : '') + await treeUtils.getNoteTitle(childNote.noteId, parentNoteId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        autocompleteItems.push({
 | 
				
			||||||
 | 
					            value: childTitlePath + ' (' + childNotePath + ')',
 | 
				
			||||||
 | 
					            label: childTitlePath
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const childItems = await getAutocompleteItems(childNote.noteId, childNotePath, childTitlePath);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (const childItem of childItems) {
 | 
				
			||||||
 | 
					            autocompleteItems.push(childItem);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return autocompleteItems;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Overrides the default autocomplete filter function to search for matched on atleast 1 word in each of the input term's words
 | 
				
			||||||
 | 
					$.ui.autocomplete.filter = (array, terms) => {
 | 
				
			||||||
 | 
					    if (!terms) {
 | 
				
			||||||
 | 
					        return array;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const startDate = new Date();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const results = [];
 | 
				
			||||||
 | 
					    const tokens = terms.toLowerCase().split(" ");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (const item of array) {
 | 
				
			||||||
 | 
					        const lcLabel = item.label.toLowerCase();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const found = tokens.every(token => lcLabel.indexOf(token) !== -1);
 | 
				
			||||||
 | 
					        if (!found) {
 | 
				
			||||||
 | 
					            continue;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // this is not completely correct and might cause minor problems with note with names containing this " / "
 | 
				
			||||||
 | 
					        const lastSegmentIndex = lcLabel.lastIndexOf(" / ");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (lastSegmentIndex !== -1) {
 | 
				
			||||||
 | 
					            const lastSegment = lcLabel.substr(lastSegmentIndex + 3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // at least some token needs to be in the last segment (leaf note), otherwise this
 | 
				
			||||||
 | 
					            // particular note is not that interesting (query is satisfied by parent note)
 | 
				
			||||||
 | 
					            const foundInLastSegment = tokens.some(token => lastSegment.indexOf(token) !== -1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (!foundInLastSegment) {
 | 
				
			||||||
 | 
					                continue;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        results.push(item);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (results.length > 100) {
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    console.log("Search took " + (new Date().getTime() - startDate.getTime()) + "ms");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return results;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					    getAutocompleteItems
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
@ -13,33 +13,19 @@ jQuery.hotkeys.options.filterInputAcceptingElements = false;
 | 
				
			|||||||
jQuery.hotkeys.options.filterContentEditable = false;
 | 
					jQuery.hotkeys.options.filterContentEditable = false;
 | 
				
			||||||
jQuery.hotkeys.options.filterTextInputs = false;
 | 
					jQuery.hotkeys.options.filterTextInputs = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(document).bind('keydown', 'alt+m', e => {
 | 
					utils.bindShortcut('alt+m', e => $(".hide-toggle").toggleClass("suppressed"));
 | 
				
			||||||
    $(".hide-toggle").toggleClass("suppressed");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    e.preventDefault();
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// hide (toggle) everything except for the note content for distraction free writing
 | 
					// hide (toggle) everything except for the note content for distraction free writing
 | 
				
			||||||
$(document).bind('keydown', 'alt+t', e => {
 | 
					utils.bindShortcut('alt+t', e => {
 | 
				
			||||||
    const date = new Date();
 | 
					    const date = new Date();
 | 
				
			||||||
    const dateString = utils.formatDateTime(date);
 | 
					    const dateString = utils.formatDateTime(date);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    linkService.addTextToEditor(dateString);
 | 
					    linkService.addTextToEditor(dateString);
 | 
				
			||||||
 | 
					 | 
				
			||||||
    e.preventDefault();
 | 
					 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(document).bind('keydown', 'f5', () => {
 | 
					utils.bindShortcut('f5', utils.reloadApp);
 | 
				
			||||||
    utils.reloadApp();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return false;
 | 
					utils.bindShortcut('ctrl+r', utils.reloadApp);
 | 
				
			||||||
});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(document).bind('keydown', 'ctrl+r', () => {
 | 
					 | 
				
			||||||
    utils.reloadApp();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return false;
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(document).bind('keydown', 'ctrl+shift+i', () => {
 | 
					$(document).bind('keydown', 'ctrl+shift+i', () => {
 | 
				
			||||||
    if (utils.isElectron()) {
 | 
					    if (utils.isElectron()) {
 | 
				
			||||||
@ -62,22 +48,18 @@ $(document).bind('keydown', 'ctrl+f', () => {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(document).bind('keydown', "ctrl+shift+up", () => {
 | 
					utils.bindShortcut("ctrl+shift+up", () => {
 | 
				
			||||||
    const node = treeService.getCurrentNode();
 | 
					    const node = treeService.getCurrentNode();
 | 
				
			||||||
    node.navigate($.ui.keyCode.UP, true);
 | 
					    node.navigate($.ui.keyCode.UP, true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $("#note-detail").focus();
 | 
					    $("#note-detail").focus();
 | 
				
			||||||
 | 
					 | 
				
			||||||
    return false;
 | 
					 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(document).bind('keydown', "ctrl+shift+down", () => {
 | 
					utils.bindShortcut("ctrl+shift+down", () => {
 | 
				
			||||||
    const node = treeService.getCurrentNode();
 | 
					    const node = treeService.getCurrentNode();
 | 
				
			||||||
    node.navigate($.ui.keyCode.DOWN, true);
 | 
					    node.navigate($.ui.keyCode.DOWN, true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $("#note-detail").focus();
 | 
					    $("#note-detail").focus();
 | 
				
			||||||
 | 
					 | 
				
			||||||
    return false;
 | 
					 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(document).bind('keydown', 'ctrl+-', () => {
 | 
					$(document).bind('keydown', 'ctrl+-', () => {
 | 
				
			||||||
@ -110,52 +92,6 @@ $(window).on('beforeunload', () => {
 | 
				
			|||||||
    noteDetailService.saveNoteIfChanged();
 | 
					    noteDetailService.saveNoteIfChanged();
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Overrides the default autocomplete filter function to search for matched on atleast 1 word in each of the input term's words
 | 
					 | 
				
			||||||
$.ui.autocomplete.filter = (array, terms) => {
 | 
					 | 
				
			||||||
    if (!terms) {
 | 
					 | 
				
			||||||
        return array;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    const startDate = new Date();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    const results = [];
 | 
					 | 
				
			||||||
    const tokens = terms.toLowerCase().split(" ");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (const item of array) {
 | 
					 | 
				
			||||||
        const lcLabel = item.label.toLowerCase();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        const found = tokens.every(token => lcLabel.indexOf(token) !== -1);
 | 
					 | 
				
			||||||
        if (!found) {
 | 
					 | 
				
			||||||
            continue;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // this is not completely correct and might cause minor problems with note with names containing this " / "
 | 
					 | 
				
			||||||
        const lastSegmentIndex = lcLabel.lastIndexOf(" / ");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (lastSegmentIndex !== -1) {
 | 
					 | 
				
			||||||
            const lastSegment = lcLabel.substr(lastSegmentIndex + 3);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // at least some token needs to be in the last segment (leaf note), otherwise this
 | 
					 | 
				
			||||||
            // particular note is not that interesting (query is satisfied by parent note)
 | 
					 | 
				
			||||||
            const foundInLastSegment = tokens.some(token => lastSegment.indexOf(token) !== -1);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if (!foundInLastSegment) {
 | 
					 | 
				
			||||||
                continue;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        results.push(item);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (results.length > 100) {
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    console.log("Search took " + (new Date().getTime() - startDate.getTime()) + "ms");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return results;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(document).tooltip({
 | 
					$(document).tooltip({
 | 
				
			||||||
    items: "#note-detail a",
 | 
					    items: "#note-detail a",
 | 
				
			||||||
    content: function(callback) {
 | 
					    content: function(callback) {
 | 
				
			||||||
 | 
				
			|||||||
@ -27,7 +27,7 @@ function createNoteLink(notePath, noteTitle) {
 | 
				
			|||||||
    if (!noteTitle) {
 | 
					    if (!noteTitle) {
 | 
				
			||||||
        const noteId = treeUtils.getNoteIdFromNotePath(notePath);
 | 
					        const noteId = treeUtils.getNoteIdFromNotePath(notePath);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        noteTitle = treeService.getNoteTitle(noteId);
 | 
					        noteTitle = treeUtils.getNoteTitle(noteId);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const noteLink = $("<a>", {
 | 
					    const noteLink = $("<a>", {
 | 
				
			||||||
 | 
				
			|||||||
@ -23,22 +23,6 @@ const $scrollToCurrentNoteButton = $("#scroll-to-current-note-button");
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
let startNotePath = null;
 | 
					let startNotePath = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async function getNoteTitle(noteId, parentNoteId = null) {
 | 
					 | 
				
			||||||
    utils.assertArguments(noteId);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    let {title} = await treeCache.getNote(noteId);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (parentNoteId !== null) {
 | 
					 | 
				
			||||||
        const branch = await treeCache.getBranchByChildParent(noteId, parentNoteId);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (branch && branch.prefix) {
 | 
					 | 
				
			||||||
            title = branch.prefix + ' - ' + title;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return title;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// note that if you want to access data like noteId or isProtected, you need to go into "data" property
 | 
					// note that if you want to access data like noteId or isProtected, you need to go into "data" property
 | 
				
			||||||
function getCurrentNode() {
 | 
					function getCurrentNode() {
 | 
				
			||||||
    return $tree.fancytree("getActiveNode");
 | 
					    return $tree.fancytree("getActiveNode");
 | 
				
			||||||
@ -78,7 +62,7 @@ async function setPrefix(branchId, prefix) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async function setNodeTitleWithPrefix(node) {
 | 
					async function setNodeTitleWithPrefix(node) {
 | 
				
			||||||
    const noteTitle = await getNoteTitle(node.data.noteId);
 | 
					    const noteTitle = await treeUtils.getNoteTitle(node.data.noteId);
 | 
				
			||||||
    const branch = await treeCache.getBranch(node.data.branchId);
 | 
					    const branch = await treeCache.getBranch(node.data.branchId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const prefix = branch.prefix;
 | 
					    const prefix = branch.prefix;
 | 
				
			||||||
@ -300,7 +284,7 @@ async function showParentList(noteId, node) {
 | 
				
			|||||||
            const parentNotePath = await getSomeNotePath(parentNote);
 | 
					            const parentNotePath = await getSomeNotePath(parentNote);
 | 
				
			||||||
            // this is to avoid having root notes leading '/'
 | 
					            // this is to avoid having root notes leading '/'
 | 
				
			||||||
            const notePath = parentNotePath ? (parentNotePath + '/' + noteId) : noteId;
 | 
					            const notePath = parentNotePath ? (parentNotePath + '/' + noteId) : noteId;
 | 
				
			||||||
            const title = await getNotePathTitle(notePath);
 | 
					            const title = await treeUtils.getNotePathTitle(notePath);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            let item;
 | 
					            let item;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -316,22 +300,6 @@ async function showParentList(noteId, node) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async function getNotePathTitle(notePath) {
 | 
					 | 
				
			||||||
    utils.assertArguments(notePath);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    const titlePath = [];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    let parentNoteId = 'root';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (const noteId of notePath.split('/')) {
 | 
					 | 
				
			||||||
        titlePath.push(await getNoteTitle(noteId, parentNoteId));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        parentNoteId = noteId;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return titlePath.join(' / ');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
async function getSomeNotePath(note) {
 | 
					async function getSomeNotePath(note) {
 | 
				
			||||||
    utils.assertArguments(note);
 | 
					    utils.assertArguments(note);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -695,54 +663,6 @@ function setProtected(noteId, isProtected) {
 | 
				
			|||||||
    setBranchBackgroundBasedOnProtectedStatus(noteId);
 | 
					    setBranchBackgroundBasedOnProtectedStatus(noteId);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async function getAutocompleteItems(parentNoteId, notePath, titlePath) {
 | 
					 | 
				
			||||||
    if (!parentNoteId) {
 | 
					 | 
				
			||||||
        parentNoteId = 'root';
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    const parentNote = await treeCache.getNote(parentNoteId);
 | 
					 | 
				
			||||||
    const childNotes = await parentNote.getChildNotes();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (!childNotes.length) {
 | 
					 | 
				
			||||||
        return [];
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (!notePath) {
 | 
					 | 
				
			||||||
        notePath = '';
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (!titlePath) {
 | 
					 | 
				
			||||||
        titlePath = '';
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // https://github.com/zadam/trilium/issues/46
 | 
					 | 
				
			||||||
    // unfortunately not easy to implement because we don't have an easy access to note's isProtected property
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    const autocompleteItems = [];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (const childNote of childNotes) {
 | 
					 | 
				
			||||||
        if (childNote.hideInAutocomplete) {
 | 
					 | 
				
			||||||
            continue;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        const childNotePath = (notePath ? (notePath + '/') : '') + childNote.noteId;
 | 
					 | 
				
			||||||
        const childTitlePath = (titlePath ? (titlePath + ' / ') : '') + await getNoteTitle(childNote.noteId, parentNoteId);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        autocompleteItems.push({
 | 
					 | 
				
			||||||
            value: childTitlePath + ' (' + childNotePath + ')',
 | 
					 | 
				
			||||||
            label: childTitlePath
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        const childItems = await getAutocompleteItems(childNote.noteId, childNotePath, childTitlePath);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for (const childItem of childItems) {
 | 
					 | 
				
			||||||
            autocompleteItems.push(childItem);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return autocompleteItems;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
async function setNoteTitle(noteId, title) {
 | 
					async function setNoteTitle(noteId, title) {
 | 
				
			||||||
    utils.assertArguments(noteId);
 | 
					    utils.assertArguments(noteId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -886,18 +806,15 @@ export default {
 | 
				
			|||||||
    scrollToCurrentNote,
 | 
					    scrollToCurrentNote,
 | 
				
			||||||
    setBranchBackgroundBasedOnProtectedStatus,
 | 
					    setBranchBackgroundBasedOnProtectedStatus,
 | 
				
			||||||
    setProtected,
 | 
					    setProtected,
 | 
				
			||||||
    getCurrentNode,
 | 
					 | 
				
			||||||
    expandToNote,
 | 
					    expandToNote,
 | 
				
			||||||
    activateNode,
 | 
					    activateNode,
 | 
				
			||||||
 | 
					    getCurrentNode,
 | 
				
			||||||
    getCurrentNotePath,
 | 
					    getCurrentNotePath,
 | 
				
			||||||
    getNoteTitle,
 | 
					 | 
				
			||||||
    setCurrentNotePathToHash,
 | 
					    setCurrentNotePathToHash,
 | 
				
			||||||
    getAutocompleteItems,
 | 
					 | 
				
			||||||
    setNoteTitle,
 | 
					    setNoteTitle,
 | 
				
			||||||
 | 
					    setPrefix,
 | 
				
			||||||
    createNewTopLevelNote,
 | 
					    createNewTopLevelNote,
 | 
				
			||||||
    createNote,
 | 
					    createNote,
 | 
				
			||||||
    setPrefix,
 | 
					 | 
				
			||||||
    getNotePathTitle,
 | 
					 | 
				
			||||||
    removeParentChildRelation,
 | 
					    removeParentChildRelation,
 | 
				
			||||||
    setParentChildRelation,
 | 
					    setParentChildRelation,
 | 
				
			||||||
    getSelectedNodes,
 | 
					    getSelectedNodes,
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,5 @@
 | 
				
			|||||||
import utils from './utils.js';
 | 
					import utils from './utils.js';
 | 
				
			||||||
 | 
					import treeCache from "./tree_cache.js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const $tree = $("#tree");
 | 
					const $tree = $("#tree");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -30,9 +31,43 @@ function getNotePath(node) {
 | 
				
			|||||||
    return path.reverse().join("/");
 | 
					    return path.reverse().join("/");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async function getNoteTitle(noteId, parentNoteId = null) {
 | 
				
			||||||
 | 
					    utils.assertArguments(noteId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let {title} = await treeCache.getNote(noteId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (parentNoteId !== null) {
 | 
				
			||||||
 | 
					        const branch = await treeCache.getBranchByChildParent(noteId, parentNoteId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (branch && branch.prefix) {
 | 
				
			||||||
 | 
					            title = branch.prefix + ' - ' + title;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return title;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async function getNotePathTitle(notePath) {
 | 
				
			||||||
 | 
					    utils.assertArguments(notePath);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const titlePath = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let parentNoteId = 'root';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (const noteId of notePath.split('/')) {
 | 
				
			||||||
 | 
					        titlePath.push(await getNoteTitle(noteId, parentNoteId));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        parentNoteId = noteId;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return titlePath.join(' / ');
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default {
 | 
					export default {
 | 
				
			||||||
    getParentProtectedStatus,
 | 
					    getParentProtectedStatus,
 | 
				
			||||||
    getNodeByKey,
 | 
					    getNodeByKey,
 | 
				
			||||||
    getNotePath,
 | 
					    getNotePath,
 | 
				
			||||||
    getNoteIdFromNotePath,
 | 
					    getNoteIdFromNotePath,
 | 
				
			||||||
 | 
					    getNoteTitle,
 | 
				
			||||||
 | 
					    getNotePathTitle,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user