1
0

vault backup: 2025-12-09 23:43:30
All checks were successful
Deploy Quartz site to GitHub Pages / build (push) Successful in 1m28s

This commit is contained in:
2025-12-09 23:43:30 +01:00
parent 86f0993d85
commit f8446b6f87
7 changed files with 381 additions and 285 deletions

View File

@@ -288,5 +288,139 @@
"googleCalendarSyncTokens": {}, "googleCalendarSyncTokens": {},
"enabledMicrosoftCalendars": [], "enabledMicrosoftCalendars": [],
"microsoftCalendarSyncTokens": {}, "microsoftCalendarSyncTokens": {},
"lastSeenVersion": "4.1.3" "lastSeenVersion": "4.1.3",
"modalFieldsConfig": {
"version": 1,
"fields": [
{
"id": "title",
"fieldType": "core",
"group": "basic",
"displayName": "Title",
"visibleInCreation": true,
"visibleInEdit": true,
"order": 0,
"enabled": true,
"required": true
},
{
"id": "details",
"fieldType": "core",
"group": "basic",
"displayName": "Details",
"visibleInCreation": true,
"visibleInEdit": true,
"order": 1,
"enabled": true
},
{
"id": "contexts",
"fieldType": "core",
"group": "metadata",
"displayName": "Contexts",
"visibleInCreation": true,
"visibleInEdit": true,
"order": 0,
"enabled": true
},
{
"id": "tags",
"fieldType": "core",
"group": "metadata",
"displayName": "Tags",
"visibleInCreation": true,
"visibleInEdit": true,
"order": 1,
"enabled": true
},
{
"id": "time-estimate",
"fieldType": "core",
"group": "metadata",
"displayName": "Time Estimate",
"visibleInCreation": true,
"visibleInEdit": true,
"order": 2,
"enabled": true
},
{
"id": "projects",
"fieldType": "organization",
"group": "organization",
"displayName": "Projects",
"visibleInCreation": true,
"visibleInEdit": true,
"order": 0,
"enabled": true
},
{
"id": "subtasks",
"fieldType": "organization",
"group": "organization",
"displayName": "Subtasks",
"visibleInCreation": true,
"visibleInEdit": true,
"order": 1,
"enabled": true
},
{
"id": "blocked-by",
"fieldType": "dependency",
"group": "dependencies",
"displayName": "Blocked By",
"visibleInCreation": true,
"visibleInEdit": true,
"order": 0,
"enabled": true
},
{
"id": "blocking",
"fieldType": "dependency",
"group": "dependencies",
"displayName": "Blocking",
"visibleInCreation": true,
"visibleInEdit": true,
"order": 1,
"enabled": true
}
],
"groups": [
{
"id": "basic",
"displayName": "Basic Information",
"order": 0,
"collapsible": false,
"defaultCollapsed": false
},
{
"id": "metadata",
"displayName": "Metadata",
"order": 1,
"collapsible": true,
"defaultCollapsed": false
},
{
"id": "organization",
"displayName": "Organization",
"order": 2,
"collapsible": true,
"defaultCollapsed": false
},
{
"id": "dependencies",
"displayName": "Dependencies",
"order": 3,
"collapsible": true,
"defaultCollapsed": false
},
{
"id": "custom",
"displayName": "Custom Fields",
"order": 4,
"collapsible": true,
"defaultCollapsed": false
}
]
},
"icsSubscriptions": []
} }

View File

