55 requireApiVersion ,
66 TAbstractFile ,
77 TFile ,
8- TFolder
8+ TFolder ,
9+ Vault
910} from 'obsidian' ;
1011import {
1112 determineStarredStatusOf ,
@@ -190,12 +191,16 @@ const Sorters: { [key in CustomSortOrder]: SorterFn } = {
190191 [ CustomSortOrder . trueAlphabeticalReverseWithFileExt ] : ( a : FIFS , b : FIFS ) => CollatorTrueAlphabeticalCompare ( b . sortStringWithExt , a . sortStringWithExt ) ,
191192 [ CustomSortOrder . byModifiedTime ] : ( a : FIFS , b : FIFS ) => ( a . isFolder && b . isFolder ) ? CollatorCompare ( a . sortString , b . sortString ) : ( a . mtime - b . mtime ) ,
192193 [ CustomSortOrder . byModifiedTimeAdvanced ] : sorterByFolderMDate ( ) ,
194+ [ CustomSortOrder . byModifiedTimeAdvancedRecursive ] : sorterByFolderMDate ( ) ,
193195 [ CustomSortOrder . byModifiedTimeReverse ] : ( a : FIFS , b : FIFS ) => ( a . isFolder && b . isFolder ) ? CollatorCompare ( a . sortString , b . sortString ) : ( b . mtime - a . mtime ) ,
194196 [ CustomSortOrder . byModifiedTimeReverseAdvanced ] : sorterByFolderMDate ( true ) ,
197+ [ CustomSortOrder . byModifiedTimeReverseAdvancedRecursive ] : sorterByFolderMDate ( true ) ,
195198 [ CustomSortOrder . byCreatedTime ] : ( a : FIFS , b : FIFS ) => ( a . isFolder && b . isFolder ) ? CollatorCompare ( a . sortString , b . sortString ) : ( a . ctime - b . ctime ) ,
196199 [ CustomSortOrder . byCreatedTimeAdvanced ] : sorterByFolderCDate ( ) ,
200+ [ CustomSortOrder . byCreatedTimeAdvancedRecursive ] : sorterByFolderCDate ( ) ,
197201 [ CustomSortOrder . byCreatedTimeReverse ] : ( a : FIFS , b : FIFS ) => ( a . isFolder && b . isFolder ) ? CollatorCompare ( a . sortString , b . sortString ) : ( b . ctime - a . ctime ) ,
198202 [ CustomSortOrder . byCreatedTimeReverseAdvanced ] : sorterByFolderCDate ( true ) ,
203+ [ CustomSortOrder . byCreatedTimeReverseAdvancedRecursive ] : sorterByFolderCDate ( true ) ,
199204 [ CustomSortOrder . byMetadataFieldAlphabetical ] : sorterByMetadataField ( StraightOrder , ! TrueAlphabetical , SortingLevelId . forPrimary ) ,
200205 [ CustomSortOrder . byMetadataFieldTrueAlphabetical ] : sorterByMetadataField ( StraightOrder , TrueAlphabetical , SortingLevelId . forPrimary ) ,
201206 [ CustomSortOrder . byMetadataFieldAlphabeticalReverse ] : sorterByMetadataField ( ReverseOrder , ! TrueAlphabetical , SortingLevelId . forPrimary ) ,
@@ -577,68 +582,82 @@ export const determineSortingGroup = function (entry: TFile | TFolder, spec: Cus
577582 }
578583}
579584
585+ const SortOrderRequiringRecursiveFolderDate = new Set < CustomSortOrder > ( [
586+ CustomSortOrder . byModifiedTimeAdvancedRecursive ,
587+ CustomSortOrder . byModifiedTimeReverseAdvancedRecursive ,
588+ CustomSortOrder . byCreatedTimeAdvancedRecursive ,
589+ CustomSortOrder . byCreatedTimeReverseAdvancedRecursive
590+ ] )
591+
592+ export const sortOrderNeedsFolderDeepDates = ( ...orders : Array < CustomSortOrder | undefined > ) : boolean => {
593+ return orders . some ( ( o ) => o && SortOrderRequiringRecursiveFolderDate . has ( o ) )
594+ }
595+
580596const SortOrderRequiringFolderDate = new Set < CustomSortOrder > ( [
597+ ...SortOrderRequiringRecursiveFolderDate ,
581598 CustomSortOrder . byModifiedTimeAdvanced ,
582599 CustomSortOrder . byModifiedTimeReverseAdvanced ,
583600 CustomSortOrder . byCreatedTimeAdvanced ,
584601 CustomSortOrder . byCreatedTimeReverseAdvanced
585602] )
586603
587- export const sortOrderNeedsFolderDates = ( order : CustomSortOrder | undefined , secondary ?: CustomSortOrder ) : boolean => {
588- // The CustomSortOrder.standardObsidian used as default because it doesn't require date on folders
589- return SortOrderRequiringFolderDate . has ( order ?? CustomSortOrder . standardObsidian )
590- || SortOrderRequiringFolderDate . has ( secondary ?? CustomSortOrder . standardObsidian )
604+ export const sortOrderNeedsFolderDates = ( ...orders : Array < CustomSortOrder | undefined > ) : boolean => {
605+ return orders . some ( ( o ) => o && SortOrderRequiringFolderDate . has ( o ) )
591606}
592607
593608const SortOrderRequiringBookmarksOrder = new Set < CustomSortOrder > ( [
594609 CustomSortOrder . byBookmarkOrder ,
595610 CustomSortOrder . byBookmarkOrderReverse
596611] )
597612
598- export const sortOrderNeedsBookmarksOrder = ( order : CustomSortOrder | undefined , secondary ?: CustomSortOrder ) : boolean => {
599- // The CustomSortOrder.standardObsidian used as default because it doesn't require bookmarks order
600- return SortOrderRequiringBookmarksOrder . has ( order ?? CustomSortOrder . standardObsidian )
601- || SortOrderRequiringBookmarksOrder . has ( secondary ?? CustomSortOrder . standardObsidian )
613+ export const sortOrderNeedsBookmarksOrder = ( ...orders : Array < CustomSortOrder | undefined > ) : boolean => {
614+ return orders . some ( ( o ) => o && SortOrderRequiringBookmarksOrder . has ( o ) )
602615}
603616
604617// Syntax sugar for readability
605618export type ModifiedTime = number
606619export type CreatedTime = number
607620
608- export const determineDatesForFolder = ( folder : TFolder , now : number ) : [ ModifiedTime , CreatedTime ] => {
621+ export const determineDatesForFolder = ( folder : TFolder , recursive ?: boolean ) : [ ModifiedTime , CreatedTime ] => {
609622 let mtimeOfFolder : ModifiedTime = DEFAULT_FOLDER_MTIME
610623 let ctimeOfFolder : CreatedTime = DEFAULT_FOLDER_CTIME
611624
612- folder . children . forEach ( ( item ) => {
613- if ( ! isFolder ( item ) ) {
614- const file : TFile = item as TFile
615- if ( file . stat . mtime > mtimeOfFolder ) {
616- mtimeOfFolder = file . stat . mtime
617- }
618- if ( file . stat . ctime < ctimeOfFolder || ctimeOfFolder === DEFAULT_FOLDER_CTIME ) {
619- ctimeOfFolder = file . stat . ctime
620- }
625+ const checkFile = ( abFile : TAbstractFile ) => {
626+ if ( isFolder ( abFile ) ) return
627+
628+ const file : TFile = abFile as TFile
629+ if ( file . stat . mtime > mtimeOfFolder ) {
630+ mtimeOfFolder = file . stat . mtime
621631 }
622- } )
632+ if ( file . stat . ctime < ctimeOfFolder || ctimeOfFolder === DEFAULT_FOLDER_CTIME ) {
633+ ctimeOfFolder = file . stat . ctime
634+ }
635+ }
636+
637+ if ( recursive ) {
638+ Vault . recurseChildren ( folder , checkFile )
639+ } else {
640+ folder . children . forEach ( ( item ) => checkFile ( item ) )
641+ }
623642 return [ mtimeOfFolder , ctimeOfFolder ]
624643}
625644
626645export const determineFolderDatesIfNeeded = ( folderItems : Array < FolderItemForSorting > , sortingSpec : CustomSortSpec ) => {
627- const Now : number = Date . now ( )
646+ const foldersDatesNeeded = sortOrderNeedsFolderDates ( sortingSpec . defaultOrder , sortingSpec . defaultSecondaryOrder )
647+ const foldersDeepDatesNeeded = sortOrderNeedsFolderDeepDates ( sortingSpec . defaultOrder , sortingSpec . defaultSecondaryOrder )
648+
649+ const groupOrders = sortingSpec . groups ?. map ( ( group ) => ( {
650+ foldersDatesNeeded : sortOrderNeedsFolderDates ( group . order , group . secondaryOrder ) ,
651+ foldersDeepDatesNeeded : sortOrderNeedsFolderDeepDates ( group . order , group . secondaryOrder )
652+ } ) )
653+
628654 folderItems . forEach ( ( item ) => {
629655 if ( item . folder ) {
630- const folderDefaultSortRequiresFolderDate : boolean = ! ! ( sortingSpec . defaultOrder && sortOrderNeedsFolderDates ( sortingSpec . defaultOrder , sortingSpec . defaultSecondaryOrder ) )
631- let groupSortRequiresFolderDate : boolean = false
632- if ( ! folderDefaultSortRequiresFolderDate ) {
633- const groupIdx : number | undefined = item . groupIdx
634- if ( groupIdx !== undefined ) {
635- const groupOrder : CustomSortOrder | undefined = sortingSpec . groups [ groupIdx ] . order
636- const groupSecondaryOrder : CustomSortOrder | undefined = sortingSpec . groups [ groupIdx ] . secondaryOrder
637- groupSortRequiresFolderDate = ! ! groupOrder && sortOrderNeedsFolderDates ( groupOrder , groupSecondaryOrder )
638- }
639- }
640- if ( folderDefaultSortRequiresFolderDate || groupSortRequiresFolderDate ) {
641- [ item . mtime , item . ctime ] = determineDatesForFolder ( item . folder , Now )
656+ if ( foldersDatesNeeded || ( item . groupIdx !== undefined && groupOrders [ item . groupIdx ] . foldersDatesNeeded ) ) {
657+ [ item . mtime , item . ctime ] = determineDatesForFolder (
658+ item . folder ,
659+ foldersDeepDatesNeeded || ( item . groupIdx !== undefined && groupOrders [ item . groupIdx ] . foldersDeepDatesNeeded )
660+ )
642661 }
643662 }
644663 } )
@@ -649,8 +668,9 @@ export const determineFolderDatesIfNeeded = (folderItems: Array<FolderItemForSor
649668export const determineBookmarksOrderIfNeeded = ( folderItems : Array < FolderItemForSorting > , sortingSpec : CustomSortSpec , plugin : BookmarksPluginInterface ) => {
650669 if ( ! plugin ) return
651670
671+ const folderDefaultSortRequiresBookmarksOrder : boolean = ! ! ( sortingSpec . defaultOrder && sortOrderNeedsBookmarksOrder ( sortingSpec . defaultOrder , sortingSpec . defaultSecondaryOrder ) )
672+
652673 folderItems . forEach ( ( item ) => {
653- const folderDefaultSortRequiresBookmarksOrder : boolean = ! ! ( sortingSpec . defaultOrder && sortOrderNeedsBookmarksOrder ( sortingSpec . defaultOrder , sortingSpec . defaultSecondaryOrder ) )
654674 let groupSortRequiresBookmarksOrder : boolean = false
655675 if ( ! folderDefaultSortRequiresBookmarksOrder ) {
656676 const groupIdx : number | undefined = item . groupIdx
0 commit comments