From f8446b6f87446635ad03c28207e6195e203e9614 Mon Sep 17 00:00:00 2001 From: Johan Dahlin Date: Tue, 9 Dec 2025 23:43:30 +0100 Subject: [PATCH] vault backup: 2025-12-09 23:43:30 --- content/.obsidian/plugins/tasknotes/data.json | 136 +++++++++++- content/.obsidian/workspace.json | 38 ++-- .../Tasks/ETK-kortlek imorgon kl 09.md | 4 +- content/TaskNotes/Views/agenda-default.base | 86 ++++---- content/TaskNotes/Views/kanban-default.base | 90 ++++---- content/TaskNotes/Views/relationships.base | 104 +++++---- content/TaskNotes/Views/tasks-default.base | 208 ++++++++---------- 7 files changed, 381 insertions(+), 285 deletions(-) diff --git a/content/.obsidian/plugins/tasknotes/data.json b/content/.obsidian/plugins/tasknotes/data.json index 3e8ca51..7c2c87b 100644 --- a/content/.obsidian/plugins/tasknotes/data.json +++ b/content/.obsidian/plugins/tasknotes/data.json @@ -288,5 +288,139 @@ "googleCalendarSyncTokens": {}, "enabledMicrosoftCalendars": [], "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": [] } \ No newline at end of file diff --git a/content/.obsidian/workspace.json b/content/.obsidian/workspace.json index 69648cf..cf6f876 100644 --- a/content/.obsidian/workspace.json +++ b/content/.obsidian/workspace.json @@ -4,21 +4,22 @@ "type": "split", "children": [ { - "id": "b89ff55393473206", + "id": "33cf68c6719cb278", "type": "tabs", "children": [ { - "id": "d89c9bed2dbbc633", + "id": "fb89c054e0a630b7", "type": "leaf", "state": { - "type": "split-diff-view", + "type": "markdown", "state": { - "aFile": "content/TaskNotes/Tasks/ETK-kortlek imorgon kl 09.md", - "bFile": "content/TaskNotes/Tasks/ETK-kortlek imorgon kl 09.md", - "aRef": "" + "file": "TaskNotes/Tasks/ETK-kortlek imorgon kl 09.md", + "mode": "source", + "source": false, + "backlinks": false }, - "icon": "diff", - "title": "Diff: ETK-kortlek imorgon kl 09" + "icon": "lucide-file", + "title": "ETK-kortlek imorgon kl 09" } } ] @@ -68,7 +69,7 @@ } ], "direction": "horizontal", - "width": 435.50390243530273 + "width": 294.50390243530273 }, "right": { "id": "0948c66181b40af9", @@ -161,7 +162,8 @@ } ], "direction": "horizontal", - "width": 332.5 + "width": 332.5, + "collapsed": true }, "left-ribbon": { "hiddenItems": { @@ -186,17 +188,17 @@ "tasknotes:Create new task": false } }, - "active": "d89c9bed2dbbc633", + "active": "fb89c054e0a630b7", "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/tasks-default.base", + "TaskNotes/Views/mini-calendar-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", "Biokemi/Metabolism/🍖 Aminosyrametabolism/Anteckningar.md", diff --git a/content/TaskNotes/Tasks/ETK-kortlek imorgon kl 09.md b/content/TaskNotes/Tasks/ETK-kortlek imorgon kl 09.md index 495a816..2208300 100644 --- a/content/TaskNotes/Tasks/ETK-kortlek imorgon kl 09.md +++ b/content/TaskNotes/Tasks/ETK-kortlek imorgon kl 09.md @@ -1,9 +1,9 @@ --- -status: open +status: none priority: normal scheduled: 2025-12-10T09: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: - task --- diff --git a/content/TaskNotes/Views/agenda-default.base b/content/TaskNotes/Views/agenda-default.base index 7e300ea..5bda2da 100644 --- a/content/TaskNotes/Views/agenda-default.base +++ b/content/TaskNotes/Views/agenda-default.base @@ -1,53 +1,49 @@ -# Agenda - filters: and: - file.hasTag("task") - formulas: - priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))' - daysUntilDue: 'if(due, ((number(date(due)) - number(today())) / 86400000).floor(), null)' - daysUntilScheduled: 'if(scheduled, ((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 && date(due) < today() && status != "done"' - isDueToday: 'due && date(due).date() == today()' - isDueThisWeek: 'due && date(due) >= today() && date(due) <= today() + "7d"' - isScheduledToday: 'scheduled && date(scheduled).date() == today()' - 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).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")' - dueWeek: 'if(due, date(due).format("YYYY-[W]WW"), "No due date")' - scheduledMonth: 'if(scheduled, date(scheduled).format("YYYY-MM"), "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")))))' - 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")))' - createdMonth: 'file.ctime.format("YYYY-MM")' - modifiedMonth: 'file.mtime.format("YYYY-MM")' - priorityCategory: 'if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))' - projectCount: 'if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))' - contextCount: 'if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))' - trackingStatus: 'if(!timeEstimate || timeEstimate == 0, "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))' - daysUntilNext: 'if(due && scheduled, min(formula.daysUntilDue, formula.daysUntilScheduled), if(due, formula.daysUntilDue, formula.daysUntilScheduled))' - hasDate: 'due || scheduled' - 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")' - 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")))' - 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))' - 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")))))))' - + 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) + daysUntilScheduled: if(scheduled, ((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 && date(due) < today() && status != "done" + isDueToday: due && date(due).date() == today() + isDueThisWeek: due && date(due) >= today() && date(due) <= today() + "7d" + isScheduledToday: scheduled && date(scheduled).date() == today() + 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).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") + dueWeek: if(due, date(due).format("YYYY-[W]WW"), "No due date") + scheduledMonth: if(scheduled, date(scheduled).format("YYYY-MM"), "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"))))) + 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"))) + createdMonth: file.ctime.format("YYYY-MM") + modifiedMonth: file.mtime.format("YYYY-MM") + priorityCategory: if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority")))) + projectCount: if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects")) + contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts")) + trackingStatus: if(!timeEstimate || timeEstimate == 0, "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)) + daysUntilNext: if(due && scheduled, min(formula.daysUntilDue, formula.daysUntilScheduled), if(due, formula.daysUntilDue, formula.daysUntilScheduled)) + hasDate: due || scheduled + 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") + 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"))) + 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)) + 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"))))))) views: - type: tasknotesCalendar - name: "Agenda" + name: Agenda order: - status - priority @@ -60,7 +56,7 @@ views: - file.name - recurrence - complete_instances - calendarView: "listWeek" + calendarView: listWeek startDateProperty: file.ctime listDayCount: 7 titleProperty: file.basename diff --git a/content/TaskNotes/Views/kanban-default.base b/content/TaskNotes/Views/kanban-default.base index 2844a38..9bc7ea8 100644 --- a/content/TaskNotes/Views/kanban-default.base +++ b/content/TaskNotes/Views/kanban-default.base @@ -1,53 +1,52 @@ -# 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,999))))' - daysUntilDue: 'if(due, ((number(date(due)) - number(today())) / 86400000).floor(), null)' - daysUntilScheduled: 'if(scheduled, ((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 && date(due) < today() && status != "done"' - isDueToday: 'due && date(due).date() == today()' - isDueThisWeek: 'due && date(due) >= today() && date(due) <= today() + "7d"' - isScheduledToday: 'scheduled && date(scheduled).date() == today()' - 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).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")' - dueWeek: 'if(due, date(due).format("YYYY-[W]WW"), "No due date")' - scheduledMonth: 'if(scheduled, date(scheduled).format("YYYY-MM"), "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")))))' - 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")))' - createdMonth: 'file.ctime.format("YYYY-MM")' - modifiedMonth: 'file.mtime.format("YYYY-MM")' - priorityCategory: 'if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))' - projectCount: 'if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))' - contextCount: 'if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))' - trackingStatus: 'if(!timeEstimate || timeEstimate == 0, "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))' - daysUntilNext: 'if(due && scheduled, min(formula.daysUntilDue, formula.daysUntilScheduled), if(due, formula.daysUntilDue, formula.daysUntilScheduled))' - hasDate: 'due || scheduled' - 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")' - 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")))' - 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))' - 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")))))))' - + 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) + daysUntilScheduled: if(scheduled, ((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 && date(due) < today() && status != "done" + isDueToday: due && date(due).date() == today() + isDueThisWeek: due && date(due) >= today() && date(due) <= today() + "7d" + isScheduledToday: scheduled && date(scheduled).date() == today() + 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).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") + dueWeek: if(due, date(due).format("YYYY-[W]WW"), "No due date") + scheduledMonth: if(scheduled, date(scheduled).format("YYYY-MM"), "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"))))) + 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"))) + createdMonth: file.ctime.format("YYYY-MM") + modifiedMonth: file.mtime.format("YYYY-MM") + priorityCategory: if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority")))) + projectCount: if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects")) + contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts")) + trackingStatus: if(!timeEstimate || timeEstimate == 0, "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)) + daysUntilNext: if(due && scheduled, min(formula.daysUntilDue, formula.daysUntilScheduled), if(due, formula.daysUntilDue, formula.daysUntilScheduled)) + hasDate: due || scheduled + 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") + 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"))) + 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)) + 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"))))))) views: - type: tasknotesKanban - name: "Kanban Board" + name: Kanban Board + groupBy: + property: status + direction: ASC order: - status - priority @@ -60,9 +59,6 @@ views: - file.name - recurrence - complete_instances - groupBy: - property: status - direction: ASC options: columnWidth: 280 hideEmptyColumns: false diff --git a/content/TaskNotes/Views/relationships.base b/content/TaskNotes/Views/relationships.base index fe46841..bfac856 100644 --- a/content/TaskNotes/Views/relationships.base +++ b/content/TaskNotes/Views/relationships.base @@ -1,58 +1,55 @@ -# Relationships -# This view shows all relationships for the current file -# Dynamically shows/hides tabs based on available data - filters: and: - file.hasTag("task") - formulas: - priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))' - daysUntilDue: 'if(due, ((number(date(due)) - number(today())) / 86400000).floor(), null)' - daysUntilScheduled: 'if(scheduled, ((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 && date(due) < today() && status != "done"' - isDueToday: 'due && date(due).date() == today()' - isDueThisWeek: 'due && date(due) >= today() && date(due) <= today() + "7d"' - isScheduledToday: 'scheduled && date(scheduled).date() == today()' - 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).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")' - dueWeek: 'if(due, date(due).format("YYYY-[W]WW"), "No due date")' - scheduledMonth: 'if(scheduled, date(scheduled).format("YYYY-MM"), "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")))))' - 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")))' - createdMonth: 'file.ctime.format("YYYY-MM")' - modifiedMonth: 'file.mtime.format("YYYY-MM")' - priorityCategory: 'if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))' - projectCount: 'if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))' - contextCount: 'if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))' - trackingStatus: 'if(!timeEstimate || timeEstimate == 0, "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))' - daysUntilNext: 'if(due && scheduled, min(formula.daysUntilDue, formula.daysUntilScheduled), if(due, formula.daysUntilDue, formula.daysUntilScheduled))' - hasDate: 'due || scheduled' - 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")' - 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")))' - 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))' - 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")))))))' - + 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) + daysUntilScheduled: if(scheduled, ((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 && date(due) < today() && status != "done" + isDueToday: due && date(due).date() == today() + isDueThisWeek: due && date(due) >= today() && date(due) <= today() + "7d" + isScheduledToday: scheduled && date(scheduled).date() == today() + 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).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") + dueWeek: if(due, date(due).format("YYYY-[W]WW"), "No due date") + scheduledMonth: if(scheduled, date(scheduled).format("YYYY-MM"), "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"))))) + 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"))) + createdMonth: file.ctime.format("YYYY-MM") + modifiedMonth: file.mtime.format("YYYY-MM") + priorityCategory: if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority")))) + projectCount: if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects")) + contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts")) + trackingStatus: if(!timeEstimate || timeEstimate == 0, "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)) + daysUntilNext: if(due && scheduled, min(formula.daysUntilDue, formula.daysUntilScheduled), if(due, formula.daysUntilDue, formula.daysUntilScheduled)) + hasDate: due || scheduled + 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") + 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"))) + 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)) + 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"))))))) views: - type: tasknotesKanban - name: "Subtasks" + name: Subtasks filters: and: - note.projects.contains(this.file.asLink()) + groupBy: + property: status + direction: ASC order: - status - priority @@ -65,11 +62,8 @@ views: - file.name - recurrence - complete_instances - groupBy: - property: status - direction: ASC - type: tasknotesTaskList - name: "Projects" + name: Projects filters: and: - list(this.projects).contains(file.asLink()) @@ -86,7 +80,7 @@ views: - recurrence - complete_instances - type: tasknotesTaskList - name: "Blocked By" + name: Blocked By filters: and: - list(this.note.blockedBy).map(value.uid).contains(file.asLink()) @@ -103,10 +97,13 @@ views: - recurrence - complete_instances - type: tasknotesKanban - name: "Blocking" + name: Blocking filters: and: - note.blockedBy.map(value.uid).contains(this.file.asLink()) + groupBy: + property: status + direction: ASC order: - status - priority @@ -119,6 +116,3 @@ views: - file.name - recurrence - complete_instances - groupBy: - property: status - direction: ASC diff --git a/content/TaskNotes/Views/tasks-default.base b/content/TaskNotes/Views/tasks-default.base index d0dd473..3163647 100644 --- a/content/TaskNotes/Views/tasks-default.base +++ b/content/TaskNotes/Views/tasks-default.base @@ -1,53 +1,49 @@ -# 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,999))))' - daysUntilDue: 'if(due, ((number(date(due)) - number(today())) / 86400000).floor(), null)' - daysUntilScheduled: 'if(scheduled, ((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 && date(due) < today() && status != "done"' - isDueToday: 'due && date(due).date() == today()' - isDueThisWeek: 'due && date(due) >= today() && date(due) <= today() + "7d"' - isScheduledToday: 'scheduled && date(scheduled).date() == today()' - 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).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")' - dueWeek: 'if(due, date(due).format("YYYY-[W]WW"), "No due date")' - scheduledMonth: 'if(scheduled, date(scheduled).format("YYYY-MM"), "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")))))' - 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")))' - createdMonth: 'file.ctime.format("YYYY-MM")' - modifiedMonth: 'file.mtime.format("YYYY-MM")' - priorityCategory: 'if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))' - projectCount: 'if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))' - contextCount: 'if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))' - trackingStatus: 'if(!timeEstimate || timeEstimate == 0, "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))' - daysUntilNext: 'if(due && scheduled, min(formula.daysUntilDue, formula.daysUntilScheduled), if(due, formula.daysUntilDue, formula.daysUntilScheduled))' - hasDate: 'due || scheduled' - 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")' - 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")))' - 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))' - 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")))))))' - + 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) + daysUntilScheduled: if(scheduled, ((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 && date(due) < today() && status != "done" + isDueToday: due && date(due).date() == today() + isDueThisWeek: due && date(due) >= today() && date(due) <= today() + "7d" + isScheduledToday: scheduled && date(scheduled).date() == today() + 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).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") + dueWeek: if(due, date(due).format("YYYY-[W]WW"), "No due date") + scheduledMonth: if(scheduled, date(scheduled).format("YYYY-MM"), "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"))))) + 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"))) + createdMonth: file.ctime.format("YYYY-MM") + modifiedMonth: file.mtime.format("YYYY-MM") + priorityCategory: if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority")))) + projectCount: if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects")) + contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts")) + trackingStatus: if(!timeEstimate || timeEstimate == 0, "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)) + daysUntilNext: if(due && scheduled, min(formula.daysUntilDue, formula.daysUntilScheduled), if(due, formula.daysUntilDue, formula.daysUntilScheduled)) + hasDate: due || scheduled + 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") + 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"))) + 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)) + 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"))))))) views: - type: tasknotesTaskList - name: "All Tasks" + name: All Tasks order: - status - priority @@ -61,28 +57,22 @@ views: - recurrence - complete_instances sort: - - column: due + - property: due direction: ASC - type: tasknotesTaskList - name: "Not Blocked" + 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 - - "!complete_instances.contains(today().format(\"yyyy-MM-dd\"))" - # Not blocked by any incomplete tasks + - and: + - recurrence.isEmpty() + - status != "done" + - and: + - recurrence + - '!complete_instances.contains(today().format("yyyy-MM-dd"))' - 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(value.uid).properties.status != "done").isEmpty()' + - blockedBy.isEmpty() + - list(blockedBy).filter(file(value.uid).properties.status != "done").isEmpty() order: - status - priority @@ -96,26 +86,22 @@ views: - recurrence - complete_instances sort: - - column: formula.urgencyScore + - property: formula.urgencyScore direction: DESC - type: tasknotesTaskList - name: "Today" + 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 - - "!complete_instances.contains(today().format(\"yyyy-MM-dd\"))" - # Due or scheduled today + - and: + - recurrence.isEmpty() + - status != "done" + - and: + - recurrence + - '!complete_instances.contains(today().format("yyyy-MM-dd"))' - or: - - date(due) == today() - - date(scheduled) == today() + - date(due) == today() + - date(scheduled) == today() order: - status - priority @@ -129,23 +115,19 @@ views: - recurrence - complete_instances sort: - - column: formula.urgencyScore + - property: formula.urgencyScore direction: DESC - type: tasknotesTaskList - name: "Overdue" + 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 - - "!complete_instances.contains(today().format(\"yyyy-MM-dd\"))" - # Due in the past + - and: + - recurrence.isEmpty() + - status != "done" + - and: + - recurrence + - '!complete_instances.contains(today().format("yyyy-MM-dd"))' - date(due) < today() order: - status @@ -160,30 +142,26 @@ views: - recurrence - complete_instances sort: - - column: formula.urgencyScore + - property: formula.urgencyScore direction: DESC - type: tasknotesTaskList - name: "This Week" + 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 - - "!complete_instances.contains(today().format(\"yyyy-MM-dd\"))" - # Due or scheduled this week + - and: + - recurrence.isEmpty() + - status != "done" + - and: + - recurrence + - '!complete_instances.contains(today().format("yyyy-MM-dd"))' - or: - - and: - - date(due) >= today() - - date(due) <= today() + "7 days" - - and: - - date(scheduled) >= today() - - date(scheduled) <= today() + "7 days" + - and: + - date(due) >= today() + - date(due) <= today() + "7 days" + - and: + - date(scheduled) >= today() + - date(scheduled) <= today() + "7 days" order: - status - priority @@ -197,23 +175,19 @@ views: - recurrence - complete_instances sort: - - column: formula.urgencyScore + - property: formula.urgencyScore direction: DESC - type: tasknotesTaskList - name: "Unscheduled" + 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 - - "!complete_instances.contains(today().format(\"yyyy-MM-dd\"))" - # No due date and no scheduled date + - and: + - recurrence.isEmpty() + - status != "done" + - and: + - recurrence + - '!complete_instances.contains(today().format("yyyy-MM-dd"))' - date(due).isEmpty() - date(scheduled).isEmpty() order: @@ -229,5 +203,5 @@ views: - recurrence - complete_instances sort: - - column: status + - property: status direction: ASC