diff --git a/src/entities/note.js b/src/entities/note.js index 0d69be12d..d37ff3cc8 100644 --- a/src/entities/note.js +++ b/src/entities/note.js @@ -138,28 +138,39 @@ class Note extends Entity { return label ? label.value : null; } + async toggleLabel(enabled, name, value = "") { + if (enabled) { + await this.setLabel(name, value); + } + else { + await this.removeLabel(name, value); + } + } + async setLabel(name, value = "") { - let label = await this.getLabel(name); + const attributes = await this.getOwnedAttributes(); + let label = attributes.find(attr => attr.type === 'label' && attr.value === value); if (!label) { label = new Attribute({ noteId: this.noteId, type: 'label', - name: name + name: name, + value: value }); + + await label.save(); } - - label.value = value; - - await label.save(); } - async removeLabel(name) { - const label = await this.getLabel(name); + async removeLabel(name, value = "") { + const attributes = await this.getOwnedAttributes(); - if (label) { - label.isDeleted = true; - await label.save(); + for (const attribute of attributes) { + if (attribute.type === 'label' && (!value || value === attribute.value)) { + attribute.isDeleted = true; + await attribute.save(); + } } } diff --git a/src/services/cloning.js b/src/services/cloning.js index e5b9625d3..bb3c51d52 100644 --- a/src/services/cloning.js +++ b/src/services/cloning.js @@ -49,6 +49,15 @@ async function ensureNoteIsAbsentFromParent(noteId, parentNoteId) { } } +async function toggleNoteInParent(present, noteId, parentNoteId, prefix) { + if (present) { + await ensureNoteIsPresentInParent(noteId, parentNoteId, prefix); + } + else { + await ensureNoteIsAbsentFromParent(noteId, parentNoteId); + } +} + async function cloneNoteAfter(noteId, afterBranchId) { const afterNote = await treeService.getBranch(afterBranchId); @@ -79,5 +88,6 @@ module.exports = { cloneNoteToParent, ensureNoteIsPresentInParent, ensureNoteIsAbsentFromParent, + toggleNoteInParent, cloneNoteAfter }; \ No newline at end of file diff --git a/src/services/script_context.js b/src/services/script_context.js index be2d19191..6f8249c9e 100644 --- a/src/services/script_context.js +++ b/src/services/script_context.js @@ -59,6 +59,8 @@ function ScriptApi(startNote, currentNote, originEntity) { this.ensureNoteIsPresentInParent = cloningService.ensureNoteIsPresentInParent; this.ensureNoteIsAbsentFromParent = cloningService.ensureNoteIsAbsentFromParent; + this.toggleNoteInParent = cloningService.toggleNoteInParent; + this.createNote = noteService.createNote; this.log = message => log.info(`Script ${currentNote.noteId}: ${message}`); @@ -68,6 +70,8 @@ function ScriptApi(startNote, currentNote, originEntity) { this.sortNotesAlphabetically = treeService.sortNotesAlphabetically; + this.setNoteToParent = treeService.setNoteToParent; + this.transactional = sql.transactional; this.refreshTree = () => messagingService.sendMessageToAllClients({ type: 'refresh-tree' }); diff --git a/src/services/tree.js b/src/services/tree.js index d0ca2370b..34269a2b7 100644 --- a/src/services/tree.js +++ b/src/services/tree.js @@ -1,6 +1,8 @@ "use strict"; const sql = require('./sql'); +const repository = require('./repository'); +const Branch = require('../entities/branch'); const syncTableService = require('./sync_table'); const protectedSessionService = require('./protected_session'); @@ -99,8 +101,32 @@ async function sortNotesAlphabetically(parentNoteId) { }); } +async function setNoteToParent(noteId, prefix, parentNoteId) { + // case where there might be more such branches is ignored. It's expected there should be just one + const branch = await repository.getEntity("SELECT * FROM branches WHERE isDeleted = 0 AND noteId = ? AND prefix = ?", [noteId, prefix]); + + if (branch) { + if (!parentNoteId) { + branch.isDeleted = true; + } + else { + branch.parentNoteId = parentNoteId; + } + + await branch.save(); + } + else if (parentNoteId) { + await new Branch({ + noteId: noteId, + parentNoteId: parentNoteId, + prefix: prefix + }).save(); + } +} + module.exports = { validateParentChild, getBranch, - sortNotesAlphabetically + sortNotesAlphabetically, + setNoteToParent }; \ No newline at end of file