Skip to content

Commit ba54e63

Browse files
committed
#132 - new orders: advanced recursive modified and advanced recursive created
1 parent 5ac9155 commit ba54e63

File tree

4 files changed

+90
-36
lines changed

4 files changed

+90
-36
lines changed

src/custom-sort/custom-sort-types.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,16 @@ export enum CustomSortOrder {
2222
trueAlphabeticalReverseWithFileExt,
2323
byModifiedTime, // New to old
2424
byModifiedTimeAdvanced,
25+
byModifiedTimeAdvancedRecursive,
2526
byModifiedTimeReverse, // Old to new
2627
byModifiedTimeReverseAdvanced,
28+
byModifiedTimeReverseAdvancedRecursive,
2729
byCreatedTime, // New to old
2830
byCreatedTimeAdvanced,
31+
byCreatedTimeAdvancedRecursive,
2932
byCreatedTimeReverse,
3033
byCreatedTimeReverseAdvanced,
34+
byCreatedTimeReverseAdvancedRecursive,
3135
byMetadataFieldAlphabetical,
3236
byMetadataFieldTrueAlphabetical,
3337
byMetadataFieldAlphabeticalReverse,

src/custom-sort/custom-sort.ts

Lines changed: 54 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import {
55
requireApiVersion,
66
TAbstractFile,
77
TFile,
8-
TFolder
8+
TFolder,
9+
Vault
910
} from 'obsidian';
1011
import {
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+
580596
const 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

593608
const 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
605618
export type ModifiedTime = number
606619
export 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

626645
export 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
649668
export 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

src/custom-sort/sorting-spec-processor.spec.ts

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2325,6 +2325,14 @@ target-folder: AA
23252325
< advanced created
23262326
/:files Archive...
23272327
> advanced created
2328+
/folders Deep1...
2329+
< advanced recursive created
2330+
/:files Deep2...
2331+
> advanced recursive created
2332+
/folders Deep3...
2333+
< advanced recursive modified
2334+
/:files Deep4...
2335+
> advanced recursive modified
23282336
`
23292337

23302338
const expectedSortSpecForAdvancedFolderDateSortingMethods: { [key: string]: CustomSortSpec } = {
@@ -2373,12 +2381,32 @@ const expectedSortSpecForAdvancedFolderDateSortingMethods: { [key: string]: Cust
23732381
exactPrefix: 'Archive',
23742382
foldersOnly: true,
23752383
order: CustomSortOrder.byCreatedTimeAdvanced,
2376-
type: 3
2384+
type: CustomSortGroupType.ExactPrefix
23772385
}, {
23782386
exactPrefix: 'Archive',
23792387
filesOnly: true,
23802388
order: CustomSortOrder.byCreatedTimeReverseAdvanced,
2381-
type: 3
2389+
type: CustomSortGroupType.ExactPrefix
2390+
}, {
2391+
exactPrefix: 'Deep1',
2392+
foldersOnly: true,
2393+
order: CustomSortOrder.byCreatedTimeAdvancedRecursive,
2394+
type: CustomSortGroupType.ExactPrefix
2395+
}, {
2396+
exactPrefix: 'Deep2',
2397+
filesOnly: true,
2398+
order: CustomSortOrder.byCreatedTimeReverseAdvancedRecursive,
2399+
type: CustomSortGroupType.ExactPrefix
2400+
}, {
2401+
exactPrefix: 'Deep3',
2402+
foldersOnly: true,
2403+
order: CustomSortOrder.byModifiedTimeAdvancedRecursive,
2404+
type: CustomSortGroupType.ExactPrefix
2405+
}, {
2406+
exactPrefix: 'Deep4',
2407+
filesOnly: true,
2408+
order: CustomSortOrder.byModifiedTimeReverseAdvancedRecursive,
2409+
type: CustomSortGroupType.ExactPrefix
23822410
}],
23832411
outsidersFilesGroupIdx: 1,
23842412
outsidersFoldersGroupIdx: 0,

src/custom-sort/sorting-spec-processor.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,8 @@ const OrderLiterals: { [key: string]: CustomSortOrderAscDescPair } = {
124124
'modified': {asc: CustomSortOrder.byModifiedTime, desc: CustomSortOrder.byModifiedTimeReverse},
125125
'advanced modified': {asc: CustomSortOrder.byModifiedTimeAdvanced, desc: CustomSortOrder.byModifiedTimeReverseAdvanced},
126126
'advanced created': {asc: CustomSortOrder.byCreatedTimeAdvanced, desc: CustomSortOrder.byCreatedTimeReverseAdvanced},
127+
'advanced recursive modified': {asc: CustomSortOrder.byModifiedTimeAdvancedRecursive, desc: CustomSortOrder.byModifiedTimeReverseAdvancedRecursive},
128+
'advanced recursive created': {asc: CustomSortOrder.byCreatedTimeAdvancedRecursive, desc: CustomSortOrder.byCreatedTimeReverseAdvancedRecursive},
127129
'standard': {asc: CustomSortOrder.standardObsidian, desc: CustomSortOrder.standardObsidian},
128130
'ui selected': {asc: CustomSortOrder.standardObsidian, desc: CustomSortOrder.standardObsidian},
129131
'by-bookmarks-order': {asc: CustomSortOrder.byBookmarkOrder, desc: CustomSortOrder.byBookmarkOrderReverse},

0 commit comments

Comments
 (0)