mirror of
https://github.com/zadam/trilium.git
synced 2025-11-03 03:46:37 +01:00
Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f7bd72ba2f | ||
|
|
038c0e78a6 | ||
|
|
2a2cbcd68b | ||
|
|
14da697a4e | ||
|
|
2525857c20 | ||
|
|
8eaef3e1d8 | ||
|
|
082caf98e8 | ||
|
|
60602a2264 | ||
|
|
9479f1c1a1 | ||
|
|
88bc7402a2 | ||
|
|
e7b3c3239b | ||
|
|
4f4c3ef3f3 | ||
|
|
decfeb366c |
@@ -1,6 +1,6 @@
|
|||||||
UPDATE branches SET branchId = '_hidden__search' WHERE parentNoteId = 'hidden' AND noteId = 'search';
|
UPDATE branches SET branchId = '_hidden__search' WHERE parentNoteId = 'hidden' AND noteId = 'search' AND isDeleted = 0;
|
||||||
UPDATE branches SET branchId = 'root__globalNoteMap' WHERE parentNoteId = 'singles' AND noteId = 'globalnotemap';
|
UPDATE branches SET branchId = 'root__globalNoteMap' WHERE parentNoteId = 'singles' AND noteId = 'globalnotemap' AND isDeleted = 0;
|
||||||
UPDATE branches SET branchId = '_hidden__sqlConsole' WHERE parentNoteId = 'hidden' AND noteId = 'sqlconsole';
|
UPDATE branches SET branchId = '_hidden__sqlConsole' WHERE parentNoteId = 'hidden' AND noteId = 'sqlconsole' AND isDeleted = 0;
|
||||||
UPDATE branches SET branchId = 'root__hidden' WHERE parentNoteId = 'root' AND noteId = 'hidden';
|
UPDATE branches SET branchId = 'root__hidden' WHERE parentNoteId = 'root' AND noteId = 'hidden' AND isDeleted = 0;
|
||||||
UPDATE branches SET branchId = '_hidden__bulkAction' WHERE parentNoteId = 'hidden' AND noteId = 'bulkaction';
|
UPDATE branches SET branchId = '_hidden__bulkAction' WHERE parentNoteId = 'hidden' AND noteId = 'bulkaction' AND isDeleted = 0;
|
||||||
UPDATE branches SET branchId = '_hidden__share' WHERE parentNoteId = 'root' AND noteId = 'share';
|
UPDATE branches SET branchId = '_hidden__share' WHERE parentNoteId = 'root' AND noteId = 'share' AND isDeleted = 0;
|
||||||
|
|||||||
@@ -12,5 +12,10 @@ module.exports = () => {
|
|||||||
|
|
||||||
attr.markAsDeleted("0204__migrate_bookmarks_to_clones");
|
attr.markAsDeleted("0204__migrate_bookmarks_to_clones");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// bookmarkFolder used to work in 0.57 without the bookmarked label
|
||||||
|
for (const attr of becca.findAttributes('label','bookmarkFolder')) {
|
||||||
|
cloningService.toggleNoteInParent(true, attr.noteId, '_lbBookmarks');
|
||||||
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"name": "trilium",
|
"name": "trilium",
|
||||||
"productName": "Trilium Notes",
|
"productName": "Trilium Notes",
|
||||||
"description": "Trilium Notes",
|
"description": "Trilium Notes",
|
||||||
"version": "0.58.4",
|
"version": "0.58.5",
|
||||||
"license": "AGPL-3.0-only",
|
"license": "AGPL-3.0-only",
|
||||||
"main": "electron.js",
|
"main": "electron.js",
|
||||||
"bin": {
|
"bin": {
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ const NoteRevision = require("./note_revision");
|
|||||||
const TaskContext = require("../../services/task_context");
|
const TaskContext = require("../../services/task_context");
|
||||||
const dayjs = require("dayjs");
|
const dayjs = require("dayjs");
|
||||||
const utc = require('dayjs/plugin/utc');
|
const utc = require('dayjs/plugin/utc');
|
||||||
|
const eventService = require("../../services/events");
|
||||||
dayjs.extend(utc)
|
dayjs.extend(utc)
|
||||||
|
|
||||||
const LABEL = 'label';
|
const LABEL = 'label';
|
||||||
@@ -314,6 +315,11 @@ class Note extends AbstractEntity {
|
|||||||
utcDateChanged: pojo.utcDateModified,
|
utcDateChanged: pojo.utcDateModified,
|
||||||
isSynced: true
|
isSynced: true
|
||||||
});
|
});
|
||||||
|
|
||||||
|
eventService.emit(eventService.ENTITY_CHANGED, {
|
||||||
|
entityName: 'note_contents',
|
||||||
|
entity: this
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
setJsonContent(content) {
|
setJsonContent(content) {
|
||||||
@@ -1107,6 +1113,13 @@ class Note extends AbstractEntity {
|
|||||||
return notePaths;
|
return notePaths;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return boolean - true if there's no non-hidden path, note is not cloned to the visible tree
|
||||||
|
*/
|
||||||
|
isHiddenCompletely() {
|
||||||
|
return !this.getAllNotePaths().find(notePathArr => !notePathArr.includes('_hidden'));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param ancestorNoteId
|
* @param ancestorNoteId
|
||||||
* @return {boolean} - true if ancestorNoteId occurs in at least one of the note's paths
|
* @return {boolean} - true if ancestorNoteId occurs in at least one of the note's paths
|
||||||
@@ -1351,7 +1364,7 @@ class Note extends AbstractEntity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
isOptions() {
|
isOptions() {
|
||||||
return this.noteId.startsWith("options");
|
return this.noteId.startsWith("_options");
|
||||||
}
|
}
|
||||||
|
|
||||||
get isDeleted() {
|
get isDeleted() {
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ class ZoomComponent extends Component {
|
|||||||
|
|
||||||
async setZoomFactorAndSave(zoomFactor) {
|
async setZoomFactorAndSave(zoomFactor) {
|
||||||
if (zoomFactor >= MIN_ZOOM && zoomFactor <= MAX_ZOOM) {
|
if (zoomFactor >= MIN_ZOOM && zoomFactor <= MAX_ZOOM) {
|
||||||
zoomFactor = Math.round(zoomFactor * 1000) / 1000;
|
zoomFactor = Math.round(zoomFactor * 10) / 10;
|
||||||
|
|
||||||
this.setZoomFactor(zoomFactor);
|
this.setZoomFactor(zoomFactor);
|
||||||
|
|
||||||
|
|||||||
@@ -364,6 +364,13 @@ class NoteShort {
|
|||||||
return notePaths;
|
return notePaths;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return boolean - true if there's no non-hidden path, note is not cloned to the visible tree
|
||||||
|
*/
|
||||||
|
isHiddenCompletely() {
|
||||||
|
return !this.getAllNotePaths().find(notePathArr => !notePathArr.includes('_hidden'));
|
||||||
|
}
|
||||||
|
|
||||||
__filterAttrs(attributes, type, name) {
|
__filterAttrs(attributes, type, name) {
|
||||||
this.__validateTypeName(type, name);
|
this.__validateTypeName(type, name);
|
||||||
|
|
||||||
@@ -853,7 +860,7 @@ class NoteShort {
|
|||||||
}
|
}
|
||||||
|
|
||||||
isOptions() {
|
isOptions() {
|
||||||
return this.noteId.startsWith("options");
|
return this.noteId.startsWith("_options");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -230,6 +230,10 @@ function init() {
|
|||||||
|
|
||||||
$.fn.getSelectedNoteId = function () {
|
$.fn.getSelectedNoteId = function () {
|
||||||
const notePath = $(this).getSelectedNotePath();
|
const notePath = $(this).getSelectedNotePath();
|
||||||
|
if (!notePath) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
const chunks = notePath.split('/');
|
const chunks = notePath.split('/');
|
||||||
|
|
||||||
return chunks.length >= 1 ? chunks[chunks.length - 1] : null;
|
return chunks.length >= 1 ? chunks[chunks.length - 1] : null;
|
||||||
|
|||||||
@@ -247,7 +247,7 @@ const ATTR_HELP = {
|
|||||||
"runOnNoteCreation": "executes when note is created on backend. Use this relation if you want to run the script for all notes created under a specific subtree. In that case, create it on the subtree root note and make it inheritable. A new note created within the subtree (any depth) will trigger the script.",
|
"runOnNoteCreation": "executes when note is created on backend. Use this relation if you want to run the script for all notes created under a specific subtree. In that case, create it on the subtree root note and make it inheritable. A new note created within the subtree (any depth) will trigger the script.",
|
||||||
"runOnChildNoteCreation": "executes when new note is created under the note where this relation is defined",
|
"runOnChildNoteCreation": "executes when new note is created under the note where this relation is defined",
|
||||||
"runOnNoteTitleChange": "executes when note title is changed (includes note creation as well)",
|
"runOnNoteTitleChange": "executes when note title is changed (includes note creation as well)",
|
||||||
"runOnNoteContentChange": "executes when note content is changed (includes note creation as well).",
|
"runOnNoteContentChange": "executes when note content is changed (includes note creation as well).",
|
||||||
"runOnNoteChange": "executes when note is changed (includes note creation as well). Does not include content changes",
|
"runOnNoteChange": "executes when note is changed (includes note creation as well). Does not include content changes",
|
||||||
"runOnNoteDeletion": "executes when note is being deleted",
|
"runOnNoteDeletion": "executes when note is being deleted",
|
||||||
"runOnBranchCreation": "executes when a branch is created. Branch is a link between parent note and child note and is created e.g. when cloning or moving note.",
|
"runOnBranchCreation": "executes when a branch is created. Branch is a link between parent note and child note and is created e.g. when cloning or moving note.",
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ export default class CodeButtonsWidget extends NoteContextAwareWidget {
|
|||||||
|
|
||||||
this.$saveToNoteButton.toggle(
|
this.$saveToNoteButton.toggle(
|
||||||
note.mime === 'text/x-sqlite;schema=trilium'
|
note.mime === 'text/x-sqlite;schema=trilium'
|
||||||
&& !note.getAllNotePaths().find(notePathArr => !notePathArr.includes('_hidden'))
|
&& note.isHiddenCompletely()
|
||||||
);
|
);
|
||||||
|
|
||||||
this.$openTriliumApiDocsButton.toggle(note.mime.startsWith('application/javascript;env='));
|
this.$openTriliumApiDocsButton.toggle(note.mime.startsWith('application/javascript;env='));
|
||||||
|
|||||||
@@ -1309,6 +1309,8 @@ export default class NoteTreeWidget extends NoteContextAwareWidget {
|
|||||||
await this.tree.reload([rootNode]);
|
await this.tree.reload([rootNode]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
await this.filterHoistedBranch();
|
||||||
|
|
||||||
if (activeNotePath) {
|
if (activeNotePath) {
|
||||||
const node = await this.getNodeFromPath(activeNotePath, true);
|
const node = await this.getNodeFromPath(activeNotePath, true);
|
||||||
|
|
||||||
|
|||||||
@@ -270,7 +270,7 @@ export default class SearchDefinitionWidget extends NoteContextAwareWidget {
|
|||||||
async refreshWithNote(note) {
|
async refreshWithNote(note) {
|
||||||
this.$component.show();
|
this.$component.show();
|
||||||
|
|
||||||
this.$saveToNoteButton.toggle(!note.getAllNotePaths().find(notePathArr => !notePathArr.includes('_hidden')));
|
this.$saveToNoteButton.toggle(note.isHiddenCompletely());
|
||||||
|
|
||||||
this.$searchOptions.empty();
|
this.$searchOptions.empty();
|
||||||
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
module.exports = { buildDate:"2023-01-11T23:44:33+01:00", buildRevision: "bdfdc0402ddb23e9af002580f368bc52e4268b3a" };
|
module.exports = { buildDate:"2023-01-14T23:02:39+01:00", buildRevision: "038c0e78a64c30f9eda47fa265c9f31de98cbc5b" };
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ module.exports = [
|
|||||||
{ type: 'relation', name: 'runOnNoteCreation', isDangerous: true },
|
{ type: 'relation', name: 'runOnNoteCreation', isDangerous: true },
|
||||||
{ type: 'relation', name: 'runOnNoteTitleChange', isDangerous: true },
|
{ type: 'relation', name: 'runOnNoteTitleChange', isDangerous: true },
|
||||||
{ type: 'relation', name: 'runOnNoteChange', isDangerous: true },
|
{ type: 'relation', name: 'runOnNoteChange', isDangerous: true },
|
||||||
|
{ type: 'relation', name: 'runOnNoteContentChange', isDangerous: true },
|
||||||
{ type: 'relation', name: 'runOnNoteDeletion', isDangerous: true },
|
{ type: 'relation', name: 'runOnNoteDeletion', isDangerous: true },
|
||||||
{ type: 'relation', name: 'runOnBranchCreation', isDangerous: true },
|
{ type: 'relation', name: 'runOnBranchCreation', isDangerous: true },
|
||||||
{ type: 'relation', name: 'runOnBranchDeletion', isDangerous: true },
|
{ type: 'relation', name: 'runOnBranchDeletion', isDangerous: true },
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ const treeService = require('./tree');
|
|||||||
const noteService = require('./notes');
|
const noteService = require('./notes');
|
||||||
const becca = require('../becca/becca');
|
const becca = require('../becca/becca');
|
||||||
const Attribute = require('../becca/entities/attribute');
|
const Attribute = require('../becca/entities/attribute');
|
||||||
|
const hiddenSubtreeService = require("./hidden_subtree");
|
||||||
|
const oneTimeTimer = require("./one_time_timer");
|
||||||
|
|
||||||
function runAttachedRelations(note, relationName, originEntity) {
|
function runAttachedRelations(note, relationName, originEntity) {
|
||||||
if (!note) {
|
if (!note) {
|
||||||
@@ -206,6 +208,16 @@ eventService.subscribe(eventService.ENTITY_DELETED, ({ entityName, entity }) =>
|
|||||||
if (entityName === 'branches') {
|
if (entityName === 'branches') {
|
||||||
runAttachedRelations(entity.getNote(), 'runOnBranchDeletion', entity);
|
runAttachedRelations(entity.getNote(), 'runOnBranchDeletion', entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (entityName === 'notes' && entity.noteId.startsWith("_")) {
|
||||||
|
// "named" note has been deleted, we will probably need to rebuild the hidden subtree
|
||||||
|
// scheduling so that bulk deletes won't trigger so many checks
|
||||||
|
oneTimeTimer.scheduleExecution('hidden-subtree-check', 1000, () => {
|
||||||
|
console.log("Checking hidden subtree");
|
||||||
|
|
||||||
|
hiddenSubtreeService.checkHiddenSubtree();
|
||||||
|
});
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
|||||||
@@ -76,8 +76,8 @@ function importEnex(taskContext, file, parentNote) {
|
|||||||
content = content.replace(/<\/ol>\s*<li>/g, "</ol></li><li>");
|
content = content.replace(/<\/ol>\s*<li>/g, "</ol></li><li>");
|
||||||
|
|
||||||
// Replace en-todo with unicode ballot box
|
// Replace en-todo with unicode ballot box
|
||||||
content = content.replace(/<en-todo\s+checked="true"\/>/g, "\u2611 ");
|
content = content.replace(/<en-todo\s+checked="true"\s*\/>/g, "\u2611 ");
|
||||||
content = content.replace(/<en-todo(\s+checked="false")?\/>/g, "\u2610 ");
|
content = content.replace(/<en-todo(\s+checked="false")?\s*\/>/g, "\u2610 ");
|
||||||
|
|
||||||
// Replace OneNote converted checkboxes with unicode ballot box based
|
// Replace OneNote converted checkboxes with unicode ballot box based
|
||||||
// on known hash of checkboxes for regular, p1, and p2 checkboxes
|
// on known hash of checkboxes for regular, p1, and p2 checkboxes
|
||||||
|
|||||||
@@ -108,8 +108,13 @@ function getAndValidateParent(params) {
|
|||||||
throw new ValidationError(`Only 'launcher' notes can be created in parent '${params.parentNoteId}'`);
|
throw new ValidationError(`Only 'launcher' notes can be created in parent '${params.parentNoteId}'`);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!params.ignoreForbiddenParents && (['_lbRoot', '_hidden'].includes(parentNote.noteId) || parentNote.isOptions())) {
|
if (!params.ignoreForbiddenParents) {
|
||||||
throw new ValidationError(`Creating child notes into '${parentNote.noteId}' is not allowed.`);
|
if (['_lbRoot', '_hidden'].includes(parentNote.noteId)
|
||||||
|
|| parentNote.noteId.startsWith("_lbTpl")
|
||||||
|
|| parentNote.isOptions()) {
|
||||||
|
|
||||||
|
throw new ValidationError(`Creating child notes into '${parentNote.noteId}' is not allowed.`);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return parentNote;
|
return parentNote;
|
||||||
@@ -281,8 +286,10 @@ function protectNote(note, protect) {
|
|||||||
|
|
||||||
note.isProtected = protect;
|
note.isProtected = protect;
|
||||||
|
|
||||||
// this will force de/encryption
|
if (content !== null) { // see https://github.com/zadam/trilium/issues/3523
|
||||||
note.setContent(content);
|
// this will force de/encryption
|
||||||
|
note.setContent(content);
|
||||||
|
}
|
||||||
|
|
||||||
note.save();
|
note.save();
|
||||||
}
|
}
|
||||||
@@ -590,11 +597,6 @@ function updateNoteContent(noteId, content) {
|
|||||||
content = saveLinks(note, content);
|
content = saveLinks(note, content);
|
||||||
|
|
||||||
note.setContent(content);
|
note.setContent(content);
|
||||||
|
|
||||||
eventService.emit(eventService.ENTITY_CHANGED, {
|
|
||||||
entityName: 'note_contents',
|
|
||||||
entity: note
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
25
src/services/one_time_timer.js
Normal file
25
src/services/one_time_timer.js
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
const scheduledExecutions = {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Subsequent calls will not move the timer to future. The first caller determines the time of execution.
|
||||||
|
*
|
||||||
|
* The good thing about synchronous better-sqlite3 is that this cannot interrupt transaction. The execution will be called
|
||||||
|
* only outside of a transaction.
|
||||||
|
*/
|
||||||
|
function scheduleExecution(name, milliseconds, cb) {
|
||||||
|
if (name in scheduledExecutions) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
scheduledExecutions[name] = true;
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
delete scheduledExecutions[name];
|
||||||
|
|
||||||
|
cb();
|
||||||
|
}, milliseconds);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
scheduleExecution
|
||||||
|
};
|
||||||
23
src/services/search/expressions/is_hidden.js
Normal file
23
src/services/search/expressions/is_hidden.js
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
const Expression = require('./expression');
|
||||||
|
const NoteSet = require('../note_set');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Note is hidden when all its note paths start in hidden subtree (i.e. the note is not cloned into visible tree)
|
||||||
|
*/
|
||||||
|
class IsHiddenExp extends Expression {
|
||||||
|
execute(inputNoteSet, executionContext, searchContext) {
|
||||||
|
const resultNoteSet = new NoteSet();
|
||||||
|
|
||||||
|
for (const note of inputNoteSet.notes) {
|
||||||
|
if (note.isHiddenCompletely()) {
|
||||||
|
resultNoteSet.add(note);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return resultNoteSet;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = IsHiddenExp;
|
||||||
@@ -6,10 +6,11 @@ class SearchContext {
|
|||||||
constructor(params = {}) {
|
constructor(params = {}) {
|
||||||
this.fastSearch = !!params.fastSearch;
|
this.fastSearch = !!params.fastSearch;
|
||||||
this.includeArchivedNotes = !!params.includeArchivedNotes;
|
this.includeArchivedNotes = !!params.includeArchivedNotes;
|
||||||
|
this.includeHiddenNotes = !!params.includeHiddenNotes;
|
||||||
this.ignoreHoistedNote = !!params.ignoreHoistedNote;
|
this.ignoreHoistedNote = !!params.ignoreHoistedNote;
|
||||||
this.ancestorNoteId = params.ancestorNoteId;
|
this.ancestorNoteId = params.ancestorNoteId;
|
||||||
|
|
||||||
if (!this.ancestorNoteId && !this.ignoreHoistedNote && !hoistedNoteService.isHoistedInHiddenSubtree()) {
|
if (!this.ancestorNoteId && !this.ignoreHoistedNote) {
|
||||||
// hoisting in hidden subtree should not limit autocomplete
|
// hoisting in hidden subtree should not limit autocomplete
|
||||||
// since we want to link (create relations) to the normal non-hidden notes
|
// since we want to link (create relations) to the normal non-hidden notes
|
||||||
this.ancestorNoteId = hoistedNoteService.getHoistedNoteId();
|
this.ancestorNoteId = hoistedNoteService.getHoistedNoteId();
|
||||||
|
|||||||
@@ -18,7 +18,8 @@ const AncestorExp = require("../expressions/ancestor");
|
|||||||
const buildComparator = require('./build_comparator');
|
const buildComparator = require('./build_comparator');
|
||||||
const ValueExtractor = require('../value_extractor');
|
const ValueExtractor = require('../value_extractor');
|
||||||
const utils = require("../../utils");
|
const utils = require("../../utils");
|
||||||
const TrueExp = require("../expressions/true.js");
|
const TrueExp = require("../expressions/true");
|
||||||
|
const IsHiddenExp = require("../expressions/is_hidden");
|
||||||
|
|
||||||
function getFulltext(tokens, searchContext) {
|
function getFulltext(tokens, searchContext) {
|
||||||
tokens = tokens.map(t => utils.removeDiacritic(t.token));
|
tokens = tokens.map(t => utils.removeDiacritic(t.token));
|
||||||
@@ -429,7 +430,7 @@ function parse({fulltextTokens, expressionTokens, searchContext}) {
|
|||||||
|
|
||||||
let exp = AndExp.of([
|
let exp = AndExp.of([
|
||||||
searchContext.includeArchivedNotes ? null : new PropertyComparisonExp(searchContext, "isarchived", "=", "false"),
|
searchContext.includeArchivedNotes ? null : new PropertyComparisonExp(searchContext, "isarchived", "=", "false"),
|
||||||
(searchContext.ancestorNoteId && searchContext.ancestorNoteId !== 'root') ? new AncestorExp(searchContext.ancestorNoteId, searchContext.ancestorDepth) : null,
|
getAncestorExp(searchContext),
|
||||||
getFulltext(fulltextTokens, searchContext),
|
getFulltext(fulltextTokens, searchContext),
|
||||||
expression
|
expression
|
||||||
]);
|
]);
|
||||||
@@ -448,4 +449,14 @@ function parse({fulltextTokens, expressionTokens, searchContext}) {
|
|||||||
return exp;
|
return exp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getAncestorExp({ancestorNoteId, ancestorDepth, includeHiddenNotes}) {
|
||||||
|
if (ancestorNoteId && ancestorNoteId !== 'root') {
|
||||||
|
return new AncestorExp(ancestorNoteId, ancestorDepth);
|
||||||
|
} else if (!includeHiddenNotes) {
|
||||||
|
return new NotExp(new IsHiddenExp());
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
module.exports = parse;
|
module.exports = parse;
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ const beccaService = require('../../../becca/becca_service');
|
|||||||
const utils = require('../../utils');
|
const utils = require('../../utils');
|
||||||
const log = require('../../log');
|
const log = require('../../log');
|
||||||
const scriptService = require("../../script");
|
const scriptService = require("../../script");
|
||||||
|
const hoistedNoteService = require("../../hoisted_note");
|
||||||
|
|
||||||
function searchFromNote(note) {
|
function searchFromNote(note) {
|
||||||
let searchResultNoteIds, highlightedTokens;
|
let searchResultNoteIds, highlightedTokens;
|
||||||
@@ -271,7 +272,11 @@ function searchNotesForAutocomplete(query) {
|
|||||||
const searchContext = new SearchContext({
|
const searchContext = new SearchContext({
|
||||||
fastSearch: true,
|
fastSearch: true,
|
||||||
includeArchivedNotes: false,
|
includeArchivedNotes: false,
|
||||||
fuzzyAttributeSearch: true
|
includeHiddenNotes: true,
|
||||||
|
fuzzyAttributeSearch: true,
|
||||||
|
ancestorNoteId: hoistedNoteService.isHoistedInHiddenSubtree()
|
||||||
|
? 'root'
|
||||||
|
: hoistedNoteService.getHoistedNoteId()
|
||||||
});
|
});
|
||||||
|
|
||||||
const allSearchResults = findResultsWithQuery(query, searchContext);
|
const allSearchResults = findResultsWithQuery(query, searchContext);
|
||||||
|
|||||||
@@ -218,7 +218,7 @@ function resetLauncher(noteId) {
|
|||||||
log.info(`Note ${noteId} is not a resettable launcher note.`);
|
log.info(`Note ${noteId} is not a resettable launcher note.`);
|
||||||
}
|
}
|
||||||
|
|
||||||
hiddenSubtreeService.checkHiddenSubtree();
|
// the re-building deleted launchers will be done in handlers
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user