Merge pull request #73 from SebastianMC/72-advanced-sorting-by-creation-date-doesnt-work-correctly

#72 - Advanced sorting by creation date doesn't work correctly
This commit is contained in:
SebastianMC 2023-04-03 19:13:52 +02:00 committed by GitHub
commit 7158e4b484
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 100 additions and 148 deletions

View File

@ -107,9 +107,9 @@ Lines starting with `//` are ignored
For extremely large vaults use with caution, as the sorting needs to scan all files inside a folder to determine the folder's modified date For extremely large vaults use with caution, as the sorting needs to scan all files inside a folder to determine the folder's modified date
- `> advanced modified` - by modified time reverse, the most recently modified item goes first. For folders, their modification date is derived from the most recently modified direct child file. - `> advanced modified` - by modified time reverse, the most recently modified item goes first. For folders, their modification date is derived from the most recently modified direct child file.
For extremely large vaults use with caution, as the sorting needs to scan all files inside a folder to determine the folder's modified date For extremely large vaults use with caution, as the sorting needs to scan all files inside a folder to determine the folder's modified date
- `< advanced created` - by created time, the oldest item goes first. For folders, their creation date is derived from the oldest direct child file. - `< advanced created` - by created time, the oldest item goes first. For folders, their creation date is derived from the oldest (ctime) direct child file.
For extremely large vaults use with caution, as the sorting needs to scan all files inside a folder to determine the folder's created date For extremely large vaults use with caution, as the sorting needs to scan all files inside a folder to determine the folder's created date
- `> advanced created` - by created time reverse, the newest item goes first. For folders, their creation date is derived from the newest direct child file. - `> advanced created` - by created time reverse, the newest item goes first. For folders, their creation date is derived from the oldest (ctime) direct child file.
For extremely large vaults use with caution, as the sorting needs to scan all files inside a folder to determine the folder's created date For extremely large vaults use with caution, as the sorting needs to scan all files inside a folder to determine the folder's created date
#### At group level only (aka secondary sorting rule) #### At group level only (aka secondary sorting rule)

View File