@@ -4,21 +4,22 @@
"type": "split", "type": "split",
"children": [ "children": [
{ {
"id": "b89ff55393473206", "id": "33cf68c6719cb278",
"type": "tabs", "type": "tabs",
"children": [ "children": [
{ {
"id": "d89c9bed2dbbc633", "id": "fb89c054e0a630b7",
"type": "leaf", "type": "leaf",
"state": { "state": {
"type": "split-diff-view", "type": "markdown",
"state": { "state": {
"aFile": "content/TaskNotes/Tasks/ETK-kortlek imorgon kl 09.md", "file": "TaskNotes/Tasks/ETK-kortlek imorgon kl 09.md",
"bFile": "content/TaskNotes/Tasks/ETK-kortlek imorgon kl 09.md", "mode": "source",
"aRef": "" "source": false,
"backlinks": false
}, },
"icon": "diff", "icon": "lucide-file",
"title": "Diff: ETK-kortlek imorgon kl 09" "title": "ETK-kortlek imorgon kl 09"
} }
} }
] ]
@@ -68,7 +69,7 @@
} }
], ],
"direction": "horizontal", "direction": "horizontal",
"width": 435.50390243530273 "width": 294.50390243530273
}, },
"right": { "right": {
"id": "0948c66181b40af9", "id": "0948c66181b40af9",
@@ -161,7 +162,8 @@
} }
], ],
"direction": "horizontal", "direction": "horizontal",
"width": 332.5 "width": 332.5,
"collapsed": true
}, },
"left-ribbon": { "left-ribbon": {
"hiddenItems": { "hiddenItems": {
@@ -186,17 +188,17 @@
"tasknotes:Create new task": false "tasknotes:Create new task": false
} }
}, },
"active": "d89c9bed2dbbc633", "active": "fb89c054e0a630b7",
"lastOpenFiles": [ "lastOpenFiles": [
"TaskNotes/Tasks/ETK-kortlek imorgon kl 09.md",
"TaskNotes/Views/calendar-default.base",
"TaskNotes/Tasks",
"TaskNotes/Views/mini-calendar-default.base",
"Biokemi/Metabolism/Enzymer/Anteckningar I.md",
"TaskNotes/Views/relationships.base",
"TaskNotes/Views/agenda-default.base", "TaskNotes/Views/agenda-default.base",
"TaskNotes/Views/tasks-default.base", "TaskNotes/Views/mini-calendar-default.base",
"TaskNotes/Views/kanban-default.base", "TaskNotes/Views/kanban-default.base",
"TaskNotes/Views/tasks-default.base",
"TaskNotes/Views/calendar-default.base",
"TaskNotes/Views/relationships.base",
"TaskNotes/Tasks/ETK-kortlek imorgon kl 09.md",
"TaskNotes/Tasks",
"Biokemi/Metabolism/Enzymer/Anteckningar I.md",
"TaskNotes/Views", "TaskNotes/Views",
"TaskNotes", "TaskNotes",
"Biokemi/Metabolism/🍖 Aminosyrametabolism/Anteckningar.md", "Biokemi/Metabolism/🍖 Aminosyrametabolism/Anteckningar.md",

View File

@@ -1,9 +1,9 @@
--- ---
status: open status: none
priority: normal priority: normal
scheduled: 2025-12-10T09:00 scheduled: 2025-12-10T09:00
dateCreated: 2025-12-09T23:34:59.094+01:00 dateCreated: 2025-12-09T23:34:59.094+01:00
dateModified: 2025-12-09T23:35:37.370+01:00 dateModified: 2025-12-09T23:38:30.465+01:00
tags: tags:
- task - task
--- ---

View File

@@ -1,53 +1,49 @@
# Agenda
filters: filters:
and: and:
- file.hasTag("task") - file.hasTag("task")
formulas: formulas:
priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))' priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
daysUntilDue: 'if(due, ((number(date(due)) - number(today())) / 86400000).floor(), null)' daysUntilDue: if(due, ((number(date(due)) - number(today())) / 86400000).floor(), null)
daysUntilScheduled: 'if(scheduled, ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)' daysUntilScheduled: if(scheduled, ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()' daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()' daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
isOverdue: 'due && date(due) < today() && status != "done"' isOverdue: due && date(due) < today() && status != "done"
isDueToday: 'due && date(due).date() == today()' isDueToday: due && date(due).date() == today()
isDueThisWeek: 'due && date(due) >= today() && date(due) <= today() + "7d"' isDueThisWeek: due && date(due) >= today() && date(due) <= today() + "7d"
isScheduledToday: 'scheduled && date(scheduled).date() == today()' isScheduledToday: scheduled && date(scheduled).date() == today()
isRecurring: 'recurrence && !recurrence.isEmpty()' isRecurring: recurrence && !recurrence.isEmpty()
hasTimeEstimate: 'timeEstimate && timeEstimate > 0' 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)' 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)' 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)' 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).date() == today()).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).date() == today()).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
dueMonth: 'if(due, date(due).format("YYYY-MM"), "No due date")' dueMonth: if(due, date(due).format("YYYY-MM"), "No due date")
dueWeek: 'if(due, date(due).format("YYYY-[W]WW"), "No due date")' dueWeek: if(due, date(due).format("YYYY-[W]WW"), "No due date")
scheduledMonth: 'if(scheduled, date(scheduled).format("YYYY-MM"), "Not scheduled")' scheduledMonth: if(scheduled, date(scheduled).format("YYYY-MM"), "Not scheduled")
scheduledWeek: 'if(scheduled, date(scheduled).format("YYYY-[W]WW"), "Not scheduled")' scheduledWeek: if(scheduled, date(scheduled).format("YYYY-[W]WW"), "Not scheduled")
dueDateCategory: 'if(!due, "No due date", if(date(due) < today(), "Overdue", if(date(due).date() == today(), "Today", if(date(due).date() == today() + "1d", "Tomorrow", if(date(due) <= today() + "7d", "This week", "Later")))))' dueDateCategory: if(!due, "No due date", if(date(due) < today(), "Overdue", if(date(due).date() == today(), "Today", if(date(due).date() == today() + "1d", "Tomorrow", if(date(due) <= today() + "7d", "This week", "Later")))))
timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))' timeEstimateCategory: if(!timeEstimate || timeEstimate == 0, "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")))' 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")' createdMonth: file.ctime.format("YYYY-MM")
modifiedMonth: 'file.mtime.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"))))' 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"))' 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"))' contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))
trackingStatus: 'if(!timeEstimate || timeEstimate == 0, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))' trackingStatus: if(!timeEstimate || timeEstimate == 0, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
nextDate: 'if(due && scheduled, if(date(due) < date(scheduled), due, scheduled), if(due, due, scheduled))' nextDate: if(due && scheduled, if(date(due) < date(scheduled), due, scheduled), if(due, due, scheduled))
daysUntilNext: 'if(due && scheduled, min(formula.daysUntilDue, formula.daysUntilScheduled), if(due, formula.daysUntilDue, formula.daysUntilScheduled))' daysUntilNext: if(due && scheduled, min(formula.daysUntilDue, formula.daysUntilScheduled), if(due, formula.daysUntilDue, formula.daysUntilScheduled))
hasDate: 'due || scheduled' hasDate: due || scheduled
isToday: '(due && date(due).date() == today()) || (scheduled && date(scheduled).date() == today())' isToday: (due && date(due).date() == today()) || (scheduled && date(scheduled).date() == today())
isThisWeek: '(due && date(due) >= today() && date(due) <= today() + "7d") || (scheduled && date(scheduled) >= today() && date(scheduled) <= today() + "7d")' isThisWeek: (due && date(due) >= today() && date(due) <= today() + "7d") || (scheduled && date(scheduled) >= today() && date(scheduled) <= today() + "7d")
nextDateCategory: 'if(!due && !scheduled, "No date", if((due && date(due) < today()) || (scheduled && date(scheduled) < today()), "Overdue/Past", if((due && date(due).date() == today()) || (scheduled && date(scheduled).date() == today()), "Today", if((due && date(due).date() == today() + "1d") || (scheduled && date(scheduled).date() == today() + "1d"), "Tomorrow", if((due && date(due) <= today() + "7d") || (scheduled && date(scheduled) <= today() + "7d"), "This week", "Later")))))' nextDateCategory: if(!due && !scheduled, "No date", if((due && date(due) < today()) || (scheduled && date(scheduled) < today()), "Overdue/Past", if((due && date(due).date() == today()) || (scheduled && date(scheduled).date() == today()), "Today", if((due && date(due).date() == today() + "1d") || (scheduled && date(scheduled).date() == today() + "1d"), "Tomorrow", if((due && date(due) <= today() + "7d") || (scheduled && date(scheduled) <= today() + "7d"), "This week", "Later")))))
nextDateMonth: 'if(due && scheduled, if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if(due, date(due).format("YYYY-MM"), if(scheduled, date(scheduled).format("YYYY-MM"), "No date")))' nextDateMonth: if(due && scheduled, if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if(due, date(due).format("YYYY-MM"), if(scheduled, date(scheduled).format("YYYY-MM"), "No date")))
nextDateWeek: 'if(due && scheduled, if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if(due, date(due).format("YYYY-[W]WW"), if(scheduled, date(scheduled).format("YYYY-[W]WW"), "No date")))' nextDateWeek: if(due && scheduled, if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if(due, date(due).format("YYYY-[W]WW"), if(scheduled, date(scheduled).format("YYYY-[W]WW"), "No date")))
urgencyScore: 'if(!due && !scheduled, formula.priorityWeight, formula.priorityWeight + max(0, 10 - formula.daysUntilNext))' urgencyScore: if(!due && !scheduled, formula.priorityWeight, formula.priorityWeight + max(0, 10 - formula.daysUntilNext))
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")' 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, "", if(date(due).date() == today(), "Today", if(date(due).date() == today() + "1d", "Tomorrow", if(date(due).date() == today() - "1d", "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due) <= today() + "7d", date(due).format("ddd"), date(due).format("MMM D")))))))' dueDateDisplay: if(!due, "", if(date(due).date() == today(), "Today", if(date(due).date() == today() + "1d", "Tomorrow", if(date(due).date() == today() - "1d", "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due) <= today() + "7d", date(due).format("ddd"), date(due).format("MMM D")))))))
views: views:
- type: tasknotesCalendar - type: tasknotesCalendar
name: "Agenda" name: Agenda
order: order:
- status - status
- priority - priority
@@ -60,7 +56,7 @@ views:
- file.name - file.name
- recurrence - recurrence
- complete_instances - complete_instances
calendarView: "listWeek" calendarView: listWeek
startDateProperty: file.ctime startDateProperty: file.ctime
listDayCount: 7 listDayCount: 7
titleProperty: file.basename titleProperty: file.basename

