fix running of runOnNoteCreation hook, #3219

This commit is contained in:
zadam 2022-10-22 21:34:38 +02:00
parent 867f7f3f59
commit c1127ec429
3 changed files with 59 additions and 25 deletions

View File

@ -240,15 +240,15 @@ const ATTR_HELP = {
"keyboardShortcut": "Defines a keyboard shortcut which will immediately jump to this note. Example: 'ctrl+alt+e'. Requires frontend reload for the change to take effect."
},
"relation": {
"runOnNoteCreation": "executes when note is created on backend",
"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)",
"runOnNoteChange": "executes when note is changed (includes note creation as well)",
"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.",
"runOnBranchDeletion": "executes when a branch is deleted. Branch is a link between parent note and child note and is deleted e.g. when moving note (old branch/link is deleted).",
"runOnChildNoteCreation": "executes when new note is created under this note",
"runOnAttributeCreation": "executes when new attribute is created under this note",
"runOnAttributeChange": "executes when attribute is changed under this note",
"runOnAttributeCreation": "executes when new attribute is created for the note which defines this relation",
"runOnAttributeChange": " executes when the attribute is changed of a note which defines this relation. This is triggered also when the attribute is deleted",
"template": "attached note's attributes will be inherited even without parent-child relationship. See template for details.",
"renderNote": 'notes of type "render HTML note" will be rendered using a code note (HTML or script) and it is necessary to point using this relation to which note should be rendered',
"widget": "target of this relation will be executed and rendered as a widget in the sidebar",

View File

@ -40,6 +40,10 @@ function disableEntityEvents() {
namespace.set('disableEntityEvents', true);
}
function enableEntityEvents() {
namespace.set('disableEntityEvents', false);
}
function isEntityEventsDisabled() {
return !!namespace.get('disableEntityEvents');
}
@ -83,6 +87,7 @@ module.exports = {
getComponentId,
getLocalNowDateTime,
disableEntityEvents,
enableEntityEvents,
isEntityEventsDisabled,
reset,
getAndClearEntityChangeIds,

View File

@ -33,10 +33,6 @@ function getNewNotePosition(parentNoteId) {
return maxNotePos + 10;
}
function triggerChildNoteCreated(childNote, parentNote) {
eventService.emit(eventService.CHILD_NOTE_CREATED, { childNote, parentNote });
}
function triggerNoteTitleChanged(note) {
eventService.emit(eventService.NOTE_TITLE_CHANGED, note);
}
@ -140,7 +136,18 @@ function createNewNote(params) {
}
return sql.transactional(() => {
const note = new Note({
let note, branch, isEntityEventsDisabled;
try {
isEntityEventsDisabled = cls.isEntityEventsDisabled();
if (!isEntityEventsDisabled) {
// it doesn't make sense to run note creation events on a partially constructed note, so
// defer them until note creation is completed
cls.disableEntityEvents();
}
note = new Note({
noteId: params.noteId, // optionally can force specific noteId
title: params.title,
isProtected: !!params.isProtected,
@ -150,7 +157,7 @@ function createNewNote(params) {
note.setContent(params.content);
const branch = new Branch({
branch = new Branch({
branchId: params.branchId,
noteId: note.noteId,
parentNoteId: params.parentNoteId,
@ -158,6 +165,14 @@ function createNewNote(params) {
prefix: params.prefix,
isExpanded: !!params.isExpanded
}).save();
}
finally {
if (!isEntityEventsDisabled) {
// re-enable entity events only if there were previously enabled
// (they can be disabled in case of import)
cls.enableEntityEvents();
}
}
scanForLinks(note);
@ -175,7 +190,21 @@ function createNewNote(params) {
}
triggerNoteTitleChanged(note);
triggerChildNoteCreated(note, parentNote);
eventService.emit(eventService.ENTITY_CREATED, {
entityName: 'notes',
entity: note
});
eventService.emit(eventService.ENTITY_CREATED, {
entityName: 'branches',
entity: branch
});
eventService.emit(eventService.CHILD_NOTE_CREATED, {
childNote: note,
parentNote: parentNote
});
log.info(`Created new note '${note.noteId}', branch '${branch.branchId}' of type '${note.type}', mime '${note.mime}'`);