diff --git a/src/public/app/services/link.js b/src/public/app/services/link.js index e42207839..73ad58704 100644 --- a/src/public/app/services/link.js +++ b/src/public/app/services/link.js @@ -288,7 +288,7 @@ async function loadReferenceLinkTitle($el, href = null) { if (note) { const icon = await getLinkIcon(noteId, viewScope.viewMode); -k + $el.prepend($("").addClass(icon)); } } diff --git a/src/routes/api/branches.js b/src/routes/api/branches.js index 87d1d5265..3e9ed60b0 100644 --- a/src/routes/api/branches.js +++ b/src/routes/api/branches.js @@ -20,14 +20,14 @@ const eventService = require("../../services/events.js"); function moveBranchToParent(req) { const {branchId, parentBranchId} = req.params; - const parentBranch = becca.getBranch(parentBranchId); const branchToMove = becca.getBranch(branchId); + const targetParentBranch = becca.getBranch(parentBranchId); - if (!parentBranch || !branchToMove) { + if (!branchToMove || !targetParentBranch) { throw new ValidationError(`One or both branches '${branchId}', '${parentBranchId}' have not been found`); } - return branchService.moveBranchToBranch(branchToMove, parentBranch, branchId); + return branchService.moveBranchToBranch(branchToMove, targetParentBranch, branchId); } function moveBranchBeforeNote(req) { diff --git a/src/services/branches.js b/src/services/branches.js index f35db98df..681676ab1 100644 --- a/src/services/branches.js +++ b/src/services/branches.js @@ -1,12 +1,12 @@ const treeService = require("./tree"); const sql = require("./sql"); -function moveBranchToNote(sourceBranch, targetParentNoteId) { - if (sourceBranch.parentNoteId === targetParentNoteId) { +function moveBranchToNote(branchToMove, targetParentNoteId) { + if (branchToMove.parentNoteId === targetParentNoteId) { return {success: true}; // no-op } - const validationResult = treeService.validateParentChild(targetParentNoteId, sourceBranch.noteId, sourceBranch.branchId); + const validationResult = treeService.validateParentChild(targetParentNoteId, branchToMove.noteId, branchToMove.branchId); if (!validationResult.success) { return [200, validationResult]; @@ -15,10 +15,10 @@ function moveBranchToNote(sourceBranch, targetParentNoteId) { const maxNotePos = sql.getValue('SELECT MAX(notePosition) FROM branches WHERE parentNoteId = ? AND isDeleted = 0', [targetParentNoteId]); const newNotePos = maxNotePos === null ? 0 : maxNotePos + 10; - const newBranch = sourceBranch.createClone(targetParentNoteId, newNotePos); + const newBranch = branchToMove.createClone(targetParentNoteId, newNotePos); newBranch.save(); - sourceBranch.markAsDeleted(); + branchToMove.markAsDeleted(); return { success: true, @@ -26,16 +26,18 @@ function moveBranchToNote(sourceBranch, targetParentNoteId) { }; } -function moveBranchToBranch(sourceBranch, targetParentBranch) { - const res = moveBranchToNote(sourceBranch, targetParentBranch.noteId); +function moveBranchToBranch(branchToMove, targetParentBranch) { + const res = moveBranchToNote(branchToMove, targetParentBranch.noteId); if (!res.success) { return res; } // expanding so that the new placement of the branch is immediately visible - targetParentBranch.isExpanded = true; - targetParentBranch.save(); + if (!targetParentBranch.isExpanded) { + targetParentBranch.isExpanded = true; + targetParentBranch.save(); + } return res; } diff --git a/src/services/search/expressions/attribute_exists.js b/src/services/search/expressions/attribute_exists.js index df4fa938d..6d2e92d64 100644 --- a/src/services/search/expressions/attribute_exists.js +++ b/src/services/search/expressions/attribute_exists.js @@ -10,6 +10,8 @@ class AttributeExistsExp extends Expression { this.attributeType = attributeType; this.attributeName = attributeName; + // template attr is used as a marker for templates, but it's not meant to be inherited + this.isTemplateLabel = this.attributeType === 'label' && (this.attributeName === 'template' || this.attributeName === 'workspacetemplate'); this.prefixMatch = prefixMatch; } @@ -23,12 +25,10 @@ class AttributeExistsExp extends Expression { for (const attr of attrs) { const note = attr.note; - if (attr.isInheritable) { + if (attr.isInheritable && !this.isTemplateLabel) { resultNoteSet.addAll(note.getSubtreeNotesIncludingTemplated()); } - else if (note.isInherited() && - // template attr is used as a marker for templates, but it's not meant to be inherited - !(this.attributeType === 'label' && (this.attributeName === 'template' || this.attributeName === 'workspacetemplate'))) { + else if (note.isInherited() && !this.isTemplateLabel) { resultNoteSet.addAll(note.getInheritingNotes()); } else { diff --git a/src/services/tree.js b/src/services/tree.js index a614669a9..60f481d55 100644 --- a/src/services/tree.js +++ b/src/services/tree.js @@ -8,7 +8,7 @@ const becca = require('../becca/becca'); function validateParentChild(parentNoteId, childNoteId, branchId = null) { if (['root', '_hidden', '_share', '_lbRoot', '_lbAvailableLaunchers', '_lbVisibleLaunchers'].includes(childNoteId)) { - return { branch: null, success: false, message: `Cannot change this note's location.`}; + return { branch: null, success: false, message: `Cannot change this note's location.` }; } if (parentNoteId === 'none') { @@ -16,14 +16,14 @@ function validateParentChild(parentNoteId, childNoteId, branchId = null) { return { branch: null, success: false, message: `Cannot move anything into 'none' parent.` }; } - const existing = becca.getBranchFromChildAndParent(childNoteId, parentNoteId); + const existingBranch = becca.getBranchFromChildAndParent(childNoteId, parentNoteId); - if (existing && (branchId === null || existing.branchId !== branchId)) { + if (existingBranch && existingBranch.branchId !== branchId) { const parentNote = becca.getNote(parentNoteId); const childNote = becca.getNote(childNoteId); return { - branch: existing, + branch: existingBranch, success: false, message: `Note "${childNote.title}" note already exists in the "${parentNote.title}".` }; @@ -52,6 +52,10 @@ function validateParentChild(parentNoteId, childNoteId, branchId = null) { * Tree cycle can be created when cloning or when moving existing clone. This method should detect both cases. */ function wouldAddingBranchCreateCycle(parentNoteId, childNoteId) { + if (parentNoteId === childNoteId) { + return true; + } + const childNote = becca.getNote(childNoteId); const parentNote = becca.getNote(parentNoteId);