#132 - new orders: `advanced recursive modified` and `advanced recursive created`

This commit is contained in:
SebastianMC 2024-02-19 08:53:43 +01:00
parent 5ac915547c
commit ba54e63a48
4 changed files with 90 additions and 36 deletions

View File

@ -22,12 +22,16 @@ export enum CustomSortOrder {
trueAlphabeticalReverseWithFileExt, trueAlphabeticalReverseWithFileExt,
byModifiedTime, // New to old byModifiedTime, // New to old
byModifiedTimeAdvanced, byModifiedTimeAdvanced,
byModifiedTimeAdvancedRecursive,
byModifiedTimeReverse, // Old to new byModifiedTimeReverse, // Old to new
byModifiedTimeReverseAdvanced, byModifiedTimeReverseAdvanced,
byModifiedTimeReverseAdvancedRecursive,
byCreatedTime, // New to old byCreatedTime, // New to old
byCreatedTimeAdvanced, byCreatedTimeAdvanced,
byCreatedTimeAdvancedRecursive,
byCreatedTimeReverse, byCreatedTimeReverse,
byCreatedTimeReverseAdvanced, byCreatedTimeReverseAdvanced,
byCreatedTimeReverseAdvancedRecursive,
byMetadataFieldAlphabetical, byMetadataFieldAlphabetical,
byMetadataFieldTrueAlphabetical, byMetadataFieldTrueAlphabetical,
byMetadataFieldAlphabeticalReverse, byMetadataFieldAlphabeticalReverse,

View File

@ -5,7 +5,8 @@ import {
requireApiVersion, requireApiVersion,
TAbstractFile, TAbstractFile,
TFile, TFile,
TFolder TFolder,
Vault
} from 'obsidian'; } from 'obsidian';
import { import {
determineStarredStatusOf, determineStarredStatusOf,
@ -190,12 +191,16 @@ const Sorters: { [key in CustomSortOrder]: SorterFn } = {
[CustomSortOrder.trueAlphabeticalReverseWithFileExt]: (a: FIFS, b: FIFS) => CollatorTrueAlphabeticalCompare(b.sortStringWithExt, a.sortStringWithExt), [CustomSortOrder.trueAlphabeticalReverseWithFileExt]: (a: FIFS, b: FIFS) => CollatorTrueAlphabeticalCompare(b.sortStringWithExt, a.sortStringWithExt),
[CustomSortOrder.byModifiedTime]: (a: FIFS, b: FIFS) => (a.isFolder && b.isFolder) ? CollatorCompare(a.sortString, b.sortString) : (a.mtime - b.mtime), [CustomSortOrder.byModifiedTime]: (a: FIFS, b: FIFS) => (a.isFolder && b.isFolder) ? CollatorCompare(a.sortString, b.sortString) : (a.mtime - b.mtime),
[CustomSortOrder.byModifiedTimeAdvanced]: sorterByFolderMDate(), [CustomSortOrder.byModifiedTimeAdvanced]: sorterByFolderMDate(),
[CustomSortOrder.byModifiedTimeAdvancedRecursive]: sorterByFolderMDate(),
[CustomSortOrder.byModifiedTimeReverse]: (a: FIFS, b: FIFS) => (a.isFolder && b.isFolder) ? CollatorCompare(a.sortString, b.sortString) : (b.mtime - a.mtime), [CustomSortOrder.byModifiedTimeReverse]: (a: FIFS, b: FIFS) => (a.isFolder && b.isFolder) ? CollatorCompare(a.sortString, b.sortString) : (b.mtime - a.mtime),
[CustomSortOrder.byModifiedTimeReverseAdvanced]: sorterByFolderMDate(true), [CustomSortOrder.byModifiedTimeReverseAdvanced]: sorterByFolderMDate(true),
[CustomSortOrder.byModifiedTimeReverseAdvancedRecursive]: sorterByFolderMDate(true),
[CustomSortOrder.byCreatedTime]: (a: FIFS, b: FIFS) => (a.isFolder && b.isFolder) ? CollatorCompare(a.sortString, b.sortString) : (a.ctime - b.ctime), [CustomSortOrder.byCreatedTime]: (a: FIFS, b: FIFS) => (a.isFolder && b.isFolder) ? CollatorCompare(a.sortString, b.sortString) : (a.ctime - b.ctime),
[CustomSortOrder.byCreatedTimeAdvanced]: sorterByFolderCDate(), [CustomSortOrder.byCreatedTimeAdvanced]: sorterByFolderCDate(),
[CustomSortOrder.byCreatedTimeAdvancedRecursive]: sorterByFolderCDate(),
[CustomSortOrder.byCreatedTimeReverse]: (a: FIFS, b: FIFS) => (a.isFolder && b.isFolder) ? CollatorCompare(a.sortString, b.sortString) : (b.ctime - a.ctime), [CustomSortOrder.byCreatedTimeReverse]: (a: FIFS, b: FIFS) => (a.isFolder && b.isFolder) ? CollatorCompare(a.sortString, b.sortString) : (b.ctime - a.ctime),
[CustomSortOrder.byCreatedTimeReverseAdvanced]: sorterByFolderCDate(true), [CustomSortOrder.byCreatedTimeReverseAdvanced]: sorterByFolderCDate(true),
[CustomSortOrder.byCreatedTimeReverseAdvancedRecursive]: sorterByFolderCDate(true),
[CustomSortOrder.byMetadataFieldAlphabetical]: sorterByMetadataField(StraightOrder, !TrueAlphabetical, SortingLevelId.forPrimary), [CustomSortOrder.byMetadataFieldAlphabetical]: sorterByMetadataField(StraightOrder, !TrueAlphabetical, SortingLevelId.forPrimary),
[CustomSortOrder.byMetadataFieldTrueAlphabetical]: sorterByMetadataField(StraightOrder, TrueAlphabetical, SortingLevelId.forPrimary), [CustomSortOrder.byMetadataFieldTrueAlphabetical]: sorterByMetadataField(StraightOrder, TrueAlphabetical, SortingLevelId.forPrimary),
[CustomSortOrder.byMetadataFieldAlphabeticalReverse]: sorterByMetadataField(ReverseOrder, !TrueAlphabetical, SortingLevelId.forPrimary), [CustomSortOrder.byMetadataFieldAlphabeticalReverse]: sorterByMetadataField(ReverseOrder, !TrueAlphabetical, SortingLevelId.forPrimary),
@ -577,17 +582,27 @@ export const determineSortingGroup = function (entry: TFile | TFolder, spec: Cus
} }
} }
const SortOrderRequiringRecursiveFolderDate = new Set<CustomSortOrder>([
CustomSortOrder.byModifiedTimeAdvancedRecursive,
CustomSortOrder.byModifiedTimeReverseAdvancedRecursive,
CustomSortOrder.byCreatedTimeAdvancedRecursive,
CustomSortOrder.byCreatedTimeReverseAdvancedRecursive
])
export const sortOrderNeedsFolderDeepDates = (...orders: Array<CustomSortOrder | undefined>): boolean => {
return orders.some((o) => o && SortOrderRequiringRecursiveFolderDate.has(o))
}
const SortOrderRequiringFolderDate = new Set<CustomSortOrder>([ const SortOrderRequiringFolderDate = new Set<CustomSortOrder>([
...SortOrderRequiringRecursiveFolderDate,
CustomSortOrder.byModifiedTimeAdvanced, CustomSortOrder.byModifiedTimeAdvanced,
CustomSortOrder.byModifiedTimeReverseAdvanced, CustomSortOrder.byModifiedTimeReverseAdvanced,
CustomSortOrder.byCreatedTimeAdvanced, CustomSortOrder.byCreatedTimeAdvanced,
CustomSortOrder.byCreatedTimeReverseAdvanced CustomSortOrder.byCreatedTimeReverseAdvanced
]) ])
export const sortOrderNeedsFolderDates = (order: CustomSortOrder | undefined, secondary?: CustomSortOrder): boolean => { export const sortOrderNeedsFolderDates = (...orders: Array<CustomSortOrder | undefined>): boolean => {
// The CustomSortOrder.standardObsidian used as default because it doesn't require date on folders return orders.some((o) => o && SortOrderRequiringFolderDate.has(o))
return SortOrderRequiringFolderDate.has(order ?? CustomSortOrder.standardObsidian)
|| SortOrderRequiringFolderDate.has(secondary ?? CustomSortOrder.standardObsidian)
} }
const SortOrderRequiringBookmarksOrder = new Set<CustomSortOrder>([ const SortOrderRequiringBookmarksOrder = new Set<CustomSortOrder>([
@ -595,23 +610,22 @@ const SortOrderRequiringBookmarksOrder = new Set<CustomSortOrder>([
CustomSortOrder.byBookmarkOrderReverse CustomSortOrder.byBookmarkOrderReverse
]) ])
export const sortOrderNeedsBookmarksOrder = (order: CustomSortOrder | undefined, secondary?: CustomSortOrder): boolean => { export const sortOrderNeedsBookmarksOrder = (...orders: Array<CustomSortOrder | undefined>): boolean => {
// The CustomSortOrder.standardObsidian used as default because it doesn't require bookmarks order return orders.some((o) => o && SortOrderRequiringBookmarksOrder.has(o))
return SortOrderRequiringBookmarksOrder.has(order ?? CustomSortOrder.standardObsidian)
|| SortOrderRequiringBookmarksOrder.has(secondary ?? CustomSortOrder.standardObsidian)
} }
// Syntax sugar for readability // Syntax sugar for readability
export type ModifiedTime = number export type ModifiedTime = number
export type CreatedTime = number export type CreatedTime = number
export const determineDatesForFolder = (folder: TFolder, now: number): [ModifiedTime, CreatedTime] => { export const determineDatesForFolder = (folder: TFolder, recursive?: boolean): [ModifiedTime, CreatedTime] => {
let mtimeOfFolder: ModifiedTime = DEFAULT_FOLDER_MTIME let mtimeOfFolder: ModifiedTime = DEFAULT_FOLDER_MTIME
let ctimeOfFolder: CreatedTime = DEFAULT_FOLDER_CTIME let ctimeOfFolder: CreatedTime = DEFAULT_FOLDER_CTIME
folder.children.forEach((item) => { const checkFile = (abFile: TAbstractFile) => {
if (!isFolder(item)) { if (isFolder(abFile)) return
const file: TFile = item as TFile
const file: TFile = abFile as TFile
if (file.stat.mtime > mtimeOfFolder) { if (file.stat.mtime > mtimeOfFolder) {
mtimeOfFolder = file.stat.mtime mtimeOfFolder = file.stat.mtime
} }
@ -619,26 +633,31 @@ export const determineDatesForFolder = (folder: TFolder, now: number): [Modified
ctimeOfFolder = file.stat.ctime ctimeOfFolder = file.stat.ctime
} }
} }
})
if (recursive) {
Vault.recurseChildren(folder, checkFile)
} else {
folder.children.forEach((item) => checkFile(item))
}
return [mtimeOfFolder, ctimeOfFolder] return [mtimeOfFolder, ctimeOfFolder]
} }
export const determineFolderDatesIfNeeded = (folderItems: Array<FolderItemForSorting>, sortingSpec: CustomSortSpec) => { export const determineFolderDatesIfNeeded = (folderItems: Array<FolderItemForSorting>, sortingSpec: CustomSortSpec) => {
const Now: number = Date.now() const foldersDatesNeeded = sortOrderNeedsFolderDates(sortingSpec.defaultOrder, sortingSpec.defaultSecondaryOrder)
const foldersDeepDatesNeeded = sortOrderNeedsFolderDeepDates(sortingSpec.defaultOrder, sortingSpec.defaultSecondaryOrder)
const groupOrders = sortingSpec.groups?.map((group) => ({
foldersDatesNeeded: sortOrderNeedsFolderDates(group.order, group.secondaryOrder),
foldersDeepDatesNeeded: sortOrderNeedsFolderDeepDates(group.order, group.secondaryOrder)
}))
folderItems.forEach((item) => { folderItems.forEach((item) => {
if (item.folder) { if (item.folder) {
const folderDefaultSortRequiresFolderDate: boolean = !!(sortingSpec.defaultOrder && sortOrderNeedsFolderDates(sortingSpec.defaultOrder, sortingSpec.defaultSecondaryOrder)) if (foldersDatesNeeded || (item.groupIdx !== undefined && groupOrders[item.groupIdx].foldersDatesNeeded)) {
let groupSortRequiresFolderDate: boolean = false [item.mtime, item.ctime] = determineDatesForFolder(
if (!folderDefaultSortRequiresFolderDate) { item.folder,
const groupIdx: number | undefined = item.groupIdx foldersDeepDatesNeeded || (item.groupIdx !== undefined && groupOrders[item.groupIdx].foldersDeepDatesNeeded)
if (groupIdx !== undefined) { )
const groupOrder: CustomSortOrder | undefined = sortingSpec.groups[groupIdx].order
const groupSecondaryOrder: CustomSortOrder | undefined = sortingSpec.groups[groupIdx].secondaryOrder
groupSortRequiresFolderDate = !!groupOrder && sortOrderNeedsFolderDates(groupOrder, groupSecondaryOrder)
}
}
if (folderDefaultSortRequiresFolderDate || groupSortRequiresFolderDate) {
[item.mtime, item.ctime] = determineDatesForFolder(item.folder, Now)
} }
} }
}) })
@ -649,8 +668,9 @@ export const determineFolderDatesIfNeeded = (folderItems: Array<FolderItemForSor
export const determineBookmarksOrderIfNeeded = (folderItems: Array<FolderItemForSorting>, sortingSpec: CustomSortSpec, plugin: BookmarksPluginInterface) => { export const determineBookmarksOrderIfNeeded = (folderItems: Array<FolderItemForSorting>, sortingSpec: CustomSortSpec, plugin: BookmarksPluginInterface) => {
if (!plugin) return if (!plugin) return
folderItems.forEach((item) => {
const folderDefaultSortRequiresBookmarksOrder: boolean = !!(sortingSpec.defaultOrder && sortOrderNeedsBookmarksOrder(sortingSpec.defaultOrder, sortingSpec.defaultSecondaryOrder)) const folderDefaultSortRequiresBookmarksOrder: boolean = !!(sortingSpec.defaultOrder && sortOrderNeedsBookmarksOrder(sortingSpec.defaultOrder, sortingSpec.defaultSecondaryOrder))
folderItems.forEach((item) => {
let groupSortRequiresBookmarksOrder: boolean = false let groupSortRequiresBookmarksOrder: boolean = false
if (!folderDefaultSortRequiresBookmarksOrder) { if (!folderDefaultSortRequiresBookmarksOrder) {
const groupIdx: number | undefined = item.groupIdx const groupIdx: number | undefined = item.groupIdx

View File

@ -2325,6 +2325,14 @@ target-folder: AA
< advanced created < advanced created
/:files Archive... /:files Archive...
> advanced created > advanced created
/folders Deep1...
< advanced recursive created
/:files Deep2...
> advanced recursive created
/folders Deep3...
< advanced recursive modified
/:files Deep4...
> advanced recursive modified
` `
const expectedSortSpecForAdvancedFolderDateSortingMethods: { [key: string]: CustomSortSpec } = { const expectedSortSpecForAdvancedFolderDateSortingMethods: { [key: string]: CustomSortSpec } = {
@ -2373,12 +2381,32 @@ const expectedSortSpecForAdvancedFolderDateSortingMethods: { [key: string]: Cust
exactPrefix: 'Archive', exactPrefix: 'Archive',
foldersOnly: true, foldersOnly: true,
order: CustomSortOrder.byCreatedTimeAdvanced, order: CustomSortOrder.byCreatedTimeAdvanced,
type: 3 type: CustomSortGroupType.ExactPrefix
}, { }, {
exactPrefix: 'Archive', exactPrefix: 'Archive',
filesOnly: true, filesOnly: true,
order: CustomSortOrder.byCreatedTimeReverseAdvanced, order: CustomSortOrder.byCreatedTimeReverseAdvanced,
type: 3 type: CustomSortGroupType.ExactPrefix
}, {
exactPrefix: 'Deep1',
foldersOnly: true,
order: CustomSortOrder.byCreatedTimeAdvancedRecursive,
type: CustomSortGroupType.ExactPrefix
}, {
exactPrefix: 'Deep2',
filesOnly: true,
order: CustomSortOrder.byCreatedTimeReverseAdvancedRecursive,
type: CustomSortGroupType.ExactPrefix
}, {
exactPrefix: 'Deep3',
foldersOnly: true,
order: CustomSortOrder.byModifiedTimeAdvancedRecursive,
type: CustomSortGroupType.ExactPrefix
}, {
exactPrefix: 'Deep4',
filesOnly: true,
order: CustomSortOrder.byModifiedTimeReverseAdvancedRecursive,
type: CustomSortGroupType.ExactPrefix
}], }],
outsidersFilesGroupIdx: 1, outsidersFilesGroupIdx: 1,
outsidersFoldersGroupIdx: 0, outsidersFoldersGroupIdx: 0,

View File

@ -124,6 +124,8 @@ const OrderLiterals: { [key: string]: CustomSortOrderAscDescPair } = {
'modified': {asc: CustomSortOrder.byModifiedTime, desc: CustomSortOrder.byModifiedTimeReverse}, 'modified': {asc: CustomSortOrder.byModifiedTime, desc: CustomSortOrder.byModifiedTimeReverse},
'advanced modified': {asc: CustomSortOrder.byModifiedTimeAdvanced, desc: CustomSortOrder.byModifiedTimeReverseAdvanced}, 'advanced modified': {asc: CustomSortOrder.byModifiedTimeAdvanced, desc: CustomSortOrder.byModifiedTimeReverseAdvanced},
'advanced created': {asc: CustomSortOrder.byCreatedTimeAdvanced, desc: CustomSortOrder.byCreatedTimeReverseAdvanced}, 'advanced created': {asc: CustomSortOrder.byCreatedTimeAdvanced, desc: CustomSortOrder.byCreatedTimeReverseAdvanced},
'advanced recursive modified': {asc: CustomSortOrder.byModifiedTimeAdvancedRecursive, desc: CustomSortOrder.byModifiedTimeReverseAdvancedRecursive},
'advanced recursive created': {asc: CustomSortOrder.byCreatedTimeAdvancedRecursive, desc: CustomSortOrder.byCreatedTimeReverseAdvancedRecursive},
'standard': {asc: CustomSortOrder.standardObsidian, desc: CustomSortOrder.standardObsidian}, 'standard': {asc: CustomSortOrder.standardObsidian, desc: CustomSortOrder.standardObsidian},
'ui selected': {asc: CustomSortOrder.standardObsidian, desc: CustomSortOrder.standardObsidian}, 'ui selected': {asc: CustomSortOrder.standardObsidian, desc: CustomSortOrder.standardObsidian},
'by-bookmarks-order': {asc: CustomSortOrder.byBookmarkOrder, desc: CustomSortOrder.byBookmarkOrderReverse}, 'by-bookmarks-order': {asc: CustomSortOrder.byBookmarkOrder, desc: CustomSortOrder.byBookmarkOrderReverse},