vault backup: 2026-09-15 18:32:01
This commit is contained in:
@@ -0,0 +1,115 @@
|
||||
# Start Here with TaskNotes
|
||||
|
||||
This note is a small tour of TaskNotes inside your own vault. Work through it in place, then keep it as a reference or delete it when you no longer need it.
|
||||
|
||||
TaskNotes works best when three things feel connected:
|
||||
|
||||
1. Capture a task quickly.
|
||||
2. Store the task as a normal Markdown note.
|
||||
3. Review tasks through Bases views.
|
||||
|
||||
## Before you start
|
||||
|
||||
- [x] Enable the Obsidian **Bases** core plugin.
|
||||
- [x] Confirm TaskNotes has created the default `.base` files in `TaskNotes/Views/`.
|
||||
- [x] Open the command palette and run **TaskNotes: Open tasks view**.
|
||||
|
||||
TaskNotes creates missing default `.base` files automatically on startup when **Auto-create default files** is enabled. If the files are missing, use **Settings -> TaskNotes -> General -> Views & base files -> Create files**.
|
||||
|
||||
## 1. Create a task from the command palette
|
||||
|
||||
Run **TaskNotes: Create new task** and create a real task you intend to do soon.
|
||||
|
||||
Try a title like:
|
||||
|
||||
```text
|
||||
Review my TaskNotes setup tomorrow #admin
|
||||
```
|
||||
|
||||
After saving, TaskNotes creates a Markdown note for that task. Open the task note and look at the YAML properties at the top. Those properties are what Bases reads for filtering, sorting, grouping, and calendar placement.
|
||||
|
||||
## 2. Convert inline tasks into TaskNotes
|
||||
|
||||
The checkboxes below are ordinary Markdown tasks. Convert each one into a TaskNote from the line's inline action or the command palette.
|
||||
|
||||
- [x] Create a TaskNotes inbox task due tomorrow #admin ✅ 2026-09-08
|
||||
- [x] Schedule a 20 minute planning task for next Monday #planning ✅ 2026-09-08
|
||||
- [x] Make a task linked to an active project note ✅ 2026-09-08
|
||||
|
||||
After conversion, notice a few things:
|
||||
|
||||
- The source line can stay in this note as context.
|
||||
- The actual task now lives as its own Markdown note, so it can appear in TaskNotes views.
|
||||
- The converted line links to the TaskNote. Right-click that TaskNote link to open the task menu, then try changing a property such as status, priority, due date, scheduled date, or project.
|
||||
|
||||
## 3. Review your tasks
|
||||
|
||||
The embedded views below use the default TaskNotes Bases files.
|
||||
|
||||
### Task list
|
||||
|
||||
![[TaskNotes/Views/tasks-default.base]]
|
||||
|
||||
Use this when you want a straightforward list of everything open.
|
||||
|
||||
### Agenda
|
||||
|
||||
![[TaskNotes/Views/agenda-default.base]]
|
||||
|
||||
Use this when you care about due dates, scheduled dates, and what needs attention soon.
|
||||
|
||||
### Mini calendar
|
||||
|
||||
![[TaskNotes/Views/mini-calendar-default.base]]
|
||||
|
||||
Use this when you want a compact calendar alongside your notes.
|
||||
|
||||
### Calendar
|
||||
|
||||
![[TaskNotes/Views/calendar-default.base]]
|
||||
|
||||
Use this when you want a larger calendar for scheduled work, due dates, timeblocks, and calendar events.
|
||||
|
||||
### Kanban
|
||||
|
||||
![[TaskNotes/Views/kanban-default.base]]
|
||||
|
||||
Use this when you want to move work through statuses like open, in progress, and done.
|
||||
|
||||
## 4. Adjust only what gets in your way
|
||||
|
||||
The defaults are enough to start. Visit settings later when you know what you want to change:
|
||||
|
||||
- If task files are going to the wrong place, check **Settings -> TaskNotes -> General**.
|
||||
- If converted inline tasks should be created somewhere else, check **Settings -> TaskNotes -> Inline Task Settings**.
|
||||
- If the task modal shows too much or too little, check **Settings -> TaskNotes -> Modal Fields**.
|
||||
- If your vault uses different property names, statuses, priorities, or custom fields, check **Settings -> TaskNotes -> Task Properties**.
|
||||
|
||||
## 5. Make it yours
|
||||
|
||||
Try adding one custom property to a task, such as `energy`, `client`, or `area`. Because tasks are Markdown notes, custom properties can be used in Bases without locking you into a separate task database.
|
||||
|
||||
## 6. Contextual views
|
||||
|
||||
You can embed Bases views inside daily notes, project notes, meeting notes, or task notes. Advanced Bases filters can use the current note as context, so one view can show tasks related to whatever note it is embedded in.
|
||||
|
||||
TaskNotes uses this pattern for the Relationships widget in task notes. When you are ready to customize views, see the TaskNotes documentation for examples.
|
||||
|
||||
Useful next experiments:
|
||||
|
||||
- Duplicate `TaskNotes/Views/tasks-default.base` and make a view for one project.
|
||||
- Add a group to a Base view, such as status or priority.
|
||||
- Add a filter for tasks due this week.
|
||||
- Link a task to a project note and use backlinks to see where it is mentioned.
|
||||
|
||||
## More help and extensions
|
||||
|
||||
- Documentation: [tasknotes.dev](https://tasknotes.dev/)
|
||||
- Problems or bugs: [open an issue on GitHub](https://github.com/callumalpass/tasknotes/issues)
|
||||
- Companion plugins:
|
||||
- [Canvas Bases](https://tasknotes.dev/companion-plugins/canvas-bases/) adds canvas-style boards and JSON Canvas snapshots for Bases views, with optional TaskNotes badges, actions, and relationship edges.
|
||||
- [TaskNotes Workflows](https://tasknotes.dev/companion-plugins/tasknotes-workflows/) adds Markdown-defined automation for TaskNotes events, schedules, manual commands, and task actions.
|
||||
|
||||
## Finished
|
||||
|
||||
Now you know the core idea: tasks are notes, properties make them queryable, and Bases turns them into views.
|
||||
@@ -0,0 +1,11 @@
|
||||
---
|
||||
status: open
|
||||
priority: low
|
||||
scheduled: 2026-09-14
|
||||
dateCreated: 2026-09-08T08:23:37.856-05:00
|
||||
dateModified: 2026-09-08T09:38:52.704-05:00
|
||||
tags:
|
||||
- task
|
||||
- Microbio
|
||||
---
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
---
|
||||
status: done
|
||||
priority: high
|
||||
due: 2026-09-08T17:00
|
||||
scheduled: 2026-09-08
|
||||
dateCreated: 2026-09-08T08:07:12.777-05:00
|
||||
dateModified: 2026-09-08T21:04:19.813-05:00
|
||||
tags:
|
||||
- task
|
||||
- HLSD
|
||||
timeEntries:
|
||||
- startTime: 2026-09-08T16:49:31.611Z
|
||||
description: Work session
|
||||
endTime: 2026-09-08T16:50:01.026Z
|
||||
completedDate: 2026-09-08
|
||||
---
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
---
|
||||
status: done
|
||||
priority: high
|
||||
scheduled: 2026-09-08T17:00
|
||||
dateCreated: 2026-09-08T09:34:41.590-05:00
|
||||
dateModified: 2026-09-08T11:49:22.476-05:00
|
||||
tags:
|
||||
- task
|
||||
- HLSD
|
||||
timeEntries:
|
||||
- startTime: 2026-09-08T16:36:14.020Z
|
||||
description: Work session
|
||||
endTime: 2026-09-08T16:49:22.476Z
|
||||
completedDate: 2026-09-08
|
||||
---
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
---
|
||||
status: open
|
||||
priority: normal
|
||||
scheduled: 2026-09-10
|
||||
dateCreated: 2026-09-10T10:02:45.374-05:00
|
||||
dateModified: 2026-09-10T11:26:41.342-05:00
|
||||
tags:
|
||||
- task
|
||||
timeEntries:
|
||||
- startTime: 2026-09-10T16:01:41.002Z
|
||||
description: Work session
|
||||
endTime: 2026-09-10T16:26:41.342Z
|
||||
---
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
---
|
||||
status: done
|
||||
priority: normal
|
||||
due: 2026-09-08T17:00
|
||||
scheduled: 2026-09-08
|
||||
dateCreated: 2026-09-08T07:43:50.120-05:00
|
||||
dateModified: 2026-09-10T10:03:21.319-05:00
|
||||
tags:
|
||||
- task
|
||||
- Physio.
|
||||
completedDate: 2026-09-10
|
||||
---
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
---
|
||||
status: open
|
||||
priority: normal
|
||||
scheduled: 2026-09-10
|
||||
dateCreated: 2026-09-10T10:03:08.253-05:00
|
||||
dateModified: 2026-09-10T10:03:08.253-05:00
|
||||
tags:
|
||||
- task
|
||||
---
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
---
|
||||
status: open
|
||||
priority: normal
|
||||
scheduled: 2026-09-15T17:00
|
||||
dateCreated: 2026-09-08T17:23:54.034-05:00
|
||||
dateModified: 2026-09-08T17:23:54.034-05:00
|
||||
tags:
|
||||
- task
|
||||
---
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
filters:
|
||||
and:
|
||||
- file.hasTag("task")
|
||||
formulas:
|
||||
priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
|
||||
daysUntilDue: if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)
|
||||
dueIn: if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))
|
||||
daysUntilScheduled: if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
|
||||
daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
|
||||
daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
|
||||
isOverdue: (due.isEmpty() == false) && date(due) < today() && status != "done"
|
||||
isDueToday: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||
isDueThisWeek: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
|
||||
isScheduledToday: (scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||
isRecurring: recurrence && !recurrence.isEmpty()
|
||||
hasTimeEstimate: timeEstimate && timeEstimate > 0
|
||||
timeRemaining: if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
|
||||
efficiencyRatio: if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)
|
||||
timeTrackedThisWeek: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||
timeTrackedToday: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||
dueMonth: if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")
|
||||
dueWeek: if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")
|
||||
scheduledMonth: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")
|
||||
scheduledWeek: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")
|
||||
dueDateCategory: if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))
|
||||
timeEstimateCategory: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))
|
||||
ageCategory: if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))
|
||||
createdMonth: file.ctime.format("YYYY-MM")
|
||||
modifiedMonth: file.mtime.format("YYYY-MM")
|
||||
priorityCategory: if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))
|
||||
projectCount: if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))
|
||||
contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))
|
||||
trackingStatus: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
|
||||
nextDate: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))
|
||||
daysUntilNext: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))
|
||||
hasDate: (due.isEmpty() == false) || (scheduled.isEmpty() == false)
|
||||
isToday: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))
|
||||
isThisWeek: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))
|
||||
nextDateCategory: if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))
|
||||
nextDateMonth: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))
|
||||
nextDateWeek: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))
|
||||
urgencyScore: if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))
|
||||
timeTrackedFormatted: if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")
|
||||
dueDateDisplay: if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))
|
||||
properties:
|
||||
formula.dueIn:
|
||||
displayName: Due in
|
||||
views:
|
||||
- type: tasknotesCalendar
|
||||
name: Agenda
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
- due
|
||||
- formula.dueIn
|
||||
- scheduled
|
||||
- projects
|
||||
- contexts
|
||||
- file.tags
|
||||
- blockedBy
|
||||
- file.name
|
||||
- recurrence
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
options:
|
||||
showPropertyBasedEvents: false
|
||||
showOverdueOnToday: true
|
||||
createDailyNotesFromDateLinks: true
|
||||
calendarView: listWeek
|
||||
startDateProperty: file.ctime
|
||||
listDayCount: 7
|
||||
titleProperty: file.basename
|
||||
@@ -0,0 +1,71 @@
|
||||
filters:
|
||||
and:
|
||||
- file.hasTag("task")
|
||||
formulas:
|
||||
priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
|
||||
daysUntilDue: if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)
|
||||
dueIn: if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))
|
||||
daysUntilScheduled: if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
|
||||
daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
|
||||
daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
|
||||
isOverdue: (due.isEmpty() == false) && date(due) < today() && status != "done"
|
||||
isDueToday: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||
isDueThisWeek: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
|
||||
isScheduledToday: (scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||
isRecurring: recurrence && !recurrence.isEmpty()
|
||||
hasTimeEstimate: timeEstimate && timeEstimate > 0
|
||||
timeRemaining: if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
|
||||
efficiencyRatio: if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)
|
||||
timeTrackedThisWeek: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||
timeTrackedToday: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||
dueMonth: if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")
|
||||
dueWeek: if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")
|
||||
scheduledMonth: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")
|
||||
scheduledWeek: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")
|
||||
dueDateCategory: if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))
|
||||
timeEstimateCategory: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))
|
||||
ageCategory: if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))
|
||||
createdMonth: file.ctime.format("YYYY-MM")
|
||||
modifiedMonth: file.mtime.format("YYYY-MM")
|
||||
priorityCategory: if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))
|
||||
projectCount: if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))
|
||||
contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))
|
||||
trackingStatus: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
|
||||
nextDate: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))
|
||||
daysUntilNext: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))
|
||||
hasDate: (due.isEmpty() == false) || (scheduled.isEmpty() == false)
|
||||
isToday: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))
|
||||
isThisWeek: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))
|
||||
nextDateCategory: if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))
|
||||
nextDateMonth: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))
|
||||
nextDateWeek: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))
|
||||
urgencyScore: if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))
|
||||
timeTrackedFormatted: if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")
|
||||
dueDateDisplay: if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))
|
||||
views:
|
||||
- type: tasknotesCalendar
|
||||
name: Calendar
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
- due
|
||||
- scheduled
|
||||
- projects
|
||||
- contexts
|
||||
- file.tags
|
||||
- blockedBy
|
||||
- file.name
|
||||
- recurrence
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
options:
|
||||
showScheduled: true
|
||||
showDue: true
|
||||
showRecurring: true
|
||||
showTimeEntries: true
|
||||
showTimeblocks: true
|
||||
showPropertyBasedEvents: true
|
||||
createDailyNotesFromDateLinks: true
|
||||
calendarView: timeGridWeek
|
||||
customDayCount: 3
|
||||
firstDay: 1
|
||||
@@ -0,0 +1,69 @@
|
||||
filters:
|
||||
and:
|
||||
- file.hasTag("task")
|
||||
formulas:
|
||||
priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
|
||||
daysUntilDue: if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)
|
||||
dueIn: if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))
|
||||
daysUntilScheduled: if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
|
||||
daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
|
||||
daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
|
||||
isOverdue: (due.isEmpty() == false) && date(due) < today() && status != "done"
|
||||
isDueToday: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||
isDueThisWeek: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
|
||||
isScheduledToday: (scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||
isRecurring: recurrence && !recurrence.isEmpty()
|
||||
hasTimeEstimate: timeEstimate && timeEstimate > 0
|
||||
timeRemaining: if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
|
||||
efficiencyRatio: if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)
|
||||
timeTrackedThisWeek: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||
timeTrackedToday: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||
dueMonth: if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")
|
||||
dueWeek: if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")
|
||||
scheduledMonth: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")
|
||||
scheduledWeek: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")
|
||||
dueDateCategory: if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))
|
||||
timeEstimateCategory: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))
|
||||
ageCategory: if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))
|
||||
createdMonth: file.ctime.format("YYYY-MM")
|
||||
modifiedMonth: file.mtime.format("YYYY-MM")
|
||||
priorityCategory: if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))
|
||||
projectCount: if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))
|
||||
contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))
|
||||
trackingStatus: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
|
||||
nextDate: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))
|
||||
daysUntilNext: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))
|
||||
hasDate: (due.isEmpty() == false) || (scheduled.isEmpty() == false)
|
||||
isToday: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))
|
||||
isThisWeek: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))
|
||||
nextDateCategory: if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))
|
||||
nextDateMonth: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))
|
||||
nextDateWeek: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))
|
||||
urgencyScore: if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))
|
||||
timeTrackedFormatted: if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")
|
||||
dueDateDisplay: if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))
|
||||
views:
|
||||
- type: tasknotesKanban
|
||||
name: Kanban Board
|
||||
groupBy:
|
||||
property: status
|
||||
direction: ASC
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
- due
|
||||
- scheduled
|
||||
- projects
|
||||
- contexts
|
||||
- file.tags
|
||||
- blockedBy
|
||||
- file.name
|
||||
- recurrence
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
sort:
|
||||
- property: tasknotes_manual_order
|
||||
direction: DESC
|
||||
config:
|
||||
columnWidth: 280
|
||||
hideEmptyColumns: false
|
||||
@@ -0,0 +1,74 @@
|
||||
filters:
|
||||
and:
|
||||
- file.hasTag("task")
|
||||
formulas:
|
||||
priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
|
||||
daysUntilDue: if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)
|
||||
dueIn: if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))
|
||||
daysUntilScheduled: if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
|
||||
daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
|
||||
daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
|
||||
isOverdue: (due.isEmpty() == false) && date(due) < today() && status != "done"
|
||||
isDueToday: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||
isDueThisWeek: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
|
||||
isScheduledToday: (scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||
isRecurring: recurrence && !recurrence.isEmpty()
|
||||
hasTimeEstimate: timeEstimate && timeEstimate > 0
|
||||
timeRemaining: if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
|
||||
efficiencyRatio: if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)
|
||||
timeTrackedThisWeek: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||
timeTrackedToday: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||
dueMonth: if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")
|
||||
dueWeek: if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")
|
||||
scheduledMonth: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")
|
||||
scheduledWeek: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")
|
||||
dueDateCategory: if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))
|
||||
timeEstimateCategory: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))
|
||||
ageCategory: if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))
|
||||
createdMonth: file.ctime.format("YYYY-MM")
|
||||
modifiedMonth: file.mtime.format("YYYY-MM")
|
||||
priorityCategory: if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))
|
||||
projectCount: if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))
|
||||
contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))
|
||||
trackingStatus: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
|
||||
nextDate: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))
|
||||
daysUntilNext: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))
|
||||
hasDate: (due.isEmpty() == false) || (scheduled.isEmpty() == false)
|
||||
isToday: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))
|
||||
isThisWeek: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))
|
||||
nextDateCategory: if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))
|
||||
nextDateMonth: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))
|
||||
nextDateWeek: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))
|
||||
urgencyScore: if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))
|
||||
timeTrackedFormatted: if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")
|
||||
dueDateDisplay: if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))
|
||||
views:
|
||||
- type: tasknotesMiniCalendar
|
||||
name: Due
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
- due
|
||||
- scheduled
|
||||
- projects
|
||||
- contexts
|
||||
- file.tags
|
||||
- blockedBy
|
||||
- file.name
|
||||
- recurrence
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
sort:
|
||||
- property: due
|
||||
direction: ASC
|
||||
dateProperty: due
|
||||
- type: tasknotesMiniCalendar
|
||||
name: Scheduled
|
||||
order: []
|
||||
dateProperty: scheduled
|
||||
- type: tasknotesMiniCalendar
|
||||
name: Created
|
||||
dateProperty: file.ctime
|
||||
- type: tasknotesMiniCalendar
|
||||
name: Modified
|
||||
dateProperty: file.mtime
|
||||
@@ -0,0 +1,78 @@
|
||||
filters:
|
||||
and:
|
||||
- file.hasProperty("pomodoros")
|
||||
- list(note["pomodoros"]).filter(value.startTime).isEmpty() == false
|
||||
formulas:
|
||||
pomodoroDate: if(note["pomodoros"], list(note["pomodoros"]).filter(value.startTime).map(date(value.startTime).format("YYYY-MM-DD")).unique().join(", "), file.basename)
|
||||
pomodoroMonth: if(note["pomodoros"], list(note["pomodoros"]).filter(value.startTime).map(date(value.startTime).format("YYYY-MM")).unique().join(", "), "")
|
||||
completedPomos: if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "work" && value.completed == true).length, 0)
|
||||
attemptedPomos: if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "work").length, 0)
|
||||
interruptedPomos: if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "work" && value.completed == false).length, 0)
|
||||
focusMinutes: if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "work" && value.completed == true).map(if(value.plannedDuration && value.plannedDuration > 0, value.plannedDuration, if(value.startTime && value.endTime, ((number(date(value.endTime)) - number(date(value.startTime))) / 60000).round(), 0))).reduce(acc + value, 0).round(), 0)
|
||||
focusTime: if(formula.focusMinutes >= 60, (formula.focusMinutes / 60).floor() + "h " + (formula.focusMinutes % 60).round() + "m", formula.focusMinutes + "m")
|
||||
completionRate: if(formula.attemptedPomos > 0, (formula.completedPomos / formula.attemptedPomos * 100).round() + "%", "0%")
|
||||
shortBreaks: if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "short-break").length, 0)
|
||||
longBreaks: if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "long-break").length, 0)
|
||||
properties:
|
||||
formula.pomodoroDate:
|
||||
displayName: Date
|
||||
formula.pomodoroMonth:
|
||||
displayName: Month
|
||||
formula.completedPomos:
|
||||
displayName: Completed
|
||||
formula.attemptedPomos:
|
||||
displayName: Attempted
|
||||
formula.interruptedPomos:
|
||||
displayName: Interrupted
|
||||
formula.focusMinutes:
|
||||
displayName: Focus minutes
|
||||
formula.focusTime:
|
||||
displayName: Focus time
|
||||
formula.completionRate:
|
||||
displayName: Completion
|
||||
formula.shortBreaks:
|
||||
displayName: Short breaks
|
||||
formula.longBreaks:
|
||||
displayName: Long breaks
|
||||
views:
|
||||
- type: table
|
||||
name: Daily
|
||||
order:
|
||||
- formula.pomodoroDate
|
||||
- formula.completedPomos
|
||||
- formula.focusTime
|
||||
- formula.attemptedPomos
|
||||
- formula.completionRate
|
||||
- formula.interruptedPomos
|
||||
- formula.shortBreaks
|
||||
- formula.longBreaks
|
||||
- file.name
|
||||
sort:
|
||||
- property: formula.pomodoroDate
|
||||
direction: DESC
|
||||
- type: table
|
||||
name: Monthly
|
||||
groupBy:
|
||||
property: formula.pomodoroMonth
|
||||
direction: DESC
|
||||
order:
|
||||
- formula.pomodoroDate
|
||||
- formula.completedPomos
|
||||
- formula.focusMinutes
|
||||
- formula.focusTime
|
||||
- formula.attemptedPomos
|
||||
- formula.completionRate
|
||||
- formula.interruptedPomos
|
||||
- formula.shortBreaks
|
||||
- formula.longBreaks
|
||||
- file.name
|
||||
sort:
|
||||
- property: formula.pomodoroDate
|
||||
direction: DESC
|
||||
summaries:
|
||||
formula.completedPomos: Sum
|
||||
formula.focusMinutes: Sum
|
||||
formula.attemptedPomos: Sum
|
||||
formula.interruptedPomos: Sum
|
||||
formula.shortBreaks: Sum
|
||||
formula.longBreaks: Sum
|
||||
@@ -0,0 +1,155 @@
|
||||
formulas:
|
||||
priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
|
||||
daysUntilDue: if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)
|
||||
dueIn: if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))
|
||||
daysUntilScheduled: if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
|
||||
daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
|
||||
daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
|
||||
isOverdue: (due.isEmpty() == false) && date(due) < today() && status != "done"
|
||||
isDueToday: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||
isDueThisWeek: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
|
||||
isScheduledToday: (scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||
isRecurring: recurrence && !recurrence.isEmpty()
|
||||
hasTimeEstimate: timeEstimate && timeEstimate > 0
|
||||
timeRemaining: if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
|
||||
efficiencyRatio: if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)
|
||||
timeTrackedThisWeek: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||
timeTrackedToday: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||
dueMonth: if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")
|
||||
dueWeek: if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")
|
||||
scheduledMonth: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")
|
||||
scheduledWeek: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")
|
||||
dueDateCategory: if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))
|
||||
timeEstimateCategory: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))
|
||||
ageCategory: if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))
|
||||
createdMonth: file.ctime.format("YYYY-MM")
|
||||
modifiedMonth: file.mtime.format("YYYY-MM")
|
||||
priorityCategory: if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))
|
||||
projectCount: if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))
|
||||
contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))
|
||||
trackingStatus: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
|
||||
nextDate: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))
|
||||
daysUntilNext: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))
|
||||
hasDate: (due.isEmpty() == false) || (scheduled.isEmpty() == false)
|
||||
isToday: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))
|
||||
isThisWeek: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))
|
||||
nextDateCategory: if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))
|
||||
nextDateMonth: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))
|
||||
nextDateWeek: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))
|
||||
urgencyScore: if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))
|
||||
timeTrackedFormatted: if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")
|
||||
dueDateDisplay: if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))
|
||||
views:
|
||||
- type: tasknotesKanban
|
||||
name: Subtasks
|
||||
filters:
|
||||
and:
|
||||
- file.hasTag("task")
|
||||
- file.hasLink(this.file) && list(note.projects).map(file(value.replace(/^\[[^\]]+\]\((.*)\)$/, "$1").replace(/%20/g, " ")).asLink()).contains(this.file.asLink())
|
||||
groupBy:
|
||||
property: status
|
||||
direction: ASC
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
- due
|
||||
- scheduled
|
||||
- projects
|
||||
- contexts
|
||||
- file.tags
|
||||
- blockedBy
|
||||
- file.name
|
||||
- recurrence
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
sort:
|
||||
- property: tasknotes_manual_order
|
||||
direction: DESC
|
||||
- type: tasknotesTaskList
|
||||
name: Occurrences
|
||||
filters:
|
||||
and:
|
||||
- file.hasTag("task")
|
||||
- file.hasLink(this.file) && note.recurrence_parent && file(note.recurrence_parent.replace(/^\[[^\]]+\]\((.*)\)$/, "$1").replace(/%20/g, " ")).asLink() == this.file.asLink()
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
- due
|
||||
- scheduled
|
||||
- occurrence_date
|
||||
- projects
|
||||
- contexts
|
||||
- file.tags
|
||||
- blockedBy
|
||||
- file.name
|
||||
- recurrence
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
sort:
|
||||
- property: occurrence_date
|
||||
direction: ASC
|
||||
- type: tasknotesTaskList
|
||||
name: Projects
|
||||
filters:
|
||||
and:
|
||||
- list(this.projects).map(file(value.replace(/^\[[^\]]+\]\((.*)\)$/, "$1").replace(/%20/g, " ")).asLink()).contains(file.asLink())
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
- due
|
||||
- scheduled
|
||||
- projects
|
||||
- contexts
|
||||
- file.tags
|
||||
- blockedBy
|
||||
- file.name
|
||||
- recurrence
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
- type: tasknotesTaskList
|
||||
name: Blocked By
|
||||
filters:
|
||||
and:
|
||||
- file.hasTag("task")
|
||||
- list(this.note.blockedBy).map(file(if(value.isType("object"), value.uid, value)).asLink()).contains(file.asLink())
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
- due
|
||||
- scheduled
|
||||
- projects
|
||||
- contexts
|
||||
- file.tags
|
||||
- blockedBy
|
||||
- file.name
|
||||
- recurrence
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
sort:
|
||||
- property: tasknotes_manual_order
|
||||
direction: DESC
|
||||
- type: tasknotesKanban
|
||||
name: Blocking
|
||||
filters:
|
||||
and:
|
||||
- file.hasTag("task")
|
||||
- list(note.blockedBy).map(file(if(value.isType("object"), value.uid, value)).asLink()).contains(this.file.asLink())
|
||||
groupBy:
|
||||
property: status
|
||||
direction: ASC
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
- due
|
||||
- scheduled
|
||||
- projects
|
||||
- contexts
|
||||
- file.tags
|
||||
- blockedBy
|
||||
- file.name
|
||||
- recurrence
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
sort:
|
||||
- property: tasknotes_manual_order
|
||||
direction: DESC
|
||||
@@ -0,0 +1,247 @@
|
||||
filters:
|
||||
and:
|
||||
- file.hasTag("task")
|
||||
formulas:
|
||||
priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
|
||||
daysUntilDue: if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)
|
||||
dueIn: if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))
|
||||
daysUntilScheduled: if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
|
||||
daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
|
||||
daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
|
||||
isOverdue: (due.isEmpty() == false) && date(due) < today() && status != "done"
|
||||
isDueToday: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||
isDueThisWeek: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
|
||||
isScheduledToday: (scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||
isRecurring: recurrence && !recurrence.isEmpty()
|
||||
hasTimeEstimate: timeEstimate && timeEstimate > 0
|
||||
timeRemaining: if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
|
||||
efficiencyRatio: if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)
|
||||
timeTrackedThisWeek: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||
timeTrackedToday: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||
dueMonth: if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")
|
||||
dueWeek: if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")
|
||||
scheduledMonth: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")
|
||||
scheduledWeek: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")
|
||||
dueDateCategory: if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))
|
||||
timeEstimateCategory: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))
|
||||
ageCategory: if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))
|
||||
createdMonth: file.ctime.format("YYYY-MM")
|
||||
modifiedMonth: file.mtime.format("YYYY-MM")
|
||||
priorityCategory: if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))
|
||||
projectCount: if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))
|
||||
contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))
|
||||
trackingStatus: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
|
||||
nextDate: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))
|
||||
daysUntilNext: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))
|
||||
hasDate: (due.isEmpty() == false) || (scheduled.isEmpty() == false)
|
||||
isToday: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))
|
||||
isThisWeek: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))
|
||||
nextDateCategory: if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))
|
||||
nextDateMonth: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))
|
||||
nextDateWeek: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))
|
||||
urgencyScore: if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))
|
||||
timeTrackedFormatted: if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")
|
||||
dueDateDisplay: if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))
|
||||
views:
|
||||
- type: tasknotesTaskList
|
||||
name: Manual Order
|
||||
groupBy:
|
||||
property: status
|
||||
direction: ASC
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
- due
|
||||
- scheduled
|
||||
- projects
|
||||
- contexts
|
||||
- file.tags
|
||||
- blockedBy
|
||||
- file.name
|
||||
- recurrence
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
sort:
|
||||
- property: tasknotes_manual_order
|
||||
direction: DESC
|
||||
- type: tasknotesTaskList
|
||||
name: All Tasks
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
- due
|
||||
- scheduled
|
||||
- projects
|
||||
- contexts
|
||||
- file.tags
|
||||
- blockedBy
|
||||
- file.name
|
||||
- recurrence
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
sort:
|
||||
- property: due
|
||||
direction: ASC
|
||||
- type: tasknotesTaskList
|
||||
name: Not Blocked
|
||||
filters:
|
||||
and:
|
||||
- or:
|
||||
- and:
|
||||
- recurrence.isEmpty()
|
||||
- status != "done"
|
||||
- and:
|
||||
- recurrence.isEmpty() == false
|
||||
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
||||
- or:
|
||||
- blockedBy.isEmpty()
|
||||
- list(blockedBy).filter(file(if(value.isType("object"), value.uid, value)).properties.status != "done").isEmpty()
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
- due
|
||||
- scheduled
|
||||
- projects
|
||||
- contexts
|
||||
- file.tags
|
||||
- blockedBy
|
||||
- file.name
|
||||
- recurrence
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
sort:
|
||||
- property: formula.urgencyScore
|
||||
direction: DESC
|
||||
- type: tasknotesTaskList
|
||||
name: Today
|
||||
filters:
|
||||
and:
|
||||
- or:
|
||||
- and:
|
||||
- recurrence.isEmpty()
|
||||
- status != "done"
|
||||
- and:
|
||||
- recurrence.isEmpty() == false
|
||||
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
||||
- or:
|
||||
- and:
|
||||
- due.isEmpty() == false
|
||||
- date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||
- and:
|
||||
- scheduled.isEmpty() == false
|
||||
- date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
- due
|
||||
- scheduled
|
||||
- projects
|
||||
- contexts
|
||||
- file.tags
|
||||
- blockedBy
|
||||
- file.name
|
||||
- recurrence
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
sort:
|
||||
- property: formula.urgencyScore
|
||||
direction: DESC
|
||||
- type: tasknotesTaskList
|
||||
name: Overdue
|
||||
filters:
|
||||
and:
|
||||
- or:
|
||||
- and:
|
||||
- recurrence.isEmpty()
|
||||
- status != "done"
|
||||
- and:
|
||||
- recurrence.isEmpty() == false
|
||||
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
||||
- or:
|
||||
- and:
|
||||
- due.isEmpty() == false
|
||||
- date(due) < today()
|
||||
- and:
|
||||
- scheduled.isEmpty() == false
|
||||
- date(scheduled) < today()
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
- due
|
||||
- scheduled
|
||||
- projects
|
||||
- contexts
|
||||
- file.tags
|
||||
- blockedBy
|
||||
- file.name
|
||||
- recurrence
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
sort:
|
||||
- property: formula.urgencyScore
|
||||
direction: DESC
|
||||
- type: tasknotesTaskList
|
||||
name: This Week
|
||||
filters:
|
||||
and:
|
||||
- or:
|
||||
- and:
|
||||
- recurrence.isEmpty()
|
||||
- status != "done"
|
||||
- and:
|
||||
- recurrence.isEmpty() == false
|
||||
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
||||
- or:
|
||||
- and:
|
||||
- due.isEmpty() == false
|
||||
- date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD")
|
||||
- date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
|
||||
- and:
|
||||
- scheduled.isEmpty() == false
|
||||
- date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD")
|
||||
- date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
- due
|
||||
- scheduled
|
||||
- projects
|
||||
- contexts
|
||||
- file.tags
|
||||
- blockedBy
|
||||
- file.name
|
||||
- recurrence
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
sort:
|
||||
- property: formula.urgencyScore
|
||||
direction: DESC
|
||||
- type: tasknotesTaskList
|
||||
name: Unscheduled
|
||||
filters:
|
||||
and:
|
||||
- or:
|
||||
- and:
|
||||
- recurrence.isEmpty()
|
||||
- status != "done"
|
||||
- and:
|
||||
- recurrence.isEmpty() == false
|
||||
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
||||
- date(due).isEmpty()
|
||||
- date(scheduled).isEmpty()
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
- due
|
||||
- scheduled
|
||||
- projects
|
||||
- contexts
|
||||
- file.tags
|
||||
- blockedBy
|
||||
- file.name
|
||||
- recurrence
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
sort:
|
||||
- property: status
|
||||
direction: ASC
|
||||
Reference in New Issue
Block a user