|
2 | 2 | // Shared between search.js and browse.js |
3 | 3 | // Requires: status_maps.js to be loaded first |
4 | 4 |
|
| 5 | +/** |
| 6 | + * Check if a date falls within N days from now. |
| 7 | + * @param {Date|null} date - The date to check |
| 8 | + * @param {number} days - Number of days in the future |
| 9 | + * @param {boolean} requirePastOrPresent - If true, date must also be >= now (for due dates) |
| 10 | + * @returns {boolean} True if date is within range |
| 11 | + */ |
| 12 | +function isWithinDays(date, days, requirePastOrPresent) { |
| 13 | + if (!date) { |
| 14 | + return false; |
| 15 | + } |
| 16 | + var now = new Date(); |
| 17 | + var futureDate = new Date(); |
| 18 | + futureDate.setDate(futureDate.getDate() + days); |
| 19 | + |
| 20 | + if (date > futureDate) { |
| 21 | + return false; |
| 22 | + } |
| 23 | + if (requirePastOrPresent && date < now) { |
| 24 | + return false; |
| 25 | + } |
| 26 | + return true; |
| 27 | +} |
| 28 | + |
5 | 29 | /** |
6 | 30 | * Create a filter function for tasks. |
7 | 31 | * @param {Object} filters - Filter criteria |
@@ -67,39 +91,21 @@ function createTaskFilter(filters, options) { |
67 | 91 |
|
68 | 92 | // Filter by due_within N days |
69 | 93 | if (filters.due_within !== undefined) { |
70 | | - if (!task.dueDate) { |
71 | | - return false; |
72 | | - } |
73 | | - var now = new Date(); |
74 | | - var futureDate = new Date(); |
75 | | - futureDate.setDate(futureDate.getDate() + filters.due_within); |
76 | | - if (task.dueDate > futureDate || task.dueDate < now) { |
| 94 | + if (!isWithinDays(task.dueDate, filters.due_within, true)) { |
77 | 95 | return false; |
78 | 96 | } |
79 | 97 | } |
80 | 98 |
|
81 | 99 | // Filter by deferred_until N days |
82 | 100 | if (filters.deferred_until !== undefined) { |
83 | | - if (!task.deferDate) { |
84 | | - return false; |
85 | | - } |
86 | | - var now = new Date(); |
87 | | - var futureDate = new Date(); |
88 | | - futureDate.setDate(futureDate.getDate() + filters.deferred_until); |
89 | | - if (task.deferDate > futureDate) { |
| 101 | + if (!isWithinDays(task.deferDate, filters.deferred_until, false)) { |
90 | 102 | return false; |
91 | 103 | } |
92 | 104 | } |
93 | 105 |
|
94 | 106 | // Filter by planned_within N days (OmniFocus 4.7+) |
95 | 107 | if (filters.planned_within !== undefined) { |
96 | | - if (!task.plannedDate) { |
97 | | - return false; |
98 | | - } |
99 | | - var now = new Date(); |
100 | | - var futureDate = new Date(); |
101 | | - futureDate.setDate(futureDate.getDate() + filters.planned_within); |
102 | | - if (task.plannedDate > futureDate || task.plannedDate < now) { |
| 108 | + if (!isWithinDays(task.plannedDate, filters.planned_within, true)) { |
103 | 109 | return false; |
104 | 110 | } |
105 | 111 | } |
@@ -185,26 +191,14 @@ function createProjectFilter(filters, options) { |
185 | 191 |
|
186 | 192 | // Filter by due_within N days |
187 | 193 | if (filters.due_within !== undefined) { |
188 | | - if (!project.dueDate) { |
189 | | - return false; |
190 | | - } |
191 | | - var now = new Date(); |
192 | | - var futureDate = new Date(); |
193 | | - futureDate.setDate(futureDate.getDate() + filters.due_within); |
194 | | - if (project.dueDate > futureDate || project.dueDate < now) { |
| 194 | + if (!isWithinDays(project.dueDate, filters.due_within, true)) { |
195 | 195 | return false; |
196 | 196 | } |
197 | 197 | } |
198 | 198 |
|
199 | 199 | // Filter by deferred_until N days |
200 | 200 | if (filters.deferred_until !== undefined) { |
201 | | - if (!project.deferDate) { |
202 | | - return false; |
203 | | - } |
204 | | - var now = new Date(); |
205 | | - var futureDate = new Date(); |
206 | | - futureDate.setDate(futureDate.getDate() + filters.deferred_until); |
207 | | - if (project.deferDate > futureDate) { |
| 201 | + if (!isWithinDays(project.deferDate, filters.deferred_until, false)) { |
208 | 202 | return false; |
209 | 203 | } |
210 | 204 | } |
|
0 commit comments