#72 - Advanced sorting by creation date doesn't work correctly

- bug fixed, the behavior of `< advanced created` sorting method corrected
- new unit tests to cover the scenario
This commit is contained in:
SebastianMC 2023-04-03 19:05:13 +02:00
parent 6298c08581
commit aa31bee80c
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
- `> 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
- `< 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
- `> 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
#### At group level only (aka secondary sorting rule)

View File

@ -79,15 +79,14 @@ describe('determineSortingGroup', () => {
}
// when
const result = determineSortingGroup(file, sortSpec)
const result: FolderItemForSorting = determineSortingGroup(file, sortSpec)
// then
expect(result).toEqual({
groupIdx: 0,
isFolder: false,
sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md'
});
@ -105,15 +104,14 @@ describe('determineSortingGroup', () => {
}
// when
const result = determineSortingGroup(file, sortSpec)
const result: FolderItemForSorting = determineSortingGroup(file, sortSpec)
// then
expect(result).toEqual({
groupIdx: 1, // This indicates the last+1 idx (no match)
isFolder: false,
sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 555,
ctimeOldest: MOCK_TIMESTAMP + 555,
ctime: MOCK_TIMESTAMP + 555,
mtime: MOCK_TIMESTAMP + 666,
path: 'Some parent folder/References.md'
});
@ -140,8 +138,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // This indicates the last+1 idx (no match)
isFolder: false,
sortString: "Part123:-icle.md",
ctimeNewest: MOCK_TIMESTAMP + 555,
ctimeOldest: MOCK_TIMESTAMP + 555,
ctime: MOCK_TIMESTAMP + 555,
mtime: MOCK_TIMESTAMP + 666,
path: 'Some parent folder/Part123:-icle.md'
});
@ -169,8 +166,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // This indicates the last+1 idx
isFolder: false,
sortString: "Part123:-icle.md",
ctimeNewest: MOCK_TIMESTAMP + 555,
ctimeOldest: MOCK_TIMESTAMP + 555,
ctime: MOCK_TIMESTAMP + 555,
mtime: MOCK_TIMESTAMP + 666,
path: 'Some parent folder/Part123:-icle.md'
});
@ -198,8 +194,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0, // Matched!
isFolder: false,
sortString: "Part123:-icle.md",
ctimeNewest: MOCK_TIMESTAMP + 555,
ctimeOldest: MOCK_TIMESTAMP + 555,
ctime: MOCK_TIMESTAMP + 555,
mtime: MOCK_TIMESTAMP + 666,
path: 'Some parent folder/Part123:-icle.md'
});
@ -228,8 +223,7 @@ describe('determineSortingGroup', () => {
isFolder: false,
sortString: "00000123////Part123:-icle.md",
matchGroup: '00000123//',
ctimeNewest: MOCK_TIMESTAMP + 555,
ctimeOldest: MOCK_TIMESTAMP + 555,
ctime: MOCK_TIMESTAMP + 555,
mtime: MOCK_TIMESTAMP + 666,
path: 'Some parent folder/Part123:-icle.md'
});
@ -257,8 +251,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // This indicates the last+1 idx
isFolder: false,
sortString: "Part:123-icle.md",
ctimeNewest: MOCK_TIMESTAMP + 555,
ctimeOldest: MOCK_TIMESTAMP + 555,
ctime: MOCK_TIMESTAMP + 555,
mtime: MOCK_TIMESTAMP + 666,
path: 'Some parent folder/Part:123-icle.md'
});
@ -287,8 +280,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0, // Matched!
isFolder: false,
sortString: "Part:123-icle.md",
ctimeNewest: MOCK_TIMESTAMP + 555,
ctimeOldest: MOCK_TIMESTAMP + 555,
ctime: MOCK_TIMESTAMP + 555,
mtime: MOCK_TIMESTAMP + 666,
path: 'Some parent folder/Part:123-icle.md'
});
@ -319,8 +311,7 @@ describe('determineSortingGroup', () => {
isFolder: false,
sortString: "00000001|00000023////Part:1 1-23.456-icle.md",
matchGroup: '00000001|00000023//',
ctimeNewest: MOCK_TIMESTAMP + 555,
ctimeOldest: MOCK_TIMESTAMP + 555,
ctime: MOCK_TIMESTAMP + 555,
mtime: MOCK_TIMESTAMP + 666,
path: 'Some parent folder/Part:1 1-23.456-icle.md'
});
@ -349,8 +340,7 @@ describe('determineSortingGroup', () => {
isFolder: false,
sortString: "00000123////Part:123-icle.md",
matchGroup: '00000123//',
ctimeNewest: MOCK_TIMESTAMP + 555,
ctimeOldest: MOCK_TIMESTAMP + 555,
ctime: MOCK_TIMESTAMP + 555,
mtime: MOCK_TIMESTAMP + 666,
path: 'Some parent folder/Part:123-icle.md'
});
@ -376,8 +366,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0,
isFolder: false,
sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md'
});
@ -403,8 +392,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0,
isFolder: false,
sortString: "Ref2erences.md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/Ref2erences.md'
});
@ -432,8 +420,7 @@ describe('determineSortingGroup', () => {
isFolder: false,
sortString: '00000001|00000030|00000006|00001900////Reference i.xxx.vi.mcm.md',
matchGroup: "00000001|00000030|00000006|00001900//",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/Reference i.xxx.vi.mcm.md'
});
@ -456,8 +443,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // This indicates the last+1 idx
isFolder: false,
sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md'
});
@ -483,8 +469,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0,
isFolder: false,
sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md'
});
@ -510,8 +495,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0,
isFolder: false,
sortString: "References 12.md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References 12.md'
});
@ -539,8 +523,7 @@ describe('determineSortingGroup', () => {
isFolder: false,
sortString: '00000001|00000030|00000006|00001900////Reference i.xxx.vi.mcm.md',
matchGroup: "00000001|00000030|00000006|00001900//",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/Reference i.xxx.vi.mcm.md'
});
@ -563,8 +546,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // This indicates the last+1 idx
isFolder: false,
sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md'
});
@ -589,8 +571,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // This indicates the last+1 idx
isFolder: false,
sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md'
});
@ -616,8 +597,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0,
isFolder: false,
sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md'
});
@ -643,8 +623,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0,
isFolder: false,
sortString: "References 12.md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References 12.md'
});
@ -672,8 +651,7 @@ describe('determineSortingGroup', () => {
isFolder: false,
sortString: '00000001|00000030|00000006|00001900////Reference i.xxx.vi.mcm.md',
matchGroup: "00000001|00000030|00000006|00001900//",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/Reference i.xxx.vi.mcm.md'
});
@ -696,8 +674,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // This indicates the last+1 idx
isFolder: false,
sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md'
});
@ -722,8 +699,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // This indicates the last+1 idx
isFolder: false,
sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md'
});
@ -762,8 +738,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // The lastIdx+1, group not determined
isFolder: false,
sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md'
});
@ -800,8 +775,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // lastIdx + 1, group not determined
isFolder: false,
sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md'
});
@ -838,8 +812,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0,
isFolder: false,
sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md'
} as FolderItemForSorting);
@ -876,8 +849,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0,
isFolder: true,
sortString: "References",
ctimeNewest: DEFAULT_FOLDER_CTIME,
ctimeOldest: DEFAULT_FOLDER_CTIME,
ctime: DEFAULT_FOLDER_CTIME,
mtime: DEFAULT_FOLDER_MTIME,
path: 'References',
folder: folder
@ -910,8 +882,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // The lastIdx+1, group not determined
isFolder: false,
sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md'
});
@ -942,8 +913,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0,
isFolder: false,
sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md'
});
@ -974,8 +944,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // The lastIdx+1, group not determined
isFolder: true,
sortString: "TestEmptyFolder",
ctimeNewest: 0,
ctimeOldest: 0,
ctime: 0,
mtime: 0,
path: 'TestEmptyFolder',
folder: {
@ -1014,8 +983,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // The lastIdx+1, group not determined
isFolder: true,
sortString: "TestEmptyFolder",
ctimeNewest: 0,
ctimeOldest: 0,
ctime: 0,
mtime: 0,
path: 'TestEmptyFolder',
folder: {
@ -1054,8 +1022,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0,
isFolder: true,
sortString: "TestEmptyFolder",
ctimeNewest: 0,
ctimeOldest: 0,
ctime: 0,
mtime: 0,
path: 'TestEmptyFolder',
folder: {
@ -1097,8 +1064,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // The lastIdx+1, group not determined
isFolder: false,
sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md'
});
@ -1133,8 +1099,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // The lastIdx+1, group not determined
isFolder: false,
sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md'
});
@ -1168,8 +1133,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0,
isFolder: false,
sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md'
});
@ -1204,8 +1168,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0,
isFolder: false,
sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md'
});
@ -1236,8 +1199,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // The lastIdx+1, group not determined
isFolder: true,
sortString: "TestEmptyFolder",
ctimeNewest: 0,
ctimeOldest: 0,
ctime: 0,
mtime: 0,
path: 'TestEmptyFolder',
folder: {
@ -1279,8 +1241,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0,
isFolder: true,
sortString: "TestEmptyFolder",
ctimeNewest: 0,
ctimeOldest: 0,
ctime: 0,
mtime: 0,
path: 'TestEmptyFolder',
folder: {
@ -1325,8 +1286,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0,
isFolder: true,
sortString: "TestEmptyFolder",
ctimeNewest: 0,
ctimeOldest: 0,
ctime: 0,
mtime: 0,
path: 'TestEmptyFolder',
folder: {
@ -1369,8 +1329,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0,
isFolder: true,
sortString: "TestEmptyFolder",
ctimeNewest: 0,
ctimeOldest: 0,
ctime: 0,
mtime: 0,
path: 'TestEmptyFolder',
folder: {
@ -1416,8 +1375,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0,
isFolder: true,
sortString: "TestEmptyFolder",
ctimeNewest: 0,
ctimeOldest: 0,
ctime: 0,
mtime: 0,
path: 'TestEmptyFolder',
folder: {
@ -1460,8 +1418,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // lastIdx+1 - no match
isFolder: true,
sortString: "TestEmptyFolder",
ctimeNewest: 0,
ctimeOldest: 0,
ctime: 0,
mtime: 0,
path: 'TestEmptyFolder',
folder: {
@ -1507,8 +1464,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // lastIdx+1 - no match
isFolder: true,
sortString: "TestEmptyFolder",
ctimeNewest: 0,
ctimeOldest: 0,
ctime: 0,
mtime: 0,
path: 'TestEmptyFolder',
folder: {
@ -1557,8 +1513,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0,
isFolder: false,
sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md',
metadataFieldValue: 'direct metadata on file'
@ -1597,8 +1552,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0,
isFolder: false,
sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md',
metadataFieldValue: 'direct metadata on file'
@ -1637,8 +1591,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0,
isFolder: false,
sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md',
metadataFieldValue: 'direct metadata on file'
@ -1677,8 +1630,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0,
isFolder: false,
sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md',
metadataFieldValue: 'direct metadata on file'
@ -1717,8 +1669,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0,
isFolder: true,
sortString: "References",
ctimeNewest: DEFAULT_FOLDER_CTIME,
ctimeOldest: DEFAULT_FOLDER_CTIME,
ctime: DEFAULT_FOLDER_CTIME,
mtime: DEFAULT_FOLDER_MTIME,
path: 'References',
metadataFieldValue: 'metadata on folder note',
@ -1759,8 +1710,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0,
isFolder: false,
sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md',
metadataFieldValue: 'direct metadata on file, not obvious'
@ -1798,8 +1748,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0,
isFolder: false,
sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md',
metadataFieldValue: 'direct metadata on file, tricky'
@ -1837,8 +1786,7 @@ describe('determineSortingGroup', () => {
groupIdx: 0,
isFolder: false,
sortString: "References.md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/References.md',
metadataFieldValue: 'direct metadata on file, under default name'
@ -1885,8 +1833,7 @@ describe('determineSortingGroup', () => {
groupIdx: 3,
isFolder: false,
sortString: "Abcdef!.md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/Abcdef!.md'
});
@ -1935,8 +1882,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // Imposed by combined groups
isFolder: false,
sortString: "Hello :-) ha.md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/Hello :-) ha.md'
});
@ -1944,8 +1890,7 @@ describe('determineSortingGroup', () => {
groupIdx: 1, // Imposed by combined groups
isFolder: false,
sortString: "Hello World :-).md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/Hello World :-).md'
});
@ -1990,8 +1935,7 @@ describe('determineSortingGroup', () => {
groupIdx: 2, // Imposed by combined groups
isFolder: false,
sortString: "Hello :-).md",
ctimeNewest: MOCK_TIMESTAMP + 222,
ctimeOldest: MOCK_TIMESTAMP + 222,
ctime: MOCK_TIMESTAMP + 222,
mtime: MOCK_TIMESTAMP + 333,
path: 'Some parent folder/Hello :-).md'
});
@ -2017,19 +1961,29 @@ describe('determineFolderDatesIfNeeded', () => {
determineFolderDatesIfNeeded([result], sortSpec)
// then
expect(result.ctimeOldest).toEqual(DEFAULT_FOLDER_CTIME)
expect(result.ctimeNewest).toEqual(DEFAULT_FOLDER_CTIME)
expect(result.ctime).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
const folder: TFolder = mockTFolderWithChildren('Test folder 1')
const OUTSIDERS_GROUP_IDX = 0
const sortSpec: CustomSortSpec = {
targetFoldersPaths: ['/'],
defaultOrder: folderOrder,
groups: [{
type: CustomSortGroupType.Outsiders,
order: CustomSortOrder.byCreatedTimeReverseAdvanced
order: order
}],
outsidersGroupIdx: OUTSIDERS_GROUP_IDX
}
@ -2039,8 +1993,7 @@ describe('determineFolderDatesIfNeeded', () => {
determineFolderDatesIfNeeded([result], sortSpec)
// then
expect(result.ctimeOldest).toEqual(TIMESTAMP_OLDEST)
expect(result.ctimeNewest).toEqual(TIMESTAMP_NEWEST)
expect(result.ctime).toEqual(TIMESTAMP_OLDEST)
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
metadataFieldValue?: string // relevant to metadata-based sorting only
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:
ctimeNewest: number // ctimeOldest = ctime of the oldest child file, ctimeNewest = ctime of the newest child file
mtime: number
ctime: number // for a file ctime is obvious, for a folder = ctime of the oldest child file
mtime: number // for a file mtime is obvious, for a folder = date of most recently modified child file
isFolder: boolean
folder?: TFolder
}
@ -98,10 +97,10 @@ export let Sorters: { [key in CustomSortOrder]: SorterFn } = {
[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.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.byCreatedTimeAdvanced]: (a: FolderItemForSorting, b: FolderItemForSorting) => a.ctimeNewest - b.ctimeNewest,
[CustomSortOrder.byCreatedTimeReverse]: (a: FolderItemForSorting, b: FolderItemForSorting) => (a.isFolder && b.isFolder) ? CollatorCompare(a.sortString, b.sortString) : (b.ctimeOldest - a.ctimeOldest),
[CustomSortOrder.byCreatedTimeReverseAdvanced]: (a: FolderItemForSorting, b: FolderItemForSorting) => b.ctimeOldest - a.ctimeOldest,
[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.ctime - b.ctime,
[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.ctime - a.ctime,
[CustomSortOrder.byMetadataFieldAlphabetical]: sorterByMetadataField(StraightOrder),
[CustomSortOrder.byMetadataFieldTrueAlphabetical]: sorterByMetadataField(StraightOrder, TrueAlphabetical),
[CustomSortOrder.byMetadataFieldAlphabeticalReverse]: sorterByMetadataField(ReverseOrder),
@ -363,8 +362,7 @@ export const determineSortingGroup = function (entry: TFile | TFolder, spec: Cus
isFolder: aFolder,
folder: aFolder ? (entry as TFolder) : undefined,
path: entry.path,
ctimeNewest: aFile ? entryAsTFile.stat.ctime : DEFAULT_FOLDER_CTIME,
ctimeOldest: aFile ? entryAsTFile.stat.ctime : DEFAULT_FOLDER_CTIME,
ctime: aFile ? entryAsTFile.stat.ctime : DEFAULT_FOLDER_CTIME,
mtime: aFile ? entryAsTFile.stat.mtime : DEFAULT_FOLDER_MTIME
}
}
@ -384,41 +382,42 @@ export const sortOrderNeedsFolderDates = (order: CustomSortOrder | undefined, se
// Syntax sugar for readability
export type ModifiedTime = number
export type CreatedTimeNewest = number
export type CreatedTimeOldest = number
export type CreatedTime = 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 ctimeNewestOfFolder: CreatedTimeNewest = DEFAULT_FOLDER_CTIME
let ctimeOldestOfFolder: CreatedTimeOldest = now
let ctimeOfFolder: CreatedTime = DEFAULT_FOLDER_CTIME
folder.children.forEach((item) => {
if (!isFolder(item)) {
const file: TFile = item as TFile
if (file.stat.mtime > mtimeOfFolder) {
mtimeOfFolder = file.stat.mtime
}
if (file.stat.ctime > ctimeNewestOfFolder) {
ctimeNewestOfFolder = file.stat.ctime
}
if (file.stat.ctime < ctimeOldestOfFolder) {
ctimeOldestOfFolder = file.stat.ctime
if (file.stat.ctime < ctimeOfFolder || ctimeOfFolder === DEFAULT_FOLDER_CTIME) {
ctimeOfFolder = file.stat.ctime
}
}
})
return [mtimeOfFolder, ctimeNewestOfFolder, ctimeOldestOfFolder]
return [mtimeOfFolder, ctimeOfFolder]
}
export const determineFolderDatesIfNeeded = (folderItems: Array<FolderItemForSorting>, sortingSpec: CustomSortSpec) => {
const Now: number = Date.now()
folderItems.forEach((item) => {
const groupIdx: number | undefined = item.groupIdx
if (groupIdx !== undefined) {
const groupOrder: CustomSortOrder | undefined = sortingSpec.groups[groupIdx].order
if (sortOrderNeedsFolderDates(groupOrder)) {
if (item.folder) {
[item.mtime, item.ctimeNewest, item.ctimeOldest] = determineDatesForFolder(item.folder, Now)
if (item.folder) {
const folderDefaultSortRequiresFolderDate: boolean = !!(sortingSpec.defaultOrder && sortOrderNeedsFolderDates(sortingSpec.defaultOrder))
let groupSortRequiresFolderDate: boolean = false
if (!folderDefaultSortRequiresFolderDate) {
const groupIdx: number | undefined = item.groupIdx
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)
}
}
})
}