mirror of
https://github.com/zadam/trilium.git
synced 2025-06-06 18:08:33 +02: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