View File

@@ -1,53 +1,52 @@
# Kanban Board
filters: filters:
and: and:
- file.hasTag("task") - file.hasTag("task")
formulas: formulas:
priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))' priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
daysUntilDue: 'if(due, ((number(date(due)) - number(today())) / 86400000).floor(), null)' daysUntilDue: if(due, ((number(date(due)) - number(today())) / 86400000).floor(), null)
daysUntilScheduled: 'if(scheduled, ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)' daysUntilScheduled: if(scheduled, ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()' daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()' daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
isOverdue: 'due && date(due) < today() && status != "done"' isOverdue: due && date(due) < today() && status != "done"
isDueToday: 'due && date(due).date() == today()' isDueToday: due && date(due).date() == today()
isDueThisWeek: 'due && date(due) >= today() && date(due) <= today() + "7d"' isDueThisWeek: due && date(due) >= today() && date(due) <= today() + "7d"
isScheduledToday: 'scheduled && date(scheduled).date() == today()' isScheduledToday: scheduled && date(scheduled).date() == today()
isRecurring: 'recurrence && !recurrence.isEmpty()' isRecurring: recurrence && !recurrence.isEmpty()
hasTimeEstimate: 'timeEstimate && timeEstimate > 0' 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)' 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)' 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)' 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).date() == today()).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).date() == today()).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
dueMonth: 'if(due, date(due).format("YYYY-MM"), "No due date")' dueMonth: if(due, date(due).format("YYYY-MM"), "No due date")
dueWeek: 'if(due, date(due).format("YYYY-[W]WW"), "No due date")' dueWeek: if(due, date(due).format("YYYY-[W]WW"), "No due date")
scheduledMonth: 'if(scheduled, date(scheduled).format("YYYY-MM"), "Not scheduled")' scheduledMonth: if(scheduled, date(scheduled).format("YYYY-MM"), "Not scheduled")
scheduledWeek: 'if(scheduled, date(scheduled).format("YYYY-[W]WW"), "Not scheduled")' scheduledWeek: if(scheduled, date(scheduled).format("YYYY-[W]WW"), "Not scheduled")
dueDateCategory: 'if(!due, "No due date", if(date(due) < today(), "Overdue", if(date(due).date() == today(), "Today", if(date(due).date() == today() + "1d", "Tomorrow", if(date(due) <= today() + "7d", "This week", "Later")))))' dueDateCategory: if(!due, "No due date", if(date(due) < today(), "Overdue", if(date(due).date() == today(), "Today", if(date(due).date() == today() + "1d", "Tomorrow", if(date(due) <= today() + "7d", "This week", "Later")))))
timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))' timeEstimateCategory: if(!timeEstimate || timeEstimate == 0, "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")))' 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")' createdMonth: file.ctime.format("YYYY-MM")
modifiedMonth: 'file.mtime.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"))))' 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"))' 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"))' contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))
trackingStatus: 'if(!timeEstimate || timeEstimate == 0, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))' trackingStatus: if(!timeEstimate || timeEstimate == 0, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
nextDate: 'if(due && scheduled, if(date(due) < date(scheduled), due, scheduled), if(due, due, scheduled))' nextDate: if(due && scheduled, if(date(due) < date(scheduled), due, scheduled), if(due, due, scheduled))
daysUntilNext: 'if(due && scheduled, min(formula.daysUntilDue, formula.daysUntilScheduled), if(due, formula.daysUntilDue, formula.daysUntilScheduled))' daysUntilNext: if(due && scheduled, min(formula.daysUntilDue, formula.daysUntilScheduled), if(due, formula.daysUntilDue, formula.daysUntilScheduled))
hasDate: 'due || scheduled' hasDate: due || scheduled
isToday: '(due && date(due).date() == today()) || (scheduled && date(scheduled).date() == today())' isToday: (due && date(due).date() == today()) || (scheduled && date(scheduled).date() == today())
isThisWeek: '(due && date(due) >= today() && date(due) <= today() + "7d") || (scheduled && date(scheduled) >= today() && date(scheduled) <= today() + "7d")' isThisWeek: (due && date(due) >= today() && date(due) <= today() + "7d") || (scheduled && date(scheduled) >= today() && date(scheduled) <= today() + "7d")
nextDateCategory: 'if(!due && !scheduled, "No date", if((due && date(due) < today()) || (scheduled && date(scheduled) < today()), "Overdue/Past", if((due && date(due).date() == today()) || (scheduled && date(scheduled).date() == today()), "Today", if((due && date(due).date() == today() + "1d") || (scheduled && date(scheduled).date() == today() + "1d"), "Tomorrow", if((due && date(due) <= today() + "7d") || (scheduled && date(scheduled) <= today() + "7d"), "This week", "Later")))))' nextDateCategory: if(!due && !scheduled, "No date", if((due && date(due) < today()) || (scheduled && date(scheduled) < today()), "Overdue/Past", if((due && date(due).date() == today()) || (scheduled && date(scheduled).date() == today()), "Today", if((due && date(due).date() == today() + "1d") || (scheduled && date(scheduled).date() == today() + "1d"), "Tomorrow", if((due && date(due) <= today() + "7d") || (scheduled && date(scheduled) <= today() + "7d"), "This week", "Later")))))
nextDateMonth: 'if(due && scheduled, if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if(due, date(due).format("YYYY-MM"), if(scheduled, date(scheduled).format("YYYY-MM"), "No date")))' nextDateMonth: if(due && scheduled, if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if(due, date(due).format("YYYY-MM"), if(scheduled, date(scheduled).format("YYYY-MM"), "No date")))
nextDateWeek: 'if(due && scheduled, if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if(due, date(due).format("YYYY-[W]WW"), if(scheduled, date(scheduled).format("YYYY-[W]WW"), "No date")))' nextDateWeek: if(due && scheduled, if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if(due, date(due).format("YYYY-[W]WW"), if(scheduled, date(scheduled).format("YYYY-[W]WW"), "No date")))
urgencyScore: 'if(!due && !scheduled, formula.priorityWeight, formula.priorityWeight + max(0, 10 - formula.daysUntilNext))' urgencyScore: if(!due && !scheduled, formula.priorityWeight, formula.priorityWeight + max(0, 10 - formula.daysUntilNext))
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")' 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, "", if(date(due).date() == today(), "Today", if(date(due).date() == today() + "1d", "Tomorrow", if(date(due).date() == today() - "1d", "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due) <= today() + "7d", date(due).format("ddd"), date(due).format("MMM D")))))))' dueDateDisplay: if(!due, "", if(date(due).date() == today(), "Today", if(date(due).date() == today() + "1d", "Tomorrow", if(date(due).date() == today() - "1d", "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due) <= today() + "7d", date(due).format("ddd"), date(due).format("MMM D")))))))
views: views:
- type: tasknotesKanban - type: tasknotesKanban
name: "Kanban Board" name: Kanban Board
groupBy:
property: status
direction: ASC
order: order:
- status - status
- priority - priority
@@ -60,9 +59,6 @@ views:
- file.name - file.name
- recurrence - recurrence
- complete_instances - complete_instances
groupBy:
property: status
direction: ASC
options: options:
columnWidth: 280 columnWidth: 280
hideEmptyColumns: false hideEmptyColumns: false