@ -79,15 +79,14 @@ describe('determineSortingGroup', () => {
} }
// when // when
const result = determineSortingGroup(file, sortSpec) const result: FolderItemForSorting = determineSortingGroup(file, sortSpec)
// then // then
expect(result).toEqual({ expect(result).toEqual({
groupIdx: 0, groupIdx: 0,
isFolder: false, isFolder: false,
sortString: "References.md", sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md' path: 'Some parent folder/References.md'
}); });
@ -105,15 +104,14 @@ describe('determineSortingGroup', () => {
} }
// when // when
const result = determineSortingGroup(file, sortSpec) const result: FolderItemForSorting = determineSortingGroup(file, sortSpec)
// then // then
expect(result).toEqual({ expect(result).toEqual({
groupIdx: 1, // This indicates the last+1 idx (no match) groupIdx: 1, // This indicates the last+1 idx (no match)
isFolder: false, isFolder: false,
sortString: "References.md", sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 555, ctime: MOCK_TIMESTAMP + 555,
ctimeOldest: MOCK_TIMESTAMP + 555,
mtime: MOCK_TIMESTAMP + 666, mtime: MOCK_TIMESTAMP + 666,
path: 'Some parent folder/References.md' path: 'Some parent folder/References.md'
}); });
@ -140,8 +138,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // This indicates the last+1 idx (no match) groupIdx: 1, // This indicates the last+1 idx (no match)
isFolder: false, isFolder: false,
sortString: "Part123:-icle.md", sortString: "Part123:-icle.md",
ctimeNewest: MOCK_TIMESTAMP + 555, ctime: MOCK_TIMESTAMP + 555,
ctimeOldest: MOCK_TIMESTAMP + 555,
mtime: MOCK_TIMESTAMP + 666, mtime: MOCK_TIMESTAMP + 666,
path: 'Some parent folder/Part123:-icle.md' path: 'Some parent folder/Part123:-icle.md'
}); });
@ -169,8 +166,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // This indicates the last+1 idx groupIdx: 1, // This indicates the last+1 idx
isFolder: false, isFolder: false,
sortString: "Part123:-icle.md", sortString: "Part123:-icle.md",
ctimeNewest: MOCK_TIMESTAMP + 555, ctime: MOCK_TIMESTAMP + 555,
ctimeOldest: MOCK_TIMESTAMP + 555,
mtime: MOCK_TIMESTAMP + 666, mtime: MOCK_TIMESTAMP + 666,
path: 'Some parent folder/Part123:-icle.md' path: 'Some parent folder/Part123:-icle.md'
}); });
@ -198,8 +194,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0, // Matched! groupIdx: 0, // Matched!
isFolder: false, isFolder: false,
sortString: "Part123:-icle.md", sortString: "Part123:-icle.md",
ctimeNewest: MOCK_TIMESTAMP + 555, ctime: MOCK_TIMESTAMP + 555,
ctimeOldest: MOCK_TIMESTAMP + 555,
mtime: MOCK_TIMESTAMP + 666, mtime: MOCK_TIMESTAMP + 666,
path: 'Some parent folder/Part123:-icle.md' path: 'Some parent folder/Part123:-icle.md'
}); });
@ -228,8 +223,7 @@ describe('determineSortingGroup', () => {
isFolder: false, isFolder: false,
sortString: "00000123////Part123:-icle.md", sortString: "00000123////Part123:-icle.md",
matchGroup: '00000123//', matchGroup: '00000123//',
ctimeNewest: MOCK_TIMESTAMP + 555, ctime: MOCK_TIMESTAMP + 555,
ctimeOldest: MOCK_TIMESTAMP + 555,
mtime: MOCK_TIMESTAMP + 666, mtime: MOCK_TIMESTAMP + 666,
path: 'Some parent folder/Part123:-icle.md' path: 'Some parent folder/Part123:-icle.md'
}); });
@ -257,8 +251,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // This indicates the last+1 idx groupIdx: 1, // This indicates the last+1 idx
isFolder: false, isFolder: false,
sortString: "Part:123-icle.md", sortString: "Part:123-icle.md",
ctimeNewest: MOCK_TIMESTAMP + 555, ctime: MOCK_TIMESTAMP + 555,
ctimeOldest: MOCK_TIMESTAMP + 555,
mtime: MOCK_TIMESTAMP + 666, mtime: MOCK_TIMESTAMP + 666,
path: 'Some parent folder/Part:123-icle.md' path: 'Some parent folder/Part:123-icle.md'
}); });
@ -287,8 +280,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0, // Matched! groupIdx: 0, // Matched!
isFolder: false, isFolder: false,
sortString: "Part:123-icle.md", sortString: "Part:123-icle.md",
ctimeNewest: MOCK_TIMESTAMP + 555, ctime: MOCK_TIMESTAMP + 555,
ctimeOldest: MOCK_TIMESTAMP + 555,
mtime: MOCK_TIMESTAMP + 666, mtime: MOCK_TIMESTAMP + 666,
path: 'Some parent folder/Part:123-icle.md' path: 'Some parent folder/Part:123-icle.md'
}); });
@ -319,8 +311,7 @@ describe('determineSortingGroup', () => {
isFolder: false, isFolder: false,
sortString: "00000001|00000023////Part:1 1-23.456-icle.md", sortString: "00000001|00000023////Part:1 1-23.456-icle.md",
matchGroup: '00000001|00000023//', matchGroup: '00000001|00000023//',
ctimeNewest: MOCK_TIMESTAMP + 555, ctime: MOCK_TIMESTAMP + 555,
ctimeOldest: MOCK_TIMESTAMP + 555,
mtime: MOCK_TIMESTAMP + 666, mtime: MOCK_TIMESTAMP + 666,
path: 'Some parent folder/Part:1 1-23.456-icle.md' path: 'Some parent folder/Part:1 1-23.456-icle.md'
}); });
@ -349,8 +340,7 @@ describe('determineSortingGroup', () => {
isFolder: false, isFolder: false,
sortString: "00000123////Part:123-icle.md", sortString: "00000123////Part:123-icle.md",
matchGroup: '00000123//', matchGroup: '00000123//',
ctimeNewest: MOCK_TIMESTAMP + 555, ctime: MOCK_TIMESTAMP + 555,
ctimeOldest: MOCK_TIMESTAMP + 555,
mtime: MOCK_TIMESTAMP + 666, mtime: MOCK_TIMESTAMP + 666,
path: 'Some parent folder/Part:123-icle.md' path: 'Some parent folder/Part:123-icle.md'
}); });
@ -376,8 +366,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0, groupIdx: 0,
isFolder: false, isFolder: false,
sortString: "References.md", sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md' path: 'Some parent folder/References.md'
}); });
@ -403,8 +392,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0, groupIdx: 0,
isFolder: false, isFolder: false,
sortString: "Ref2erences.md", sortString: "Ref2erences.md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/Ref2erences.md' path: 'Some parent folder/Ref2erences.md'
}); });
@ -432,8 +420,7 @@ describe('determineSortingGroup', () => {
isFolder: false, isFolder: false,
sortString: '00000001|00000030|00000006|00001900////Reference i.xxx.vi.mcm.md', sortString: '00000001|00000030|00000006|00001900////Reference i.xxx.vi.mcm.md',
matchGroup: "00000001|00000030|00000006|00001900//", matchGroup: "00000001|00000030|00000006|00001900//",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/Reference i.xxx.vi.mcm.md' path: 'Some parent folder/Reference i.xxx.vi.mcm.md'
}); });
@ -456,8 +443,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // This indicates the last+1 idx groupIdx: 1, // This indicates the last+1 idx
isFolder: false, isFolder: false,
sortString: "References.md", sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md' path: 'Some parent folder/References.md'
}); });
@ -483,8 +469,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0, groupIdx: 0,
isFolder: false, isFolder: false,
sortString: "References.md", sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md' path: 'Some parent folder/References.md'
}); });
@ -510,8 +495,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0, groupIdx: 0,
isFolder: false, isFolder: false,
sortString: "References 12.md", sortString: "References 12.md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References 12.md' path: 'Some parent folder/References 12.md'
}); });
@ -539,8 +523,7 @@ describe('determineSortingGroup', () => {
isFolder: false, isFolder: false,
sortString: '00000001|00000030|00000006|00001900////Reference i.xxx.vi.mcm.md', sortString: '00000001|00000030|00000006|00001900////Reference i.xxx.vi.mcm.md',
matchGroup: "00000001|00000030|00000006|00001900//", matchGroup: "00000001|00000030|00000006|00001900//",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/Reference i.xxx.vi.mcm.md' path: 'Some parent folder/Reference i.xxx.vi.mcm.md'
}); });
@ -563,8 +546,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // This indicates the last+1 idx groupIdx: 1, // This indicates the last+1 idx
isFolder: false, isFolder: false,
sortString: "References.md", sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md' path: 'Some parent folder/References.md'
}); });
@ -589,8 +571,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // This indicates the last+1 idx groupIdx: 1, // This indicates the last+1 idx
isFolder: false, isFolder: false,
sortString: "References.md", sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md' path: 'Some parent folder/References.md'
}); });
@ -616,8 +597,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0, groupIdx: 0,
isFolder: false, isFolder: false,
sortString: "References.md", sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md' path: 'Some parent folder/References.md'
}); });
@ -643,8 +623,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0, groupIdx: 0,
isFolder: false, isFolder: false,
sortString: "References 12.md", sortString: "References 12.md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References 12.md' path: 'Some parent folder/References 12.md'
}); });
@ -672,8 +651,7 @@ describe('determineSortingGroup', () => {
isFolder: false, isFolder: false,
sortString: '00000001|00000030|00000006|00001900////Reference i.xxx.vi.mcm.md', sortString: '00000001|00000030|00000006|00001900////Reference i.xxx.vi.mcm.md',
matchGroup: "00000001|00000030|00000006|00001900//", matchGroup: "00000001|00000030|00000006|00001900//",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/Reference i.xxx.vi.mcm.md' path: 'Some parent folder/Reference i.xxx.vi.mcm.md'
}); });
@ -696,8 +674,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // This indicates the last+1 idx groupIdx: 1, // This indicates the last+1 idx
isFolder: false, isFolder: false,
sortString: "References.md", sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md' path: 'Some parent folder/References.md'
}); });
@ -722,8 +699,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // This indicates the last+1 idx groupIdx: 1, // This indicates the last+1 idx
isFolder: false, isFolder: false,
sortString: "References.md", sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md' path: 'Some parent folder/References.md'
}); });
@ -762,8 +738,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // The lastIdx+1, group not determined groupIdx: 1, // The lastIdx+1, group not determined
isFolder: false, isFolder: false,
sortString: "References.md", sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md' path: 'Some parent folder/References.md'
}); });
@ -800,8 +775,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // lastIdx + 1, group not determined groupIdx: 1, // lastIdx + 1, group not determined
isFolder: false, isFolder: false,
sortString: "References.md", sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md' path: 'Some parent folder/References.md'
}); });
@ -838,8 +812,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0, groupIdx: 0,
isFolder: false, isFolder: false,
sortString: "References.md", sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md' path: 'Some parent folder/References.md'
} as FolderItemForSorting); } as FolderItemForSorting);
@ -876,8 +849,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0, groupIdx: 0,
isFolder: true, isFolder: true,
sortString: "References", sortString: "References",
ctimeNewest: DEFAULT_FOLDER_CTIME, ctime: DEFAULT_FOLDER_CTIME,
ctimeOldest: DEFAULT_FOLDER_CTIME,
mtime: DEFAULT_FOLDER_MTIME, mtime: DEFAULT_FOLDER_MTIME,
path: 'References', path: 'References',
folder: folder folder: folder
@ -910,8 +882,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // The lastIdx+1, group not determined groupIdx: 1, // The lastIdx+1, group not determined
isFolder: false, isFolder: false,
sortString: "References.md", sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md' path: 'Some parent folder/References.md'
}); });
@ -942,8 +913,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0, groupIdx: 0,
isFolder: false, isFolder: false,
sortString: "References.md", sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md' path: 'Some parent folder/References.md'
}); });
@ -974,8 +944,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // The lastIdx+1, group not determined groupIdx: 1, // The lastIdx+1, group not determined
isFolder: true, isFolder: true,
sortString: "TestEmptyFolder", sortString: "TestEmptyFolder",
ctimeNewest: 0, ctime: 0,
ctimeOldest: 0,
mtime: 0, mtime: 0,
path: 'TestEmptyFolder', path: 'TestEmptyFolder',
folder: { folder: {
@ -1014,8 +983,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // The lastIdx+1, group not determined groupIdx: 1, // The lastIdx+1, group not determined
isFolder: true, isFolder: true,
sortString: "TestEmptyFolder", sortString: "TestEmptyFolder",
ctimeNewest: 0, ctime: 0,
ctimeOldest: 0,
mtime: 0, mtime: 0,
path: 'TestEmptyFolder', path: 'TestEmptyFolder',
folder: { folder: {
@ -1054,8 +1022,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0, groupIdx: 0,
isFolder: true, isFolder: true,
sortString: "TestEmptyFolder", sortString: "TestEmptyFolder",
ctimeNewest: 0, ctime: 0,
ctimeOldest: 0,
mtime: 0, mtime: 0,
path: 'TestEmptyFolder', path: 'TestEmptyFolder',
folder: { folder: {
@ -1097,8 +1064,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // The lastIdx+1, group not determined groupIdx: 1, // The lastIdx+1, group not determined
isFolder: false, isFolder: false,
sortString: "References.md", sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md' path: 'Some parent folder/References.md'
}); });
@ -1133,8 +1099,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // The lastIdx+1, group not determined groupIdx: 1, // The lastIdx+1, group not determined
isFolder: false, isFolder: false,
sortString: "References.md", sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md' path: 'Some parent folder/References.md'
}); });
@ -1168,8 +1133,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0, groupIdx: 0,
isFolder: false, isFolder: false,
sortString: "References.md", sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md' path: 'Some parent folder/References.md'
}); });
@ -1204,8 +1168,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0, groupIdx: 0,
isFolder: false, isFolder: false,
sortString: "References.md", sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md' path: 'Some parent folder/References.md'
}); });
@ -1236,8 +1199,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // The lastIdx+1, group not determined groupIdx: 1, // The lastIdx+1, group not determined
isFolder: true, isFolder: true,
sortString: "TestEmptyFolder", sortString: "TestEmptyFolder",
ctimeNewest: 0, ctime: 0,
ctimeOldest: 0,
mtime: 0, mtime: 0,
path: 'TestEmptyFolder', path: 'TestEmptyFolder',
folder: { folder: {
@ -1279,8 +1241,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0, groupIdx: 0,
isFolder: true, isFolder: true,
sortString: "TestEmptyFolder", sortString: "TestEmptyFolder",
ctimeNewest: 0, ctime: 0,
ctimeOldest: 0,
mtime: 0, mtime: 0,
path: 'TestEmptyFolder', path: 'TestEmptyFolder',
folder: { folder: {
@ -1325,8 +1286,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0, groupIdx: 0,
isFolder: true, isFolder: true,
sortString: "TestEmptyFolder", sortString: "TestEmptyFolder",
ctimeNewest: 0, ctime: 0,
ctimeOldest: 0,
mtime: 0, mtime: 0,
path: 'TestEmptyFolder', path: 'TestEmptyFolder',
folder: { folder: {
@ -1369,8 +1329,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0, groupIdx: 0,
isFolder: true, isFolder: true,
sortString: "TestEmptyFolder", sortString: "TestEmptyFolder",
ctimeNewest: 0, ctime: 0,
ctimeOldest: 0,
mtime: 0, mtime: 0,
path: 'TestEmptyFolder', path: 'TestEmptyFolder',
folder: { folder: {
@ -1416,8 +1375,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0, groupIdx: 0,
isFolder: true, isFolder: true,
sortString: "TestEmptyFolder", sortString: "TestEmptyFolder",
ctimeNewest: 0, ctime: 0,
ctimeOldest: 0,
mtime: 0, mtime: 0,
path: 'TestEmptyFolder', path: 'TestEmptyFolder',
folder: { folder: {
@ -1460,8 +1418,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // lastIdx+1 - no match groupIdx: 1, // lastIdx+1 - no match
isFolder: true, isFolder: true,
sortString: "TestEmptyFolder", sortString: "TestEmptyFolder",
ctimeNewest: 0, ctime: 0,
ctimeOldest: 0,
mtime: 0, mtime: 0,
path: 'TestEmptyFolder', path: 'TestEmptyFolder',
folder: { folder: {
@ -1507,8 +1464,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // lastIdx+1 - no match groupIdx: 1, // lastIdx+1 - no match
isFolder: true, isFolder: true,
sortString: "TestEmptyFolder", sortString: "TestEmptyFolder",
ctimeNewest: 0, ctime: 0,
ctimeOldest: 0,
mtime: 0, mtime: 0,
path: 'TestEmptyFolder', path: 'TestEmptyFolder',
folder: { folder: {
@ -1557,8 +1513,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0, groupIdx: 0,
isFolder: false, isFolder: false,
sortString: "References.md", sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md', path: 'Some parent folder/References.md',
metadataFieldValue: 'direct metadata on file' metadataFieldValue: 'direct metadata on file'
@ -1597,8 +1552,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0, groupIdx: 0,
isFolder: false, isFolder: false,
sortString: "References.md", sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md', path: 'Some parent folder/References.md',
metadataFieldValue: 'direct metadata on file' metadataFieldValue: 'direct metadata on file'
@ -1637,8 +1591,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0, groupIdx: 0,
isFolder: false, isFolder: false,
sortString: "References.md", sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md', path: 'Some parent folder/References.md',
metadataFieldValue: 'direct metadata on file' metadataFieldValue: 'direct metadata on file'
@ -1677,8 +1630,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0, groupIdx: 0,
isFolder: false, isFolder: false,
sortString: "References.md", sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md', path: 'Some parent folder/References.md',
metadataFieldValue: 'direct metadata on file' metadataFieldValue: 'direct metadata on file'
@ -1717,8 +1669,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0, groupIdx: 0,
isFolder: true, isFolder: true,
sortString: "References", sortString: "References",
ctimeNewest: DEFAULT_FOLDER_CTIME, ctime: DEFAULT_FOLDER_CTIME,
ctimeOldest: DEFAULT_FOLDER_CTIME,
mtime: DEFAULT_FOLDER_MTIME, mtime: DEFAULT_FOLDER_MTIME,
path: 'References', path: 'References',
metadataFieldValue: 'metadata on folder note', metadataFieldValue: 'metadata on folder note',
@ -1759,8 +1710,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0, groupIdx: 0,
isFolder: false, isFolder: false,
sortString: "References.md", sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md', path: 'Some parent folder/References.md',
metadataFieldValue: 'direct metadata on file, not obvious' metadataFieldValue: 'direct metadata on file, not obvious'
@ -1798,8 +1748,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0, groupIdx: 0,
isFolder: false, isFolder: false,
sortString: "References.md", sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md', path: 'Some parent folder/References.md',
metadataFieldValue: 'direct metadata on file, tricky' metadataFieldValue: 'direct metadata on file, tricky'
@ -1837,8 +1786,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0, groupIdx: 0,
isFolder: false, isFolder: false,
sortString: "References.md", sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md', path: 'Some parent folder/References.md',
metadataFieldValue: 'direct metadata on file, under default name' metadataFieldValue: 'direct metadata on file, under default name'
@ -1885,8 +1833,7 @@ describe('determineSortingGroup', () => {
groupIdx: 3, groupIdx: 3,
isFolder: false, isFolder: false,
sortString: "Abcdef!.md", sortString: "Abcdef!.md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/Abcdef!.md' path: 'Some parent folder/Abcdef!.md'
}); });
@ -1935,8 +1882,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // Imposed by combined groups groupIdx: 1, // Imposed by combined groups
isFolder: false, isFolder: false,
sortString: "Hello :-) ha.md", sortString: "Hello :-) ha.md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/Hello :-) ha.md' path: 'Some parent folder/Hello :-) ha.md'
}); });
@ -1944,8 +1890,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // Imposed by combined groups groupIdx: 1, // Imposed by combined groups
isFolder: false, isFolder: false,
sortString: "Hello World :-).md", sortString: "Hello World :-).md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/Hello World :-).md' path: 'Some parent folder/Hello World :-).md'
}); });
@ -1990,8 +1935,7 @@ describe('determineSortingGroup', () => {
groupIdx: 2, // Imposed by combined groups groupIdx: 2, // Imposed by combined groups
isFolder: false, isFolder: false,
sortString: "Hello :-).md", sortString: "Hello :-).md",
ctimeNewest: MOCK_TIMESTAMP + 222, ctime: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333, mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/Hello :-).md' path: 'Some parent folder/Hello :-).md'
}); });
@ -2017,19 +1961,29 @@ describe('determineFolderDatesIfNeeded', () => {
determineFolderDatesIfNeeded([result], sortSpec) determineFolderDatesIfNeeded([result], sortSpec)
// then // then
expect(result.ctimeOldest).toEqual(DEFAULT_FOLDER_CTIME) expect(result.ctime).toEqual(DEFAULT_FOLDER_CTIME)
expect(result.ctimeNewest).toEqual(DEFAULT_FOLDER_CTIME)
expect(result.mtime).toEqual(DEFAULT_FOLDER_CTIME) expect(result.mtime).toEqual(DEFAULT_FOLDER_CTIME)
}) })
it('should correctly determine dates, if triggered', () => { it.each(
[
[CustomSortOrder.byCreatedTimeReverseAdvanced, undefined],
[CustomSortOrder.byCreatedTimeAdvanced, undefined],
[CustomSortOrder.byModifiedTimeAdvanced, undefined],
[CustomSortOrder.byModifiedTimeReverseAdvanced, undefined],
[CustomSortOrder.alphabetical, CustomSortOrder.byCreatedTimeReverseAdvanced],
[CustomSortOrder.alphabetical, CustomSortOrder.byCreatedTimeAdvanced],
[CustomSortOrder.alphabetical, CustomSortOrder.byModifiedTimeAdvanced],
[CustomSortOrder.alphabetical, CustomSortOrder.byModifiedTimeReverseAdvanced]
])('should correctly determine dates, if triggered by %s under default %s', (order: CustomSortOrder, folderOrder: CustomSortOrder | undefined) => {
// given // given
const folder: TFolder = mockTFolderWithChildren('Test folder 1') const folder: TFolder = mockTFolderWithChildren('Test folder 1')
const OUTSIDERS_GROUP_IDX = 0 const OUTSIDERS_GROUP_IDX = 0
const sortSpec: CustomSortSpec = { const sortSpec: CustomSortSpec = {
targetFoldersPaths: ['/'], targetFoldersPaths: ['/'],
defaultOrder: folderOrder,
groups: [{ groups: [{
type: CustomSortGroupType.Outsiders, type: CustomSortGroupType.Outsiders,
order: CustomSortOrder.byCreatedTimeReverseAdvanced order: order
}], }],
outsidersGroupIdx: OUTSIDERS_GROUP_IDX outsidersGroupIdx: OUTSIDERS_GROUP_IDX
} }
@ -2039,8 +1993,7 @@ describe('determineFolderDatesIfNeeded', () => {
determineFolderDatesIfNeeded([result], sortSpec) determineFolderDatesIfNeeded([result], sortSpec)
// then // then
expect(result.ctimeOldest).toEqual(TIMESTAMP_OLDEST) expect(result.ctime).toEqual(TIMESTAMP_OLDEST)
expect(result.ctimeNewest).toEqual(TIMESTAMP_NEWEST)
expect(result.mtime).toEqual(TIMESTAMP_NEWEST) expect(result.mtime).toEqual(TIMESTAMP_NEWEST)
}) })
}) })

