vault backup: 2025-12-09 23:33:33
All checks were successful
Deploy Quartz site to GitHub Pages / build (push) Successful in 1m52s
All checks were successful
Deploy Quartz site to GitHub Pages / build (push) Successful in 1m52s
This commit is contained in:
3
content/.obsidian/community-plugins.json
vendored
3
content/.obsidian/community-plugins.json
vendored
@@ -10,5 +10,6 @@
|
|||||||
"agent-client",
|
"agent-client",
|
||||||
"manual-sorting",
|
"manual-sorting",
|
||||||
"obsidian-icon-folder",
|
"obsidian-icon-folder",
|
||||||
"image-converter"
|
"image-converter",
|
||||||
|
"tasknotes"
|
||||||
]
|
]
|
||||||
292
content/.obsidian/plugins/tasknotes/data.json
vendored
Normal file
292
content/.obsidian/plugins/tasknotes/data.json
vendored
Normal file
@@ -0,0 +1,292 @@
|
|||||||
|
{
|
||||||
|
"tasksFolder": "TaskNotes/Tasks",
|
||||||
|
"moveArchivedTasks": false,
|
||||||
|
"archiveFolder": "TaskNotes/Archive",
|
||||||
|
"taskTag": "task",
|
||||||
|
"taskIdentificationMethod": "tag",
|
||||||
|
"hideIdentifyingTagsInCards": false,
|
||||||
|
"taskPropertyName": "",
|
||||||
|
"taskPropertyValue": "",
|
||||||
|
"excludedFolders": "",
|
||||||
|
"defaultTaskPriority": "normal",
|
||||||
|
"defaultTaskStatus": "open",
|
||||||
|
"taskOrgFiltersCollapsed": false,
|
||||||
|
"taskFilenameFormat": "zettel",
|
||||||
|
"storeTitleInFilename": true,
|
||||||
|
"customFilenameTemplate": "{title}",
|
||||||
|
"taskCreationDefaults": {
|
||||||
|
"defaultContexts": "",
|
||||||
|
"defaultTags": "",
|
||||||
|
"defaultProjects": "",
|
||||||
|
"useParentNoteAsProject": false,
|
||||||
|
"defaultTimeEstimate": 0,
|
||||||
|
"defaultRecurrence": "none",
|
||||||
|
"defaultDueDate": "none",
|
||||||
|
"defaultScheduledDate": "today",
|
||||||
|
"bodyTemplate": "",
|
||||||
|
"useBodyTemplate": false,
|
||||||
|
"defaultReminders": []
|
||||||
|
},
|
||||||
|
"calendarViewSettings": {
|
||||||
|
"defaultView": "dayGridMonth",
|
||||||
|
"customDayCount": 3,
|
||||||
|
"slotDuration": "00:30:00",
|
||||||
|
"slotMinTime": "00:00:00",
|
||||||
|
"slotMaxTime": "24:00:00",
|
||||||
|
"scrollTime": "08:00:00",
|
||||||
|
"firstDay": 1,
|
||||||
|
"timeFormat": "24",
|
||||||
|
"showWeekends": true,
|
||||||
|
"locale": "",
|
||||||
|
"defaultShowScheduled": true,
|
||||||
|
"defaultShowDue": true,
|
||||||
|
"defaultShowDueWhenScheduled": true,
|
||||||
|
"defaultShowTimeEntries": false,
|
||||||
|
"defaultShowRecurring": true,
|
||||||
|
"defaultShowICSEvents": true,
|
||||||
|
"enableTimeblocking": false,
|
||||||
|
"defaultShowTimeblocks": true,
|
||||||
|
"nowIndicator": true,
|
||||||
|
"selectMirror": true,
|
||||||
|
"weekNumbers": false,
|
||||||
|
"showTodayHighlight": true,
|
||||||
|
"eventMinHeight": 15,
|
||||||
|
"slotEventOverlap": true,
|
||||||
|
"eventMaxStack": null,
|
||||||
|
"dayMaxEvents": true,
|
||||||
|
"dayMaxEventRows": false
|
||||||
|
},
|
||||||
|
"pomodoroWorkDuration": 25,
|
||||||
|
"pomodoroShortBreakDuration": 5,
|
||||||
|
"pomodoroLongBreakDuration": 15,
|
||||||
|
"pomodoroLongBreakInterval": 4,
|
||||||
|
"pomodoroAutoStartBreaks": true,
|
||||||
|
"pomodoroAutoStartWork": false,
|
||||||
|
"pomodoroNotifications": true,
|
||||||
|
"pomodoroSoundEnabled": true,
|
||||||
|
"pomodoroSoundVolume": 50,
|
||||||
|
"pomodoroStorageLocation": "plugin",
|
||||||
|
"enableTaskLinkOverlay": true,
|
||||||
|
"enableInstantTaskConvert": true,
|
||||||
|
"useDefaultsOnInstantConvert": true,
|
||||||
|
"enableNaturalLanguageInput": true,
|
||||||
|
"nlpDefaultToScheduled": true,
|
||||||
|
"nlpLanguage": "en",
|
||||||
|
"uiLanguage": "system",
|
||||||
|
"statusSuggestionTrigger": "*",
|
||||||
|
"nlpTriggers": {
|
||||||
|
"triggers": [
|
||||||
|
{
|
||||||
|
"propertyId": "tags",
|
||||||
|
"trigger": "#",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"propertyId": "contexts",
|
||||||
|
"trigger": "@",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"propertyId": "projects",
|
||||||
|
"trigger": "+",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"propertyId": "status",
|
||||||
|
"trigger": "*",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"propertyId": "priority",
|
||||||
|
"trigger": "!",
|
||||||
|
"enabled": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"singleClickAction": "edit",
|
||||||
|
"doubleClickAction": "openNote",
|
||||||
|
"projectAutosuggest": {
|
||||||
|
"enableFuzzy": false,
|
||||||
|
"rows": [
|
||||||
|
"{title|n(Title)}",
|
||||||
|
"{aliases|n(Aliases)}",
|
||||||
|
"{file.path|n(Path)}"
|
||||||
|
],
|
||||||
|
"showAdvanced": false,
|
||||||
|
"requiredTags": [],
|
||||||
|
"includeFolders": [],
|
||||||
|
"propertyKey": "",
|
||||||
|
"propertyValue": ""
|
||||||
|
},
|
||||||
|
"inlineTaskConvertFolder": "{{currentNotePath}}",
|
||||||
|
"disableNoteIndexing": false,
|
||||||
|
"suggestionDebounceMs": 0,
|
||||||
|
"fieldMapping": {
|
||||||
|
"title": "title",
|
||||||
|
"status": "status",
|
||||||
|
"priority": "priority",
|
||||||
|
"due": "due",
|
||||||
|
"scheduled": "scheduled",
|
||||||
|
"contexts": "contexts",
|
||||||
|
"projects": "projects",
|
||||||
|
"timeEstimate": "timeEstimate",
|
||||||
|
"completedDate": "completedDate",
|
||||||
|
"dateCreated": "dateCreated",
|
||||||
|
"dateModified": "dateModified",
|
||||||
|
"recurrence": "recurrence",
|
||||||
|
"recurrenceAnchor": "recurrence_anchor",
|
||||||
|
"archiveTag": "archived",
|
||||||
|
"timeEntries": "timeEntries",
|
||||||
|
"completeInstances": "complete_instances",
|
||||||
|
"skippedInstances": "skipped_instances",
|
||||||
|
"blockedBy": "blockedBy",
|
||||||
|
"pomodoros": "pomodoros",
|
||||||
|
"icsEventId": "icsEventId",
|
||||||
|
"icsEventTag": "ics_event",
|
||||||
|
"reminders": "reminders"
|
||||||
|
},
|
||||||
|
"customStatuses": [
|
||||||
|
{
|
||||||
|
"id": "none",
|
||||||
|
"value": "none",
|
||||||
|
"label": "None",
|
||||||
|
"color": "#cccccc",
|
||||||
|
"isCompleted": false,
|
||||||
|
"order": 0,
|
||||||
|
"autoArchive": false,
|
||||||
|
"autoArchiveDelay": 5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "open",
|
||||||
|
"value": "open",
|
||||||
|
"label": "Open",
|
||||||
|
"color": "#808080",
|
||||||
|
"isCompleted": false,
|
||||||
|
"order": 1,
|
||||||
|
"autoArchive": false,
|
||||||
|
"autoArchiveDelay": 5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "in-progress",
|
||||||
|
"value": "in-progress",
|
||||||
|
"label": "In progress",
|
||||||
|
"color": "#0066cc",
|
||||||
|
"isCompleted": false,
|
||||||
|
"order": 2,
|
||||||
|
"autoArchive": false,
|
||||||
|
"autoArchiveDelay": 5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "done",
|
||||||
|
"value": "done",
|
||||||
|
"label": "Done",
|
||||||
|
"color": "#00aa00",
|
||||||
|
"isCompleted": true,
|
||||||
|
"order": 3,
|
||||||
|
"autoArchive": false,
|
||||||
|
"autoArchiveDelay": 5
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"customPriorities": [
|
||||||
|
{
|
||||||
|
"id": "none",
|
||||||
|
"value": "none",
|
||||||
|
"label": "None",
|
||||||
|
"color": "#cccccc",
|
||||||
|
"weight": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "low",
|
||||||
|
"value": "low",
|
||||||
|
"label": "Low",
|
||||||
|
"color": "#00aa00",
|
||||||
|
"weight": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "normal",
|
||||||
|
"value": "normal",
|
||||||
|
"label": "Normal",
|
||||||
|
"color": "#ffaa00",
|
||||||
|
"weight": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "high",
|
||||||
|
"value": "high",
|
||||||
|
"label": "High",
|
||||||
|
"color": "#ff0000",
|
||||||
|
"weight": 3
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"recurrenceMigrated": false,
|
||||||
|
"showReleaseNotesOnUpdate": true,
|
||||||
|
"showTrackedTasksInStatusBar": false,
|
||||||
|
"autoStopTimeTrackingOnComplete": true,
|
||||||
|
"autoStopTimeTrackingNotification": false,
|
||||||
|
"showRelationships": true,
|
||||||
|
"relationshipsPosition": "bottom",
|
||||||
|
"showTaskCardInNote": true,
|
||||||
|
"showExpandableSubtasks": true,
|
||||||
|
"subtaskChevronPosition": "right",
|
||||||
|
"viewsButtonAlignment": "right",
|
||||||
|
"hideCompletedFromOverdue": true,
|
||||||
|
"icsIntegration": {
|
||||||
|
"defaultNoteTemplate": "",
|
||||||
|
"defaultNoteFolder": "",
|
||||||
|
"icsNoteFilenameFormat": "title",
|
||||||
|
"customICSNoteFilenameTemplate": "{title}",
|
||||||
|
"enableAutoExport": false,
|
||||||
|
"autoExportPath": "tasknotes-calendar.ics",
|
||||||
|
"autoExportInterval": 60
|
||||||
|
},
|
||||||
|
"savedViews": [],
|
||||||
|
"enableNotifications": true,
|
||||||
|
"notificationType": "system",
|
||||||
|
"enableAPI": false,
|
||||||
|
"apiPort": 8080,
|
||||||
|
"apiAuthToken": "",
|
||||||
|
"webhooks": [],
|
||||||
|
"userFields": [],
|
||||||
|
"enableModalSplitLayout": true,
|
||||||
|
"defaultVisibleProperties": [
|
||||||
|
"status",
|
||||||
|
"priority",
|
||||||
|
"due",
|
||||||
|
"scheduled",
|
||||||
|
"projects",
|
||||||
|
"contexts",
|
||||||
|
"tags",
|
||||||
|
"blocked",
|
||||||
|
"blocking"
|
||||||
|
],
|
||||||
|
"inlineVisibleProperties": [
|
||||||
|
"status",
|
||||||
|
"priority",
|
||||||
|
"due",
|
||||||
|
"scheduled",
|
||||||
|
"recurrence"
|
||||||
|
],
|
||||||
|
"enableBases": true,
|
||||||
|
"commandFileMapping": {
|
||||||
|
"open-calendar-view": "TaskNotes/Views/mini-calendar-default.base",
|
||||||
|
"open-kanban-view": "TaskNotes/Views/kanban-default.base",
|
||||||
|
"open-tasks-view": "TaskNotes/Views/tasks-default.base",
|
||||||
|
"open-advanced-calendar-view": "TaskNotes/Views/calendar-default.base",
|
||||||
|
"open-agenda-view": "TaskNotes/Views/agenda-default.base",
|
||||||
|
"relationships": "TaskNotes/Views/relationships.base"
|
||||||
|
},
|
||||||
|
"maintainDueDateOffsetInRecurring": false,
|
||||||
|
"useFrontmatterMarkdownLinks": false,
|
||||||
|
"oauthSetupMode": "advanced",
|
||||||
|
"lemonSqueezyLicenseKey": "",
|
||||||
|
"googleOAuthClientId": "",
|
||||||
|
"googleOAuthClientSecret": "",
|
||||||
|
"microsoftOAuthClientId": "",
|
||||||
|
"microsoftOAuthClientSecret": "",
|
||||||
|
"enableGoogleCalendar": false,
|
||||||
|
"enableMicrosoftCalendar": false,
|
||||||
|
"enabledGoogleCalendars": [],
|
||||||
|
"googleCalendarSyncTokens": {},
|
||||||
|
"enabledMicrosoftCalendars": [],
|
||||||
|
"microsoftCalendarSyncTokens": {},
|
||||||
|
"lastSeenVersion": "4.1.3"
|
||||||
|
}
|
||||||
1883
content/.obsidian/plugins/tasknotes/main.js
vendored
Normal file
1883
content/.obsidian/plugins/tasknotes/main.js
vendored
Normal file
File diff suppressed because one or more lines are too long
10
content/.obsidian/plugins/tasknotes/manifest.json
vendored
Normal file
10
content/.obsidian/plugins/tasknotes/manifest.json
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"id": "tasknotes",
|
||||||
|
"name": "TaskNotes",
|
||||||
|
"version": "4.1.3",
|
||||||
|
"minAppVersion": "1.10.1",
|
||||||
|
"description": "Note-based task management with calendar, pomodoro and time-tracking integration.",
|
||||||
|
"author": "Callum Alpass",
|
||||||
|
"authorUrl": "https://github.com/callumalpass",
|
||||||
|
"isDesktopOnly": false
|
||||||
|
}
|
||||||
19213
content/.obsidian/plugins/tasknotes/styles.css
vendored
Normal file
19213
content/.obsidian/plugins/tasknotes/styles.css
vendored
Normal file
File diff suppressed because it is too large
Load Diff
47
content/.obsidian/workspace.json
vendored
47
content/.obsidian/workspace.json
vendored
@@ -4,22 +4,20 @@
|
|||||||
"type": "split",
|
"type": "split",
|
||||||
"children": [
|
"children": [
|
||||||
{
|
{
|
||||||
"id": "7b7a63dd0bab0bc6",
|
"id": "b89ff55393473206",
|
||||||
"type": "tabs",
|
"type": "tabs",
|
||||||
"children": [
|
"children": [
|
||||||
{
|
{
|
||||||
"id": "e37d77cee0dbc12f",
|
"id": "d89c9bed2dbbc633",
|
||||||
"type": "leaf",
|
"type": "leaf",
|
||||||
"state": {
|
"state": {
|
||||||
"type": "markdown",
|
"type": "bases",
|
||||||
"state": {
|
"state": {
|
||||||
"file": "Biokemi/Metabolism/Enzymer/Anteckningar I.md",
|
"file": "TaskNotes/Views/calendar-default.base",
|
||||||
"mode": "source",
|
"viewName": "Calendar"
|
||||||
"source": false,
|
|
||||||
"backlinks": false
|
|
||||||
},
|
},
|
||||||
"icon": "lucide-file",
|
"icon": "lucide-layout-list",
|
||||||
"title": "Anteckningar I"
|
"title": "calendar-default"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -176,11 +174,28 @@
|
|||||||
"agent-client:Open agent client": false,
|
"agent-client:Open agent client": false,
|
||||||
"graph:Open graph view": false,
|
"graph:Open graph view": false,
|
||||||
"templates:Insert template": false,
|
"templates:Insert template": false,
|
||||||
"random-note:Open random note": false
|
"random-note:Open random note": false,
|
||||||
|
"tasknotes:Open mini calendar": false,
|
||||||
|
"tasknotes:Open advanced calendar": false,
|
||||||
|
"tasknotes:Open task list": false,
|
||||||
|
"tasknotes:Open agenda": false,
|
||||||
|
"tasknotes:Open kanban board": false,
|
||||||
|
"tasknotes:Open pomodoro": false,
|
||||||
|
"tasknotes:Open pomodoro stats": false,
|
||||||
|
"tasknotes:Create new task": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"active": "41f1a2a8dc1c3ad7",
|
"active": "d89c9bed2dbbc633",
|
||||||
"lastOpenFiles": [
|
"lastOpenFiles": [
|
||||||
|
"TaskNotes/Views/mini-calendar-default.base",
|
||||||
|
"Biokemi/Metabolism/Enzymer/Anteckningar I.md",
|
||||||
|
"TaskNotes/Views/relationships.base",
|
||||||
|
"TaskNotes/Views/agenda-default.base",
|
||||||
|
"TaskNotes/Views/calendar-default.base",
|
||||||
|
"TaskNotes/Views/tasks-default.base",
|
||||||
|
"TaskNotes/Views/kanban-default.base",
|
||||||
|
"TaskNotes/Views",
|
||||||
|
"TaskNotes",
|
||||||
"Biokemi/Metabolism/🍖 Aminosyrametabolism/Anteckningar.md",
|
"Biokemi/Metabolism/🍖 Aminosyrametabolism/Anteckningar.md",
|
||||||
"Biokemi/Metabolism/⛓️ Elektrontransportkedjan/🗒 Anteckningar.md",
|
"Biokemi/Metabolism/⛓️ Elektrontransportkedjan/🗒 Anteckningar.md",
|
||||||
"Biokemi/Gamla tentor/2023-12-18/13.md",
|
"Biokemi/Gamla tentor/2023-12-18/13.md",
|
||||||
@@ -205,18 +220,8 @@
|
|||||||
"Biokemi/Gamla tentor/2024-08-01/23.md",
|
"Biokemi/Gamla tentor/2024-08-01/23.md",
|
||||||
"Biokemi/Gamla tentor/2024-08-01/17.md",
|
"Biokemi/Gamla tentor/2024-08-01/17.md",
|
||||||
"Biokemi/Gamla tentor/2024-08-01/16.md",
|
"Biokemi/Gamla tentor/2024-08-01/16.md",
|
||||||
"Biokemi/Gamla tentor/2024-08-01/20.md",
|
|
||||||
"Biokemi/Gamla tentor/2024-08-01/27.md",
|
|
||||||
"Biokemi/Gamla tentor/2022-12-19/2022-12-19-0097-TUX.pdf",
|
"Biokemi/Gamla tentor/2022-12-19/2022-12-19-0097-TUX.pdf",
|
||||||
"Biokemi/Gamla tentor/2022-12-19/2022-12-19-0119-FAE.pdf",
|
"Biokemi/Gamla tentor/2022-12-19/2022-12-19-0119-FAE.pdf",
|
||||||
"Biokemi/Gamla tentor/2023-05-15/2023-05-15-0134-FDC.pdf",
|
|
||||||
"Biokemi/Gamla tentor/2023-12-18/2023-12-18-0075-GXD.pdf",
|
|
||||||
"Biokemi/Gamla tentor/2023-12-18/2023-12-18-0114-EES.pdf",
|
|
||||||
"Biokemi/Gamla tentor/2023-12-18/2023-12-18-0028-LAD.pdf",
|
|
||||||
"Biokemi/Gamla tentor/2024-01-27/2024-01-27-0096-APG.pdf",
|
|
||||||
"Biokemi/Gamla tentor/2024-05-15/2024-05-15-0068-GXS.pdf",
|
|
||||||
"Biokemi/Gamla tentor/2024-05-15/2024-05-15-0020-EBK.pdf",
|
|
||||||
"Biokemi/Gamla tentor/2024-05-15/2024-05-15-0018-UAE.pdf",
|
|
||||||
"Biokemi/Plasmidlabb/Bilder/IMG_1976.jpg",
|
"Biokemi/Plasmidlabb/Bilder/IMG_1976.jpg",
|
||||||
"Biokemi/Plasmidlabb/Bilder/IMG_1974.jpg",
|
"Biokemi/Plasmidlabb/Bilder/IMG_1974.jpg",
|
||||||
"Biokemi/Plasmidlabb/Bilder/IMG_0846.jpg",
|
"Biokemi/Plasmidlabb/Bilder/IMG_0846.jpg",
|
||||||
|
|||||||
66
content/TaskNotes/Views/agenda-default.base
Normal file
66
content/TaskNotes/Views/agenda-default.base
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
# 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")))))))'
|
||||||
|
|
||||||
|
views:
|
||||||
|
- type: tasknotesCalendar
|
||||||
|
name: "Agenda"
|
||||||
|
order:
|
||||||
|
- status
|
||||||
|
- priority
|
||||||
|
- due
|
||||||
|
- scheduled
|
||||||
|
- projects
|
||||||
|
- contexts
|
||||||
|
- file.tags
|
||||||
|
- blockedBy
|
||||||
|
- file.name
|
||||||
|
- recurrence
|
||||||
|
- complete_instances
|
||||||
|
calendarView: "listWeek"
|
||||||
|
startDateProperty: file.ctime
|
||||||
|
listDayCount: 7
|
||||||
|
titleProperty: file.basename
|
||||||
75
content/TaskNotes/Views/calendar-default.base
Normal file
75
content/TaskNotes/Views/calendar-default.base
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
# Calendar
|
||||||
|
|
||||||
|
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")))))))'
|
||||||
|
|
||||||
|
views:
|
||||||
|
- type: tasknotesCalendar
|
||||||
|
name: "Calendar"
|
||||||
|
order:
|
||||||
|
- status
|
||||||
|
- priority
|
||||||
|
- due
|
||||||
|
- scheduled
|
||||||
|
- projects
|
||||||
|
- contexts
|
||||||
|
- file.tags
|
||||||
|
- blockedBy
|
||||||
|
- file.name
|
||||||
|
- recurrence
|
||||||
|
- complete_instances
|
||||||
|
options:
|
||||||
|
showScheduled: true
|
||||||
|
showDue: true
|
||||||
|
showRecurring: true
|
||||||
|
showTimeEntries: true
|
||||||
|
showTimeblocks: true
|
||||||
|
showPropertyBasedEvents: true
|
||||||
|
calendarView: "timeGridWeek"
|
||||||
|
customDayCount: 3
|
||||||
|
firstDay: 0
|
||||||
|
slotMinTime: "06:00:00"
|
||||||
|
slotMaxTime: "22:00:00"
|
||||||
|
slotDuration: "00:30:00"
|
||||||
68
content/TaskNotes/Views/kanban-default.base
Normal file
68
content/TaskNotes/Views/kanban-default.base
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
# 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")))))))'
|
||||||
|
|
||||||
|
views:
|
||||||
|
- type: tasknotesKanban
|
||||||
|
name: "Kanban Board"
|
||||||
|
order:
|
||||||
|
- status
|
||||||
|
- priority
|
||||||
|
- due
|
||||||
|
- scheduled
|
||||||
|
- projects
|
||||||
|
- contexts
|
||||||
|
- file.tags
|
||||||
|
- blockedBy
|
||||||
|
- file.name
|
||||||
|
- recurrence
|
||||||
|
- complete_instances
|
||||||
|
groupBy:
|
||||||
|
property: status
|
||||||
|
direction: ASC
|
||||||
|
options:
|
||||||
|
columnWidth: 280
|
||||||
|
hideEmptyColumns: false
|
||||||
72
content/TaskNotes/Views/mini-calendar-default.base
Normal file
72
content/TaskNotes/Views/mini-calendar-default.base
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
filters:
|
||||||
|
and:
|
||||||
|
- file.hasTag("task")
|
||||||
|
formulas:
|
||||||
|
priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
|
||||||
|
daysUntilDue: if(due, ((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: tasknotesMiniCalendar
|
||||||
|
name: Due
|
||||||
|
order:
|
||||||
|
- status
|
||||||
|
- priority
|
||||||
|
- due
|
||||||
|
- scheduled
|
||||||
|
- projects
|
||||||
|
- contexts
|
||||||
|
- file.tags
|
||||||
|
- blockedBy
|
||||||
|
- file.name
|
||||||
|
- recurrence
|
||||||
|
- complete_instances
|
||||||
|
sort:
|
||||||
|
- property: due
|
||||||
|
direction: ASC
|
||||||
|
dateProperty: due
|
||||||
|
- type: tasknotesMiniCalendar
|
||||||
|
name: Scheduled
|
||||||
|
order: []
|
||||||
|
dateProperty: scheduled
|
||||||
|
- type: tasknotesMiniCalendar
|
||||||
|
name: Created
|
||||||
|
dateProperty: file.ctime
|
||||||
|
- type: tasknotesMiniCalendar
|
||||||
|
name: Modified
|
||||||
|
dateProperty: file.mtime
|
||||||
124
content/TaskNotes/Views/relationships.base
Normal file
124
content/TaskNotes/Views/relationships.base
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
# 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")))))))'
|
||||||
|
|
||||||
|
views:
|
||||||
|
- type: tasknotesKanban
|
||||||
|
name: "Subtasks"
|
||||||
|
filters:
|
||||||
|
and:
|
||||||
|
- note.projects.contains(this.file.asLink())
|
||||||
|
order:
|
||||||
|
- status
|
||||||
|
- priority
|
||||||
|
- due
|
||||||
|
- scheduled
|
||||||
|
- projects
|
||||||
|
- contexts
|
||||||
|
- file.tags
|
||||||
|
- blockedBy
|
||||||
|
- file.name
|
||||||
|
- recurrence
|
||||||
|
- complete_instances
|
||||||
|
groupBy:
|
||||||
|
property: status
|
||||||
|
direction: ASC
|
||||||
|
- type: tasknotesTaskList
|
||||||
|
name: "Projects"
|
||||||
|
filters:
|
||||||
|
and:
|
||||||
|
- list(this.projects).contains(file.asLink())
|
||||||
|
order:
|
||||||
|
- status
|
||||||
|
- priority
|
||||||
|
- due
|
||||||
|
- scheduled
|
||||||
|
- projects
|
||||||
|
- contexts
|
||||||
|
- file.tags
|
||||||
|
- blockedBy
|
||||||
|
- file.name
|
||||||
|
- recurrence
|
||||||
|
- complete_instances
|
||||||
|
- type: tasknotesTaskList
|
||||||
|
name: "Blocked By"
|
||||||
|
filters:
|
||||||
|
and:
|
||||||
|
- list(this.note.blockedBy).map(value.uid).contains(file.asLink())
|
||||||
|
order:
|
||||||
|
- status
|
||||||
|
- priority
|
||||||
|
- due
|
||||||
|
- scheduled
|
||||||
|
- projects
|
||||||
|
- contexts
|
||||||
|
- file.tags
|
||||||
|
- blockedBy
|
||||||
|
- file.name
|
||||||
|
- recurrence
|
||||||
|
- complete_instances
|
||||||
|
- type: tasknotesKanban
|
||||||
|
name: "Blocking"
|
||||||
|
filters:
|
||||||
|
and:
|
||||||
|
- note.blockedBy.map(value.uid).contains(this.file.asLink())
|
||||||
|
order:
|
||||||
|
- status
|
||||||
|
- priority
|
||||||
|
- due
|
||||||
|
- scheduled
|
||||||
|
- projects
|
||||||
|
- contexts
|
||||||
|
- file.tags
|
||||||
|
- blockedBy
|
||||||
|
- file.name
|
||||||
|
- recurrence
|
||||||
|
- complete_instances
|
||||||
|
groupBy:
|
||||||
|
property: status
|
||||||
|
direction: ASC
|
||||||
233
content/TaskNotes/Views/tasks-default.base
Normal file
233
content/TaskNotes/Views/tasks-default.base
Normal file
@@ -0,0 +1,233 @@
|
|||||||
|
# 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")))))))'
|
||||||
|
|
||||||
|
views:
|
||||||
|
- type: tasknotesTaskList
|
||||||
|
name: "All Tasks"
|
||||||
|
order:
|
||||||
|
- status
|
||||||
|
- priority
|
||||||
|
- due
|
||||||
|
- scheduled
|
||||||
|
- projects
|
||||||
|
- contexts
|
||||||
|
- file.tags
|
||||||
|
- blockedBy
|
||||||
|
- file.name
|
||||||
|
- recurrence
|
||||||
|
- complete_instances
|
||||||
|
sort:
|
||||||
|
- column: due
|
||||||
|
direction: ASC
|
||||||
|
- type: tasknotesTaskList
|
||||||
|
name: "Not Blocked"
|
||||||
|
filters:
|
||||||
|
and:
|
||||||
|
# Incomplete tasks
|
||||||
|
- or:
|
||||||
|
# Non-recurring task that's not in any completed status
|
||||||
|
- and:
|
||||||
|
- recurrence.isEmpty()
|
||||||
|
- status != "done"
|
||||||
|
# Recurring task where today is not in complete_instances
|
||||||
|
- and:
|
||||||
|
- recurrence
|
||||||
|
- "!complete_instances.contains(today().format(\"yyyy-MM-dd\"))"
|
||||||
|
# Not blocked by any incomplete tasks
|
||||||
|
- or:
|
||||||
|
# No blocking dependencies at all
|
||||||
|
- blockedBy.isEmpty()
|
||||||
|
# All blocking tasks are completed (filter returns only incomplete, then check if empty)
|
||||||
|
- 'list(blockedBy).filter(file(value.uid).properties.status != "done").isEmpty()'
|
||||||
|
order:
|
||||||
|
- status
|
||||||
|
- priority
|
||||||
|
- due
|
||||||
|
- scheduled
|
||||||
|
- projects
|
||||||
|
- contexts
|
||||||
|
- file.tags
|
||||||
|
- blockedBy
|
||||||
|
- file.name
|
||||||
|
- recurrence
|
||||||
|
- complete_instances
|
||||||
|
sort:
|
||||||
|
- column: formula.urgencyScore
|
||||||
|
direction: DESC
|
||||||
|
- type: tasknotesTaskList
|
||||||
|
name: "Today"
|
||||||
|
filters:
|
||||||
|
and:
|
||||||
|
# Incomplete tasks (handles both recurring and non-recurring)
|
||||||
|
- or:
|
||||||
|
# Non-recurring task that's not in any completed status
|
||||||
|
- and:
|
||||||
|
- recurrence.isEmpty()
|
||||||
|
- status != "done"
|
||||||
|
# Recurring task where today is not in complete_instances
|
||||||
|
- and:
|
||||||
|
- recurrence
|
||||||
|
- "!complete_instances.contains(today().format(\"yyyy-MM-dd\"))"
|
||||||
|
# Due or scheduled today
|
||||||
|
- or:
|
||||||
|
- date(due) == today()
|
||||||
|
- date(scheduled) == today()
|
||||||
|
order:
|
||||||
|
- status
|
||||||
|
- priority
|
||||||
|
- due
|
||||||
|
- scheduled
|
||||||
|
- projects
|
||||||
|
- contexts
|
||||||
|
- file.tags
|
||||||
|
- blockedBy
|
||||||
|
- file.name
|
||||||
|
- recurrence
|
||||||
|
- complete_instances
|
||||||
|
sort:
|
||||||
|
- column: formula.urgencyScore
|
||||||
|
direction: DESC
|
||||||
|
- type: tasknotesTaskList
|
||||||
|
name: "Overdue"
|
||||||
|
filters:
|
||||||
|
and:
|
||||||
|
# Incomplete tasks
|
||||||
|
- or:
|
||||||
|
# Non-recurring task that's not in any completed status
|
||||||
|
- and:
|
||||||
|
- recurrence.isEmpty()
|
||||||
|
- status != "done"
|
||||||
|
# Recurring task where today is not in complete_instances
|
||||||
|
- and:
|
||||||
|
- recurrence
|
||||||
|
- "!complete_instances.contains(today().format(\"yyyy-MM-dd\"))"
|
||||||
|
# Due in the past
|
||||||
|
- date(due) < today()
|
||||||
|
order:
|
||||||
|
- status
|
||||||
|
- priority
|
||||||
|
- due
|
||||||
|
- scheduled
|
||||||
|
- projects
|
||||||
|
- contexts
|
||||||
|
- file.tags
|
||||||
|
- blockedBy
|
||||||
|
- file.name
|
||||||
|
- recurrence
|
||||||
|
- complete_instances
|
||||||
|
sort:
|
||||||
|
- column: formula.urgencyScore
|
||||||
|
direction: DESC
|
||||||
|
- type: tasknotesTaskList
|
||||||
|
name: "This Week"
|
||||||
|
filters:
|
||||||
|
and:
|
||||||
|
# Incomplete tasks
|
||||||
|
- or:
|
||||||
|
# Non-recurring task that's not in any completed status
|
||||||
|
- and:
|
||||||
|
- recurrence.isEmpty()
|
||||||
|
- status != "done"
|
||||||
|
# Recurring task where today is not in complete_instances
|
||||||
|
- and:
|
||||||
|
- recurrence
|
||||||
|
- "!complete_instances.contains(today().format(\"yyyy-MM-dd\"))"
|
||||||
|
# Due or scheduled this week
|
||||||
|
- or:
|
||||||
|
- and:
|
||||||
|
- date(due) >= today()
|
||||||
|
- date(due) <= today() + "7 days"
|
||||||
|
- and:
|
||||||
|
- date(scheduled) >= today()
|
||||||
|
- date(scheduled) <= today() + "7 days"
|
||||||
|
order:
|
||||||
|
- status
|
||||||
|
- priority
|
||||||
|
- due
|
||||||
|
- scheduled
|
||||||
|
- projects
|
||||||
|
- contexts
|
||||||
|
- file.tags
|
||||||
|
- blockedBy
|
||||||
|
- file.name
|
||||||
|
- recurrence
|
||||||
|
- complete_instances
|
||||||
|
sort:
|
||||||
|
- column: formula.urgencyScore
|
||||||
|
direction: DESC
|
||||||
|
- type: tasknotesTaskList
|
||||||
|
name: "Unscheduled"
|
||||||
|
filters:
|
||||||
|
and:
|
||||||
|
# Incomplete tasks
|
||||||
|
- or:
|
||||||
|
# Non-recurring task that's not in any completed status
|
||||||
|
- and:
|
||||||
|
- recurrence.isEmpty()
|
||||||
|
- status != "done"
|
||||||
|
# Recurring task where today is not in complete_instances
|
||||||
|
- and:
|
||||||
|
- recurrence
|
||||||
|
- "!complete_instances.contains(today().format(\"yyyy-MM-dd\"))"
|
||||||
|
# No due date and no scheduled date
|
||||||
|
- date(due).isEmpty()
|
||||||
|
- date(scheduled).isEmpty()
|
||||||
|
order:
|
||||||
|
- status
|
||||||
|
- priority
|
||||||
|
- due
|
||||||
|
- scheduled
|
||||||
|
- projects
|
||||||
|
- contexts
|
||||||
|
- file.tags
|
||||||
|
- blockedBy
|
||||||
|
- file.name
|
||||||
|
- recurrence
|
||||||
|
- complete_instances
|
||||||
|
sort:
|
||||||
|
- column: status
|
||||||
|
direction: ASC
|
||||||
Reference in New Issue
Block a user