vault backup: 2026-06-05 12:41:25
This commit is contained in:
Vendored
+1
-1
@@ -7,7 +7,7 @@
|
||||
"autoPairMarkdown": true,
|
||||
"useTab": false,
|
||||
"alwaysUpdateLinks": true,
|
||||
"tabSize": 4,
|
||||
"tabSize": 2,
|
||||
"vimMode": true,
|
||||
"promptDelete": false,
|
||||
"focusNewTab": true,
|
||||
|
||||
Vendored
-1
@@ -30,6 +30,5 @@
|
||||
"obsidian-citation-plugin",
|
||||
"obsidian-quiet-outline",
|
||||
"inline-spoilers",
|
||||
"daily-notes-editor",
|
||||
"tasknotes"
|
||||
]
|
||||
-16
@@ -1,16 +0,0 @@
|
||||
{
|
||||
"hideFrontmatter": true,
|
||||
"hideBacklinks": false,
|
||||
"createAndOpenOnStartup": false,
|
||||
"useArrowUpOrDownToNavigate": false,
|
||||
"preset": [
|
||||
{
|
||||
"type": "folder",
|
||||
"target": "timestamped"
|
||||
},
|
||||
{
|
||||
"type": "folder",
|
||||
"target": "daily"
|
||||
}
|
||||
]
|
||||
}
|
||||
-4251
File diff suppressed because it is too large
Load Diff
@@ -1,15 +0,0 @@
|
||||
{
|
||||
"id": "daily-notes-editor",
|
||||
"name": "Daily Notes Editor",
|
||||
"version": "1.1.0",
|
||||
"minAppVersion": "0.15.0",
|
||||
"description": "Edit a bunch of daily notes in one page(inline), which works similar to Roam Research's default daily note view.",
|
||||
"author": "Boninall",
|
||||
"authorUrl": "https://github.com/Quorafind",
|
||||
"fundingUrl": {
|
||||
"Buy Me a Coffee": "https://www.buymeacoffee.com/boninall",
|
||||
"爱发电": "https://afdian.net/a/boninall",
|
||||
"支付宝": "https://cdn.jsdelivr.net/gh/Quorafind/.github@main/IMAGE/%E6%94%AF%E4%BB%98%E5%AE%9D%E4%BB%98%E6%AC%BE%E7%A0%81.jpg"
|
||||
},
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
-220
@@ -1,220 +0,0 @@
|
||||
.dn-editor {
|
||||
/*overflow-y: hidden;*/
|
||||
}
|
||||
|
||||
.dn-editor .cm-scroller {
|
||||
/*overflow-y: hidden;*/
|
||||
padding: unset;
|
||||
}
|
||||
|
||||
.dn-editor .workspace-leaf {
|
||||
all: unset;
|
||||
}
|
||||
|
||||
.dn-editor .dn-content {
|
||||
display: none;
|
||||
/*margin: 0;*/
|
||||
/*border-radius: var(--he-popover-border-radius);*/
|
||||
/*overflow: hidden;*/
|
||||
/*height: 100%;*/
|
||||
}
|
||||
|
||||
.dn-editor .workspace-leaf,
|
||||
.dn-editor .workspace-split {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.dn-editor .markdown-source-view.mod-cm6 .cm-editor {
|
||||
min-height: auto;
|
||||
}
|
||||
|
||||
.dn-editor .cm-content {
|
||||
padding-bottom: 0 !important;
|
||||
padding-top: 0 !important;
|
||||
}
|
||||
|
||||
.dn-editor .view-content {
|
||||
background: none !important;
|
||||
}
|
||||
|
||||
.dn-editor .cm-scroller {
|
||||
padding: 0 !important;
|
||||
overflow-y: clip;
|
||||
}
|
||||
.daily-note-view .daily-note-wrapper::before {
|
||||
content: "";
|
||||
display: block;
|
||||
height: 1px;
|
||||
width: var(--file-line-width);
|
||||
margin-bottom: 30px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
background-color: var(--background-modifier-border);
|
||||
}
|
||||
|
||||
.daily-note-view .daily-note-wrapper:first-of-type::before {
|
||||
height: 0px;
|
||||
}
|
||||
|
||||
.daily-note-view .dn-range-indicator + .daily-note-container::before {
|
||||
height: 0px;
|
||||
}
|
||||
|
||||
.is-popout-window .dn-editor .dn-content {
|
||||
margin: 0;
|
||||
border-radius: var(--he-popover-border-radius);
|
||||
overflow: hidden;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.is-popout-window .dn-editor .workspace-leaf,
|
||||
.is-popout-window .dn-editor .workspace-split {
|
||||
height: auto;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.is-popout-window .dn-editor .cm-scroller {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.is-popout-window .dn-editor .markdown-source-view.mod-cm6 {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.is-popout-window .dn-editor .view-content {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.is-popout-window .dn-editor .workspace-leaf-content {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.daily-note-view .embedded-backlinks {
|
||||
min-height: unset !important;
|
||||
}
|
||||
|
||||
.daily-note-view {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--size-4-4);
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
body.daily-notes-hide-frontmatter
|
||||
.daily-note-view
|
||||
.markdown-source-view.is-live-preview.show-properties
|
||||
.metadata-container {
|
||||
display: none;
|
||||
}
|
||||
|
||||
body.daily-notes-hide-backlinks .daily-note-view .embedded-backlinks {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Custom Range Modal Styles */
|
||||
.custom-range-date-container {
|
||||
margin-bottom: var(--size-4-2);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.custom-range-date-container span {
|
||||
width: 100px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.custom-range-date-container input {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.custom-range-button-container {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
margin-top: var(--size-4-4);
|
||||
gap: var(--size-4-2);
|
||||
}
|
||||
|
||||
/* Preset management styles */
|
||||
.preset-container {
|
||||
margin-bottom: var(--size-4-4);
|
||||
}
|
||||
|
||||
.no-presets-message {
|
||||
color: var(--text-muted);
|
||||
font-style: italic;
|
||||
margin: var(--size-4-2) 0;
|
||||
}
|
||||
|
||||
.preset-list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--size-4-2);
|
||||
margin: var(--size-4-2) 0;
|
||||
}
|
||||
|
||||
.preset-item {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: var(--size-2-4) var(--size-4-3);
|
||||
background-color: var(--background-secondary);
|
||||
border-radius: var(--radius-s);
|
||||
}
|
||||
|
||||
.preset-info {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.preset-type {
|
||||
font-weight: bold;
|
||||
margin-right: var(--size-2-2);
|
||||
}
|
||||
|
||||
.preset-actions {
|
||||
display: flex;
|
||||
gap: var(--size-4-2);
|
||||
}
|
||||
|
||||
.preset-action-button {
|
||||
padding: var(--size-2-2) var(--size-2-4);
|
||||
border-radius: var(--radius-s);
|
||||
font-size: var(--font-ui-small);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.preset-open-button {
|
||||
background-color: var(--interactive-accent);
|
||||
color: var(--text-on-accent);
|
||||
}
|
||||
|
||||
.preset-delete-button {
|
||||
background-color: var(--background-modifier-error);
|
||||
color: var(--text-on-accent);
|
||||
}
|
||||
|
||||
/* Add preset modal styles */
|
||||
.setting-item {
|
||||
margin-bottom: var(--size-4-4);
|
||||
}
|
||||
|
||||
.target-input {
|
||||
width: 100%;
|
||||
padding: var(--size-2-3);
|
||||
border-radius: var(--radius-s);
|
||||
border: 1px solid var(--background-modifier-border);
|
||||
background-color: var(--background-primary);
|
||||
}
|
||||
|
||||
.modal-button-container {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: var(--size-4-2);
|
||||
margin-top: var(--size-4-4);
|
||||
}
|
||||
|
||||
.is-phone .mod-root .workspace-tabs:not(.mod-visible):has(.daily-note-view) {
|
||||
display: flex !important;
|
||||
}
|
||||
.daily-note.svelte-1d2sruf.svelte-1d2sruf{margin-bottom:var(--size-4-5);padding-bottom:var(--size-4-8)}.daily-note.svelte-1d2sruf.svelte-1d2sruf:has(.daily-note-editor[data-collapsed="true"]){margin-bottom:0;padding-bottom:0}.daily-note-editor.svelte-1d2sruf.svelte-1d2sruf{min-height:100px}.daily-note-editor[data-collapsed="true"].svelte-1d2sruf.svelte-1d2sruf{display:none}.daily-note.svelte-1d2sruf .collapse-button.svelte-1d2sruf{display:none}.daily-note.svelte-1d2sruf:hover .collapse-button.svelte-1d2sruf{display:block}.daily-note.svelte-1d2sruf .collapse-button.svelte-1d2sruf{color:var(--text-muted)}.daily-note.svelte-1d2sruf .collapse-button.svelte-1d2sruf:hover{color:var(--text-normal)}.daily-note.svelte-1d2sruf:has(.is-readable-line-width) .daily-note-title.svelte-1d2sruf{max-width:calc(var(--file-line-width) + var(--size-4-4));width:calc(var(--file-line-width) + var(--size-4-4));margin-left:auto;margin-right:auto;margin-bottom:var(--size-4-8);display:flex;align-items:center;justify-content:start;gap:var(--size-4-2)}.collapse-button.svelte-1d2sruf.svelte-1d2sruf{margin-left:calc(var(--size-4-8) * -1)}.collapse-button[data-collapsed="true"].svelte-1d2sruf.svelte-1d2sruf{transform:rotate(-90deg);transition:transform 0.2s ease}.daily-note.svelte-1d2sruf:not(:has(.is-readable-line-width)) .daily-note-title.svelte-1d2sruf{display:flex;justify-content:start;align-items:center;width:100%;padding-left:calc(calc(100% - var(--file-line-width)) / 2 - var(--size-4-2));padding-right:calc(calc(100% - var(--file-line-width)) / 2 - var(--size-4-2));margin-top:var(--size-4-8);gap:var(--size-4-2)}.clickable-link.svelte-1d2sruf.svelte-1d2sruf{cursor:pointer;text-decoration:none}.clickable-link.svelte-1d2sruf.svelte-1d2sruf:hover{color:var(--color-accent);text-decoration:underline}.editor-placeholder.svelte-1d2sruf.svelte-1d2sruf{display:flex;justify-content:center;align-items:center;height:100px;color:var(--text-muted);font-style:italic}.collapse-button.svelte-1d2sruf.svelte-1d2sruf{cursor:pointer;display:flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:4px;color:var(--text-muted);transition:background-color 0.2s ease}.collapse-button.svelte-1d2sruf.svelte-1d2sruf:hover{color:var(--text-normal)}.dn-stock.svelte-4q3cv7{height:1000px;width:100%;display:flex;justify-content:center;align-items:center}.dn-stock-text.svelte-4q3cv7{text-align:center}.no-more-text.svelte-4q3cv7{margin-left:auto;margin-right:auto;text-align:center}.dn-blank-day.svelte-4q3cv7{display:flex;margin-left:auto;margin-right:auto;max-width:var(--file-line-width);color:var(--color-base-40);padding-top:20px;padding-bottom:20px;transition:all 300ms}.dn-blank-day.svelte-4q3cv7:hover{padding-top:40px;padding-bottom:40px;transition:padding 300ms}.dn-blank-day-text.svelte-4q3cv7{margin-left:auto;margin-right:auto;text-align:center}.daily-note-wrapper.svelte-4q3cv7{width:100%}
|
||||
+10
-40
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"tasksFolder": "tasks",
|
||||
"tasksFolder": "",
|
||||
"moveArchivedTasks": false,
|
||||
"archiveFolder": "TaskNotes/Archive",
|
||||
"taskTag": "type/task",
|
||||
@@ -72,7 +72,7 @@
|
||||
"pomodoroAutoStartBreaks": false,
|
||||
"pomodoroAutoStartWork": false,
|
||||
"pomodoroNotifications": true,
|
||||
"pomodoroSoundEnabled": true,
|
||||
"pomodoroSoundEnabled": false,
|
||||
"pomodoroSoundVolume": 50,
|
||||
"pomodoroStorageLocation": "daily-notes",
|
||||
"pomodoroMobileSidebar": "tab",
|
||||
@@ -431,7 +431,8 @@
|
||||
"status",
|
||||
"priority",
|
||||
"blocked",
|
||||
"blocking"
|
||||
"blocking",
|
||||
"totalTrackedTime"
|
||||
],
|
||||
"inlineVisibleProperties": [
|
||||
"status",
|
||||
@@ -461,7 +462,7 @@
|
||||
"microsoftOAuthClientSecret": "",
|
||||
"enableGoogleCalendar": false,
|
||||
"enableMicrosoftCalendar": false,
|
||||
"disableCalendarOnMobile": false,
|
||||
"disableCalendarOnMobile": true,
|
||||
"enabledGoogleCalendars": [],
|
||||
"googleCalendarSyncTokens": {},
|
||||
"enabledMicrosoftCalendars": [],
|
||||
@@ -469,10 +470,10 @@
|
||||
"googleCalendarExport": {
|
||||
"enabled": false,
|
||||
"targetCalendarId": "",
|
||||
"syncOnTaskCreate": true,
|
||||
"syncOnTaskUpdate": true,
|
||||
"syncOnTaskComplete": true,
|
||||
"syncOnTaskDelete": true,
|
||||
"syncOnTaskCreate": false,
|
||||
"syncOnTaskUpdate": false,
|
||||
"syncOnTaskComplete": false,
|
||||
"syncOnTaskDelete": false,
|
||||
"eventTitleTemplate": "{{title}}",
|
||||
"includeDescription": true,
|
||||
"eventColorId": null,
|
||||
@@ -483,36 +484,5 @@
|
||||
"defaultReminderMinutes": null
|
||||
},
|
||||
"enableDebugLogging": false,
|
||||
"googleCalendarSyncQueue": [
|
||||
{
|
||||
"taskPath": "timestamped/YYYY-MM-DD_HH-mm-ss.md",
|
||||
"requestedAt": 1780346458397,
|
||||
"attempts": 0,
|
||||
"lastError": "Google Calendar sync is not ready"
|
||||
},
|
||||
{
|
||||
"taskPath": "timestamped/2026-06-01_16-44-31.md",
|
||||
"requestedAt": 1780346671952,
|
||||
"attempts": 0,
|
||||
"lastError": "Google Calendar sync is not ready"
|
||||
},
|
||||
{
|
||||
"taskPath": "timestamped/2026-06-01_16-54-37.md",
|
||||
"requestedAt": 1780347277788,
|
||||
"attempts": 0,
|
||||
"lastError": "Google Calendar sync is not ready"
|
||||
},
|
||||
{
|
||||
"taskPath": "timestamped/2026-06-01_17-07-41.md",
|
||||
"requestedAt": 1780348061498,
|
||||
"attempts": 0,
|
||||
"lastError": "Google Calendar sync is not ready"
|
||||
},
|
||||
{
|
||||
"taskPath": "timestamped/2026-06-01_17-09-04.md",
|
||||
"requestedAt": 1780348144101,
|
||||
"attempts": 0,
|
||||
"lastError": "Google Calendar sync is not ready"
|
||||
}
|
||||
]
|
||||
"googleCalendarSyncQueue": []
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
---
|
||||
id: 2026-05-31
|
||||
title: 2026-05-31
|
||||
tags: []
|
||||
weekly: "[[2026w23]]"
|
||||
monthly: "[[2026-05]]"
|
||||
quarterly: "[[2026q2]]"
|
||||
previous: "[[2026-05-30]]"
|
||||
---
|
||||
# 2026-05-31
|
||||
@@ -8,5 +8,3 @@ quarterly: "[[2026q2]]"
|
||||
previous: "[[2026-06-02]]"
|
||||
---
|
||||
# 2026-06-03
|
||||
|
||||
testing^[[[2025-08-15_14-15-41]]]
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
---
|
||||
id: 2026-06-04
|
||||
title: 2026-06-04
|
||||
tags: []
|
||||
weekly: "[[2026w23]]"
|
||||
monthly: "[[2026-06]]"
|
||||
quarterly: "[[2026q2]]"
|
||||
previous: "[[2026-06-03]]"
|
||||
---
|
||||
# 2026-06-04
|
||||
@@ -0,0 +1,16 @@
|
||||
---
|
||||
id: 2026-06-05
|
||||
title: 2026-06-05
|
||||
tags: []
|
||||
weekly: "[[2026w23]]"
|
||||
monthly: "[[2026-06]]"
|
||||
quarterly: "[[2026q2]]"
|
||||
previous: "[[2026-06-04]]"
|
||||
---
|
||||
# 2026-06-05
|
||||
|
||||
When I got to work today, around 08:15,
|
||||
I watched one of the robot dogs plow into a bollard fixture.
|
||||
Unfortunately it kept going,
|
||||
and too fast for me to catch up
|
||||
to point and laugh into its camera.
|
||||
@@ -1,55 +1,51 @@
|
||||
# Calendar
|
||||
|
||||
filters:
|
||||
and:
|
||||
- file.hasTag("type/task")
|
||||
- file.inFolder("templates") != true
|
||||
|
||||
formulas:
|
||||
priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))'
|
||||
daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'
|
||||
dueIn: 'if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))'
|
||||
daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'
|
||||
daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'
|
||||
daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'
|
||||
isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != "done"'
|
||||
isDueToday: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'
|
||||
isDueThisWeek: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")'
|
||||
isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'
|
||||
isRecurring: 'recurrence && !recurrence.isEmpty()'
|
||||
hasTimeEstimate: 'timeEstimate && timeEstimate > 0'
|
||||
timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'
|
||||
efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'
|
||||
timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'
|
||||
timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'
|
||||
dueMonth: 'if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")'
|
||||
dueWeek: 'if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")'
|
||||
scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")'
|
||||
scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")'
|
||||
dueDateCategory: 'if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))'
|
||||
timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))'
|
||||
ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))'
|
||||
createdMonth: 'file.ctime.format("YYYY-MM")'
|
||||
modifiedMonth: 'file.mtime.format("YYYY-MM")'
|
||||
priorityCategory: 'if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))'
|
||||
projectCount: 'if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))'
|
||||
contextCount: 'if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))'
|
||||
trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))'
|
||||
nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'
|
||||
daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'
|
||||
hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'
|
||||
isToday: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))'
|
||||
isThisWeek: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))'
|
||||
nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))'
|
||||
nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))'
|
||||
nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))'
|
||||
urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))'
|
||||
timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")'
|
||||
dueDateDisplay: 'if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))'
|
||||
|
||||
priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
|
||||
daysUntilDue: if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)
|
||||
dueIn: if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))
|
||||
daysUntilScheduled: if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
|
||||
daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
|
||||
daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
|
||||
isOverdue: (due.isEmpty() == false) && date(due) < today() && status != "done"
|
||||
isDueToday: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||
isDueThisWeek: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
|
||||
isScheduledToday: (scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||
isRecurring: recurrence && !recurrence.isEmpty()
|
||||
hasTimeEstimate: timeEstimate && timeEstimate > 0
|
||||
timeRemaining: if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
|
||||
efficiencyRatio: if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)
|
||||
timeTrackedThisWeek: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||
timeTrackedToday: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||
dueMonth: if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")
|
||||
dueWeek: if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")
|
||||
scheduledMonth: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")
|
||||
scheduledWeek: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")
|
||||
dueDateCategory: if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))
|
||||
timeEstimateCategory: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))
|
||||
ageCategory: if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))
|
||||
createdMonth: file.ctime.format("YYYY-MM")
|
||||
modifiedMonth: file.mtime.format("YYYY-MM")
|
||||
priorityCategory: if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))
|
||||
projectCount: if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))
|
||||
contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))
|
||||
trackingStatus: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
|
||||
nextDate: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))
|
||||
daysUntilNext: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))
|
||||
hasDate: (due.isEmpty() == false) || (scheduled.isEmpty() == false)
|
||||
isToday: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))
|
||||
isThisWeek: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))
|
||||
nextDateCategory: if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))
|
||||
nextDateMonth: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))
|
||||
nextDateWeek: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))
|
||||
urgencyScore: if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))
|
||||
timeTrackedFormatted: if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")
|
||||
dueDateDisplay: if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))
|
||||
views:
|
||||
- type: tasknotesCalendar
|
||||
name: "Calendar"
|
||||
name: Calendar
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
@@ -66,7 +62,7 @@ views:
|
||||
showTimeblocks: true
|
||||
showPropertyBasedEvents: true
|
||||
createDailyNotesFromDateLinks: true
|
||||
calendarView: "timeGridWeek"
|
||||
calendarView: timeGridWeek
|
||||
customDayCount: 3
|
||||
firstDay: 0
|
||||
slotDuration: "00:30:00"
|
||||
slotDuration: 00:30:00
|
||||
|
||||
@@ -1,55 +1,57 @@
|
||||
# Kanban Board
|
||||
|
||||
filters:
|
||||
and:
|
||||
- file.hasTag("type/task")
|
||||
- file.inFolder("templates") != true
|
||||
|
||||
formulas:
|
||||
priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))'
|
||||
daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'
|
||||
dueIn: 'if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))'
|
||||
daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'
|
||||
daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'
|
||||
daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'
|
||||
isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != "done"'
|
||||
isDueToday: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'
|
||||
isDueThisWeek: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")'
|
||||
isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'
|
||||
isRecurring: 'recurrence && !recurrence.isEmpty()'
|
||||
hasTimeEstimate: 'timeEstimate && timeEstimate > 0'
|
||||
timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'
|
||||
efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'
|
||||
timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'
|
||||
timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'
|
||||
dueMonth: 'if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")'
|
||||
dueWeek: 'if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")'
|
||||
scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")'
|
||||
scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")'
|
||||
dueDateCategory: 'if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))'
|
||||
timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))'
|
||||
ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))'
|
||||
createdMonth: 'file.ctime.format("YYYY-MM")'
|
||||
modifiedMonth: 'file.mtime.format("YYYY-MM")'
|
||||
priorityCategory: 'if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))'
|
||||
projectCount: 'if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))'
|
||||
contextCount: 'if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))'
|
||||
trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))'
|
||||
nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'
|
||||
daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'
|
||||
hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'
|
||||
isToday: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))'
|
||||
isThisWeek: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))'
|
||||
nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))'
|
||||
nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))'
|
||||
nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))'
|
||||
urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))'
|
||||
timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")'
|
||||
dueDateDisplay: 'if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))'
|
||||
|
||||
priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
|
||||
daysUntilDue: if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)
|
||||
dueIn: if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))
|
||||
daysUntilScheduled: if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
|
||||
daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
|
||||
daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
|
||||
isOverdue: (due.isEmpty() == false) && date(due) < today() && status != "done"
|
||||
isDueToday: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||
isDueThisWeek: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
|
||||
isScheduledToday: (scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||
isRecurring: recurrence && !recurrence.isEmpty()
|
||||
hasTimeEstimate: timeEstimate && timeEstimate > 0
|
||||
timeRemaining: if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
|
||||
efficiencyRatio: if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)
|
||||
timeTrackedThisWeek: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||
timeTrackedToday: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||
dueMonth: if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")
|
||||
dueWeek: if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")
|
||||
scheduledMonth: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")
|
||||
scheduledWeek: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")
|
||||
dueDateCategory: if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))
|
||||
timeEstimateCategory: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))
|
||||
ageCategory: if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))
|
||||
createdMonth: file.ctime.format("YYYY-MM")
|
||||
modifiedMonth: file.mtime.format("YYYY-MM")
|
||||
priorityCategory: if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))
|
||||
projectCount: if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))
|
||||
contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))
|
||||
trackingStatus: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
|
||||
nextDate: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))
|
||||
daysUntilNext: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))
|
||||
hasDate: (due.isEmpty() == false) || (scheduled.isEmpty() == false)
|
||||
isToday: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))
|
||||
isThisWeek: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))
|
||||
nextDateCategory: if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))
|
||||
nextDateMonth: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))
|
||||
nextDateWeek: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))
|
||||
urgencyScore: if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))
|
||||
timeTrackedFormatted: if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")
|
||||
dueDateDisplay: if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))
|
||||
views:
|
||||
- type: tasknotesKanban
|
||||
name: "Kanban Board"
|
||||
name: Kanban Board
|
||||
filters:
|
||||
and:
|
||||
- recurrence.isEmpty()
|
||||
groupBy:
|
||||
property: status
|
||||
direction: ASC
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
@@ -59,11 +61,8 @@ views:
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
sort:
|
||||
- column: tasknotes_manual_order
|
||||
- property: tasknotes_manual_order
|
||||
direction: DESC
|
||||
groupBy:
|
||||
property: status
|
||||
direction: ASC
|
||||
options:
|
||||
columnWidth: 280
|
||||
hideEmptyColumns: false
|
||||
|
||||
@@ -1,56 +1,51 @@
|
||||
# Mini Calendar
|
||||
# Generated with your TaskNotes settings
|
||||
|
||||
filters:
|
||||
and:
|
||||
- file.hasTag("type/task")
|
||||
- file.inFolder("templates") != true
|
||||
|
||||
formulas:
|
||||
priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))'
|
||||
daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'
|
||||
dueIn: 'if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))'
|
||||
daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'
|
||||
daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'
|
||||
daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'
|
||||
isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != "done"'
|
||||
isDueToday: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'
|
||||
isDueThisWeek: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")'
|
||||
isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'
|
||||
isRecurring: 'recurrence && !recurrence.isEmpty()'
|
||||
hasTimeEstimate: 'timeEstimate && timeEstimate > 0'
|
||||
timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'
|
||||
efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'
|
||||
timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'
|
||||
timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'
|
||||
dueMonth: 'if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")'
|
||||
dueWeek: 'if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")'
|
||||
scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")'
|
||||
scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")'
|
||||
dueDateCategory: 'if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))'
|
||||
timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))'
|
||||
ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))'
|
||||
createdMonth: 'file.ctime.format("YYYY-MM")'
|
||||
modifiedMonth: 'file.mtime.format("YYYY-MM")'
|
||||
priorityCategory: 'if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))'
|
||||
projectCount: 'if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))'
|
||||
contextCount: 'if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))'
|
||||
trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))'
|
||||
nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'
|
||||
daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'
|
||||
hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'
|
||||
isToday: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))'
|
||||
isThisWeek: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))'
|
||||
nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))'
|
||||
nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))'
|
||||
nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))'
|
||||
urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))'
|
||||
timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")'
|
||||
dueDateDisplay: 'if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))'
|
||||
|
||||
priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
|
||||
daysUntilDue: if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)
|
||||
dueIn: if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))
|
||||
daysUntilScheduled: if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
|
||||
daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
|
||||
daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
|
||||
isOverdue: (due.isEmpty() == false) && date(due) < today() && status != "done"
|
||||
isDueToday: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||
isDueThisWeek: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
|
||||
isScheduledToday: (scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||
isRecurring: recurrence && !recurrence.isEmpty()
|
||||
hasTimeEstimate: timeEstimate && timeEstimate > 0
|
||||
timeRemaining: if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
|
||||
efficiencyRatio: if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)
|
||||
timeTrackedThisWeek: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||
timeTrackedToday: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||
dueMonth: if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")
|
||||
dueWeek: if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")
|
||||
scheduledMonth: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")
|
||||
scheduledWeek: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")
|
||||
dueDateCategory: if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))
|
||||
timeEstimateCategory: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))
|
||||
ageCategory: if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))
|
||||
createdMonth: file.ctime.format("YYYY-MM")
|
||||
modifiedMonth: file.mtime.format("YYYY-MM")
|
||||
priorityCategory: if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))
|
||||
projectCount: if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))
|
||||
contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))
|
||||
trackingStatus: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
|
||||
nextDate: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))
|
||||
daysUntilNext: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))
|
||||
hasDate: (due.isEmpty() == false) || (scheduled.isEmpty() == false)
|
||||
isToday: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))
|
||||
isThisWeek: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))
|
||||
nextDateCategory: if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))
|
||||
nextDateMonth: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))
|
||||
nextDateWeek: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))
|
||||
urgencyScore: if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))
|
||||
timeTrackedFormatted: if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")
|
||||
dueDateDisplay: if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))
|
||||
views:
|
||||
- type: tasknotesMiniCalendar
|
||||
name: "Due"
|
||||
name: Due
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
@@ -64,12 +59,12 @@ views:
|
||||
direction: ASC
|
||||
dateProperty: due
|
||||
- type: tasknotesMiniCalendar
|
||||
name: "Scheduled"
|
||||
name: Scheduled
|
||||
order: []
|
||||
dateProperty: scheduled
|
||||
- type: tasknotesMiniCalendar
|
||||
name: "Created"
|
||||
name: Created
|
||||
dateProperty: file.ctime
|
||||
- type: tasknotesMiniCalendar
|
||||
name: "Modified"
|
||||
name: Modified
|
||||
dateProperty: file.mtime
|
||||
|
||||
+88
-114
@@ -1,71 +1,54 @@
|
||||
# All Tasks
|
||||
|
||||
filters:
|
||||
and:
|
||||
- file.hasTag("type/task")
|
||||
- file.inFolder("templates") != true
|
||||
|
||||
formulas:
|
||||
priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))'
|
||||
daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'
|
||||
dueIn: 'if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))'
|
||||
daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'
|
||||
daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'
|
||||
daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'
|
||||
isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != "done"'
|
||||
isDueToday: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'
|
||||
isDueThisWeek: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")'
|
||||
isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'
|
||||
isRecurring: 'recurrence && !recurrence.isEmpty()'
|
||||
hasTimeEstimate: 'timeEstimate && timeEstimate > 0'
|
||||
timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'
|
||||
efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'
|
||||
timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'
|
||||
timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'
|
||||
dueMonth: 'if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")'
|
||||
dueWeek: 'if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")'
|
||||
scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")'
|
||||
scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")'
|
||||
dueDateCategory: 'if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))'
|
||||
timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))'
|
||||
ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))'
|
||||
createdMonth: 'file.ctime.format("YYYY-MM")'
|
||||
modifiedMonth: 'file.mtime.format("YYYY-MM")'
|
||||
priorityCategory: 'if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))'
|
||||
projectCount: 'if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))'
|
||||
contextCount: 'if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))'
|
||||
trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))'
|
||||
nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'
|
||||
daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'
|
||||
hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'
|
||||
isToday: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))'
|
||||
isThisWeek: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))'
|
||||
nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))'
|
||||
nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))'
|
||||
nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))'
|
||||
urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))'
|
||||
timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")'
|
||||
dueDateDisplay: 'if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))'
|
||||
|
||||
priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
|
||||
daysUntilDue: if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)
|
||||
dueIn: if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))
|
||||
daysUntilScheduled: if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
|
||||
daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
|
||||
daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
|
||||
isOverdue: (due.isEmpty() == false) && date(due) < today() && status != "done"
|
||||
isDueToday: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||
isDueThisWeek: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
|
||||
isScheduledToday: (scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||
isRecurring: recurrence && !recurrence.isEmpty()
|
||||
hasTimeEstimate: timeEstimate && timeEstimate > 0
|
||||
timeRemaining: if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
|
||||
efficiencyRatio: if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)
|
||||
timeTrackedThisWeek: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||
timeTrackedToday: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||
dueMonth: if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")
|
||||
dueWeek: if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")
|
||||
scheduledMonth: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")
|
||||
scheduledWeek: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")
|
||||
dueDateCategory: if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))
|
||||
timeEstimateCategory: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))
|
||||
ageCategory: if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))
|
||||
createdMonth: file.ctime.format("YYYY-MM")
|
||||
modifiedMonth: file.mtime.format("YYYY-MM")
|
||||
priorityCategory: if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))
|
||||
projectCount: if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))
|
||||
contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))
|
||||
trackingStatus: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
|
||||
nextDate: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))
|
||||
daysUntilNext: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))
|
||||
hasDate: (due.isEmpty() == false) || (scheduled.isEmpty() == false)
|
||||
isToday: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))
|
||||
isThisWeek: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))
|
||||
nextDateCategory: if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))
|
||||
nextDateMonth: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))
|
||||
nextDateWeek: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))
|
||||
urgencyScore: if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))
|
||||
timeTrackedFormatted: if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")
|
||||
dueDateDisplay: if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))
|
||||
views:
|
||||
- type: tasknotesTaskList
|
||||
name: "Manual Order"
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
- blockedBy
|
||||
- file.name
|
||||
- recurrence
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
sort:
|
||||
- column: tasknotes_manual_order
|
||||
direction: DESC
|
||||
name: Manual Order
|
||||
groupBy:
|
||||
property: status
|
||||
direction: ASC
|
||||
- type: tasknotesTaskList
|
||||
name: "All Tasks"
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
@@ -75,54 +58,57 @@ views:
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
sort:
|
||||
- column: due
|
||||
direction: ASC
|
||||
- type: tasknotesTaskList
|
||||
name: "Not Blocked"
|
||||
filters:
|
||||
and:
|
||||
# Incomplete tasks
|
||||
- or:
|
||||
# Non-recurring task that's not in any completed status
|
||||
- and:
|
||||
- recurrence.isEmpty()
|
||||
- status != "done"
|
||||
# Recurring task where today is not in complete_instances
|
||||
- and:
|
||||
- recurrence.isEmpty() == false
|
||||
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
||||
# Not blocked by any incomplete tasks
|
||||
- or:
|
||||
# No blocking dependencies at all
|
||||
- blockedBy.isEmpty()
|
||||
# All blocking tasks are completed (filter returns only incomplete, then check if empty)
|
||||
- 'list(blockedBy).filter(file(if(value.isType("object"), value.uid, value)).properties.status != "done").isEmpty()'
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
- blockedBy
|
||||
- file.name
|
||||
- recurrence
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
sort:
|
||||
- column: formula.urgencyScore
|
||||
- property: tasknotes_manual_order
|
||||
direction: DESC
|
||||
- type: tasknotesTaskList
|
||||
name: "Today"
|
||||
name: All Tasks
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
- blockedBy
|
||||
- file.name
|
||||
- recurrence
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
sort:
|
||||
- property: due
|
||||
direction: ASC
|
||||
- type: tasknotesTaskList
|
||||
name: Not Blocked
|
||||
filters:
|
||||
and:
|
||||
- or:
|
||||
- and:
|
||||
- recurrence.isEmpty()
|
||||
- status != "done"
|
||||
- and:
|
||||
- recurrence.isEmpty() == false
|
||||
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
||||
- or:
|
||||
- blockedBy.isEmpty()
|
||||
- list(blockedBy).filter(file(if(value.isType("object"), value.uid, value)).properties.status != "done").isEmpty()
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
- blockedBy
|
||||
- file.name
|
||||
- recurrence
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
sort:
|
||||
- property: formula.urgencyScore
|
||||
direction: DESC
|
||||
- type: tasknotesTaskList
|
||||
name: Today
|
||||
filters:
|
||||
and:
|
||||
# Incomplete tasks (handles both recurring and non-recurring)
|
||||
- or:
|
||||
# Non-recurring task that's not in any completed status
|
||||
- and:
|
||||
- recurrence.isEmpty()
|
||||
- status != "done"
|
||||
# Recurring task where today is not in complete_instances
|
||||
- and:
|
||||
- recurrence.isEmpty() == false
|
||||
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
||||
# Due or scheduled today
|
||||
- or:
|
||||
- and:
|
||||
- due.isEmpty() == false
|
||||
@@ -139,23 +125,19 @@ views:
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
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.isEmpty() == false
|
||||
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
||||
# Due or scheduled in the past
|
||||
- or:
|
||||
- and:
|
||||
- due.isEmpty() == false
|
||||
@@ -172,23 +154,19 @@ views:
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
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.isEmpty() == false
|
||||
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
||||
# Due or scheduled this week
|
||||
- or:
|
||||
- and:
|
||||
- due.isEmpty() == false
|
||||
@@ -207,23 +185,19 @@ views:
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
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.isEmpty() == false
|
||||
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
||||
# No due date and no scheduled date
|
||||
- date(due).isEmpty()
|
||||
- date(scheduled).isEmpty()
|
||||
order:
|
||||
@@ -235,5 +209,5 @@ views:
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
sort:
|
||||
- column: status
|
||||
- property: status
|
||||
direction: ASC
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
---
|
||||
id: 2026-06-05T09:20:40-0400
|
||||
title: 2026-06-05 09:20:40
|
||||
tags: []
|
||||
daily: "[[2026-06-05]]"
|
||||
---
|
||||
# 2026-06-05 09:20:40
|
||||
|
||||
## LiveCount Feedback
|
||||
|
||||
### Which LiveCount features do you **like**?
|
||||
|
||||
* Adding and deleting from existing runs immediately updating Accubid
|
||||
is an excellent pattern.
|
||||
I teach estimators to count the obvious symbols
|
||||
then move on to the next assembly,
|
||||
using Add to Run at the end to pick up what was missed.
|
||||
|
||||
* The new Overlay manual alignment pattern is much better.
|
||||
|
||||
### Which LiveCount features do you **not like**?
|
||||
|
||||
* Reverse takeoffs "un-reverse" when adding or deleting from a run.
|
||||
|
||||
* Overlay Auto-align is turned on by default,
|
||||
requiring me to wait seconds which feel like an eternity for each one,
|
||||
even when I know from the previous that it will not align correctly.
|
||||
|
||||
* Overlay Auto-align appears to give equal preference to drawing titles
|
||||
meaning it always results in a zero translation alignment.
|
||||
|
||||
* Overlays turn off when the overlay menu is closed.
|
||||
|
||||
### Which features do you miss and should be added?
|
||||
|
||||
### Is there anything else you would like to add?
|
||||
|
||||
* Gating LiveCount features behind Anywhere
|
||||
(Auto-homerun)
|
||||
but still mentioning them in the changelogs
|
||||
is up-selly and confusing.
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
---
|
||||
id: 2026-06-05T09:48:37-0400
|
||||
title: 2026-06-05 09:48:37
|
||||
tags: []
|
||||
daily: "[[2026-06-05]]"
|
||||
---
|
||||
# 2026-06-05 09:48:37
|
||||
|
||||
## Accubid Reverse Takeoff
|
||||
|
||||
I have mixed feelings
|
||||
about using negative or "reverse" takeoffs
|
||||
in [[accubid|Accubid]].
|
||||
|
||||
### Pros
|
||||
|
||||
Pros as an alternative to simply changing existing counts.
|
||||
|
||||
With more than one revision,
|
||||
it quickly becomes difficult to have confidence in count changes.
|
||||
|
||||
### Cons
|
||||
|
||||
This note specifically concerns using negative quantities
|
||||
to cancel out positive for breakdown purposes,
|
||||
which I suspect is the only practical purpose for them.
|
||||
Net negative quantities cause all kinds of problems.
|
||||
There is no link from the positive to the negative,
|
||||
so any change to the former must be repeated for the latter.
|
||||
|
||||
With more than one revision,
|
||||
determining net takeoff quickly becomes unwieldy.
|
||||
|
||||
LiveCount "un-reverses" reverse takeoffs
|
||||
when adding or deleting from an existing run,
|
||||
which is not intuitive or well known.
|
||||
@@ -0,0 +1,20 @@
|
||||
---
|
||||
id: 2026-06-05T10:07:40-0400
|
||||
title: 2026-06-05 10:07:40
|
||||
tags: []
|
||||
daily: "[[2026-06-05]]"
|
||||
---
|
||||
# 2026-06-05 10:07:40
|
||||
|
||||
In [[construction-estimating-software]]
|
||||
it would always make more sense
|
||||
to model count-based assemblies
|
||||
as individual line items
|
||||
rather than counts in a single run of that assembly type.
|
||||
This would allow per-instance breakdowns and substitution
|
||||
without need to delete from one to create another.
|
||||
|
||||
Were it not for Accubid's poor performance
|
||||
with 1000+ takeoff jobs,
|
||||
our own workflow could benefit from this arrangement
|
||||
if LiveCount would better support it.
|
||||
@@ -1,51 +0,0 @@
|
||||
"""
|
||||
This script ensures that every daily note linked in the timestamped notes exists.
|
||||
"""
|
||||
import frontmatter
|
||||
import io
|
||||
import glob
|
||||
from datetime import datetime
|
||||
import os
|
||||
|
||||
timestamped_notes = glob.glob("timestamped/*.md")
|
||||
|
||||
daily_links = set()
|
||||
for child in timestamped_notes:
|
||||
with io.open(child, 'r') as file:
|
||||
link = frontmatter.load(file).get('daily')
|
||||
daily_links.add(link)
|
||||
|
||||
new_daily_names = set()
|
||||
for link in daily_links:
|
||||
base_name = link[2:-2]
|
||||
path = f"periodic/daily/{base_name}.md"
|
||||
if not os.path.exists(path):
|
||||
new_daily_names.add(base_name)
|
||||
|
||||
print(new_daily_names)
|
||||
|
||||
# for name in new_daily_names:
|
||||
# date = datetime.strptime(name, '%Y-%m-%d')
|
||||
|
||||
# with io.open(f"periodic/daily/{name}.md", 'x', encoding='utf8') as f:
|
||||
# f.write(f"# {name}\n\n")
|
||||
|
||||
# post = frontmatter.load(f)
|
||||
|
||||
# post['id'] = name
|
||||
# post['aliases'] = []
|
||||
# post['title'] = name
|
||||
# post['tags'] = [
|
||||
# 'authorship/original',
|
||||
# 'destiny/permanent',
|
||||
# 'status/draft',
|
||||
# 'type/periodic/daily'
|
||||
# ]
|
||||
# post['dg-publish'] = True
|
||||
# post['date-created'] = datetime.now().strftime("%Y-%m-%dT%H:%M:%SZ")
|
||||
# post['weekly'] = f'"[[{date.strftime('%Y-[W]%W')}]]"'
|
||||
# post['monthly'] = f'"[[{date.strftime('%Y-%m')}]]"'
|
||||
# post['quarterly'] = f'"[[{date.strftime('%Y-[Q]%q')}]]"'
|
||||
# post['yearly'] = f'"[[{date.strftime('%Y')}]]"'
|
||||
|
||||
# frontmatter.dump(post, f)
|
||||
Reference in New Issue
Block a user