View File

@ -51,9 +51,8 @@ export interface FolderItemForSorting {
sortString: string // fragment (or full name) to be used for sorting sortString: string // fragment (or full name) to be used for sorting
metadataFieldValue?: string // relevant to metadata-based sorting only metadataFieldValue?: string // relevant to metadata-based sorting only
matchGroup?: string // advanced - used for secondary sorting rule, to recognize 'same regex match' matchGroup?: string // advanced - used for secondary sorting rule, to recognize 'same regex match'
ctimeOldest: number // for a file, both ctime values are the same. For folder, they can be different: ctime: number // for a file ctime is obvious, for a folder = ctime of the oldest child file
ctimeNewest: number // ctimeOldest = ctime of the oldest child file, ctimeNewest = ctime of the newest child file mtime: number // for a file mtime is obvious, for a folder = date of most recently modified child file
mtime: number
isFolder: boolean isFolder: boolean
folder?: TFolder folder?: TFolder
} }
@ -98,10 +97,10 @@ export let Sorters: { [key in CustomSortOrder]: SorterFn } = {
[CustomSortOrder.byModifiedTimeAdvanced]: (a: FolderItemForSorting, b: FolderItemForSorting) => a.mtime - b.mtime, [CustomSortOrder.byModifiedTimeAdvanced]: (a: FolderItemForSorting, b: FolderItemForSorting) => a.mtime - b.mtime,
[CustomSortOrder.byModifiedTimeReverse]: (a: FolderItemForSorting, b: FolderItemForSorting) => (a.isFolder && b.isFolder) ? CollatorCompare(a.sortString, b.sortString) : (b.mtime - a.mtime), [CustomSortOrder.byModifiedTimeReverse]: (a: FolderItemForSorting, b: FolderItemForSorting) => (a.isFolder && b.isFolder) ? CollatorCompare(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) ? CollatorCompare(a.sortString, b.sortString) : (a.ctimeNewest - b.ctimeNewest), [CustomSortOrder.byCreatedTime]: (a: FolderItemForSorting, b: FolderItemForSorting) => (a.isFolder && b.isFolder) ? CollatorCompare(a.sortString, b.sortString) : (a.ctime - b.ctime),
[CustomSortOrder.byCreatedTimeAdvanced]: (a: FolderItemForSorting, b: FolderItemForSorting) => a.ctimeNewest - b.ctimeNewest, [CustomSortOrder.byCreatedTimeAdvanced]: (a: FolderItemForSorting, b: FolderItemForSorting) => a.ctime - b.ctime,
[CustomSortOrder.byCreatedTimeReverse]: (a: FolderItemForSorting, b: FolderItemForSorting) => (a.isFolder && b.isFolder) ? CollatorCompare(a.sortString, b.sortString) : (b.ctimeOldest - a.ctimeOldest), [CustomSortOrder.byCreatedTimeReverse]: (a: FolderItemForSorting, b: FolderItemForSorting) => (a.isFolder && b.isFolder) ? CollatorCompare(a.sortString, b.sortString) : (b.ctime - a.ctime),
[CustomSortOrder.byCreatedTimeReverseAdvanced]: (a: FolderItemForSorting, b: FolderItemForSorting) => b.ctimeOldest - a.ctimeOldest, [CustomSortOrder.byCreatedTimeReverseAdvanced]: (a: FolderItemForSorting, b: FolderItemForSorting) => b.ctime - a.ctime,
[CustomSortOrder.byMetadataFieldAlphabetical]: sorterByMetadataField(StraightOrder), [CustomSortOrder.byMetadataFieldAlphabetical]: sorterByMetadataField(StraightOrder),
[CustomSortOrder.byMetadataFieldTrueAlphabetical]: sorterByMetadataField(StraightOrder, TrueAlphabetical), [CustomSortOrder.byMetadataFieldTrueAlphabetical]: sorterByMetadataField(StraightOrder, TrueAlphabetical),
[CustomSortOrder.byMetadataFieldAlphabeticalReverse]: sorterByMetadataField(ReverseOrder), [CustomSortOrder.byMetadataFieldAlphabeticalReverse]: sorterByMetadataField(ReverseOrder),
@ -363,8 +362,7 @@ export const determineSortingGroup = function (entry: TFile | TFolder, spec: Cus
isFolder: aFolder, isFolder: aFolder,
folder: aFolder ? (entry as TFolder) : undefined, folder: aFolder ? (entry as TFolder) : undefined,
path: entry.path, path: entry.path,
ctimeNewest: aFile ? entryAsTFile.stat.ctime : DEFAULT_FOLDER_CTIME, ctime: aFile ? entryAsTFile.stat.ctime : DEFAULT_FOLDER_CTIME,
ctimeOldest: aFile ? entryAsTFile.stat.ctime : DEFAULT_FOLDER_CTIME,
mtime: aFile ? entryAsTFile.stat.mtime : DEFAULT_FOLDER_MTIME mtime: aFile ? entryAsTFile.stat.mtime : DEFAULT_FOLDER_MTIME
} }
} }
@ -384,41 +382,42 @@ export const sortOrderNeedsFolderDates = (order: CustomSortOrder | undefined, se
// Syntax sugar for readability // Syntax sugar for readability
export type ModifiedTime = number export type ModifiedTime = number
export type CreatedTimeNewest = number export type CreatedTime = number
export type CreatedTimeOldest = number
export const determineDatesForFolder = (folder: TFolder, now: number): [ModifiedTime, CreatedTimeNewest, CreatedTimeOldest] => { export const determineDatesForFolder = (folder: TFolder, now: number): [ModifiedTime, CreatedTime] => {
let mtimeOfFolder: ModifiedTime = DEFAULT_FOLDER_MTIME let mtimeOfFolder: ModifiedTime = DEFAULT_FOLDER_MTIME
let ctimeNewestOfFolder: CreatedTimeNewest = DEFAULT_FOLDER_CTIME let ctimeOfFolder: CreatedTime = DEFAULT_FOLDER_CTIME
let ctimeOldestOfFolder: CreatedTimeOldest = now
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 > ctimeNewestOfFolder) { if (file.stat.ctime < ctimeOfFolder || ctimeOfFolder === DEFAULT_FOLDER_CTIME) {
ctimeNewestOfFolder = file.stat.ctime ctimeOfFolder = file.stat.ctime
}
if (file.stat.ctime < ctimeOldestOfFolder) {
ctimeOldestOfFolder = file.stat.ctime
} }
} }
}) })
return [mtimeOfFolder, ctimeNewestOfFolder, ctimeOldestOfFolder] 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 Now: number = Date.now()
folderItems.forEach((item) => { folderItems.forEach((item) => {
const groupIdx: number | undefined = item.groupIdx if (item.folder) {
if (groupIdx !== undefined) { const folderDefaultSortRequiresFolderDate: boolean = !!(sortingSpec.defaultOrder && sortOrderNeedsFolderDates(sortingSpec.defaultOrder))
const groupOrder: CustomSortOrder | undefined = sortingSpec.groups[groupIdx].order let groupSortRequiresFolderDate: boolean = false
if (sortOrderNeedsFolderDates(groupOrder)) { if (!folderDefaultSortRequiresFolderDate) {
if (item.folder) { const groupIdx: number | undefined = item.groupIdx
[item.mtime, item.ctimeNewest, item.ctimeOldest] = determineDatesForFolder(item.folder, Now) if (groupIdx !== undefined) {
const groupOrder: CustomSortOrder | undefined = sortingSpec.groups[groupIdx].order
groupSortRequiresFolderDate = sortOrderNeedsFolderDates(groupOrder)
} }
} }
if (folderDefaultSortRequiresFolderDate || groupSortRequiresFolderDate) {
[item.mtime, item.ctime] = determineDatesForFolder(item.folder, Now)
}
} }
}) })
} }