View File

@@ -1,58 +1,55 @@
# Relationships
# This view shows all relationships for the current file
# Dynamically shows/hides tabs based on available data
filters: filters:
and: and:
- file.hasTag("task") - file.hasTag("task")
formulas: formulas:
priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))' priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
daysUntilDue: 'if(due, ((number(date(due)) - number(today())) / 86400000).floor(), null)' daysUntilDue: if(due, ((number(date(due)) - number(today())) / 86400000).floor(), null)
daysUntilScheduled: 'if(scheduled, ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)' daysUntilScheduled: if(scheduled, ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()' daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()' daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
isOverdue: 'due && date(due) < today() && status != "done"' isOverdue: due && date(due) < today() && status != "done"
isDueToday: 'due && date(due).date() == today()' isDueToday: due && date(due).date() == today()
isDueThisWeek: 'due && date(due) >= today() && date(due) <= today() + "7d"' isDueThisWeek: due && date(due) >= today() && date(due) <= today() + "7d"
isScheduledToday: 'scheduled && date(scheduled).date() == today()' isScheduledToday: scheduled && date(scheduled).date() == today()
isRecurring: 'recurrence && !recurrence.isEmpty()' isRecurring: recurrence && !recurrence.isEmpty()
hasTimeEstimate: 'timeEstimate && timeEstimate > 0' 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)' 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)' 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)' 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).date() == today()).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).date() == today()).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
dueMonth: 'if(due, date(due).format("YYYY-MM"), "No due date")' dueMonth: if(due, date(due).format("YYYY-MM"), "No due date")
dueWeek: 'if(due, date(due).format("YYYY-[W]WW"), "No due date")' dueWeek: if(due, date(due).format("YYYY-[W]WW"), "No due date")
scheduledMonth: 'if(scheduled, date(scheduled).format("YYYY-MM"), "Not scheduled")' scheduledMonth: if(scheduled, date(scheduled).format("YYYY-MM"), "Not scheduled")
scheduledWeek: 'if(scheduled, date(scheduled).format("YYYY-[W]WW"), "Not scheduled")' scheduledWeek: if(scheduled, date(scheduled).format("YYYY-[W]WW"), "Not scheduled")
dueDateCategory: 'if(!due, "No due date", if(date(due) < today(), "Overdue", if(date(due).date() == today(), "Today", if(date(due).date() == today() + "1d", "Tomorrow", if(date(due) <= today() + "7d", "This week", "Later")))))' dueDateCategory: if(!due, "No due date", if(date(due) < today(), "Overdue", if(date(due).date() == today(), "Today", if(date(due).date() == today() + "1d", "Tomorrow", if(date(due) <= today() + "7d", "This week", "Later")))))
timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))' timeEstimateCategory: if(!timeEstimate || timeEstimate == 0, "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")))' 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")' createdMonth: file.ctime.format("YYYY-MM")
modifiedMonth: 'file.mtime.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"))))' 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"))' 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"))' contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))
trackingStatus: 'if(!timeEstimate || timeEstimate == 0, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))' trackingStatus: if(!timeEstimate || timeEstimate == 0, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
nextDate: 'if(due && scheduled, if(date(due) < date(scheduled), due, scheduled), if(due, due, scheduled))' nextDate: if(due && scheduled, if(date(due) < date(scheduled), due, scheduled), if(due, due, scheduled))
daysUntilNext: 'if(due && scheduled, min(formula.daysUntilDue, formula.daysUntilScheduled), if(due, formula.daysUntilDue, formula.daysUntilScheduled))' daysUntilNext: if(due && scheduled, min(formula.daysUntilDue, formula.daysUntilScheduled), if(due, formula.daysUntilDue, formula.daysUntilScheduled))
hasDate: 'due || scheduled' hasDate: due || scheduled
isToday: '(due && date(due).date() == today()) || (scheduled && date(scheduled).date() == today())' isToday: (due && date(due).date() == today()) || (scheduled && date(scheduled).date() == today())
isThisWeek: '(due && date(due) >= today() && date(due) <= today() + "7d") || (scheduled && date(scheduled) >= today() && date(scheduled) <= today() + "7d")' isThisWeek: (due && date(due) >= today() && date(due) <= today() + "7d") || (scheduled && date(scheduled) >= today() && date(scheduled) <= today() + "7d")
nextDateCategory: 'if(!due && !scheduled, "No date", if((due && date(due) < today()) || (scheduled && date(scheduled) < today()), "Overdue/Past", if((due && date(due).date() == today()) || (scheduled && date(scheduled).date() == today()), "Today", if((due && date(due).date() == today() + "1d") || (scheduled && date(scheduled).date() == today() + "1d"), "Tomorrow", if((due && date(due) <= today() + "7d") || (scheduled && date(scheduled) <= today() + "7d"), "This week", "Later")))))' nextDateCategory: if(!due && !scheduled, "No date", if((due && date(due) < today()) || (scheduled && date(scheduled) < today()), "Overdue/Past", if((due && date(due).date() == today()) || (scheduled && date(scheduled).date() == today()), "Today", if((due && date(due).date() == today() + "1d") || (scheduled && date(scheduled).date() == today() + "1d"), "Tomorrow", if((due && date(due) <= today() + "7d") || (scheduled && date(scheduled) <= today() + "7d"), "This week", "Later")))))
nextDateMonth: 'if(due && scheduled, if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if(due, date(due).format("YYYY-MM"), if(scheduled, date(scheduled).format("YYYY-MM"), "No date")))' nextDateMonth: if(due && scheduled, if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if(due, date(due).format("YYYY-MM"), if(scheduled, date(scheduled).format("YYYY-MM"), "No date")))
nextDateWeek: 'if(due && scheduled, if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if(due, date(due).format("YYYY-[W]WW"), if(scheduled, date(scheduled).format("YYYY-[W]WW"), "No date")))' nextDateWeek: if(due && scheduled, if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if(due, date(due).format("YYYY-[W]WW"), if(scheduled, date(scheduled).format("YYYY-[W]WW"), "No date")))
urgencyScore: 'if(!due && !scheduled, formula.priorityWeight, formula.priorityWeight + max(0, 10 - formula.daysUntilNext))' urgencyScore: if(!due && !scheduled, formula.priorityWeight, formula.priorityWeight + max(0, 10 - formula.daysUntilNext))
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")' 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, "", if(date(due).date() == today(), "Today", if(date(due).date() == today() + "1d", "Tomorrow", if(date(due).date() == today() - "1d", "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due) <= today() + "7d", date(due).format("ddd"), date(due).format("MMM D")))))))' dueDateDisplay: if(!due, "", if(date(due).date() == today(), "Today", if(date(due).date() == today() + "1d", "Tomorrow", if(date(due).date() == today() - "1d", "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due) <= today() + "7d", date(due).format("ddd"), date(due).format("MMM D")))))))
views: views:
- type: tasknotesKanban - type: tasknotesKanban
name: "Subtasks" name: Subtasks
filters: filters:
and: and:
- note.projects.contains(this.file.asLink()) - note.projects.contains(this.file.asLink())
groupBy:
property: status
direction: ASC
order: order:
- status - status
- priority - priority
@@ -65,11 +62,8 @@ views:
- file.name - file.name
- recurrence - recurrence
- complete_instances - complete_instances
groupBy:
property: status
direction: ASC
- type: tasknotesTaskList - type: tasknotesTaskList
name: "Projects" name: Projects
filters: filters:
and: and:
- list(this.projects).contains(file.asLink()) - list(this.projects).contains(file.asLink())
@@ -86,7 +80,7 @@ views:
- recurrence - recurrence
- complete_instances - complete_instances
- type: tasknotesTaskList - type: tasknotesTaskList
name: "Blocked By" name: Blocked By
filters: filters:
and: and:
- list(this.note.blockedBy).map(value.uid).contains(file.asLink()) - list(this.note.blockedBy).map(value.uid).contains(file.asLink())
@@ -103,10 +97,13 @@ views:
- recurrence - recurrence
- complete_instances - complete_instances
- type: tasknotesKanban - type: tasknotesKanban
name: "Blocking" name: Blocking
filters: filters:
and: and:
- note.blockedBy.map(value.uid).contains(this.file.asLink()) - note.blockedBy.map(value.uid).contains(this.file.asLink())
groupBy:
property: status
direction: ASC
order: order:
- status - status
- priority - priority
@@ -119,6 +116,3 @@ views:
- file.name - file.name
- recurrence - recurrence
- complete_instances - complete_instances
groupBy:
property: status
direction: ASC

