Skip to content

Commit 684c7bc

Browse files
committed
feat: Support 'sort by id' and 'sort by id reverse'
1 parent 8dd4e24 commit 684c7bc

File tree

3 files changed

+51
-0
lines changed

3 files changed

+51
-0
lines changed

src/Query/Filter/IdField.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ export class IdField extends TextField {
1212
this.filterInstructions.add('no id', (task: Task) => task.id.length === 0);
1313
}
1414

15+
// -----------------------------------------------------------------------------------------------------------------
16+
// Filtering
17+
// -----------------------------------------------------------------------------------------------------------------
18+
1519
public canCreateFilterForLine(line: string): boolean {
1620
if (this.filterInstructions.canCreateFilterForLine(line)) {
1721
return true;
@@ -36,4 +40,12 @@ export class IdField extends TextField {
3640
public value(task: Task): string {
3741
return task.id;
3842
}
43+
44+
// -----------------------------------------------------------------------------------------------------------------
45+
// Sorting
46+
// -----------------------------------------------------------------------------------------------------------------
47+
48+
public supportsSorting(): boolean {
49+
return true;
50+
}
3951
}

tests/Query/Filter/IdField.test.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import { testFilter } from '../../TestingTools/FilterTestHelpers';
22
import { TaskBuilder } from '../../TestingTools/TaskBuilder';
33
import { IdField } from '../../../src/Query/Filter/IdField';
4+
import {
5+
expectTaskComparesAfter,
6+
expectTaskComparesBefore,
7+
expectTaskComparesEqual,
8+
} from '../../CustomMatchers/CustomMatchersForSorting';
49

510
describe('id', () => {
611
const idField = new IdField();
@@ -69,3 +74,35 @@ describe('id', () => {
6974
testFilter(filter, new TaskBuilder().id('bc'), true);
7075
});
7176
});
77+
78+
describe('sorting by id', () => {
79+
it('supports Field sorting methods correctly', () => {
80+
const field = new IdField();
81+
expect(field.supportsSorting()).toEqual(true);
82+
});
83+
84+
// Helper function to create a task with a given id
85+
function with_id(id: string) {
86+
return new TaskBuilder().id(id).build();
87+
}
88+
89+
it('sort by id', () => {
90+
// Arrange
91+
const sorter = new IdField().createNormalSorter();
92+
93+
// Assert
94+
expectTaskComparesEqual(sorter, with_id('mvplec'), with_id('mvplec'));
95+
expectTaskComparesBefore(sorter, with_id('g7317o'), with_id('rot7gb'));
96+
97+
// Beginning with numbers
98+
expectTaskComparesBefore(sorter, with_id('1'), with_id('9'));
99+
expectTaskComparesBefore(sorter, with_id('9'), with_id('11'));
100+
});
101+
102+
it('sort by id reverse', () => {
103+
// Single example just to prove reverse works.
104+
// (There's no need to repeat all the examples above)
105+
const sorter = new IdField().createReverseSorter();
106+
expectTaskComparesAfter(sorter, with_id('bbb'), with_id('ddd'));
107+
});
108+
});

tests/Query/Query.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,8 @@ describe('Query parsing', () => {
256256
'sort by happens reverse',
257257
'sort by heading',
258258
'sort by heading reverse',
259+
'sort by id',
260+
'sort by id reverse',
259261
'sort by path',
260262
'sort by path reverse',
261263
'sort by priority',

0 commit comments

Comments
 (0)