Obsidian plugin · 4.17.0 · Generated from source
Generated default Base templates
Exact default Obsidian Base files generated by the current TaskNotes source and default settings.
These are the exact templates TaskNotes 4.17.0 produces with default settings. Your generated files reflect your own field mapping and other settings, so customized output can differ.
Regenerating with Update files overwrites configured default Base files. Copy a customized file to a new path before updating it.
mini-calendar-default.base#
Command/template ID: open-calendar-view
# Mini Calendar
# Generated with your TaskNotes settings
filters:
and:
- file.hasTag("task")
formulas:
priorityWeight: >-
if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,-1))))
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 > 0, (if((formula.daysUntilDue) == 1,
(if((formula.daysUntilDue) >= 1000 || (formula.daysUntilDue) <= -1000, ("" +
(formula.daysUntilDue)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
(formula.daysUntilDue))) + " day"), (if((formula.daysUntilDue) >= 1000 ||
(formula.daysUntilDue) <= -1000, ("" +
(formula.daysUntilDue)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
(formula.daysUntilDue))) + " days"))), (if((formula.daysUntilDue * -1) == 1,
(if((formula.daysUntilDue * -1) >= 1000 || (formula.daysUntilDue * -1) <=
-1000, ("" + (formula.daysUntilDue * -1)).replace(/\B(?=(\d{3})+(?!\d))/g,
","), ("" + (formula.daysUntilDue * -1))) + " day overdue"),
(if((formula.daysUntilDue * -1) >= 1000 || (formula.daysUntilDue * -1) <=
-1000, ("" + (formula.daysUntilDue * -1)).replace(/\B(?=(\d{3})+(?!\d))/g,
","), ("" + (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((if(projects, list(projects).length, 0)) == 0, ("No projects"),
if((if(projects, list(projects).length, 0)) == 1, ("Single project"),
("Multiple projects"))))
contextCount: >-
(if((if(contexts, list(contexts).length, 0)) == 0, ("No contexts"),
if((if(contexts, list(contexts).length, 0)) == 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,
(if(((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
- number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
60).floor()) >= 1000 ||
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
60).floor()) <= -1000, ("" +
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
60).floor())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
60).floor()))) + "h " +
if(((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
- number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
60).round()) >= 1000 ||
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
60).round()) <= -1000, ("" +
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
60).round())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
60).round()))) + "m"),
(if((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
- number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()) >=
1000 ||
(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()) <=
-1000, ("" +
(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value,
0).round())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()))) +
"m")), (if((0) >= 1000 || (0) <= -1000, ("" +
(0)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (0))) + "m"))
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(),
(if((formula.daysUntilDue * -1) == 1, (if((formula.daysUntilDue * -1) >=
1000 || (formula.daysUntilDue * -1) <= -1000, ("" + (formula.daysUntilDue *
-1)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (formula.daysUntilDue *
-1))) + " day ago"), (if((formula.daysUntilDue * -1) >= 1000 ||
(formula.daysUntilDue * -1) <= -1000, ("" + (formula.daysUntilDue *
-1)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (formula.daysUntilDue *
-1))) + " days 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
kanban-default.base#
Command/template ID: open-kanban-view
# Kanban Board
filters:
and:
- file.hasTag("task")
formulas:
priorityWeight: >-
if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,-1))))
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 > 0, (if((formula.daysUntilDue) == 1,
(if((formula.daysUntilDue) >= 1000 || (formula.daysUntilDue) <= -1000, ("" +
(formula.daysUntilDue)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
(formula.daysUntilDue))) + " day"), (if((formula.daysUntilDue) >= 1000 ||
(formula.daysUntilDue) <= -1000, ("" +
(formula.daysUntilDue)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
(formula.daysUntilDue))) + " days"))), (if((formula.daysUntilDue * -1) == 1,
(if((formula.daysUntilDue * -1) >= 1000 || (formula.daysUntilDue * -1) <=
-1000, ("" + (formula.daysUntilDue * -1)).replace(/\B(?=(\d{3})+(?!\d))/g,
","), ("" + (formula.daysUntilDue * -1))) + " day overdue"),
(if((formula.daysUntilDue * -1) >= 1000 || (formula.daysUntilDue * -1) <=
-1000, ("" + (formula.daysUntilDue * -1)).replace(/\B(?=(\d{3})+(?!\d))/g,
","), ("" + (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((if(projects, list(projects).length, 0)) == 0, ("No projects"),
if((if(projects, list(projects).length, 0)) == 1, ("Single project"),
("Multiple projects"))))
contextCount: >-
(if((if(contexts, list(contexts).length, 0)) == 0, ("No contexts"),
if((if(contexts, list(contexts).length, 0)) == 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,
(if(((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
- number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
60).floor()) >= 1000 ||
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
60).floor()) <= -1000, ("" +
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
60).floor())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
60).floor()))) + "h " +
if(((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
- number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
60).round()) >= 1000 ||
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
60).round()) <= -1000, ("" +
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
60).round())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
60).round()))) + "m"),
(if((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
- number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()) >=
1000 ||
(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()) <=
-1000, ("" +
(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value,
0).round())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()))) +
"m")), (if((0) >= 1000 || (0) <= -1000, ("" +
(0)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (0))) + "m"))
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(),
(if((formula.daysUntilDue * -1) == 1, (if((formula.daysUntilDue * -1) >=
1000 || (formula.daysUntilDue * -1) <= -1000, ("" + (formula.daysUntilDue *
-1)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (formula.daysUntilDue *
-1))) + " day ago"), (if((formula.daysUntilDue * -1) >= 1000 ||
(formula.daysUntilDue * -1) <= -1000, ("" + (formula.daysUntilDue *
-1)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (formula.daysUntilDue *
-1))) + " days 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"
order:
- status
- priority
- due
- scheduled
- projects
- contexts
- file.tags
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
sort:
- column: tasknotes_manual_order
direction: DESC
groupBy:
property: status
direction: ASC
columnWidth: 280
hideEmptyColumns: false
tasks-default.base#
Command/template ID: open-tasks-view
# All Tasks
filters:
and:
- file.hasTag("task")
formulas:
priorityWeight: >-
if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,-1))))
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 > 0, (if((formula.daysUntilDue) == 1,
(if((formula.daysUntilDue) >= 1000 || (formula.daysUntilDue) <= -1000, ("" +
(formula.daysUntilDue)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
(formula.daysUntilDue))) + " day"), (if((formula.daysUntilDue) >= 1000 ||
(formula.daysUntilDue) <= -1000, ("" +
(formula.daysUntilDue)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
(formula.daysUntilDue))) + " days"))), (if((formula.daysUntilDue * -1) == 1,
(if((formula.daysUntilDue * -1) >= 1000 || (formula.daysUntilDue * -1) <=
-1000, ("" + (formula.daysUntilDue * -1)).replace(/\B(?=(\d{3})+(?!\d))/g,
","), ("" + (formula.daysUntilDue * -1))) + " day overdue"),
(if((formula.daysUntilDue * -1) >= 1000 || (formula.daysUntilDue * -1) <=
-1000, ("" + (formula.daysUntilDue * -1)).replace(/\B(?=(\d{3})+(?!\d))/g,
","), ("" + (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((if(projects, list(projects).length, 0)) == 0, ("No projects"),
if((if(projects, list(projects).length, 0)) == 1, ("Single project"),
("Multiple projects"))))
contextCount: >-
(if((if(contexts, list(contexts).length, 0)) == 0, ("No contexts"),
if((if(contexts, list(contexts).length, 0)) == 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,
(if(((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
- number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
60).floor()) >= 1000 ||
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
60).floor()) <= -1000, ("" +
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
60).floor())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
60).floor()))) + "h " +
if(((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
- number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
60).round()) >= 1000 ||
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
60).round()) <= -1000, ("" +
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
60).round())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
60).round()))) + "m"),
(if((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
- number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()) >=
1000 ||
(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()) <=
-1000, ("" +
(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value,
0).round())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()))) +
"m")), (if((0) >= 1000 || (0) <= -1000, ("" +
(0)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (0))) + "m"))
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(),
(if((formula.daysUntilDue * -1) == 1, (if((formula.daysUntilDue * -1) >=
1000 || (formula.daysUntilDue * -1) <= -1000, ("" + (formula.daysUntilDue *
-1)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (formula.daysUntilDue *
-1))) + " day ago"), (if((formula.daysUntilDue * -1) >= 1000 ||
(formula.daysUntilDue * -1) <= -1000, ("" + (formula.daysUntilDue *
-1)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (formula.daysUntilDue *
-1))) + " days 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"
order:
- status
- priority
- due
- scheduled
- projects
- contexts
- file.tags
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
sort:
- column: tasknotes_manual_order
direction: DESC
groupBy:
property: status
direction: ASC
- type: tasknotesTaskList
name: "All Tasks"
order:
- status
- priority
- due
- scheduled
- projects
- contexts
- file.tags
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
sort:
- column: due
direction: ASC
- type: tasknotesTaskList
name: "Not Blocked"
filters:
and:
# Incomplete tasks
- or:
# Non-recurring task that's not in any completed status
- and:
- recurrence.isEmpty()
- status != "done"
# Recurring task where today is not in complete_instances
- and:
- recurrence.isEmpty() == false
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
# Not blocked by any incomplete tasks
- or:
# No blocking dependencies at all
- blockedBy.isEmpty()
# All blocking tasks are completed (filter returns only incomplete, then check if empty)
- "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:
- column: formula.urgencyScore
direction: DESC
- type: tasknotesTaskList
name: "Today"
filters:
and:
# Incomplete tasks (handles both recurring and non-recurring)
- or:
# Non-recurring task that's not in any completed status
- and:
- recurrence.isEmpty()
- status != "done"
# Recurring task where today is not in complete_instances
- and:
- recurrence.isEmpty() == false
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
# Due or scheduled today
- 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:
- column: formula.urgencyScore
direction: DESC
- type: tasknotesTaskList
name: "Overdue"
filters:
and:
# Incomplete tasks
- or:
# Non-recurring task that's not in any completed status
- and:
- recurrence.isEmpty()
- status != "done"
# Recurring task where today is not in complete_instances
- and:
- recurrence.isEmpty() == false
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
# Due or scheduled in the past
- 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:
- column: formula.urgencyScore
direction: DESC
- type: tasknotesTaskList
name: "This Week"
filters:
and:
# Incomplete tasks
- or:
# Non-recurring task that's not in any completed status
- and:
- recurrence.isEmpty()
- status != "done"
# Recurring task where today is not in complete_instances
- and:
- recurrence.isEmpty() == false
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
# Due or scheduled this week
- 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:
- column: formula.urgencyScore
direction: DESC
- type: tasknotesTaskList
name: "Unscheduled"
filters:
and:
# Incomplete tasks
- or:
# Non-recurring task that's not in any completed status
- and:
- recurrence.isEmpty()
- status != "done"
# Recurring task where today is not in complete_instances
- and:
- recurrence.isEmpty() == false
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
# No due date and no scheduled date
- date(due).isEmpty()
- date(scheduled).isEmpty()
order:
- status
- priority
- due
- scheduled
- projects
- contexts
- file.tags
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
sort:
- column: status
direction: ASC
calendar-default.base#
Command/template ID: open-advanced-calendar-view
# Calendar
filters:
and:
- file.hasTag("task")
formulas:
priorityWeight: >-
if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,-1))))
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 > 0, (if((formula.daysUntilDue) == 1,
(if((formula.daysUntilDue) >= 1000 || (formula.daysUntilDue) <= -1000, ("" +
(formula.daysUntilDue)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
(formula.daysUntilDue))) + " day"), (if((formula.daysUntilDue) >= 1000 ||
(formula.daysUntilDue) <= -1000, ("" +
(formula.daysUntilDue)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
(formula.daysUntilDue))) + " days"))), (if((formula.daysUntilDue * -1) == 1,
(if((formula.daysUntilDue * -1) >= 1000 || (formula.daysUntilDue * -1) <=
-1000, ("" + (formula.daysUntilDue * -1)).replace(/\B(?=(\d{3})+(?!\d))/g,
","), ("" + (formula.daysUntilDue * -1))) + " day overdue"),
(if((formula.daysUntilDue * -1) >= 1000 || (formula.daysUntilDue * -1) <=
-1000, ("" + (formula.daysUntilDue * -1)).replace(/\B(?=(\d{3})+(?!\d))/g,
","), ("" + (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((if(projects, list(projects).length, 0)) == 0, ("No projects"),
if((if(projects, list(projects).length, 0)) == 1, ("Single project"),
("Multiple projects"))))
contextCount: >-
(if((if(contexts, list(contexts).length, 0)) == 0, ("No contexts"),
if((if(contexts, list(contexts).length, 0)) == 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,
(if(((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
- number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
60).floor()) >= 1000 ||
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
60).floor()) <= -1000, ("" +
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
60).floor())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
60).floor()))) + "h " +
if(((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
- number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
60).round()) >= 1000 ||
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
60).round()) <= -1000, ("" +
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
60).round())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
60).round()))) + "m"),
(if((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
- number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()) >=
1000 ||
(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()) <=
-1000, ("" +
(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value,
0).round())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()))) +
"m")), (if((0) >= 1000 || (0) <= -1000, ("" +
(0)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (0))) + "m"))
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(),
(if((formula.daysUntilDue * -1) == 1, (if((formula.daysUntilDue * -1) >=
1000 || (formula.daysUntilDue * -1) <= -1000, ("" + (formula.daysUntilDue *
-1)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (formula.daysUntilDue *
-1))) + " day ago"), (if((formula.daysUntilDue * -1) >= 1000 ||
(formula.daysUntilDue * -1) <= -1000, ("" + (formula.daysUntilDue *
-1)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (formula.daysUntilDue *
-1))) + " days 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
showScheduled: true
showDue: true
showRecurring: true
showTimeEntries: true
showTimeblocks: true
showPropertyBasedEvents: true
createDailyNotesFromDateLinks: true
calendarView: "timeGridWeek"
customDayCount: 3
firstDay: 1
agenda-default.base#
Command/template ID: open-agenda-view
# Agenda
filters:
and:
- file.hasTag("task")
formulas:
priorityWeight: >-
if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,-1))))
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 > 0, (if((formula.daysUntilDue) == 1,
(if((formula.daysUntilDue) >= 1000 || (formula.daysUntilDue) <= -1000, ("" +
(formula.daysUntilDue)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
(formula.daysUntilDue))) + " day"), (if((formula.daysUntilDue) >= 1000 ||
(formula.daysUntilDue) <= -1000, ("" +
(formula.daysUntilDue)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
(formula.daysUntilDue))) + " days"))), (if((formula.daysUntilDue * -1) == 1,
(if((formula.daysUntilDue * -1) >= 1000 || (formula.daysUntilDue * -1) <=
-1000, ("" + (formula.daysUntilDue * -1)).replace(/\B(?=(\d{3})+(?!\d))/g,
","), ("" + (formula.daysUntilDue * -1))) + " day overdue"),
(if((formula.daysUntilDue * -1) >= 1000 || (formula.daysUntilDue * -1) <=
-1000, ("" + (formula.daysUntilDue * -1)).replace(/\B(?=(\d{3})+(?!\d))/g,
","), ("" + (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((if(projects, list(projects).length, 0)) == 0, ("No projects"),
if((if(projects, list(projects).length, 0)) == 1, ("Single project"),
("Multiple projects"))))
contextCount: >-
(if((if(contexts, list(contexts).length, 0)) == 0, ("No contexts"),
if((if(contexts, list(contexts).length, 0)) == 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,
(if(((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
- number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
60).floor()) >= 1000 ||
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
60).floor()) <= -1000, ("" +
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
60).floor())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
60).floor()))) + "h " +
if(((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
- number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
60).round()) >= 1000 ||
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
60).round()) <= -1000, ("" +
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
60).round())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
60).round()))) + "m"),
(if((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
- number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()) >=
1000 ||
(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()) <=
-1000, ("" +
(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value,
0).round())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()))) +
"m")), (if((0) >= 1000 || (0) <= -1000, ("" +
(0)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (0))) + "m"))
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(),
(if((formula.daysUntilDue * -1) == 1, (if((formula.daysUntilDue * -1) >=
1000 || (formula.daysUntilDue * -1) <= -1000, ("" + (formula.daysUntilDue *
-1)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (formula.daysUntilDue *
-1))) + " day ago"), (if((formula.daysUntilDue * -1) >= 1000 ||
(formula.daysUntilDue * -1) <= -1000, ("" + (formula.daysUntilDue *
-1)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (formula.daysUntilDue *
-1))) + " days 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
showPropertyBasedEvents: false
showOverdueOnToday: true
createDailyNotesFromDateLinks: true
calendarView: "listWeek"
startDateProperty: file.ctime
listDayCount: 7
titleProperty: file.basename
pomodoro-stats.base#
Command/template ID: pomodoro-stats-base
# Pomodoro statistics
# Generated with your TaskNotes settings
# Requires Pomodoro data storage to be set to Daily notes.
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, (if(((formula.focusMinutes / 60).floor()) >= 1000 || ((formula.focusMinutes / 60).floor()) <= -1000, (\"\" + ((formula.focusMinutes / 60).floor())).replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\"), (\"\" + ((formula.focusMinutes / 60).floor()))) + \"h \" + if(((formula.focusMinutes % 60).round()) >= 1000 || ((formula.focusMinutes % 60).round()) <= -1000, (\"\" + ((formula.focusMinutes % 60).round())).replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\"), (\"\" + ((formula.focusMinutes % 60).round()))) + \"m\"), (if((formula.focusMinutes) >= 1000 || (formula.focusMinutes) <= -1000, (\"\" + (formula.focusMinutes)).replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\"), (\"\" + (formula.focusMinutes))) + \"m\"))"
completionRate: "(if((if(formula.attemptedPomos > 0, (formula.completedPomos / formula.attemptedPomos * 100).round(), 0)) >= 1000 || (if(formula.attemptedPomos > 0, (formula.completedPomos / formula.attemptedPomos * 100).round(), 0)) <= -1000, (\"\" + (if(formula.attemptedPomos > 0, (formula.completedPomos / formula.attemptedPomos * 100).round(), 0))).replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\"), (\"\" + (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:
- column: 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
summaries:
formula.completedPomos: Sum
formula.focusMinutes: Sum
formula.attemptedPomos: Sum
formula.interruptedPomos: Sum
formula.shortBreaks: Sum
formula.longBreaks: Sum
sort:
- column: formula.pomodoroDate
direction: DESC
relationships.base#
Command/template ID: relationships
# Relationships
# This view shows all relationships for the current file
# Dynamically shows/hides tabs based on available data
formulas:
priorityWeight: >-
if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,-1))))
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 > 0, (if((formula.daysUntilDue) == 1,
(if((formula.daysUntilDue) >= 1000 || (formula.daysUntilDue) <= -1000, ("" +
(formula.daysUntilDue)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
(formula.daysUntilDue))) + " day"), (if((formula.daysUntilDue) >= 1000 ||
(formula.daysUntilDue) <= -1000, ("" +
(formula.daysUntilDue)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
(formula.daysUntilDue))) + " days"))), (if((formula.daysUntilDue * -1) == 1,
(if((formula.daysUntilDue * -1) >= 1000 || (formula.daysUntilDue * -1) <=
-1000, ("" + (formula.daysUntilDue * -1)).replace(/\B(?=(\d{3})+(?!\d))/g,
","), ("" + (formula.daysUntilDue * -1))) + " day overdue"),
(if((formula.daysUntilDue * -1) >= 1000 || (formula.daysUntilDue * -1) <=
-1000, ("" + (formula.daysUntilDue * -1)).replace(/\B(?=(\d{3})+(?!\d))/g,
","), ("" + (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((if(projects, list(projects).length, 0)) == 0, ("No projects"),
if((if(projects, list(projects).length, 0)) == 1, ("Single project"),
("Multiple projects"))))
contextCount: >-
(if((if(contexts, list(contexts).length, 0)) == 0, ("No contexts"),
if((if(contexts, list(contexts).length, 0)) == 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,
(if(((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
- number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
60).floor()) >= 1000 ||
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
60).floor()) <= -1000, ("" +
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
60).floor())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
60).floor()))) + "h " +
if(((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
- number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
60).round()) >= 1000 ||
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
60).round()) <= -1000, ("" +
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
60).round())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
60).round()))) + "m"),
(if((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
- number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()) >=
1000 ||
(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()) <=
-1000, ("" +
(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value,
0).round())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()))) +
"m")), (if((0) >= 1000 || (0) <= -1000, ("" +
(0)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (0))) + "m"))
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(),
(if((formula.daysUntilDue * -1) == 1, (if((formula.daysUntilDue * -1) >=
1000 || (formula.daysUntilDue * -1) <= -1000, ("" + (formula.daysUntilDue *
-1)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (formula.daysUntilDue *
-1))) + " day ago"), (if((formula.daysUntilDue * -1) >= 1000 ||
(formula.daysUntilDue * -1) <= -1000, ("" + (formula.daysUntilDue *
-1)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (formula.daysUntilDue *
-1))) + " days 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())
order:
- status
- priority
- due
- scheduled
- projects
- contexts
- file.tags
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
sort:
- column: tasknotes_manual_order
direction: DESC
groupBy:
property: status
direction: ASC
- 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:
- column: 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:
- column: 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())
order:
- status
- priority
- due
- scheduled
- projects
- contexts
- file.tags
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
sort:
- column: tasknotes_manual_order
direction: DESC
groupBy:
property: status
direction: ASC