From f2ca9276d682bf466bf1fe591e205536da87067f Mon Sep 17 00:00:00 2001 From: zadam Date: Sat, 23 Jan 2021 21:00:59 +0100 Subject: [PATCH] fix/improve behavior of "sorted" attribute --- src/public/app/widgets/note_tree.js | 23 +++++++++++++++++++++++ src/services/handlers.js | 19 +++++++++++++++---- src/services/note_cache/entities/note.js | 13 +++++++++++++ src/services/note_cache/note_cache.js | 4 ---- 4 files changed, 51 insertions(+), 8 deletions(-) diff --git a/src/public/app/widgets/note_tree.js b/src/public/app/widgets/note_tree.js index e6a1bcc5f..7b9186fa0 100644 --- a/src/public/app/widgets/note_tree.js +++ b/src/public/app/widgets/note_tree.js @@ -1198,7 +1198,25 @@ export default class NoteTreeWidget extends TabAwareWidget { this.clearSelectedNodes(); } + canBeMovedUpOrDown(node) { + if (node.data.noteId === 'root') { + return false; + } + + const parentNote = treeCache.getNoteFromCache(node.getParent().data.noteId); + + if (parentNote && parentNote.hasLabel('sorted')) { + return false; + } + + return true; + } + moveNoteUpCommand({node}) { + if (!this.canBeMovedUpOrDown(node)) { + return; + } + const beforeNode = node.getPrevSibling(); if (beforeNode !== null) { @@ -1207,7 +1225,12 @@ export default class NoteTreeWidget extends TabAwareWidget { } moveNoteDownCommand({node}) { + if (!this.canBeMovedUpOrDown(node)) { + return; + } + const afterNode = node.getNextSibling(); + if (afterNode !== null) { branchService.moveAfterBranch([node.data.branchId], afterNode.data.branchId); } diff --git a/src/services/handlers.js b/src/services/handlers.js index 6ac5d5c1f..6eb42391b 100644 --- a/src/services/handlers.js +++ b/src/services/handlers.js @@ -3,6 +3,7 @@ const scriptService = require('./script'); const treeService = require('./tree'); const noteService = require('./notes'); const repository = require('./repository'); +const noteCache = require('./note_cache/note_cache'); const Attribute = require('../entities/attribute'); function runAttachedRelations(note, relationName, originEntity) { @@ -22,11 +23,11 @@ eventService.subscribe(eventService.NOTE_TITLE_CHANGED, note => { runAttachedRelations(note, 'runOnNoteTitleChange', note); if (!note.isRoot()) { - const parents = note.getParentNotes(); + const noteFromCache = noteCache.notes[note.noteId]; - for (const parent of parents) { - if (parent.hasOwnedLabel("sorted")) { - treeService.sortNotesAlphabetically(parent.noteId); + for (const parentNote of noteFromCache.parents) { + if (parentNote.hasLabel("sorted")) { + treeService.sortNotesAlphabetically(parentNote.noteId); } } } @@ -80,6 +81,16 @@ eventService.subscribe(eventService.ENTITY_CREATED, ({ entityName, entity }) => } else if (entity.type === 'label' && entity.name === 'sorted') { treeService.sortNotesAlphabetically(entity.noteId); + + if (entity.isInheritable) { + const note = noteCache.notes[entity.noteId]; + + if (note) { + for (const noteId of note.subtreeNoteIds) { + treeService.sortNotesAlphabetically(noteId); + } + } + } } } else if (entityName === 'notes') { diff --git a/src/services/note_cache/entities/note.js b/src/services/note_cache/entities/note.js index d2eeda928..9e00dd0a5 100644 --- a/src/services/note_cache/entities/note.js +++ b/src/services/note_cache/entities/note.js @@ -133,6 +133,14 @@ class Note { return !!this.attributes.find(attr => attr.type === type && attr.name === name); } + hasLabel(name) { + return this.hasAttribute('label', name); + } + + hasRelation(name) { + return this.hasAttribute('relation', name); + } + getLabelValue(name) { const label = this.attributes.find(attr => attr.type === 'label' && attr.name === name); @@ -275,6 +283,11 @@ class Note { return arr.flat(); } + /** @return {String[]} */ + get subtreeNoteIds() { + return this.subtreeNotes.map(note => note.noteId); + } + get parentCount() { return this.parents.length; } diff --git a/src/services/note_cache/note_cache.js b/src/services/note_cache/note_cache.js index b77d6ec5c..812050afd 100644 --- a/src/services/note_cache/note_cache.js +++ b/src/services/note_cache/note_cache.js @@ -1,9 +1,5 @@ "use strict"; -const Note = require('./entities/note'); -const Branch = require('./entities/branch'); -const Attribute = require('./entities/attribute'); - class NoteCache { constructor() { this.reset();