diff --git a/src/public/app/services/tree.js b/src/public/app/services/tree.js index 30eb85688..b4b2eb038 100644 --- a/src/public/app/services/tree.js +++ b/src/public/app/services/tree.js @@ -135,10 +135,6 @@ function getSomeNotePath(note, hoistedNotePath = 'root') { return notePath === null ? null : notePath.join('/'); } -async function sortAlphabetically(noteId) { - await server.put(`notes/${noteId}/sort`); -} - ws.subscribeToMessages(message => { if (message.type === 'openNote') { appContext.tabManager.activateOrOpenNote(message.noteId); @@ -319,7 +315,6 @@ function parseNotePath(notePath) { } export default { - sortAlphabetically, resolveNotePath, resolveNotePathToSegments, getSomeNotePath, diff --git a/src/public/app/widgets/attribute_widgets/attribute_detail.js b/src/public/app/widgets/attribute_widgets/attribute_detail.js index 98cebd523..2e2c0d013 100644 --- a/src/public/app/widgets/attribute_widgets/attribute_detail.js +++ b/src/public/app/widgets/attribute_widgets/attribute_detail.js @@ -189,6 +189,8 @@ const ATTR_HELP = { "runAtHour": "On which hour should this run. Should be used together with #run=hourly. Can be defined multiple times for more runs during the day.", "disableInclusion": "scripts with this label won't be included into parent script execution.", "sorted": "keeps child notes sorted by title alphabetically", + "sortDirection": "ASC (the default) or DESC", + "sortFoldersFirst": "Folders (notes with children) should be sorted on top", "top": "keep given note on top in its parent (applies only on sorted parents)", "hidePromotedAttributes": "Hide promoted attributes on this note", "readOnly": "editor is in read only mode. Works only for text and code notes.", diff --git a/src/services/builtin_attributes.js b/src/services/builtin_attributes.js index 9c0a6b853..58e47f842 100644 --- a/src/services/builtin_attributes.js +++ b/src/services/builtin_attributes.js @@ -41,6 +41,8 @@ module.exports = [ { type: 'label', name: 'bookmarked' }, { type: 'label', name: 'bookmarkFolder' }, { type: 'label', name: 'sorted' }, + { type: 'label', name: 'sortDirection' }, + { type: 'label', name: 'sortFoldersFirst' }, { type: 'label', name: 'top' }, { type: 'label', name: 'fullContentWidth' }, { type: 'label', name: 'shareHiddenFromTree' }, diff --git a/src/services/handlers.js b/src/services/handlers.js index f4916437e..dceb913c2 100644 --- a/src/services/handlers.js +++ b/src/services/handlers.js @@ -44,7 +44,7 @@ eventService.subscribe([ eventService.ENTITY_CHANGED, eventService.ENTITY_DELETE if (entityName === 'attributes') { runAttachedRelations(entity.getNote(), 'runOnAttributeChange', entity); - if (entity.type === 'label' && entity.name === 'sorted') { + if (entity.type === 'label' && ['sorted', 'sortDirection', 'sortFoldersFirst'].includes(entity.name)) { handleSortedAttribute(entity); } } diff --git a/src/services/tree.js b/src/services/tree.js index 55e8f1716..218777183 100644 --- a/src/services/tree.js +++ b/src/services/tree.js @@ -204,7 +204,11 @@ function sortNotesIfNeeded(parentNoteId) { return; } - sortNotes(parentNoteId, sortedLabel.value); + const sortReversed = parentNote.getLabelValue('sortDirection')?.toLowerCase() === "desc"; + const sortFoldersFirstLabel = parentNote.getLabel('sortFoldersFirst'); + const sortFoldersFirst = sortFoldersFirstLabel && sortFoldersFirstLabel.value.toLowerCase() !== "false"; + + sortNotes(parentNoteId, sortedLabel.value, sortReversed, sortFoldersFirst); } /**