Skip to content

Commit f4200d7

Browse files
authored
Merge pull request #3165 from ilandikov/refactor-priority-tools
refactor: add `PriorityTools.priorityValue()`
2 parents 8ed8910 + 7e03ad8 commit f4200d7

File tree

4 files changed

+55
-42
lines changed

4 files changed

+55
-42
lines changed

src/TaskSerializer/DataviewTaskSerializer.ts

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { TaskLayoutComponent } from '../Layout/TaskLayoutOptions';
2-
import { Priority } from '../Task/Priority';
2+
import { PriorityTools } from '../lib/PriorityTools';
3+
import type { Priority } from '../Task/Priority';
34
import type { Task } from '../Task/Task';
45
import { DefaultTaskSerializer, taskIdRegex, taskIdSequenceRegex } from './DefaultTaskSerializer';
56

@@ -103,20 +104,7 @@ export class DataviewTaskSerializer extends DefaultTaskSerializer {
103104
}
104105

105106
protected parsePriority(p: string): Priority {
106-
switch (p) {
107-
case 'highest':
108-
return Priority.Highest;
109-
case 'high':
110-
return Priority.High;
111-
case 'medium':
112-
return Priority.Medium;
113-
case 'low':
114-
return Priority.Low;
115-
case 'lowest':
116-
return Priority.Lowest;
117-
default:
118-
return Priority.None;
119-
}
107+
return PriorityTools.priorityValue(p);
120108
}
121109

122110
public componentToString(task: Task, shortMode: boolean, component: TaskLayoutComponent) {

src/lib/PriorityTools.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,30 @@ export class PriorityTools {
3939
public static priorityNameUsingNormal(priority: Priority) {
4040
return PriorityTools.priorityNameUsingNone(priority).replace('None', 'Normal');
4141
}
42+
43+
/**
44+
* Get the {@link Priority} value from a string. The algorithm is case-insensitive.
45+
*
46+
* In case the value was not recognised, {@link Priority.None} will be returned.
47+
*
48+
* @param priority - a string containing a name of one the supported {@link Priority} values.
49+
* Capitalisation is ignored.
50+
* @see priorityNameUsingNormal
51+
*/
52+
public static priorityValue(priority: string): Priority {
53+
switch (priority.toLowerCase()) {
54+
case 'lowest':
55+
return Priority.Lowest;
56+
case 'low':
57+
return Priority.Low;
58+
case 'medium':
59+
return Priority.Medium;
60+
case 'high':
61+
return Priority.High;
62+
case 'highest':
63+
return Priority.Highest;
64+
default:
65+
return Priority.None;
66+
}
67+
}
4268
}

src/ui/EditableTask.ts

Lines changed: 5 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { GlobalFilter } from '../Config/GlobalFilter';
22
import { parseTypedDateForSaving } from '../DateTime/DateTools';
3+
import { PriorityTools } from '../lib/PriorityTools';
34
import { replaceTaskWithTasks } from '../Obsidian/File';
45
import type { Status } from '../Statuses/Status';
56
import type { OnCompletion } from '../Task/OnCompletion';
@@ -10,8 +11,6 @@ import { Task } from '../Task/Task';
1011
import { addDependencyToParent, ensureTaskHasId, generateUniqueId, removeDependency } from '../Task/TaskDependency';
1112
import { StatusType } from '../Statuses/StatusConfiguration';
1213

13-
type EditableTaskPriority = 'none' | 'lowest' | 'low' | 'medium' | 'high' | 'highest';
14-
1514
/**
1615
* {@link Task} objects are immutable. This class allows to create a mutable object from a {@link Task}, apply the edits,
1716
* and get the resulting task(s).
@@ -24,7 +23,7 @@ export class EditableTask {
2423
// NEW_TASK_FIELD_EDIT_REQUIRED
2524
description: string;
2625
status: Status;
27-
priority: EditableTaskPriority;
26+
priority: string;
2827
recurrenceRule: string;
2928
onCompletion: OnCompletion;
3029
createdDate: string;
@@ -44,7 +43,7 @@ export class EditableTask {
4443
// NEW_TASK_FIELD_EDIT_REQUIRED
4544
description: string;
4645
status: Status;
47-
priority: EditableTaskPriority;
46+
priority: string;
4847
onCompletion: OnCompletion;
4948
recurrenceRule: string;
5049
createdDate: string;
@@ -90,7 +89,7 @@ export class EditableTask {
9089
const addGlobalFilterOnSave =
9190
description != task.description || !GlobalFilter.getInstance().includedIn(task.description);
9291

93-
let priority: EditableTaskPriority = 'none';
92+
let priority = 'none';
9493
if (task.priority === Priority.Lowest) {
9594
priority = 'lowest';
9695
} else if (task.priority === Priority.Low) {
@@ -168,27 +167,6 @@ export class EditableTask {
168167
});
169168
}
170169

171-
let parsedPriority: Priority;
172-
switch (this.priority) {
173-
case 'lowest':
174-
parsedPriority = Priority.Lowest;
175-
break;
176-
case 'low':
177-
parsedPriority = Priority.Low;
178-
break;
179-
case 'medium':
180-
parsedPriority = Priority.Medium;
181-
break;
182-
case 'high':
183-
parsedPriority = Priority.High;
184-
break;
185-
case 'highest':
186-
parsedPriority = Priority.Highest;
187-
break;
188-
default:
189-
parsedPriority = Priority.None;
190-
}
191-
192170
const parsedOnCompletion: OnCompletion = this.onCompletion;
193171

194172
const blockedByWithIds = [];
@@ -218,7 +196,7 @@ export class EditableTask {
218196
...task,
219197
description,
220198
status: task.status,
221-
priority: parsedPriority,
199+
priority: PriorityTools.priorityValue(this.priority),
222200
onCompletion: parsedOnCompletion,
223201
recurrence,
224202
startDate,

tests/lib/PriorityTools.test.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,25 @@ describe('priority naming', () => {
1212
expect(PriorityTools.priorityNameUsingNone(none)).toEqual('None');
1313
expect(PriorityTools.priorityNameUsingNormal(none)).toEqual('Normal');
1414
});
15+
16+
it.each([
17+
// Normal cases
18+
['highest', Priority.Highest],
19+
['high', Priority.High],
20+
['medium', Priority.Medium],
21+
['none', Priority.None],
22+
['normal', Priority.None],
23+
['low', Priority.Low],
24+
['lowest', Priority.Lowest],
25+
26+
// Erroneous cases
27+
['', Priority.None],
28+
['invalid_priority_string!', Priority.None],
29+
30+
// Priority search is case-insensitive
31+
['Highest', Priority.Highest],
32+
['highEst', Priority.Highest],
33+
])('should get priority value for "%s"', (str, value) => {
34+
expect(PriorityTools.priorityValue(str)).toEqual(value);
35+
});
1536
});

0 commit comments

Comments
 (0)