From 4f4c3ef3f3e504776940976ded91f3e8c5c578ea Mon Sep 17 00:00:00 2001 From: zadam Date: Thu, 12 Jan 2023 16:45:11 +0100 Subject: [PATCH 01/24] fix enex checkboxes for mac, closes #3511 --- src/services/import/enex.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/services/import/enex.js b/src/services/import/enex.js index 5f9489189..f0598e0fd 100644 --- a/src/services/import/enex.js +++ b/src/services/import/enex.js @@ -76,8 +76,8 @@ function importEnex(taskContext, file, parentNote) { content = content.replace(/<\/ol>\s*
  • /g, "
  • "); // Replace en-todo with unicode ballot box - content = content.replace(//g, "\u2611 "); - content = content.replace(//g, "\u2610 "); + content = content.replace(//g, "\u2611 "); + content = content.replace(//g, "\u2610 "); // Replace OneNote converted checkboxes with unicode ballot box based // on known hash of checkboxes for regular, p1, and p2 checkboxes From e7b3c3239b5b81f3901af59b92c6e84b6fd9575d Mon Sep 17 00:00:00 2001 From: zadam Date: Fri, 13 Jan 2023 08:43:18 +0100 Subject: [PATCH 02/24] fix migration of bookmarks to also migrate bookmarkFolder #3514 --- db/migrations/0204__migrate_bookmarks_to_clones.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/db/migrations/0204__migrate_bookmarks_to_clones.js b/db/migrations/0204__migrate_bookmarks_to_clones.js index 82cc11ebe..6b180a446 100644 --- a/db/migrations/0204__migrate_bookmarks_to_clones.js +++ b/db/migrations/0204__migrate_bookmarks_to_clones.js @@ -12,5 +12,10 @@ module.exports = () => { 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'); + } }); }; From 88bc7402a22fe2bb1a7eae0af7b980d8ca1e14a8 Mon Sep 17 00:00:00 2001 From: zadam Date: Fri, 13 Jan 2023 10:09:41 +0100 Subject: [PATCH 03/24] hidden notes should not appear in the global search unless hoisted into it, #3516 --- src/becca/entities/note.js | 7 ++++++ src/public/app/entities/note_short.js | 7 ++++++ src/public/app/services/note_autocomplete.js | 4 ++++ .../widgets/floating_buttons/code_buttons.js | 2 +- .../ribbon_widgets/search_definition.js | 2 +- src/services/search/expressions/is_hidden.js | 23 +++++++++++++++++++ src/services/search/search_context.js | 3 ++- src/services/search/services/parse.js | 15 ++++++++++-- src/services/search/services/search.js | 7 +++++- 9 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 src/services/search/expressions/is_hidden.js diff --git a/src/becca/entities/note.js b/src/becca/entities/note.js index ae1b1df52..00140a7d1 100644 --- a/src/becca/entities/note.js +++ b/src/becca/entities/note.js @@ -1107,6 +1107,13 @@ class Note extends AbstractEntity { 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 * @return {boolean} - true if ancestorNoteId occurs in at least one of the note's paths diff --git a/src/public/app/entities/note_short.js b/src/public/app/entities/note_short.js index e496c6543..effd59790 100644 --- a/src/public/app/entities/note_short.js +++ b/src/public/app/entities/note_short.js @@ -364,6 +364,13 @@ class NoteShort { 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) { this.__validateTypeName(type, name); diff --git a/src/public/app/services/note_autocomplete.js b/src/public/app/services/note_autocomplete.js index 157c24261..07c75d447 100644 --- a/src/public/app/services/note_autocomplete.js +++ b/src/public/app/services/note_autocomplete.js @@ -230,6 +230,10 @@ function init() { $.fn.getSelectedNoteId = function () { const notePath = $(this).getSelectedNotePath(); + if (!notePath) { + return null; + } + const chunks = notePath.split('/'); return chunks.length >= 1 ? chunks[chunks.length - 1] : null; diff --git a/src/public/app/widgets/floating_buttons/code_buttons.js b/src/public/app/widgets/floating_buttons/code_buttons.js index 9363856a5..f1763870b 100644 --- a/src/public/app/widgets/floating_buttons/code_buttons.js +++ b/src/public/app/widgets/floating_buttons/code_buttons.js @@ -76,7 +76,7 @@ export default class CodeButtonsWidget extends NoteContextAwareWidget { this.$saveToNoteButton.toggle( 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=')); diff --git a/src/public/app/widgets/ribbon_widgets/search_definition.js b/src/public/app/widgets/ribbon_widgets/search_definition.js index 0dc4d4841..4ca8e17d9 100644 --- a/src/public/app/widgets/ribbon_widgets/search_definition.js +++ b/src/public/app/widgets/ribbon_widgets/search_definition.js @@ -270,7 +270,7 @@ export default class SearchDefinitionWidget extends NoteContextAwareWidget { async refreshWithNote(note) { this.$component.show(); - this.$saveToNoteButton.toggle(!note.getAllNotePaths().find(notePathArr => !notePathArr.includes('_hidden'))); + this.$saveToNoteButton.toggle(note.isHiddenCompletely()); this.$searchOptions.empty(); diff --git a/src/services/search/expressions/is_hidden.js b/src/services/search/expressions/is_hidden.js new file mode 100644 index 000000000..023c69087 --- /dev/null +++ b/src/services/search/expressions/is_hidden.js @@ -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; diff --git a/src/services/search/search_context.js b/src/services/search/search_context.js index 6c427cf5f..95b8b8c57 100644 --- a/src/services/search/search_context.js +++ b/src/services/search/search_context.js @@ -6,10 +6,11 @@ class SearchContext { constructor(params = {}) { this.fastSearch = !!params.fastSearch; this.includeArchivedNotes = !!params.includeArchivedNotes; + this.includeHiddenNotes = !!params.includeHiddenNotes; this.ignoreHoistedNote = !!params.ignoreHoistedNote; this.ancestorNoteId = params.ancestorNoteId; - if (!this.ancestorNoteId && !this.ignoreHoistedNote && !hoistedNoteService.isHoistedInHiddenSubtree()) { + if (!this.ancestorNoteId && !this.ignoreHoistedNote) { // hoisting in hidden subtree should not limit autocomplete // since we want to link (create relations) to the normal non-hidden notes this.ancestorNoteId = hoistedNoteService.getHoistedNoteId(); diff --git a/src/services/search/services/parse.js b/src/services/search/services/parse.js index 0b121f959..6332f7728 100644 --- a/src/services/search/services/parse.js +++ b/src/services/search/services/parse.js @@ -18,7 +18,8 @@ const AncestorExp = require("../expressions/ancestor"); const buildComparator = require('./build_comparator'); const ValueExtractor = require('../value_extractor'); 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) { tokens = tokens.map(t => utils.removeDiacritic(t.token)); @@ -429,7 +430,7 @@ function parse({fulltextTokens, expressionTokens, searchContext}) { let exp = AndExp.of([ 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), expression ]); @@ -448,4 +449,14 @@ function parse({fulltextTokens, expressionTokens, searchContext}) { 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; diff --git a/src/services/search/services/search.js b/src/services/search/services/search.js index 3e2f5af40..3b18c0b33 100644 --- a/src/services/search/services/search.js +++ b/src/services/search/services/search.js @@ -11,6 +11,7 @@ const beccaService = require('../../../becca/becca_service'); const utils = require('../../utils'); const log = require('../../log'); const scriptService = require("../../script"); +const hoistedNoteService = require("../../hoisted_note"); function searchFromNote(note) { let searchResultNoteIds, highlightedTokens; @@ -271,7 +272,11 @@ function searchNotesForAutocomplete(query) { const searchContext = new SearchContext({ fastSearch: true, includeArchivedNotes: false, - fuzzyAttributeSearch: true + includeHiddenNotes: true, + fuzzyAttributeSearch: true, + ancestorNoteId: hoistedNoteService.isHoistedInHiddenSubtree() + ? 'root' + : hoistedNoteService.getHoistedNoteId() }); const allSearchResults = findResultsWithQuery(query, searchContext); From 9479f1c1a15e4b8edce300b2260ff007f997a6c0 Mon Sep 17 00:00:00 2001 From: zadam Date: Fri, 13 Jan 2023 11:25:58 +0100 Subject: [PATCH 04/24] toggling archived notes caused appearance of hidden subtree, fixes #3519 --- src/public/app/widgets/note_tree.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/public/app/widgets/note_tree.js b/src/public/app/widgets/note_tree.js index b471d7acd..0d911fd47 100644 --- a/src/public/app/widgets/note_tree.js +++ b/src/public/app/widgets/note_tree.js @@ -1309,6 +1309,8 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { await this.tree.reload([rootNode]); }); + await this.filterHoistedBranch(); + if (activeNotePath) { const node = await this.getNodeFromPath(activeNotePath, true); From 60602a2264d105bf3b800a550f11346fefaed3a5 Mon Sep 17 00:00:00 2001 From: zadam Date: Fri, 13 Jan 2023 11:34:35 +0100 Subject: [PATCH 05/24] fix creating notes into options, #3517 --- src/becca/entities/note.js | 2 +- src/services/notes.js | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/becca/entities/note.js b/src/becca/entities/note.js index 00140a7d1..3a994a507 100644 --- a/src/becca/entities/note.js +++ b/src/becca/entities/note.js @@ -1358,7 +1358,7 @@ class Note extends AbstractEntity { } isOptions() { - return this.noteId.startsWith("options"); + return this.noteId.startsWith("_options"); } get isDeleted() { diff --git a/src/services/notes.js b/src/services/notes.js index 95dff2ec3..813e75bc6 100644 --- a/src/services/notes.js +++ b/src/services/notes.js @@ -108,8 +108,13 @@ function getAndValidateParent(params) { throw new ValidationError(`Only 'launcher' notes can be created in parent '${params.parentNoteId}'`); } - if (!params.ignoreForbiddenParents && (['_lbRoot', '_hidden'].includes(parentNote.noteId) || parentNote.isOptions())) { - throw new ValidationError(`Creating child notes into '${parentNote.noteId}' is not allowed.`); + if (!params.ignoreForbiddenParents) { + 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; From 082caf98e809bf3dc6a18edb6c26750f61015522 Mon Sep 17 00:00:00 2001 From: zadam Date: Fri, 13 Jan 2023 11:53:25 +0100 Subject: [PATCH 06/24] restore all "named" notes quickly after their deletion, #3517 --- src/services/handlers.js | 12 ++++++++++++ src/services/one_time_timer.js | 25 +++++++++++++++++++++++++ src/services/special_notes.js | 2 +- 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 src/services/one_time_timer.js diff --git a/src/services/handlers.js b/src/services/handlers.js index fc67b464f..98fc873dd 100644 --- a/src/services/handlers.js +++ b/src/services/handlers.js @@ -4,6 +4,8 @@ const treeService = require('./tree'); const noteService = require('./notes'); const becca = require('../becca/becca'); const Attribute = require('../becca/entities/attribute'); +const hiddenSubtreeService = require("./hidden_subtree"); +const oneTimeTimer = require("./one_time_timer"); function runAttachedRelations(note, relationName, originEntity) { if (!note) { @@ -206,6 +208,16 @@ eventService.subscribe(eventService.ENTITY_DELETED, ({ entityName, entity }) => if (entityName === 'branches') { 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 = { diff --git a/src/services/one_time_timer.js b/src/services/one_time_timer.js new file mode 100644 index 000000000..68b4dfef4 --- /dev/null +++ b/src/services/one_time_timer.js @@ -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 +}; \ No newline at end of file diff --git a/src/services/special_notes.js b/src/services/special_notes.js index ee88a48eb..bbc1bc978 100644 --- a/src/services/special_notes.js +++ b/src/services/special_notes.js @@ -218,7 +218,7 @@ function resetLauncher(noteId) { log.info(`Note ${noteId} is not a resettable launcher note.`); } - hiddenSubtreeService.checkHiddenSubtree(); + // the re-building deleted launchers will be done in handlers } /** From 8eaef3e1d823b24345a8dd2579a68208ba65e0ea Mon Sep 17 00:00:00 2001 From: zadam Date: Fri, 13 Jan 2023 14:28:41 +0100 Subject: [PATCH 07/24] add runOnNoteContentChange into the autocomplete --- src/public/app/widgets/attribute_widgets/attribute_detail.js | 2 +- src/services/builtin_attributes.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/public/app/widgets/attribute_widgets/attribute_detail.js b/src/public/app/widgets/attribute_widgets/attribute_detail.js index bf44a8a4e..ba637e86f 100644 --- a/src/public/app/widgets/attribute_widgets/attribute_detail.js +++ b/src/public/app/widgets/attribute_widgets/attribute_detail.js @@ -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.", "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)", - "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", "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.", diff --git a/src/services/builtin_attributes.js b/src/services/builtin_attributes.js index 80331a02a..b37b21814 100644 --- a/src/services/builtin_attributes.js +++ b/src/services/builtin_attributes.js @@ -71,6 +71,7 @@ module.exports = [ { type: 'relation', name: 'runOnNoteCreation', isDangerous: true }, { type: 'relation', name: 'runOnNoteTitleChange', isDangerous: true }, { type: 'relation', name: 'runOnNoteChange', isDangerous: true }, + { type: 'relation', name: 'runOnNoteContentChange', isDangerous: true }, { type: 'relation', name: 'runOnNoteDeletion', isDangerous: true }, { type: 'relation', name: 'runOnBranchCreation', isDangerous: true }, { type: 'relation', name: 'runOnBranchDeletion', isDangerous: true }, From 2525857c206284993e2ec24a0176a8217f44c6c0 Mon Sep 17 00:00:00 2001 From: zadam Date: Sat, 14 Jan 2023 00:01:24 +0100 Subject: [PATCH 08/24] fix null content when protecting notes, closes #3523 --- src/services/notes.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/services/notes.js b/src/services/notes.js index 813e75bc6..c361b0542 100644 --- a/src/services/notes.js +++ b/src/services/notes.js @@ -286,8 +286,10 @@ function protectNote(note, protect) { note.isProtected = protect; - // this will force de/encryption - note.setContent(content); + if (content !== null) { // see https://github.com/zadam/trilium/issues/3523 + // this will force de/encryption + note.setContent(content); + } note.save(); } From 14da697a4ec6f0e8e8c7b9c8bd96e4b384acbdb6 Mon Sep 17 00:00:00 2001 From: zadam Date: Sat, 14 Jan 2023 12:57:50 +0100 Subject: [PATCH 09/24] put firing of the runOnNoteContentChange on entity level instead of service level, #3436 --- src/becca/entities/note.js | 6 ++++++ src/services/notes.js | 5 ----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/becca/entities/note.js b/src/becca/entities/note.js index 3a994a507..80ac1422b 100644 --- a/src/becca/entities/note.js +++ b/src/becca/entities/note.js @@ -11,6 +11,7 @@ const NoteRevision = require("./note_revision"); const TaskContext = require("../../services/task_context"); const dayjs = require("dayjs"); const utc = require('dayjs/plugin/utc'); +const eventService = require("../../services/events"); dayjs.extend(utc) const LABEL = 'label'; @@ -314,6 +315,11 @@ class Note extends AbstractEntity { utcDateChanged: pojo.utcDateModified, isSynced: true }); + + eventService.emit(eventService.ENTITY_CHANGED, { + entityName: 'note_contents', + entity: this + }); } setJsonContent(content) { diff --git a/src/services/notes.js b/src/services/notes.js index c361b0542..48ae814cf 100644 --- a/src/services/notes.js +++ b/src/services/notes.js @@ -597,11 +597,6 @@ function updateNoteContent(noteId, content) { content = saveLinks(note, content); note.setContent(content); - - eventService.emit(eventService.ENTITY_CHANGED, { - entityName: 'note_contents', - entity: note - }); } /** From 2a2cbcd68ba7aa62ce6db34e5b89cacc8399bfd7 Mon Sep 17 00:00:00 2001 From: zadam Date: Sat, 14 Jan 2023 22:55:22 +0100 Subject: [PATCH 10/24] fix duplicate unique key in migration, #3526 --- db/migrations/0198__rename_branchIds.sql | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/db/migrations/0198__rename_branchIds.sql b/db/migrations/0198__rename_branchIds.sql index 3c6cd0e64..5b32eb51c 100644 --- a/db/migrations/0198__rename_branchIds.sql +++ b/db/migrations/0198__rename_branchIds.sql @@ -1,6 +1,6 @@ -UPDATE branches SET branchId = '_hidden__search' WHERE parentNoteId = 'hidden' AND noteId = 'search'; -UPDATE branches SET branchId = 'root__globalNoteMap' WHERE parentNoteId = 'singles' AND noteId = 'globalnotemap'; -UPDATE branches SET branchId = '_hidden__sqlConsole' WHERE parentNoteId = 'hidden' AND noteId = 'sqlconsole'; -UPDATE branches SET branchId = 'root__hidden' WHERE parentNoteId = 'root' AND noteId = 'hidden'; -UPDATE branches SET branchId = '_hidden__bulkAction' WHERE parentNoteId = 'hidden' AND noteId = 'bulkaction'; -UPDATE branches SET branchId = '_hidden__share' WHERE parentNoteId = 'root' AND noteId = 'share'; +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' AND isDeleted = 0; +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' AND isDeleted = 0; +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' AND isDeleted = 0; From 038c0e78a64c30f9eda47fa265c9f31de98cbc5b Mon Sep 17 00:00:00 2001 From: zadam Date: Sat, 14 Jan 2023 23:01:02 +0100 Subject: [PATCH 11/24] fix options check in froca --- src/public/app/entities/note_short.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/public/app/entities/note_short.js b/src/public/app/entities/note_short.js index effd59790..dabdf396c 100644 --- a/src/public/app/entities/note_short.js +++ b/src/public/app/entities/note_short.js @@ -860,7 +860,7 @@ class NoteShort { } isOptions() { - return this.noteId.startsWith("options"); + return this.noteId.startsWith("_options"); } } From f7bd72ba2fa4856f6b8ee0a45efea8454e1eaced Mon Sep 17 00:00:00 2001 From: zadam Date: Sat, 14 Jan 2023 23:02:39 +0100 Subject: [PATCH 12/24] release 0.58.5 --- package.json | 2 +- src/services/build.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index dfe9b1ae5..9184da1de 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "trilium", "productName": "Trilium Notes", "description": "Trilium Notes", - "version": "0.58.4", + "version": "0.58.5", "license": "AGPL-3.0-only", "main": "electron.js", "bin": { diff --git a/src/services/build.js b/src/services/build.js index f3031a049..026f4e4c3 100644 --- a/src/services/build.js +++ b/src/services/build.js @@ -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" }; From df0f52aff93b3c780e65b36c7825e9eb27495e43 Mon Sep 17 00:00:00 2001 From: zadam Date: Sat, 14 Jan 2023 23:16:57 +0100 Subject: [PATCH 13/24] clarified comment --- src/services/notes.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/services/notes.js b/src/services/notes.js index 48ae814cf..1380616ae 100644 --- a/src/services/notes.js +++ b/src/services/notes.js @@ -286,7 +286,9 @@ function protectNote(note, protect) { note.isProtected = protect; - if (content !== null) { // see https://github.com/zadam/trilium/issues/3523 + // see https://github.com/zadam/trilium/issues/3523 + // IIRC a zero-sized buffer can be returned as null from the database + if (content !== null) { // this will force de/encryption note.setContent(content); } From a004a8b092f1b86be2a44be29f2cffc9ec1309aa Mon Sep 17 00:00:00 2001 From: zadam Date: Sun, 15 Jan 2023 12:54:38 +0100 Subject: [PATCH 14/24] fix loading custom themes in Options, closes #3528 --- src/routes/api/options.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/api/options.js b/src/routes/api/options.js index a176bb45f..ddb4321ec 100644 --- a/src/routes/api/options.js +++ b/src/routes/api/options.js @@ -112,7 +112,7 @@ function update(name, value) { } function getUserThemes() { - const notes = searchService.searchNotes("#appTheme"); + const notes = searchService.searchNotes("#appTheme", {ignoreHoistedNote: true}); const ret = []; for (const note of notes) { From 424b624ea9adde47b992e16d4aa00e7cde552081 Mon Sep 17 00:00:00 2001 From: zadam Date: Sun, 15 Jan 2023 13:48:01 +0100 Subject: [PATCH 15/24] small mermaid fixes --- package-lock.json | 10 ++++++---- package.json | 1 + src/public/app/widgets/dialogs/note_revisions.js | 2 +- src/share/content_renderer.js | 7 ++++--- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index f33caa45f..c05b691e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,12 @@ { "name": "trilium", - "version": "0.58.3-beta", + "version": "0.58.5", "lockfileVersion": 2, "requires": true, "packages": { "": { - "version": "0.58.3-beta", + "name": "trilium", + "version": "0.58.5", "hasInstallScript": true, "license": "AGPL-3.0-only", "dependencies": { @@ -29,6 +30,7 @@ "electron-debug": "3.2.0", "electron-dl": "3.5.0", "electron-window-state": "5.0.3", + "escape-html": "^1.0.3", "express": "4.18.2", "express-partial-content": "1.0.2", "express-rate-limit": "6.7.0", @@ -4774,7 +4776,7 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "node_modules/escape-string-regexp": { "version": "1.0.5", @@ -14267,7 +14269,7 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "escape-string-regexp": { "version": "1.0.5", diff --git a/package.json b/package.json index 9184da1de..28da4d750 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,7 @@ "electron-debug": "3.2.0", "electron-dl": "3.5.0", "electron-window-state": "5.0.3", + "escape-html": "1.0.3", "express": "4.18.2", "express-partial-content": "1.0.2", "express-rate-limit": "6.7.0", diff --git a/src/public/app/widgets/dialogs/note_revisions.js b/src/public/app/widgets/dialogs/note_revisions.js index c936c45be..6bad87617 100644 --- a/src/public/app/widgets/dialogs/note_revisions.js +++ b/src/public/app/widgets/dialogs/note_revisions.js @@ -234,7 +234,7 @@ export default class NoteRevisionsDialog extends BasicWidget { renderMathInElement($content[0], {trust: true}); } } - else if (revisionItem.type === 'code') { + else if (revisionItem.type === 'code' || revisionItem.type === 'mermaid') { this.$content.html($("
    ").text(fullNoteRevision.content));
             }
             else if (revisionItem.type === 'image') {
    diff --git a/src/share/content_renderer.js b/src/share/content_renderer.js
    index 9b9aef442..d73fa6206 100644
    --- a/src/share/content_renderer.js
    +++ b/src/share/content_renderer.js
    @@ -2,6 +2,7 @@ const {JSDOM} = require("jsdom");
     const shaca = require("./shaca/shaca");
     const assetPath = require("../services/asset_path");
     const shareRoot = require('./share_root');
    +const escapeHtml = require('escape-html');
     
     function getContent(note) {
         if (note.isProtected) {
    @@ -112,17 +113,17 @@ function renderCode(result) {
     
     function renderMermaid(result) {
         result.content = `
    -
    ${result.content}
    +
    ${escapeHtml(result.content)}

    Chart source -
    ${result.content}
    +
    ${escapeHtml(result.content)}
    ` result.header += ``; } function renderImage(result, note) { - result.content = ``; + result.content = ``; } function renderFile(note, result) { From 4f98c960ec04d0a2e99005ce593a5eee1db59989 Mon Sep 17 00:00:00 2001 From: zadam Date: Sun, 15 Jan 2023 19:23:28 +0100 Subject: [PATCH 16/24] fix note revision for images --- src/public/app/widgets/dialogs/note_revisions.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/public/app/widgets/dialogs/note_revisions.js b/src/public/app/widgets/dialogs/note_revisions.js index 6bad87617..9caab652f 100644 --- a/src/public/app/widgets/dialogs/note_revisions.js +++ b/src/public/app/widgets/dialogs/note_revisions.js @@ -240,8 +240,8 @@ export default class NoteRevisionsDialog extends BasicWidget { else if (revisionItem.type === 'image') { this.$content.html($("") // reason why we put this inline as base64 is that we do not want to let user to copy this - // as a URL to be used in a note. Instead if they copy and paste it into a note, it will be a uploaded as a new note - .attr("src", `data:${note.mime};base64,${fullNoteRevision.content}`) + // as a URL to be used in a note. Instead, if they copy and paste it into a note, it will be a uploaded as a new note + .attr("src", `data:${fullNoteRevision.mime};base64,${fullNoteRevision.content}`) .css("max-width", "100%") .css("max-height", "100%")); } From 743979266a88dc8e5b7d30933305d8df67c9d315 Mon Sep 17 00:00:00 2001 From: zadam Date: Sun, 15 Jan 2023 19:46:32 +0100 Subject: [PATCH 17/24] fix history navigation buttons in server, #3527 --- package-lock.json | 2 +- src/public/app/widgets/buttons/command_button.js | 2 +- src/public/app/widgets/buttons/history_navigation.js | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index c05b691e7..fac982e30 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,7 +30,7 @@ "electron-debug": "3.2.0", "electron-dl": "3.5.0", "electron-window-state": "5.0.3", - "escape-html": "^1.0.3", + "escape-html": "1.0.3", "express": "4.18.2", "express-partial-content": "1.0.2", "express-rate-limit": "6.7.0", diff --git a/src/public/app/widgets/buttons/command_button.js b/src/public/app/widgets/buttons/command_button.js index 376c5a822..12e0dd821 100644 --- a/src/public/app/widgets/buttons/command_button.js +++ b/src/public/app/widgets/buttons/command_button.js @@ -39,7 +39,7 @@ export default class CommandButtonWidget extends AbstractButtonWidget { /** * @param {function|string} command - * @returns {CommandButtonWidget} + * @returns {this} */ command(command) { this.settings.command = command; diff --git a/src/public/app/widgets/buttons/history_navigation.js b/src/public/app/widgets/buttons/history_navigation.js index 430aeae21..08a86810f 100644 --- a/src/public/app/widgets/buttons/history_navigation.js +++ b/src/public/app/widgets/buttons/history_navigation.js @@ -23,6 +23,10 @@ export default class HistoryNavigationButton extends ButtonFromNoteWidget { doRender() { super.doRender(); + if (!utils.isElectron()) { + return; + } + this.webContents = utils.dynamicRequire('@electron/remote').getCurrentWebContents(); // without this the history is preserved across frontend reloads From 4ba72bc8d33159da8531b8baf544d4cc0da56c36 Mon Sep 17 00:00:00 2001 From: zadam Date: Sun, 15 Jan 2023 21:05:03 +0100 Subject: [PATCH 18/24] fixed standalone anonymize script --- src/anonymize.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/anonymize.js b/src/anonymize.js index 39cb44852..0fa00cda1 100644 --- a/src/anonymize.js +++ b/src/anonymize.js @@ -1,12 +1,12 @@ -const backupService = require('./services/backup'); +const anonymizationService = require('./services/anonymization'); const sqlInit = require('./services/sql_init'); -require('./entities/entity_constructor'); +require('./becca/entity_constructor'); sqlInit.dbReady.then(async () => { try { console.log("Starting anonymization..."); - const resp = await backupService.anonymize(); + const resp = await anonymizationService.createAnonymizedCopy('full'); if (resp.success) { console.log(`Anonymized file has been saved to: ${resp.anonymizedFilePath}`); From 9eff08144c27e6faa0e65088e3f3cf666da33e13 Mon Sep 17 00:00:00 2001 From: zadam Date: Mon, 16 Jan 2023 08:06:19 +0100 Subject: [PATCH 19/24] extra check that hidden tree is not created until migration is completed --- src/services/hidden_subtree.js | 8 ++++++++ src/services/migration.js | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/services/hidden_subtree.js b/src/services/hidden_subtree.js index b6be8d619..b97baf4a8 100644 --- a/src/services/hidden_subtree.js +++ b/src/services/hidden_subtree.js @@ -1,6 +1,8 @@ const becca = require("../becca/becca"); const noteService = require("./notes"); const Attribute = require("../becca/entities/attribute.js"); +const log = require("./log"); +const migrationService = require("./migration"); const LBTPL_ROOT = "_lbTplRoot"; const LBTPL_BASE = "_lbTplBase"; @@ -231,6 +233,12 @@ const HIDDEN_SUBTREE_DEFINITION = { }; function checkHiddenSubtree() { + if (!migrationService.isDbUpToDate()) { + // on-delete hook might get triggered during some future migration and cause havoc + log.info("Will not check hidden subtree until migration is finished."); + return; + } + checkHiddenSubtreeRecursively('root', HIDDEN_SUBTREE_DEFINITION); } diff --git a/src/services/migration.js b/src/services/migration.js index 1bda273e4..7bda5bc36 100644 --- a/src/services/migration.js +++ b/src/services/migration.js @@ -119,5 +119,6 @@ async function migrateIfNecessary() { } module.exports = { - migrateIfNecessary + migrateIfNecessary, + isDbUpToDate }; From 98620887d44b0ba60029bffc9d826b4b7af53a8a Mon Sep 17 00:00:00 2001 From: zadam Date: Mon, 16 Jan 2023 22:19:36 +0100 Subject: [PATCH 20/24] fix demo steel blue main menu icon --- db/demo.zip | Bin 882795 -> 882814 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/db/demo.zip b/db/demo.zip index f9efd3e44338bccf8abf40baea77830cefa41df6..d715fb928872e08e7fb95f3e8e06a8319e7d760c 100644 GIT binary patch delta 25577 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≧+Bki9Yys5K<6RaJ$_zLcH1YN9T zN4j!`4?1GNcjxF%1HX-YW*s&3!KA_&=y~aLsiR<2N1sM73^~h)m2Z$UHwXSSay*K` z3={>6Y9X{XS0Bk_eSJQVF64`7dYG$si!%>VI4Z$Wl$ocuz;p(?gBUxCw&WS_s>mzf zU0n$Y{on{|#VDo=c|y&_$Uh&nBZ3tz<{*Alkgq*F6KnQFI?qaA91s z>No;gerZ^nN=*jp9hc~@(t(d~_QN!+KqN@o7nc6$g*hnDKG?|CUeoTS2>1D`0jK^94e0wqNaH=U3krGu|rv7?f(Ojx<43nsz7wV&W zTOo{`Yk;>$_=kT_L!|^Lzv-hW|Ix=koIWcOPARGQ;?(Ib2QJ|Mb+qeDg!eV^d+@v` zw1Z~WDswZ6c1#pQ>7DV~{l~|{0YfQuf=KG{=IOob#Q8likn?DqX)ecd6%!bZ@umq- z{LOyMIFs5YXvTpP0q)YD!Q<%6R1wtS);HE<$xfS2%@c*u9ew~>dn*I7>A++WNL9}W zqd{B$4A^drW42km7S!PskXDv+$q|a)!*H8zu_=PJ_8n-F4gJ9yS!a^5W^dC6lf)`@ zsLq)T@u`U>AD2AhT<-Fp$Nq3q3!XBQmPK|-Hc>&BvmH@bdo_FKSh@C-jyyjn`**cq=71xu8rHYN?@p(u zYP;ozEF=5O@7a){r{DP3L8w>&uGS5CiV3_o&xtVZizKg;C*M|Hp&2;Mx z+2RImOd-?CU1#L$&{+t-eDNjD0zy-fi4aH!W{DoE#BdBn;NRi%_h2Zy3G&H>k zQ_kSAdV4KnPEn*X306<^@-Bvf-91Tgta(RWIh=8+LlWF-M`T=I8s|XIbCZ~1Ke{|e z#L7r5dUo9e&ZUK5gQ{VCI79Cg(~eRRPq}k-eB5)vVQ&e86X@-^I{%L`_`U>>?AVTv zo`==!X-qVd=Z?O#VxFd4%WLzetF;^RM6guJyC;YPgO^ID4Ai_*Vf=hhI=DMEmx^5F zw!5Y9_yPu`P|keaQ;~w2-AWKs`4;ta6vQ^zX0Ua50YsySt~3VcHq^pTmrjkVunfWN8|qvadn#Hy5xN8q^uJToi` zWi}`dD;ffN(o5BP12t8H&7n1F?amtfx*(uNdx8UJNA0Z<$#kdC7#}&_hTl#DN)nFdGc>N+Kg2dF%Q4W^n}eg3Vlg)X@I%M|w@+^RJkmhtSQt}9@e z6NSxcT-*jPB8+AII-Dt5M;8n!gf<)Tq?_t-O7x^13q+C3n-<@0=Z<1A20}b)Gty^_ zluU&SMPIp1{B0Gk?rq*~4Y}wy338EJRrNM(TO6A6021hrVl-&rE;UIdnM6;HWZKTvCXa`6} z>z5$Z_Zg5(qqhcxw8M4OZd1%AFBK6o(LTJI7ZwBu9L7^(aljb^6@z755SHo-hP@6t z&2Cm~a_e;au^M3eFR7tU3@Kqv9-fLhVGF?95Elvbpo|ZP;E_Yvs@+S=O5KagYO1|D uDysR(#I}`7p0GoqpW|_AS{oCOqTpqyN7B~#We~ZDvX+V7od-k+;QbHT*u294 delta 25532 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 Date: Mon, 16 Jan 2023 22:37:21 +0100 Subject: [PATCH 21/24] doc note for the back/forward launchers --- src/public/app/doc_notes/launchbar_history_navigation.html | 3 +++ src/services/hidden_subtree.js | 6 ++++-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 src/public/app/doc_notes/launchbar_history_navigation.html diff --git a/src/public/app/doc_notes/launchbar_history_navigation.html b/src/public/app/doc_notes/launchbar_history_navigation.html new file mode 100644 index 000000000..bf4411572 --- /dev/null +++ b/src/public/app/doc_notes/launchbar_history_navigation.html @@ -0,0 +1,3 @@ +

    Back and Forward buttons allow you to move in the navigation history.

    + +

    These launchers are active only in the desktop build and will be ignored in the server edition where you can use the native browser navigation buttons instead.

    diff --git a/src/services/hidden_subtree.js b/src/services/hidden_subtree.js index b97baf4a8..df3bbc984 100644 --- a/src/services/hidden_subtree.js +++ b/src/services/hidden_subtree.js @@ -175,8 +175,10 @@ const HIDDEN_SUBTREE_DEFINITION = { isExpanded: true, attributes: [ { type: 'label', name: 'docName', value: 'launchbar_intro' } ], children: [ - { id: '_lbBackInHistory', title: 'Go to Previous Note', type: 'launcher', builtinWidget: 'backInHistoryButton', icon: 'bx bxs-left-arrow-square' }, - { id: '_lbForwardInHistory', title: 'Go to Next Note', type: 'launcher', builtinWidget: 'forwardInHistoryButton', icon: 'bx bxs-right-arrow-square' }, + { id: '_lbBackInHistory', title: 'Go to Previous Note', type: 'launcher', builtinWidget: 'backInHistoryButton', icon: 'bx bxs-left-arrow-square', + attributes: [ { type: 'label', name: 'docName', value: 'launchbar_history_navigation' } ]}, + { id: '_lbForwardInHistory', title: 'Go to Next Note', type: 'launcher', builtinWidget: 'forwardInHistoryButton', icon: 'bx bxs-right-arrow-square', + attributes: [ { type: 'label', name: 'docName', value: 'launchbar_history_navigation' } ]}, { id: '_lbBackendLog', title: 'Backend Log', type: 'launcher', targetNoteId: '_backendLog', icon: 'bx bx-terminal' }, ] }, From 58d71bf8e3b8af7f3e0138a81b643020e0bd6053 Mon Sep 17 00:00:00 2001 From: zadam Date: Mon, 16 Jan 2023 22:39:28 +0100 Subject: [PATCH 22/24] release 0.58.6 --- package.json | 2 +- src/services/build.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 28da4d750..95c798b25 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "trilium", "productName": "Trilium Notes", "description": "Trilium Notes", - "version": "0.58.5", + "version": "0.58.6", "license": "AGPL-3.0-only", "main": "electron.js", "bin": { diff --git a/src/services/build.js b/src/services/build.js index 026f4e4c3..dc5dc5172 100644 --- a/src/services/build.js +++ b/src/services/build.js @@ -1 +1 @@ -module.exports = { buildDate:"2023-01-14T23:02:39+01:00", buildRevision: "038c0e78a64c30f9eda47fa265c9f31de98cbc5b" }; +module.exports = { buildDate:"2023-01-16T22:39:28+01:00", buildRevision: "9fd0b85ff2be264be35ec2052c956b654f0dac9e" }; From b5677751293eb135858d481b18ee692494bb5074 Mon Sep 17 00:00:00 2001 From: zadam Date: Tue, 17 Jan 2023 21:06:30 +0100 Subject: [PATCH 23/24] small fixes of steel blue theme --- db/demo.zip | Bin 882814 -> 882804 bytes package-lock.json | 4 ++-- src/public/app/widgets/buttons/global_menu.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/db/demo.zip b/db/demo.zip index d715fb928872e08e7fb95f3e8e06a8319e7d760c..5344f44c23d39b964f59213799ca976b97c49710 100644 GIT binary patch delta 26051 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 WlZ(c=h%*Js<}x39A8-6T*ZmKl)F=`F delta 26012 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 Q|HgmAae;*T;>A$;A9$h`@&Et; diff --git a/package-lock.json b/package-lock.json index fac982e30..4a0cd9448 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "trilium", - "version": "0.58.5", + "version": "0.58.6", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "trilium", - "version": "0.58.5", + "version": "0.58.6", "hasInstallScript": true, "license": "AGPL-3.0-only", "dependencies": { diff --git a/src/public/app/widgets/buttons/global_menu.js b/src/public/app/widgets/buttons/global_menu.js index 86a3fd378..54ca3019d 100644 --- a/src/public/app/widgets/buttons/global_menu.js +++ b/src/public/app/widgets/buttons/global_menu.js @@ -303,7 +303,7 @@ export default class GlobalMenuWidget extends BasicWidget { const resp = await fetch(RELEASES_API_URL); const data = await resp.json(); - return data.tag_name.substring(1); + return data?.tag_name?.substring(1); } downloadLatestVersionCommand() { From ef825371cff04978d0484de723ce8cd48c94a49a Mon Sep 17 00:00:00 2001 From: zadam Date: Tue, 17 Jan 2023 21:15:05 +0100 Subject: [PATCH 24/24] fix "root" note in autocomplete when hoisted into another subtree --- src/becca/becca_service.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/becca/becca_service.js b/src/becca/becca_service.js index 2cb924a5c..1b5c5649e 100644 --- a/src/becca/becca_service.js +++ b/src/becca/becca_service.js @@ -83,10 +83,8 @@ function getNoteTitleArrayForPath(notePathArray) { throw new Error(`${notePathArray} is not an array.`); } - const hoistedNoteId = cls.getHoistedNoteId(); - - if (notePathArray.length === 1 && notePathArray[0] === hoistedNoteId) { - return [getNoteTitle(hoistedNoteId)]; + if (notePathArray.length === 1) { + return [getNoteTitle(notePathArray[0])]; } const titles = []; @@ -95,6 +93,7 @@ function getNoteTitleArrayForPath(notePathArray) { let hoistedNotePassed = false; // this is a notePath from outside of hoisted subtree so full title path needs to be returned + const hoistedNoteId = cls.getHoistedNoteId(); const outsideOfHoistedSubtree = !notePathArray.includes(hoistedNoteId); for (const noteId of notePathArray) {