vault backup: 2026-06-01 17:13:50

This commit is contained in:
2026-06-01 17:13:50 -04:00
parent ea4d9799e8
commit c73056e05f
43 changed files with 30067 additions and 50 deletions
+49 -25
View File
@@ -1,35 +1,59 @@
{
"items": [
{
"type": "file",
"ctime": 1754398939230,
"path": "full-takeoff.md",
"title": "Full Takeoff"
"type": "group",
"ctime": 1780330987866,
"items": [
{
"type": "file",
"ctime": 1760361633886,
"path": "TODO.md"
},
{
"type": "file",
"ctime": 1780330914026,
"path": "home.md",
"title": "Home"
}
],
"title": "General"
},
{
"type": "file",
"ctime": 1760361633886,
"path": "TODO.md"
"type": "group",
"ctime": 1780330954006,
"items": [
{
"type": "file",
"ctime": 1769779428614,
"path": "wishlist.md"
}
],
"title": "Personal"
},
{
"type": "file",
"ctime": 1769779428614,
"path": "wishlist.md"
},
{
"type": "file",
"ctime": 1761313177282,
"path": "nfpa-70_national-electric-code.md"
},
{
"type": "file",
"ctime": 1766074735360,
"path": "consolidate-estimating-thoughts.md"
},
{
"type": "file",
"ctime": 1769269535439,
"path": "digital-garden-homepage.md"
"type": "group",
"ctime": 1780330940827,
"items": [
{
"type": "file",
"ctime": 1754398939230,
"path": "full-takeoff.md",
"title": "Full Takeoff"
},
{
"type": "file",
"ctime": 1761313177282,
"path": "nfpa-70_national-electric-code.md"
},
{
"type": "file",
"ctime": 1780328464803,
"path": "timestamped/2026-05-22_11-57-18.md",
"subpath": "#ConEst's Purpose Considering its Accuracy",
"title": "ConEst's Purpose Considering its Accuracy"
}
],
"title": "Occupational"
}
]
}
+5 -1
View File
@@ -25,5 +25,9 @@
"neighbouring-files",
"cmdr",
"sheets",
"tabout"
"tabout",
"inline-spoilers",
"obsidian-quiet-outline",
"tasknotes",
"daily-notes-editor"
]
+16
View File
@@ -0,0 +1,16 @@
{
"hideFrontmatter": true,
"hideBacklinks": false,
"createAndOpenOnStartup": false,
"useArrowUpOrDownToNavigate": false,
"preset": [
{
"type": "folder",
"target": "timestamped"
},
{
"type": "folder",
"target": "daily"
}
]
}
File diff suppressed because it is too large Load Diff
+15
View File
@@ -0,0 +1,15 @@
{
"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
View File
@@ -0,0 +1,220 @@
.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%}
+4
View File
@@ -0,0 +1,4 @@
{
"showAllSpoilers": false,
"enableEditorMode": true
}
+55
View File
@@ -0,0 +1,55 @@
{
"search_support": true,
"level_switch": true,
"markdown": true,
"expand_level": "0",
"hide_unsearched": true,
"auto_expand_ext": "only-expand",
"regex_search": false,
"ellipsis": false,
"label_direction": "left",
"drag_modify": false,
"locate_by_cursor": false,
"show_popover_key": "ctrlKey",
"persist_md_states": true,
"keep_search_input": false,
"export_format": "{title}",
"lang_direction_decide_by": "system",
"auto_scroll_into_view": true,
"vimlize_canvas": false,
"canvas_sort_by": "area",
"shown_node_types": [
"file",
"group",
"text",
"link"
],
"heading_truncate_length": 20,
"patch_color": false,
"primary_color_light": "#18a058",
"primary_color_dark": "#63e2b7",
"rainbow_line": false,
"rainbow_color_1": "#FD8B1F",
"rainbow_color_2": "#FFDF00",
"rainbow_color_3": "#07EB23",
"rainbow_color_4": "#2D8FF0",
"rainbow_color_5": "#BC01E2",
"font_size": "",
"font_family": "",
"font_weight": "",
"line_height": "",
"line_gap": "",
"custom_font_color": false,
"h1_color": "#000000",
"h2_color": "#000000",
"h3_color": "#000000",
"h4_color": "#000000",
"h5_color": "#000000",
"h6_color": "#000000",
"h1_color_dark": "#000000",
"h2_color_dark": "#000000",
"h3_color_dark": "#000000",
"h4_color_dark": "#000000",
"h5_color_dark": "#000000",
"h6_color_dark": "#000000"
}
@@ -0,0 +1,697 @@
{
"timestamped/2026-05-22_11-57-18.md": {
"scroll": 8,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": [
"item-1-0"
]
},
"home.md": {
"scroll": 3.870503487346841,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": [
"item-1-0",
"item-2-1"
]
},
"periodic/daily/2026-06-01.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 9,
"ch": 0
},
"to": {
"line": 9,
"ch": 0
}
},
"expandedKeys": []
},
"periodic/daily/2026-05-30.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": []
},
"periodic/daily/2026-05-29.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": []
},
"periodic/daily/2026-05-27.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 9,
"ch": 0
},
"to": {
"line": 9,
"ch": 0
}
},
"expandedKeys": []
},
"periodic/daily/2026-05-28.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 9,
"ch": 0
},
"to": {
"line": 9,
"ch": 0
}
},
"expandedKeys": []
},
"timestamped/2025-06-13_00-00-00.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": [
"item-2-1",
"item-1-0"
]
},
"periodic/daily/2025-03-08.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": []
},
"periodic/daily/2026-05-26.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 9,
"ch": 0
},
"to": {
"line": 9,
"ch": 0
}
},
"expandedKeys": []
},
"periodic/daily/2026-05-25.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 9,
"ch": 0
},
"to": {
"line": 9,
"ch": 0
}
},
"expandedKeys": []
},
"periodic/daily/2026-05-24.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": []
},
"periodic/daily/2026-05-23.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 9,
"ch": 0
},
"to": {
"line": 9,
"ch": 0
}
},
"expandedKeys": []
},
"timestamped/2025-11-01_08-25-00.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": []
},
"timestamped/2025-11-04_14-52-05.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": []
},
"timestamped/2025-11-05_00-00-00.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": []
},
"timestamped/2025-11-06_18-12-00.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": []
},
"timestamped/2025-11-10_06-53-00.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": []
},
"timestamped/2025-11-10_10-40-00.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": []
},
"timestamped/2025-11-10_11-14-00.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": []
},
"timestamped/2025-11-10_15-15-00.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": []
},
"timestamped/2025-11-10_20-00-00.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": []
},
"timestamped/2025-11-11_00-00-00.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": []
},
"timestamped/2025-11-11_06-06-00.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": []
},
"timestamped/2025-11-11_14-41-00.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": []
},
"timestamped/2025-11-13_08-03-00.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": []
},
"timestamped/2025-11-13_08-19-00.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": []
},
"timestamped/2025-11-13_08-19-01.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": []
},
"timestamped/2025-11-13_13-25-27.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": []
},
"timestamped/2025-11-13_20-41-00.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": []
},
"timestamped/2025-11-14_13-41-00.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": []
},
"timestamped/2025-11-16_08-09-00.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": []
},
"timestamped/2026-05-25_15-02-03.md": {
"scroll": 40.27835051546392,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": []
},
"the-failure-of-risk-management.md": {
"scroll": 110.97590067300452,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": [
"item-1-0",
"item-3-8",
"item-2-2",
"item-3-11",
"item-2-15",
"item-2-18"
]
},
"timestamped/2026-01-25_21-02-00.md": {
"scroll": 0.4805194681340998,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": []
},
"fooled-by-randomness.md": {
"scroll": 102.7064700909515,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": [
"item-1-0",
"item-3-7",
"item-2-2"
]
},
"hubbard_2020_failure.md": {
"scroll": 296.0055643717448,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": [
"item-3-46",
"item-2-28",
"item-1-0"
]
},
"consolidate-electrical-info.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 11,
"ch": 0
},
"to": {
"line": 11,
"ch": 0
}
},
"expandedKeys": []
},
"timestamped/YYYY-MM-DD_HH-mm-ss.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 13,
"ch": 33
},
"to": {
"line": 13,
"ch": 33
}
},
"expandedKeys": []
},
"timestamped/2026-06-01_16-44-31.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": []
},
"timestamped/2026-06-01_16-54-37.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 11,
"ch": 0
},
"to": {
"line": 11,
"ch": 0
}
},
"expandedKeys": []
},
"templates/Untitled 1.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": []
},
"templates/task.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 9,
"ch": 82
},
"to": {
"line": 9,
"ch": 82
}
},
"expandedKeys": []
},
"templates/timestamped.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 6,
"ch": 2
},
"to": {
"line": 6,
"ch": 2
}
},
"expandedKeys": []
},
"templates/untitled.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 0,
"ch": 0
},
"to": {
"line": 0,
"ch": 0
}
},
"expandedKeys": []
},
"timestamped/2026-06-01_17-07-41.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 8,
"ch": 40
},
"to": {
"line": 8,
"ch": 40
}
},
"expandedKeys": []
},
"timestamped/2026-06-01_17-09-04.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 11,
"ch": 0
},
"to": {
"line": 11,
"ch": 0
}
},
"expandedKeys": []
},
"timestamped/2026-06-01_08-31-48.md": {
"scroll": 0,
"cursor": {
"from": {
"line": 21,
"ch": 0
},
"to": {
"line": 21,
"ch": 0
}
},
"expandedKeys": []
}
}
+3
View File
@@ -25,6 +25,9 @@
"filenameAsDateFolders": [],
"recurrenceOnNextLine": false,
"removeScheduledDateOnRecurrence": false,
"searchResults": {
"taskCountLocation": "bottom"
},
"statusSettings": {
"coreStatuses": [
{
+518
View File
@@ -0,0 +1,518 @@
{
"tasksFolder": "tasks",
"moveArchivedTasks": false,
"archiveFolder": "TaskNotes/Archive",
"taskTag": "type/task",
"taskIdentificationMethod": "tag",
"hideIdentifyingTagsInCards": false,
"hideIdentifyingTagsMode": "all",
"taskPropertyName": "",
"taskPropertyValue": "",
"excludedFolders": "templates",
"defaultTaskPriority": "normal",
"defaultTaskStatus": "open",
"taskOrgFiltersCollapsed": false,
"taskFilenameFormat": "custom",
"storeTitleInFilename": false,
"customFilenameTemplate": "{{date}}_{{hourPadded}}-{{minute}}-{{second}}",
"taskCreationDefaults": {
"defaultContexts": "",
"defaultTags": "",
"defaultProjects": "",
"useParentNoteAsProject": false,
"useParentHeaderAsProject": false,
"inheritParentTaskProperties": false,
"defaultTimeEstimate": 0,
"defaultRecurrence": "none",
"defaultDueDate": "none",
"defaultDueTime": "none",
"defaultScheduledDate": "today",
"defaultScheduledTime": "none",
"bodyTemplate": "templates/task",
"useBodyTemplate": true,
"defaultReminders": []
},
"openTaskAfterCreation": "none",
"calendarViewSettings": {
"defaultView": "dayGridMonth",
"customDayCount": 3,
"slotDuration": "00:15:00",
"slotMinTime": "00:00:00",
"slotMaxTime": "24:00:00",
"scrollTime": "08:00:00",
"firstDay": 0,
"timeFormat": "24",
"showWeekends": true,
"locale": "",
"defaultShowScheduled": true,
"defaultShowDue": true,
"defaultShowDueWhenScheduled": true,
"defaultShowScheduledToDueSpan": false,
"defaultShowTimeEntries": false,
"defaultShowRecurring": true,
"defaultShowICSEvents": true,
"enableTimeblocking": true,
"defaultShowTimeblocks": true,
"defaultTimeblockColor": "#6366f1",
"timeblockAttachmentSearchOrder": "name-asc",
"nowIndicator": true,
"selectMirror": true,
"weekNumbers": true,
"showTodayHighlight": true,
"eventMinHeight": 15,
"slotEventOverlap": true,
"eventMaxStack": null,
"dayMaxEvents": true,
"dayMaxEventRows": false
},
"pomodoroWorkDuration": 25,
"pomodoroShortBreakDuration": 5,
"pomodoroLongBreakDuration": 15,
"pomodoroLongBreakInterval": 4,
"pomodoroAutoStartBreaks": false,
"pomodoroAutoStartWork": false,
"pomodoroNotifications": true,
"pomodoroSoundEnabled": true,
"pomodoroSoundVolume": 50,
"pomodoroStorageLocation": "daily-notes",
"pomodoroMobileSidebar": "tab",
"showPomodoroInStatusBar": true,
"enableTaskLinkOverlay": true,
"disableOverlayOnAlias": false,
"enableInstantTaskConvert": true,
"useDefaultsOnInstantConvert": true,
"preserveCheckboxOnConvert": false,
"taskModalTabMovesFocus": true,
"enableNaturalLanguageInput": false,
"nlpDefaultToScheduled": true,
"nlpLanguage": "en",
"uiLanguage": "system",
"statusSuggestionTrigger": "*",
"nlpTriggers": {
"triggers": [
{
"propertyId": "tags",
"trigger": "#",
"enabled": true
},
{
"propertyId": "contexts",
"trigger": "@",
"enabled": true
},
{
"propertyId": "projects",
"trigger": "+",
"enabled": true
},
{
"propertyId": "status",
"trigger": "*",
"enabled": true
},
{
"propertyId": "priority",
"trigger": "!",
"enabled": false
},
{
"propertyId": "field_1780347153381",
"trigger": "daily:",
"enabled": false
}
]
},
"singleClickAction": "edit",
"doubleClickAction": "openNote",
"projectAutosuggest": {
"enableFuzzy": false,
"rows": [
"{title|n(Title)}",
"{aliases|n(Aliases)}",
"{file.path|n(Path)}"
],
"showAdvanced": false,
"requiredTags": [],
"includeFolders": [],
"propertyKey": "",
"propertyValue": ""
},
"inlineTaskConvertFolder": "",
"disableNoteIndexing": false,
"suggestionDebounceMs": 0,
"fieldMapping": {
"title": "title",
"status": "status",
"priority": "priority",
"due": "due",
"scheduled": "scheduled",
"contexts": "contexts",
"projects": "projects",
"timeEstimate": "timeEstimate",
"completedDate": "completedDate",
"dateCreated": "dateCreated",
"dateModified": "dateModified",
"recurrence": "recurrence",
"recurrenceAnchor": "recurrence_anchor",
"recurrenceParent": "recurrence_parent",
"occurrenceDate": "occurrence_date",
"occurrenceMaterialization": "occurrence_materialization",
"occurrenceNextTrigger": "occurrence_next_trigger",
"occurrenceTemplate": "occurrence_template",
"occurrencePastHorizon": "occurrence_past_horizon",
"occurrenceFutureHorizon": "occurrence_future_horizon",
"archiveTag": "archived",
"timeEntries": "timeEntries",
"completeInstances": "complete_instances",
"skippedInstances": "skipped_instances",
"blockedBy": "blockedBy",
"pomodoros": "pomodoros",
"icsEventId": "icsEventId",
"icsEventTag": "ics_event",
"googleCalendarEventId": "googleCalendarEventId",
"googleCalendarExceptionEventId": "googleCalendarExceptionEventId",
"googleCalendarExceptionOriginalScheduled": "googleCalendarExceptionOriginalScheduled",
"googleCalendarMovedOriginalDates": "googleCalendarMovedOriginalDates",
"reminders": "reminders",
"sortOrder": "tasknotes_manual_order"
},
"customStatuses": [
{
"id": "none",
"value": "none",
"label": "None",
"color": "#cccccc",
"isCompleted": false,
"excludeFromCycle": false,
"order": 0,
"autoArchive": false,
"autoArchiveDelay": 5
},
{
"id": "open",
"value": "open",
"label": "Open",
"color": "#808080",
"isCompleted": false,
"excludeFromCycle": false,
"order": 1,
"autoArchive": false,
"autoArchiveDelay": 5
},
{
"id": "in-progress",
"value": "in-progress",
"label": "In progress",
"color": "#0066cc",
"isCompleted": false,
"excludeFromCycle": false,
"order": 2,
"autoArchive": false,
"autoArchiveDelay": 5
},
{
"id": "done",
"value": "done",
"label": "Done",
"color": "#00aa00",
"isCompleted": true,
"excludeFromCycle": false,
"order": 3,
"autoArchive": false,
"autoArchiveDelay": 5
}
],
"customPriorities": [
{
"id": "none",
"value": "none",
"label": "None",
"color": "#cccccc",
"weight": 0
},
{
"id": "low",
"value": "low",
"label": "Low",
"color": "#00aa00",
"weight": 1
},
{
"id": "normal",
"value": "normal",
"label": "Normal",
"color": "#ffaa00",
"weight": 2
},
{
"id": "high",
"value": "high",
"label": "High",
"color": "#ff0000",
"weight": 3
}
],
"recurrenceMigrated": false,
"lastSeenVersion": "4.10.0",
"showReleaseNotesOnUpdate": false,
"showTrackedTasksInStatusBar": false,
"autoStopTimeTrackingOnComplete": true,
"autoStopTimeTrackingNotification": false,
"showRelationships": true,
"relationshipsPosition": "bottom",
"showTaskCardInNote": true,
"showCompletedTaskStrikethrough": true,
"showExpandableSubtasks": true,
"expandSubtasksByDefault": false,
"subtaskChevronPosition": "right",
"viewsButtonAlignment": "right",
"hideCompletedFromOverdue": true,
"icsIntegration": {
"defaultNoteTemplate": "",
"defaultNoteFolder": "",
"icsNoteFilenameFormat": "title",
"customICSNoteFilenameTemplate": "{title}",
"enableAutoExport": false,
"autoExportPath": "tasknotes-calendar.ics",
"autoExportInterval": 60,
"useDurationForExport": false,
"excludeArchivedFromExport": false,
"excludeCompletedFromExport": false,
"requireDueDateForExport": false,
"requireScheduledDateForExport": false,
"useICSEndAsDue": false
},
"savedViews": [],
"enableNotifications": false,
"notificationType": "system",
"notificationSoundEnabled": false,
"notificationSoundVolume": 50,
"enableAPI": false,
"apiPort": 8080,
"apiAuthToken": "",
"enableMCP": false,
"webhooks": [],
"userFields": [],
"modalFieldsConfig": {
"version": 1,
"fields": [
{
"id": "title",
"fieldType": "core",
"group": "basic",
"displayName": "Title",
"visibleInCreation": true,
"visibleInEdit": true,
"order": 0,
"enabled": true,
"required": true
},
{
"id": "details",
"fieldType": "core",
"group": "basic",
"displayName": "Details",
"visibleInCreation": true,
"visibleInEdit": true,
"order": 1,
"enabled": true
},
{
"id": "contexts",
"fieldType": "core",
"group": "metadata",
"displayName": "Contexts",
"visibleInCreation": true,
"visibleInEdit": true,
"order": 0,
"enabled": true
},
{
"id": "tags",
"fieldType": "core",
"group": "metadata",
"displayName": "Tags",
"visibleInCreation": true,
"visibleInEdit": true,
"order": 1,
"enabled": true
},
{
"id": "time-estimate",
"fieldType": "core",
"group": "metadata",
"displayName": "Time Estimate",
"visibleInCreation": true,
"visibleInEdit": true,
"order": 2,
"enabled": true
},
{
"id": "projects",
"fieldType": "organization",
"group": "organization",
"displayName": "Projects",
"visibleInCreation": true,
"visibleInEdit": true,
"order": 0,
"enabled": true
},
{
"id": "subtasks",
"fieldType": "organization",
"group": "organization",
"displayName": "Subtasks",
"visibleInCreation": true,
"visibleInEdit": true,
"order": 1,
"enabled": true
},
{
"id": "blocked-by",
"fieldType": "dependency",
"group": "dependencies",
"displayName": "Blocked By",
"visibleInCreation": true,
"visibleInEdit": true,
"order": 0,
"enabled": true
},
{
"id": "blocking",
"fieldType": "dependency",
"group": "dependencies",
"displayName": "Blocking",
"visibleInCreation": true,
"visibleInEdit": true,
"order": 1,
"enabled": true
}
],
"groups": [
{
"id": "basic",
"displayName": "Basic Information",
"order": 0,
"collapsible": false,
"defaultCollapsed": false
},
{
"id": "metadata",
"displayName": "Metadata",
"order": 1,
"collapsible": true,
"defaultCollapsed": false
},
{
"id": "organization",
"displayName": "Organization",
"order": 2,
"collapsible": true,
"defaultCollapsed": false
},
{
"id": "dependencies",
"displayName": "Dependencies",
"order": 3,
"collapsible": true,
"defaultCollapsed": false
},
{
"id": "custom",
"displayName": "Custom Fields",
"order": 4,
"collapsible": true,
"defaultCollapsed": false
}
]
},
"enableModalSplitLayout": true,
"defaultVisibleProperties": [
"status",
"priority",
"blocked",
"blocking"
],
"inlineVisibleProperties": [
"status",
"priority",
"due",
"scheduled",
"recurrence"
],
"enableBases": true,
"enableMdbaseSpec": false,
"autoCreateDefaultBasesFiles": true,
"commandFileMapping": {
"open-calendar-view": "tasks/views/mini-calendar-default.base",
"open-kanban-view": "tasks/views/kanban-default.base",
"open-tasks-view": "tasks/views/tasks-default.base",
"open-advanced-calendar-view": "tasks/views/calendar-default.base",
"open-agenda-view": "tasks/views/agenda-default.base",
"pomodoro-stats-base": "tasks/views/pomodoro-stats.base",
"relationships": "tasks/views/relationships.base"
},
"maintainDueDateOffsetInRecurring": false,
"resetCheckboxesOnRecurrence": false,
"useFrontmatterMarkdownLinks": false,
"googleOAuthClientId": "",
"googleOAuthClientSecret": "",
"microsoftOAuthClientId": "",
"microsoftOAuthClientSecret": "",
"enableGoogleCalendar": false,
"enableMicrosoftCalendar": false,
"disableCalendarOnMobile": false,
"enabledGoogleCalendars": [],
"googleCalendarSyncTokens": {},
"enabledMicrosoftCalendars": [],
"microsoftCalendarSyncTokens": {},
"googleCalendarExport": {
"enabled": false,
"targetCalendarId": "",
"syncOnTaskCreate": true,
"syncOnTaskUpdate": true,
"syncOnTaskComplete": true,
"syncOnTaskDelete": true,
"eventTitleTemplate": "{{title}}",
"includeDescription": true,
"eventColorId": null,
"syncTrigger": "scheduled",
"createAsAllDay": true,
"defaultEventDuration": 60,
"includeObsidianLink": true,
"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"
}
]
}
File diff suppressed because one or more lines are too long
+10
View File
@@ -0,0 +1,10 @@
{
"id": "tasknotes",
"name": "TaskNotes",
"version": "4.10.0",
"minAppVersion": "1.12.2",
"description": "Note-based task management with calendar, pomodoro and time-tracking integration.",
"author": "Callum Alpass",
"authorUrl": "https://github.com/callumalpass",
"isDesktopOnly": false
}
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -13,7 +13,7 @@ origlanguage: Czech
translator: Dora Round
type: incollection
year: 1935
up: "[[poetry]]"
---
# From the Point of View of a Cat
+5
View File
@@ -1,3 +1,8 @@
---
title: Circular Mil
tags: []
up: "[[electrical-construction]]"
---
# Circular Mil
> A [**circular mil**](https://en.wikipedia.org/wiki/Circular_mil)
+1
View File
@@ -12,6 +12,7 @@ dg-home: true
## TALK
This is the homepage for the website only.
See [[home]] for the [[obsidian]] entry point.
%%
+4 -2
View File
@@ -84,10 +84,12 @@ per [[fire-resistive-wiring-methods-takeoff]].
.../`CONDENSOR HOME RUNS`
* **Horizontal:** Distance from load center to FCU.
(~50ft expected)
(~50ft expected)[^1]
* **Vertical:** floor-to-floor distance from FCU to CU
[^1]: [[2026-05-04_14-57-49#Unit Condensing Units]]
| Level | Horizontal | Vertical | Length |
| :------- | ---------: | -------: | -----: |
| Level 01 | 150 | 40 | 190 |
@@ -117,7 +119,7 @@ with flex to the equipment.
Max 20 disconnects per rack
`DISTRIBUTION`/`TRAPEZE RACK SUPPORT ...`/`...`
`DISTRIBUTION`/`TRAPEZE RACK SUPPORT ...`/...
## Trash Chute
+1
View File
@@ -4,6 +4,7 @@ aliases:
title: Jared DeFanti
tags:
- type/person
- occupational
up: "[[conest]]"
---
# Jared DeFanti
+8
View File
@@ -0,0 +1,8 @@
---
title: Joshua Komis
tags:
- occupational
- type/person
up: "[[pdi-bid-estimating]]"
---
# Joshua Komis
+7
View File
@@ -0,0 +1,7 @@
---
title: Milan Hrvacevic
tags:
- occupational
- type/person
---
# Milan Hrvacevic
@@ -3,6 +3,7 @@ aliases:
- NECA
title: National Electrical Contractors Association (NECA)
tags:
- topic/construction/electrical
- type/organization
---
# National Electrical Contractors Association (NECA)
+10
View File
@@ -0,0 +1,10 @@
---
id: 2026-06-01
title: 2026-06-01
tags: []
weekly: "[[2026w23]]"
monthly: "[[2026-06]]"
quarterly: "[[2026q2]]"
previous: "[[2026-05-31]]"
---
# 2026-06-01
+7
View File
@@ -0,0 +1,7 @@
---
title: 2026w23
tags: []
yearly: "[[2026]]"
previous: "[[2026w22]]"
---
# 2026w23
+68
View File
@@ -0,0 +1,68 @@
# Agenda
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")))))))'
views:
- type: tasknotesCalendar
name: "Agenda"
order:
- status
- priority
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
options:
showPropertyBasedEvents: false
createDailyNotesFromDateLinks: true
calendarView: "listWeek"
startDateProperty: file.ctime
listDayCount: 7
titleProperty: file.basename
+72
View File
@@ -0,0 +1,72 @@
# 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")))))))'
views:
- type: tasknotesCalendar
name: "Calendar"
order:
- status
- priority
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
options:
showScheduled: true
showDue: true
showRecurring: true
showTimeEntries: true
showTimeblocks: true
showPropertyBasedEvents: true
createDailyNotesFromDateLinks: true
calendarView: "timeGridWeek"
customDayCount: 3
firstDay: 0
slotDuration: "00:30:00"
+69
View File
@@ -0,0 +1,69 @@
# 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")))))))'
views:
- type: tasknotesKanban
name: "Kanban Board"
order:
- status
- priority
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
sort:
- column: tasknotes_manual_order
direction: DESC
groupBy:
property: status
direction: ASC
options:
columnWidth: 280
hideEmptyColumns: false
+75
View File
@@ -0,0 +1,75 @@
# 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")))))))'
views:
- type: tasknotesMiniCalendar
name: "Due"
order:
- status
- priority
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
sort:
- property: due
direction: ASC
dateProperty: due
- type: tasknotesMiniCalendar
name: "Scheduled"
order: []
dateProperty: scheduled
- type: tasknotesMiniCalendar
name: "Created"
dateProperty: file.ctime
- type: tasknotesMiniCalendar
name: "Modified"
dateProperty: file.mtime
+85
View File
@@ -0,0 +1,85 @@
# Pomodoro statistics
# Generated with your TaskNotes settings
# Requires Pomodoro data storage to be set to Daily notes.
filters:
and:
- file.hasProperty("pomodoros")
- list(note["pomodoros"]).filter(value.startTime).isEmpty() == false
formulas:
pomodoroDate: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.startTime).map(date(value.startTime).format("YYYY-MM-DD")).unique().join(", "), file.basename)'
pomodoroMonth: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.startTime).map(date(value.startTime).format("YYYY-MM")).unique().join(", "), "")'
completedPomos: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "work" && value.completed == true).length, 0)'
attemptedPomos: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "work").length, 0)'
interruptedPomos: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "work" && value.completed == false).length, 0)'
focusMinutes: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "work" && value.completed == true).map(if(value.plannedDuration && value.plannedDuration > 0, value.plannedDuration, if(value.startTime && value.endTime, ((number(date(value.endTime)) - number(date(value.startTime))) / 60000).round(), 0))).reduce(acc + value, 0).round(), 0)'
focusTime: 'if(formula.focusMinutes >= 60, (formula.focusMinutes / 60).floor() + "h " + (formula.focusMinutes % 60).round() + "m", formula.focusMinutes + "m")'
completionRate: 'if(formula.attemptedPomos > 0, (formula.completedPomos / formula.attemptedPomos * 100).round() + "%", "0%")'
shortBreaks: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "short-break").length, 0)'
longBreaks: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "long-break").length, 0)'
properties:
formula.pomodoroDate:
displayName: Date
formula.pomodoroMonth:
displayName: Month
formula.completedPomos:
displayName: Completed
formula.attemptedPomos:
displayName: Attempted
formula.interruptedPomos:
displayName: Interrupted
formula.focusMinutes:
displayName: Focus minutes
formula.focusTime:
displayName: Focus time
formula.completionRate:
displayName: Completion
formula.shortBreaks:
displayName: Short breaks
formula.longBreaks:
displayName: Long breaks
views:
- type: table
name: "Daily"
order:
- formula.pomodoroDate
- formula.completedPomos
- formula.focusTime
- formula.attemptedPomos
- formula.completionRate
- formula.interruptedPomos
- formula.shortBreaks
- formula.longBreaks
- file.name
sort:
- column: formula.pomodoroDate
direction: DESC
- type: table
name: "Monthly"
groupBy:
property: formula.pomodoroMonth
direction: DESC
order:
- formula.pomodoroDate
- formula.completedPomos
- formula.focusMinutes
- formula.focusTime
- formula.attemptedPomos
- formula.completionRate
- formula.interruptedPomos
- formula.shortBreaks
- formula.longBreaks
- file.name
summaries:
formula.completedPomos: Sum
formula.focusMinutes: Sum
formula.attemptedPomos: Sum
formula.interruptedPomos: Sum
formula.shortBreaks: Sum
formula.longBreaks: Sum
sort:
- column: formula.pomodoroDate
direction: DESC
+121
View File
@@ -0,0 +1,121 @@
# Relationships
# This view shows all relationships for the current file
# Dynamically shows/hides tabs based on available data
formulas:
priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,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: "Subtasks"
filters:
and:
- file.hasTag("type/task")
- file.inFolder("templates") != true
- file.hasLink(this.file) && list(note.projects).map(file(value.replace(/^\[[^\]]+\]\((.*)\)$/, "$1").replace(/%20/g, " ")).asLink()).contains(this.file.asLink())
order:
- status
- priority
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
sort:
- column: tasknotes_manual_order
direction: DESC
groupBy:
property: status
direction: ASC
- type: tasknotesTaskList
name: "Projects"
filters:
and:
- file.inFolder("templates") != true
- list(this.projects).map(file(value.replace(/^\[[^\]]+\]\((.*)\)$/, "$1").replace(/%20/g, " ")).asLink()).contains(file.asLink())
order:
- status
- priority
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
- type: tasknotesTaskList
name: "Blocked By"
filters:
and:
- file.hasTag("type/task")
- file.inFolder("templates") != true
- list(this.note.blockedBy).map(file(if(value.isType("object"), value.uid, value)).asLink()).contains(file.asLink())
order:
- status
- priority
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
sort:
- column: tasknotes_manual_order
direction: DESC
- type: tasknotesKanban
name: "Blocking"
filters:
and:
- file.hasTag("type/task")
- file.inFolder("templates") != true
- list(note.blockedBy).map(file(if(value.isType("object"), value.uid, value)).asLink()).contains(this.file.asLink())
order:
- status
- priority
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
sort:
- column: tasknotes_manual_order
direction: DESC
groupBy:
property: status
direction: ASC
+239
View File
@@ -0,0 +1,239 @@
# 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")))))))'
views:
- type: tasknotesTaskList
name: "Manual Order"
order:
- status
- priority
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
sort:
- column: tasknotes_manual_order
direction: DESC
groupBy:
property: status
direction: ASC
- type: tasknotesTaskList
name: "All Tasks"
order:
- status
- priority
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
sort:
- column: due
direction: ASC
- type: tasknotesTaskList
name: "Not Blocked"
filters:
and:
# Incomplete tasks
- or:
# Non-recurring task that's not in any completed status
- and:
- recurrence.isEmpty()
- status != "done"
# Recurring task where today is not in complete_instances
- and:
- recurrence.isEmpty() == false
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
# Not blocked by any incomplete tasks
- or:
# No blocking dependencies at all
- blockedBy.isEmpty()
# All blocking tasks are completed (filter returns only incomplete, then check if empty)
- 'list(blockedBy).filter(file(if(value.isType("object"), value.uid, value)).properties.status != "done").isEmpty()'
order:
- status
- priority
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
sort:
- column: formula.urgencyScore
direction: DESC
- type: tasknotesTaskList
name: "Today"
filters:
and:
# Incomplete tasks (handles both recurring and non-recurring)
- or:
# Non-recurring task that's not in any completed status
- and:
- recurrence.isEmpty()
- status != "done"
# Recurring task where today is not in complete_instances
- and:
- recurrence.isEmpty() == false
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
# Due or scheduled today
- or:
- and:
- due.isEmpty() == false
- date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
- and:
- scheduled.isEmpty() == false
- date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
order:
- status
- priority
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
sort:
- column: formula.urgencyScore
direction: DESC
- type: tasknotesTaskList
name: "Overdue"
filters:
and:
# Incomplete tasks
- or:
# Non-recurring task that's not in any completed status
- and:
- recurrence.isEmpty()
- status != "done"
# Recurring task where today is not in complete_instances
- and:
- recurrence.isEmpty() == false
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
# Due or scheduled in the past
- or:
- and:
- due.isEmpty() == false
- date(due) < today()
- and:
- scheduled.isEmpty() == false
- date(scheduled) < today()
order:
- status
- priority
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
sort:
- column: formula.urgencyScore
direction: DESC
- type: tasknotesTaskList
name: "This Week"
filters:
and:
# Incomplete tasks
- or:
# Non-recurring task that's not in any completed status
- and:
- recurrence.isEmpty()
- status != "done"
# Recurring task where today is not in complete_instances
- and:
- recurrence.isEmpty() == false
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
# Due or scheduled this week
- or:
- and:
- due.isEmpty() == false
- date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD")
- date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
- and:
- scheduled.isEmpty() == false
- date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD")
- date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
order:
- status
- priority
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
sort:
- column: formula.urgencyScore
direction: DESC
- type: tasknotesTaskList
name: "Unscheduled"
filters:
and:
# Incomplete tasks
- or:
# Non-recurring task that's not in any completed status
- and:
- recurrence.isEmpty()
- status != "done"
# Recurring task where today is not in complete_instances
- and:
- recurrence.isEmpty() == false
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
# No due date and no scheduled date
- date(due).isEmpty()
- date(scheduled).isEmpty()
order:
- status
- priority
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
sort:
- column: status
direction: ASC
+10
View File
@@ -0,0 +1,10 @@
---
title: {{title}}
tags:
- type/task
daily: "[[{{date}}]]"
priority: {{priority}}
scheduled: {{scheduledDate}}
status: {{status}}
---
# <% moment(tp.file.title, 'YYYY-MM-DD_HH-mm-ss').format('YYYY-MM-DD HH:mm:ss') %>
+1 -1
View File
@@ -10,7 +10,7 @@ daily: "[[2025-12-03]]"
## Excluding Vs. Ignoring Project Requirements
%%
A criticism of an observed lack of [[transparency]] in [[construction-estimating]].
A criticism of an observed lack of [[transparency-in-construction-estimating]].
%%
There is a distinct difference between _excluding_ and _ignoring_ requirements.
+1 -1
View File
@@ -30,7 +30,7 @@ The probability that any construction will be performed
according the drawings that we take off
(or even their immediate successors)
I suspect is slim to zero.
That Ops would have the patience to add the revisions,
That [[pdi-operations|Ops]] would have the patience to add the revisions,
fighting with Trimble Connect as they would be,
I suspect is even less.
+1 -1
View File
@@ -63,5 +63,5 @@ to ask for a revision to a WBS
Bid receives bonuses based on _awarded GP_ ([[markup-vs-margin|margin]]),
thus they are incentivized to underestimate cost.
Ops receives bonuses based on _positive GP variance_,
[[pdi-operations|Ops]] receives bonuses based on _positive GP variance_,
thus they are incentivized to overestimate cost.
+1 -1
View File
@@ -44,7 +44,7 @@ Carried labor for lost time due to badging
### Free Notes
Ops creates, approves the labor plan.
[[pdi-operations|Ops]] creates, approves the labor plan.
This limits our ability to make interesting decisions:
MC cable ILO PVC in-slab pushes the schedule out.
+5
View File
@@ -10,6 +10,11 @@ date-created: 2026-03-11T11:58:49-04:00
---
# 2026-03-11 11:58:49
%%
Note concerning [[ambiguity-in-construction-estimating]]
and [[transparency-in-construction-estimating]].
%%
## Selling Scope
When an estimator provides a proposal,
+1 -1
View File
@@ -31,7 +31,7 @@ potentially to be qualified in future bids.
>
> 2. Awarded contract does not include respect for the direction
>
> 3. Ops, not aware of direction, believes ConEst takeoff was in error.
> 3. [[pdi-operations|Ops]], not aware of direction, believes ConEst takeoff was in error.
Intent is to improve transparency,
an area the OneNote is poor in.
+4 -3
View File
@@ -15,8 +15,8 @@ and replaced with [[heating-designations]],
I suggested leaving the existing work alone,
citing that the limited information
makes likely our superiors will have a different interpretation than us.
**If we changed the takeoff then**
**we would have to change it again.**
**If we changed the takeoff now**
**then we would have to change it again.**
> Ultimately we did change the takeoff
> because there were less than a dozen outlets in the project.
@@ -27,7 +27,8 @@ This is a good example of a scope question
which I believe should be saved for review,
not raised with the senior.
1. The maximum project cost impact of the decision is low,
1. The maximum project cost impact of the decision is low
(final cost is not especially [[sensitivity|sensitive]] to it),
being only the difference between RG6 and Cat5e.
2. The result of the decision will not affect our future takeoff.
+1 -1
View File
@@ -48,7 +48,7 @@ with no coordination with other disciplines.
Water Feature plans are a similar case.
> [!quote] [[josh-komis]] 2026-05-28 around 10:30 (pp.)
> [!quote] [[joshua-komis]] 2026-05-28 around 10:30 (pp.)
> Assume a single-point connection
> to a pool equipment panel.
> 100A for the spa.
+1 -1
View File
@@ -12,7 +12,7 @@ daily: "[[2026-05-30]]"
Hubbard doesn't explain the concept
of "record-breaking probability" to my tastes.
more to the point,
More to the point,
he gives special attention to minimum and maximum
when the probability that the next sample will have _any_ rank
is given by 1/(n+1).
+21
View File
@@ -0,0 +1,21 @@
---
id: 2026-06-01T08:31:48-0400
title: 2026-06-01 08:31:48
tags: []
daily: "[[2026-06-01]]"
---
# 2026-06-01 08:31:48
## ConEst Schedule Meeting 2026w23
[[conest-schedule-meeting]] for [[2026w23]].
Recently received several WBS approvals,
expect bells rung for them soon.
[[milan-hrvacevic|Milan]]'s team
just returned from Albuquerque,
visiting a data center there.
Committed to finishing [[303-mariposa-residence]]
and [[cincinnati-convention-center-hotel]] this week.
+7
View File
@@ -0,0 +1,7 @@
---
title: Transparency
tags: []
---
# Transparency
**Transparency** is a state of open honesty.