13 - Feature request: Sort by modification date, treating folder and files equally
- extended the advanced folder date handling also on the creation date
This commit is contained in:
parent
4e64925b2d
commit
1b8e0878af
|
@ -15,7 +15,9 @@ export enum CustomSortOrder {
|
||||||
byModifiedTimeReverse,
|
byModifiedTimeReverse,
|
||||||
byModifiedTimeReverseAdvanced,
|
byModifiedTimeReverseAdvanced,
|
||||||
byCreatedTime,
|
byCreatedTime,
|
||||||
|
byCreatedTimeAdvanced,
|
||||||
byCreatedTimeReverse,
|
byCreatedTimeReverse,
|
||||||
|
byCreatedTimeReverseAdvanced,
|
||||||
standardObsidian, // Let the folder sorting be in hands of Obsidian, whatever user selected in the UI
|
standardObsidian, // Let the folder sorting be in hands of Obsidian, whatever user selected in the UI
|
||||||
default = alphabetical
|
default = alphabetical
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,7 +29,9 @@ let Sorters: { [key in CustomSortOrder]: SorterFn } = {
|
||||||
[CustomSortOrder.byModifiedTimeReverse]: (a: FolderItemForSorting, b: FolderItemForSorting) => (a.isFolder && b.isFolder) ? Collator(a.sortString, b.sortString) : (b.mtime - a.mtime),
|
[CustomSortOrder.byModifiedTimeReverse]: (a: FolderItemForSorting, b: FolderItemForSorting) => (a.isFolder && b.isFolder) ? Collator(a.sortString, b.sortString) : (b.mtime - a.mtime),
|
||||||
[CustomSortOrder.byModifiedTimeReverseAdvanced]: (a: FolderItemForSorting, b: FolderItemForSorting) => b.mtime - a.mtime,
|
[CustomSortOrder.byModifiedTimeReverseAdvanced]: (a: FolderItemForSorting, b: FolderItemForSorting) => b.mtime - a.mtime,
|
||||||
[CustomSortOrder.byCreatedTime]: (a: FolderItemForSorting, b: FolderItemForSorting) => (a.isFolder && b.isFolder) ? Collator(a.sortString, b.sortString) : (a.ctime - b.ctime),
|
[CustomSortOrder.byCreatedTime]: (a: FolderItemForSorting, b: FolderItemForSorting) => (a.isFolder && b.isFolder) ? Collator(a.sortString, b.sortString) : (a.ctime - b.ctime),
|
||||||
|
[CustomSortOrder.byCreatedTimeAdvanced]: (a: FolderItemForSorting, b: FolderItemForSorting) => a.ctime - b.ctime,
|
||||||
[CustomSortOrder.byCreatedTimeReverse]: (a: FolderItemForSorting, b: FolderItemForSorting) => (a.isFolder && b.isFolder) ? Collator(a.sortString, b.sortString) : (b.ctime - a.ctime),
|
[CustomSortOrder.byCreatedTimeReverse]: (a: FolderItemForSorting, b: FolderItemForSorting) => (a.isFolder && b.isFolder) ? Collator(a.sortString, b.sortString) : (b.ctime - a.ctime),
|
||||||
|
[CustomSortOrder.byCreatedTimeReverseAdvanced]: (a: FolderItemForSorting, b: FolderItemForSorting) => b.ctime - a.ctime,
|
||||||
|
|
||||||
// This is a fallback entry which should not be used - the plugin code should refrain from custom sorting at all
|
// This is a fallback entry which should not be used - the plugin code should refrain from custom sorting at all
|
||||||
[CustomSortOrder.standardObsidian]: (a: FolderItemForSorting, b: FolderItemForSorting) => Collator(a.sortString, b.sortString),
|
[CustomSortOrder.standardObsidian]: (a: FolderItemForSorting, b: FolderItemForSorting) => Collator(a.sortString, b.sortString),
|
||||||
|
@ -178,27 +180,38 @@ export const determineSortingGroup = function (entry: TFile | TFolder, spec: Cus
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const sortOrderNeedsFoldersMDate = (order: CustomSortOrder | undefined, secondary?: CustomSortOrder): boolean => {
|
const SortOrderRequiringFolderDate = new Set<CustomSortOrder>([
|
||||||
return order === CustomSortOrder.byModifiedTimeAdvanced
|
CustomSortOrder.byModifiedTimeAdvanced,
|
||||||
|| order === CustomSortOrder.byModifiedTimeReverseAdvanced
|
CustomSortOrder.byModifiedTimeReverseAdvanced,
|
||||||
|| secondary === CustomSortOrder.byModifiedTimeAdvanced
|
CustomSortOrder.byCreatedTimeAdvanced,
|
||||||
|| secondary === CustomSortOrder.byModifiedTimeReverseAdvanced
|
CustomSortOrder.byCreatedTimeReverseAdvanced
|
||||||
|
])
|
||||||
|
|
||||||
|
export const sortOrderNeedsFolderDates = (order: CustomSortOrder | undefined, secondary?: CustomSortOrder): boolean => {
|
||||||
|
// The CustomSortOrder.standardObsidian used as default because it doesn't require date on folders
|
||||||
|
return SortOrderRequiringFolderDate.has(order ?? CustomSortOrder.standardObsidian)
|
||||||
|
|| SortOrderRequiringFolderDate.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 const determineModifiedDateForFolder = (folder: TFolder): ModifiedTime => {
|
export const determineDatesForFolder = (folder: TFolder): [ModifiedTime, CreatedTime] => {
|
||||||
let mtimeOfFolder: ModifiedTime = DEFAULT_FOLDER_MTIME
|
let mtimeOfFolder: ModifiedTime = DEFAULT_FOLDER_MTIME
|
||||||
|
let ctimeOfFolder: CreatedTime = DEFAULT_FOLDER_CTIME
|
||||||
folder.children.forEach((item) => {
|
folder.children.forEach((item) => {
|
||||||
if (!isFolder(item)) {
|
if (!isFolder(item)) {
|
||||||
const file: TFile = item as TFile
|
const file: TFile = item as TFile
|
||||||
if (file.stat.mtime > mtimeOfFolder) {
|
if (file.stat.mtime > mtimeOfFolder) {
|
||||||
mtimeOfFolder = file.stat.mtime
|
mtimeOfFolder = file.stat.mtime
|
||||||
}
|
}
|
||||||
|
if (file.stat.ctime > ctimeOfFolder) {
|
||||||
|
ctimeOfFolder = file.stat.ctime
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
return mtimeOfFolder
|
return [mtimeOfFolder, ctimeOfFolder]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -226,9 +239,9 @@ export const folderSort = function (sortingSpec: CustomSortSpec, order: string[]
|
||||||
const groupIdx: number | undefined = item.groupIdx
|
const groupIdx: number | undefined = item.groupIdx
|
||||||
if (groupIdx !== undefined) {
|
if (groupIdx !== undefined) {
|
||||||
const groupOrder: CustomSortOrder | undefined = sortingSpec.groups[groupIdx].order
|
const groupOrder: CustomSortOrder | undefined = sortingSpec.groups[groupIdx].order
|
||||||
if (sortOrderNeedsFoldersMDate(groupOrder)) {
|
if (sortOrderNeedsFolderDates(groupOrder)) {
|
||||||
if (item.folder) {
|
if (item.folder) {
|
||||||
item.mtime = determineModifiedDateForFolder(item.folder)
|
[item.mtime, item.ctime] = determineDatesForFolder(item.folder)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,6 +87,7 @@ const OrderLiterals: { [key: string]: CustomSortOrderAscDescPair } = {
|
||||||
'created': {asc: CustomSortOrder.byCreatedTime, desc: CustomSortOrder.byCreatedTimeReverse},
|
'created': {asc: CustomSortOrder.byCreatedTime, desc: CustomSortOrder.byCreatedTimeReverse},
|
||||||
'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, for edge cases of secondary sorting, when if regexp match is the same, override the alphabetical sorting by full name
|
// Advanced, for edge cases of secondary sorting, when if regexp match is the same, override the alphabetical sorting by full name
|
||||||
'a-z, created': {
|
'a-z, created': {
|
||||||
|
@ -109,6 +110,16 @@ const OrderLiterals: { [key: string]: CustomSortOrderAscDescPair } = {
|
||||||
desc: CustomSortOrder.alphabeticalReverse,
|
desc: CustomSortOrder.alphabeticalReverse,
|
||||||
secondary: CustomSortOrder.byModifiedTimeReverse
|
secondary: CustomSortOrder.byModifiedTimeReverse
|
||||||
},
|
},
|
||||||
|
'a-z, advanced created': {
|
||||||
|
asc: CustomSortOrder.alphabetical,
|
||||||
|
desc: CustomSortOrder.alphabeticalReverse,
|
||||||
|
secondary: CustomSortOrder.byCreatedTimeAdvanced
|
||||||
|
},
|
||||||
|
'a-z, advanced created desc': {
|
||||||
|
asc: CustomSortOrder.alphabetical,
|
||||||
|
desc: CustomSortOrder.alphabeticalReverse,
|
||||||
|
secondary: CustomSortOrder.byCreatedTimeReverseAdvanced
|
||||||
|
},
|
||||||
'a-z, advanced modified': {
|
'a-z, advanced modified': {
|
||||||
asc: CustomSortOrder.alphabetical,
|
asc: CustomSortOrder.alphabetical,
|
||||||
desc: CustomSortOrder.alphabeticalReverse,
|
desc: CustomSortOrder.alphabeticalReverse,
|
||||||
|
|
Loading…
Reference in New Issue