Skip to content

Commit 8dd4e24

Browse files
committed
feat: Add text searching of id field
1 parent bcd215d commit 8dd4e24

File tree

3 files changed

+47
-6
lines changed

3 files changed

+47
-6
lines changed

src/Query/Filter/IdField.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import type { Task } from '../../Task/Task';
2-
import { Field } from './Field';
3-
import { FilterOrErrorMessage } from './FilterOrErrorMessage';
2+
import type { FilterOrErrorMessage } from './FilterOrErrorMessage';
43
import { FilterInstructions } from './FilterInstructions';
4+
import { TextField } from './TextField';
55

6-
export class IdField extends Field {
6+
export class IdField extends TextField {
77
private readonly filterInstructions: FilterInstructions = new FilterInstructions();
88

99
constructor() {
@@ -26,14 +26,14 @@ export class IdField extends Field {
2626
return filterResult;
2727
}
2828

29-
return FilterOrErrorMessage.fromError(line, 'Unknown instruction');
29+
return super.createFilterOrErrorMessage(line);
3030
}
3131

3232
public fieldName(): string {
3333
return 'id';
3434
}
3535

36-
protected filterRegExp(): RegExp | null {
37-
return null;
36+
public value(task: Task): string {
37+
return task.id;
3838
}
3939
}

tests/Query/Filter/IdField.test.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,42 @@ describe('id', () => {
3030
testFilter(filter, new TaskBuilder().id(''), true);
3131
testFilter(filter, new TaskBuilder().id('abcdef'), false);
3232
});
33+
34+
it('by id (includes)', () => {
35+
// Arrange
36+
const filter = new IdField().createFilterOrErrorMessage('id includes DEF');
37+
38+
// Assert
39+
testFilter(filter, new TaskBuilder().id(''), false);
40+
testFilter(filter, new TaskBuilder().id('abcdef'), true);
41+
});
42+
43+
it('by id (does not include)', () => {
44+
// Arrange
45+
const filter = new IdField().createFilterOrErrorMessage('id does not include def');
46+
47+
// Assert
48+
testFilter(filter, new TaskBuilder().id(''), true);
49+
testFilter(filter, new TaskBuilder().id('abcdef'), false);
50+
});
51+
52+
it('by id (regex matches)', () => {
53+
// Arrange
54+
const filter = new IdField().createFilterOrErrorMessage(String.raw`id regex matches /\d/`);
55+
56+
// Assert
57+
testFilter(filter, new TaskBuilder().id(''), false);
58+
testFilter(filter, new TaskBuilder().id('a1'), true);
59+
testFilter(filter, new TaskBuilder().id('bc'), false);
60+
});
61+
62+
it('by id (regex does not match)', () => {
63+
// Arrange
64+
const filter = new IdField().createFilterOrErrorMessage(String.raw`id regex does not match /\d/`);
65+
66+
// Assert
67+
testFilter(filter, new TaskBuilder().id(''), true);
68+
testFilter(filter, new TaskBuilder().id('a1'), false);
69+
testFilter(filter, new TaskBuilder().id('bc'), true);
70+
});
3371
});

tests/Query/Query.test.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,9 @@ describe('Query parsing', () => {
9595
'heading does not include wibble',
9696
'heading includes AND', // Verify Query doesn't confuse this with a boolean query
9797
'heading includes wibble',
98+
'id does not include abc123',
99+
'id includes abc123',
100+
'id includes AND', // Verify Query doesn't confuse this with a boolean query
98101
'is blocking',
99102
'is not blocked',
100103
'is not recurring',

0 commit comments

Comments
 (0)