View File

@@ -1,53 +1,49 @@
# All Tasks
filters: filters:
and: and:
- file.hasTag("task") - file.hasTag("task")
formulas: formulas:
priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))' priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
daysUntilDue: 'if(due, ((number(date(due)) - number(today())) / 86400000).floor(), null)' daysUntilDue: if(due, ((number(date(due)) - number(today())) / 86400000).floor(), null)
daysUntilScheduled: 'if(scheduled, ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)' daysUntilScheduled: if(scheduled, ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()' daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()' daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
isOverdue: 'due && date(due) < today() && status != "done"' isOverdue: due && date(due) < today() && status != "done"
isDueToday: 'due && date(due).date() == today()' isDueToday: due && date(due).date() == today()
isDueThisWeek: 'due && date(due) >= today() && date(due) <= today() + "7d"' isDueThisWeek: due && date(due) >= today() && date(due) <= today() + "7d"
isScheduledToday: 'scheduled && date(scheduled).date() == today()' isScheduledToday: scheduled && date(scheduled).date() == today()
isRecurring: 'recurrence && !recurrence.isEmpty()' isRecurring: recurrence && !recurrence.isEmpty()
hasTimeEstimate: 'timeEstimate && timeEstimate > 0' 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)' 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)' 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)' 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).date() == today()).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).date() == today()).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
dueMonth: 'if(due, date(due).format("YYYY-MM"), "No due date")' dueMonth: if(due, date(due).format("YYYY-MM"), "No due date")
dueWeek: 'if(due, date(due).format("YYYY-[W]WW"), "No due date")' dueWeek: if(due, date(due).format("YYYY-[W]WW"), "No due date")
scheduledMonth: 'if(scheduled, date(scheduled).format("YYYY-MM"), "Not scheduled")' scheduledMonth: if(scheduled, date(scheduled).format("YYYY-MM"), "Not scheduled")
scheduledWeek: 'if(scheduled, date(scheduled).format("YYYY-[W]WW"), "Not scheduled")' scheduledWeek: if(scheduled, date(scheduled).format("YYYY-[W]WW"), "Not scheduled")
dueDateCategory: 'if(!due, "No due date", if(date(due) < today(), "Overdue", if(date(due).date() == today(), "Today", if(date(due).date() == today() + "1d", "Tomorrow", if(date(due) <= today() + "7d", "This week", "Later")))))' dueDateCategory: if(!due, "No due date", if(date(due) < today(), "Overdue", if(date(due).date() == today(), "Today", if(date(due).date() == today() + "1d", "Tomorrow", if(date(due) <= today() + "7d", "This week", "Later")))))
timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))' timeEstimateCategory: if(!timeEstimate || timeEstimate == 0, "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")))' 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")' createdMonth: file.ctime.format("YYYY-MM")
modifiedMonth: 'file.mtime.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"))))' 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"))' 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"))' contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))
trackingStatus: 'if(!timeEstimate || timeEstimate == 0, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))' trackingStatus: if(!timeEstimate || timeEstimate == 0, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
nextDate: 'if(due && scheduled, if(date(due) < date(scheduled), due, scheduled), if(due, due, scheduled))' nextDate: if(due && scheduled, if(date(due) < date(scheduled), due, scheduled), if(due, due, scheduled))
daysUntilNext: 'if(due && scheduled, min(formula.daysUntilDue, formula.daysUntilScheduled), if(due, formula.daysUntilDue, formula.daysUntilScheduled))' daysUntilNext: if(due && scheduled, min(formula.daysUntilDue, formula.daysUntilScheduled), if(due, formula.daysUntilDue, formula.daysUntilScheduled))
hasDate: 'due || scheduled' hasDate: due || scheduled
isToday: '(due && date(due).date() == today()) || (scheduled && date(scheduled).date() == today())' isToday: (due && date(due).date() == today()) || (scheduled && date(scheduled).date() == today())
isThisWeek: '(due && date(due) >= today() && date(due) <= today() + "7d") || (scheduled && date(scheduled) >= today() && date(scheduled) <= today() + "7d")' isThisWeek: (due && date(due) >= today() && date(due) <= today() + "7d") || (scheduled && date(scheduled) >= today() && date(scheduled) <= today() + "7d")
nextDateCategory: 'if(!due && !scheduled, "No date", if((due && date(due) < today()) || (scheduled && date(scheduled) < today()), "Overdue/Past", if((due && date(due).date() == today()) || (scheduled && date(scheduled).date() == today()), "Today", if((due && date(due).date() == today() + "1d") || (scheduled && date(scheduled).date() == today() + "1d"), "Tomorrow", if((due && date(due) <= today() + "7d") || (scheduled && date(scheduled) <= today() + "7d"), "This week", "Later")))))' nextDateCategory: if(!due && !scheduled, "No date", if((due && date(due) < today()) || (scheduled && date(scheduled) < today()), "Overdue/Past", if((due && date(due).date() == today()) || (scheduled && date(scheduled).date() == today()), "Today", if((due && date(due).date() == today() + "1d") || (scheduled && date(scheduled).date() == today() + "1d"), "Tomorrow", if((due && date(due) <= today() + "7d") || (scheduled && date(scheduled) <= today() + "7d"), "This week", "Later")))))
nextDateMonth: 'if(due && scheduled, if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if(due, date(due).format("YYYY-MM"), if(scheduled, date(scheduled).format("YYYY-MM"), "No date")))' nextDateMonth: if(due && scheduled, if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if(due, date(due).format("YYYY-MM"), if(scheduled, date(scheduled).format("YYYY-MM"), "No date")))
nextDateWeek: 'if(due && scheduled, if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if(due, date(due).format("YYYY-[W]WW"), if(scheduled, date(scheduled).format("YYYY-[W]WW"), "No date")))' nextDateWeek: if(due && scheduled, if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if(due, date(due).format("YYYY-[W]WW"), if(scheduled, date(scheduled).format("YYYY-[W]WW"), "No date")))
urgencyScore: 'if(!due && !scheduled, formula.priorityWeight, formula.priorityWeight + max(0, 10 - formula.daysUntilNext))' urgencyScore: if(!due && !scheduled, formula.priorityWeight, formula.priorityWeight + max(0, 10 - formula.daysUntilNext))
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")' 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, "", if(date(due).date() == today(), "Today", if(date(due).date() == today() + "1d", "Tomorrow", if(date(due).date() == today() - "1d", "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due) <= today() + "7d", date(due).format("ddd"), date(due).format("MMM D")))))))' dueDateDisplay: if(!due, "", if(date(due).date() == today(), "Today", if(date(due).date() == today() + "1d", "Tomorrow", if(date(due).date() == today() - "1d", "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due) <= today() + "7d", date(due).format("ddd"), date(due).format("MMM D")))))))
views: views:
- type: tasknotesTaskList - type: tasknotesTaskList
name: "All Tasks" name: All Tasks
order: order:
- status - status
- priority - priority
@@ -61,28 +57,22 @@ views:
- recurrence - recurrence
- complete_instances - complete_instances
sort: sort:
- column: due - property: due
direction: ASC direction: ASC
- type: tasknotesTaskList - type: tasknotesTaskList
name: "Not Blocked" name: Not Blocked
filters: filters:
and: and:
# Incomplete tasks
- or: - or:
# Non-recurring task that's not in any completed status - and:
- and: - recurrence.isEmpty()
- recurrence.isEmpty() - status != "done"
- status != "done" - and:
# Recurring task where today is not in complete_instances - recurrence
- and: - '!complete_instances.contains(today().format("yyyy-MM-dd"))'
- recurrence
- "!complete_instances.contains(today().format(\"yyyy-MM-dd\"))"
# Not blocked by any incomplete tasks
- or: - or:
# No blocking dependencies at all - blockedBy.isEmpty()
- blockedBy.isEmpty() - list(blockedBy).filter(file(value.uid).properties.status != "done").isEmpty()
# All blocking tasks are completed (filter returns only incomplete, then check if empty)
- 'list(blockedBy).filter(file(value.uid).properties.status != "done").isEmpty()'
order: order:
- status - status
- priority - priority
@@ -96,26 +86,22 @@ views:
- recurrence - recurrence
- complete_instances - complete_instances
sort: sort:
- column: formula.urgencyScore - property: formula.urgencyScore
direction: DESC direction: DESC
- type: tasknotesTaskList - type: tasknotesTaskList
name: "Today" name: Today
filters: filters:
and: and:
# Incomplete tasks (handles both recurring and non-recurring)
- or: - or:
# Non-recurring task that's not in any completed status - and:
- and: - recurrence.isEmpty()
- recurrence.isEmpty() - status != "done"
- status != "done" - and:
# Recurring task where today is not in complete_instances - recurrence
- and: - '!complete_instances.contains(today().format("yyyy-MM-dd"))'
- recurrence
- "!complete_instances.contains(today().format(\"yyyy-MM-dd\"))"
# Due or scheduled today
- or: - or:
- date(due) == today() - date(due) == today()
- date(scheduled) == today() - date(scheduled) == today()
order: order:
- status - status
- priority - priority
@@ -129,23 +115,19 @@ views:
- recurrence - recurrence
- complete_instances - complete_instances
sort: sort:
- column: formula.urgencyScore - property: formula.urgencyScore
direction: DESC direction: DESC
- type: tasknotesTaskList - type: tasknotesTaskList
name: "Overdue" name: Overdue
filters: filters:
and: and:
# Incomplete tasks
- or: - or:
# Non-recurring task that's not in any completed status - and:
- and: - recurrence.isEmpty()
- recurrence.isEmpty() - status != "done"
- status != "done" - and:
# Recurring task where today is not in complete_instances - recurrence
- and: - '!complete_instances.contains(today().format("yyyy-MM-dd"))'
- recurrence
- "!complete_instances.contains(today().format(\"yyyy-MM-dd\"))"
# Due in the past
- date(due) < today() - date(due) < today()
order: order:
- status - status
@@ -160,30 +142,26 @@ views:
- recurrence - recurrence
- complete_instances - complete_instances
sort: sort:
- column: formula.urgencyScore - property: formula.urgencyScore
direction: DESC direction: DESC
- type: tasknotesTaskList - type: tasknotesTaskList
name: "This Week" name: This Week
filters: filters:
and: and:
# Incomplete tasks
- or: - or:
# Non-recurring task that's not in any completed status - and:
- and: - recurrence.isEmpty()
- recurrence.isEmpty() - status != "done"
- status != "done" - and:
# Recurring task where today is not in complete_instances - recurrence
- and: - '!complete_instances.contains(today().format("yyyy-MM-dd"))'
- recurrence
- "!complete_instances.contains(today().format(\"yyyy-MM-dd\"))"
# Due or scheduled this week
- or: - or:
- and: - and:
- date(due) >= today() - date(due) >= today()
- date(due) <= today() + "7 days" - date(due) <= today() + "7 days"
- and: - and:
- date(scheduled) >= today() - date(scheduled) >= today()
- date(scheduled) <= today() + "7 days" - date(scheduled) <= today() + "7 days"
order: order:
- status - status
- priority - priority
@@ -197,23 +175,19 @@ views:
- recurrence - recurrence
- complete_instances - complete_instances
sort: sort:
- column: formula.urgencyScore - property: formula.urgencyScore
direction: DESC direction: DESC
- type: tasknotesTaskList - type: tasknotesTaskList
name: "Unscheduled" name: Unscheduled
filters: filters:
and: and:
# Incomplete tasks
- or: - or:
# Non-recurring task that's not in any completed status - and:
- and: - recurrence.isEmpty()
- recurrence.isEmpty() - status != "done"
- status != "done" - and:
# Recurring task where today is not in complete_instances - recurrence
- and: - '!complete_instances.contains(today().format("yyyy-MM-dd"))'
- recurrence
- "!complete_instances.contains(today().format(\"yyyy-MM-dd\"))"
# No due date and no scheduled date
- date(due).isEmpty() - date(due).isEmpty()
- date(scheduled).isEmpty() - date(scheduled).isEmpty()
order: order:
@@ -229,5 +203,5 @@ views:
- recurrence - recurrence
- complete_instances - complete_instances
sort: sort:
- column: status - property: status
direction: ASC direction: ASC