Skip to content

Commit 1a9294f

Browse files
authored
refactor: Add ExcludeSubItemsField, for handling 'exclude sub-items' filter (#817)
* test: Add Query-based tests for 'exclude sub-items' * feat: Add ExcludeSubItemsField class - for 'exclude sub-items' * refactor: Re-implement 'exclude sub-items' in Query using ExcludeSubItemsField * test: Clean up tests for ExcludeSubItemsField * test: Make ExcludeSubItemsField.test.ts more readable and thorough * chore: Add jsdoc for ExcludeSubItemsField
1 parent de882c1 commit 1a9294f

File tree

3 files changed

+57
-4
lines changed

3 files changed

+57
-4
lines changed

src/Query.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import type { Field } from './Query/Filter/Field';
1010
import { DescriptionField } from './Query/Filter/DescriptionField';
1111
import { DoneDateField } from './Query/Filter/DoneDateField';
1212
import { DueDateField } from './Query/Filter/DueDateField';
13+
import { ExcludeSubItemsField } from './Query/Filter/ExcludeSubItemsField';
1314
import { HeadingField } from './Query/Filter/HeadingField';
1415
import { PathField } from './Query/Filter/PathField';
1516
import { PriorityField } from './Query/Filter/PriorityField';
@@ -73,7 +74,6 @@ export class Query implements IQuery {
7374
private readonly shortModeRegexp = /^short/;
7475

7576
private readonly limitRegexp = /^limit (to )?(\d+)( tasks?)?/;
76-
private readonly excludeSubItemsString = 'exclude sub-items';
7777

7878
private readonly commentRegexp = /^#.*/;
7979

@@ -86,9 +86,6 @@ export class Query implements IQuery {
8686
switch (true) {
8787
case line === '':
8888
break;
89-
case line === this.excludeSubItemsString:
90-
this._filters.push((task) => task.indentation === '');
91-
break;
9289
case this.shortModeRegexp.test(line):
9390
this._layoutOptions.shortMode = true;
9491
break;
@@ -116,6 +113,8 @@ export class Query implements IQuery {
116113
break;
117114
case this.parseFilter(line, new HeadingField()):
118115
break;
116+
case this.parseFilter(line, new ExcludeSubItemsField()):
117+
break;
119118
case this.limitRegexp.test(line):
120119
this.parseLimit({ line });
121120
break;
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { Field } from './Field';
2+
import type { FilterOrErrorMessage } from './Filter';
3+
import { FilterInstructions } from './FilterInstructions';
4+
5+
/**
6+
* Implements 'exclude sub-items' filter
7+
*/
8+
export class ExcludeSubItemsField extends Field {
9+
private readonly _filters = new FilterInstructions();
10+
11+
constructor() {
12+
super();
13+
14+
this._filters.add(
15+
'exclude sub-items',
16+
(task) => task.indentation === '',
17+
);
18+
}
19+
20+
public canCreateFilterForLine(line: string): boolean {
21+
return this._filters.canCreateFilterForLine(line);
22+
}
23+
24+
public createFilterOrErrorMessage(line: string): FilterOrErrorMessage {
25+
return this._filters.createFilterOrErrorMessage(line);
26+
}
27+
28+
protected fieldName(): string {
29+
return 'exclude';
30+
}
31+
32+
protected filterRegexp(): RegExp | null {
33+
return null;
34+
}
35+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// 'exclude sub-items'
2+
3+
import { testTaskFilter } from '../../TestingTools/FilterTestHelpers';
4+
import { fromLine } from '../../TestHelpers';
5+
import { ExcludeSubItemsField } from '../../../src/Query/Filter/ExcludeSubItemsField';
6+
7+
describe('sub-items', () => {
8+
it('exclude sub-items', () => {
9+
// Arrange
10+
const filter = new ExcludeSubItemsField().createFilterOrErrorMessage(
11+
'exclude sub-items',
12+
);
13+
14+
// Assert
15+
testTaskFilter(filter, fromLine({ line: '- [ ] Task' }), true);
16+
testTaskFilter(filter, fromLine({ line: ' - [ ] Subtask1' }), false);
17+
testTaskFilter(filter, fromLine({ line: ' - [ ] Subtask2' }), false);
18+
});
19+
});

0 commit comments

Comments
 (0)