mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 10:26:08 +01:00 
			
		
		
		
	add natural sort for notes, introduce new label #sortNatural
This commit is contained in:
		| @@ -65,6 +65,17 @@ const TPL = `<div class="sort-child-notes-dialog modal mx-auto" tabindex="-1" ro | |||||||
|                             sort folders at the top |                             sort folders at the top | ||||||
|                         </label> |                         </label> | ||||||
|                     </div> |                     </div> | ||||||
|  |                      | ||||||
|  |                     <br /> | ||||||
|  |                      | ||||||
|  |                     <h5>Natural Sort</h5> | ||||||
|  |  | ||||||
|  |                     <div class="form-check"> | ||||||
|  |                         <label class="form-check-label"> | ||||||
|  |                             <input class="form-check-input" type="checkbox" name="sort-natural" value="1"> | ||||||
|  |                             sort by alphanumeric order | ||||||
|  |                         </label> | ||||||
|  |                     </div> | ||||||
|                 </div> |                 </div> | ||||||
|                 <div class="modal-footer"> |                 <div class="modal-footer"> | ||||||
|                     <button type="submit" class="btn btn-primary">Sort <kbd>enter</kbd></button> |                     <button type="submit" class="btn btn-primary">Sort <kbd>enter</kbd></button> | ||||||
| @@ -83,8 +94,9 @@ export default class SortChildNotesDialog extends BasicWidget { | |||||||
|             const sortBy = this.$form.find("input[name='sort-by']:checked").val(); |             const sortBy = this.$form.find("input[name='sort-by']:checked").val(); | ||||||
|             const sortDirection = this.$form.find("input[name='sort-direction']:checked").val(); |             const sortDirection = this.$form.find("input[name='sort-direction']:checked").val(); | ||||||
|             const foldersFirst = this.$form.find("input[name='sort-folders-first']").is(":checked"); |             const foldersFirst = this.$form.find("input[name='sort-folders-first']").is(":checked"); | ||||||
|  |             const sortNatural = this.$form.find("input[name='sort-natural']").is(":checked"); | ||||||
|  |  | ||||||
|             await server.put(`notes/${this.parentNoteId}/sort-children`, {sortBy, sortDirection, foldersFirst}); |             await server.put(`notes/${this.parentNoteId}/sort-children`, {sortBy, sortDirection, foldersFirst, sortNatural}); | ||||||
|  |  | ||||||
|             utils.closeActiveDialog(); |             utils.closeActiveDialog(); | ||||||
|         }); |         }); | ||||||
|   | |||||||
| @@ -94,13 +94,13 @@ function undeleteNote(req) { | |||||||
|  |  | ||||||
| function sortChildNotes(req) { | function sortChildNotes(req) { | ||||||
|     const noteId = req.params.noteId; |     const noteId = req.params.noteId; | ||||||
|     const {sortBy, sortDirection, foldersFirst} = req.body; |     const {sortBy, sortDirection, foldersFirst, sortNatural} = req.body; | ||||||
|  |  | ||||||
|     log.info(`Sorting '${noteId}' children with ${sortBy} ${sortDirection}, foldersFirst=${foldersFirst}`); |     log.info(`Sorting '${noteId}' children with ${sortBy} ${sortDirection}, foldersFirst=${foldersFirst}, sortNatural=${sortNatural}`); | ||||||
|  |  | ||||||
|     const reverse = sortDirection === 'desc'; |     const reverse = sortDirection === 'desc'; | ||||||
|  |  | ||||||
|     treeService.sortNotes(noteId, sortBy, reverse, foldersFirst); |     treeService.sortNotes(noteId, sortBy, reverse, foldersFirst, sortNatural); | ||||||
| } | } | ||||||
|  |  | ||||||
| function protectNote(req) { | function protectNote(req) { | ||||||
|   | |||||||
| @@ -42,6 +42,7 @@ module.exports = [ | |||||||
|     { type: 'label', name: 'sorted' }, |     { type: 'label', name: 'sorted' }, | ||||||
|     { type: 'label', name: 'sortDirection' }, |     { type: 'label', name: 'sortDirection' }, | ||||||
|     { type: 'label', name: 'sortFoldersFirst' }, |     { type: 'label', name: 'sortFoldersFirst' }, | ||||||
|  |     { type: 'label', name: 'sortNatural' }, | ||||||
|     { type: 'label', name: 'top' }, |     { type: 'label', name: 'top' }, | ||||||
|     { type: 'label', name: 'fullContentWidth' }, |     { type: 'label', name: 'fullContentWidth' }, | ||||||
|     { type: 'label', name: 'shareHiddenFromTree' }, |     { type: 'label', name: 'shareHiddenFromTree' }, | ||||||
|   | |||||||
| @@ -46,7 +46,7 @@ eventService.subscribe([ eventService.ENTITY_CHANGED, eventService.ENTITY_DELETE | |||||||
|     if (entityName === 'attributes') { |     if (entityName === 'attributes') { | ||||||
|         runAttachedRelations(entity.getNote(), 'runOnAttributeChange', entity); |         runAttachedRelations(entity.getNote(), 'runOnAttributeChange', entity); | ||||||
|  |  | ||||||
|         if (entity.type === 'label' && ['sorted', 'sortDirection', 'sortFoldersFirst'].includes(entity.name)) { |         if (entity.type === 'label' && ['sorted', 'sortDirection', 'sortFoldersFirst', 'sortNatural'].includes(entity.name)) { | ||||||
|             handleSortedAttribute(entity); |             handleSortedAttribute(entity); | ||||||
|         } else if (entity.type === 'label') { |         } else if (entity.type === 'label') { | ||||||
|             handleMaybeSortingLabel(entity); |             handleMaybeSortingLabel(entity); | ||||||
| @@ -101,7 +101,7 @@ eventService.subscribe(eventService.ENTITY_CREATED, ({ entityName, entity }) => | |||||||
|                 noteService.duplicateSubtreeWithoutRoot(templateNote.noteId, note.noteId); |                 noteService.duplicateSubtreeWithoutRoot(templateNote.noteId, note.noteId); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         else if (entity.type === 'label' && ['sorted', 'sortDirection', 'sortFoldersFirst'].includes(entity.name)) { |         else if (entity.type === 'label' && ['sorted', 'sortDirection', 'sortFoldersFirst', 'sortNatural'].includes(entity.name)) { | ||||||
|             handleSortedAttribute(entity); |             handleSortedAttribute(entity); | ||||||
|         } |         } | ||||||
|         else if (entity.type === 'label') { |         else if (entity.type === 'label') { | ||||||
|   | |||||||
| @@ -123,7 +123,7 @@ function loadSubtreeNoteIds(parentNoteId, subtreeNoteIds) { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| function sortNotes(parentNoteId, customSortBy = 'title', reverse = false, foldersFirst = false) { | function sortNotes(parentNoteId, customSortBy = 'title', reverse = false, foldersFirst = false, sortNatural = false) { | ||||||
|     if (!customSortBy) { |     if (!customSortBy) { | ||||||
|         customSortBy = 'title'; |         customSortBy = 'title'; | ||||||
|     } |     } | ||||||
| @@ -153,7 +153,14 @@ function sortNotes(parentNoteId, customSortBy = 'title', reverse = false, folder | |||||||
|             } |             } | ||||||
|  |  | ||||||
|             function compare(a, b) { |             function compare(a, b) { | ||||||
|  |                 if (!sortNatural){ | ||||||
|  |                     // alphabetical sort | ||||||
|                     return b === null || b === undefined || a < b ? -1 : 1; |                     return b === null || b === undefined || a < b ? -1 : 1; | ||||||
|  |                 } else { | ||||||
|  |                     // alphanumeric sort, or natural sort | ||||||
|  |                     return a.localeCompare(b, undefined, {numeric: true, sensitivity: 'base'}); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             const topAEl = fetchValue(a, 'top'); |             const topAEl = fetchValue(a, 'top'); | ||||||
| @@ -224,8 +231,9 @@ function sortNotesIfNeeded(parentNoteId) { | |||||||
|     const sortReversed = parentNote.getLabelValue('sortDirection')?.toLowerCase() === "desc"; |     const sortReversed = parentNote.getLabelValue('sortDirection')?.toLowerCase() === "desc"; | ||||||
|     const sortFoldersFirstLabel = parentNote.getLabel('sortFoldersFirst'); |     const sortFoldersFirstLabel = parentNote.getLabel('sortFoldersFirst'); | ||||||
|     const sortFoldersFirst = sortFoldersFirstLabel && sortFoldersFirstLabel.value.toLowerCase() !== "false"; |     const sortFoldersFirst = sortFoldersFirstLabel && sortFoldersFirstLabel.value.toLowerCase() !== "false"; | ||||||
|  |     const sortNaturalLabel = parentNote.getLabel('sortNatural'); | ||||||
|     sortNotes(parentNoteId, sortedLabel.value, sortReversed, sortFoldersFirst); |     const sortNatural = sortNaturalLabel && sortNaturalLabel.value.toLowerCase() !== "false"; | ||||||
|  |     sortNotes(parentNoteId, sortedLabel.value, sortReversed, sortFoldersFirst, sortNatural); | ||||||
| } | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user