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": [ "items": [
{ {
"type": "file", "type": "group",
"ctime": 1754398939230, "ctime": 1780330987866,
"path": "full-takeoff.md", "items": [
"title": "Full Takeoff" {
"type": "file",
"ctime": 1760361633886,
"path": "TODO.md"
},
{
"type": "file",
"ctime": 1780330914026,
"path": "home.md",
"title": "Home"
}
],
"title": "General"
}, },
{ {
"type": "file", "type": "group",
"ctime": 1760361633886, "ctime": 1780330954006,
"path": "TODO.md" "items": [
{
"type": "file",
"ctime": 1769779428614,
"path": "wishlist.md"
}
],
"title": "Personal"
}, },
{ {
"type": "file", "type": "group",
"ctime": 1769779428614, "ctime": 1780330940827,
"path": "wishlist.md" "items": [
}, {
{ "type": "file",
"type": "file", "ctime": 1754398939230,
"ctime": 1761313177282, "path": "full-takeoff.md",
"path": "nfpa-70_national-electric-code.md" "title": "Full Takeoff"
}, },
{ {
"type": "file", "type": "file",
"ctime": 1766074735360, "ctime": 1761313177282,
"path": "consolidate-estimating-thoughts.md" "path": "nfpa-70_national-electric-code.md"
}, },
{ {
"type": "file", "type": "file",
"ctime": 1769269535439, "ctime": 1780328464803,
"path": "digital-garden-homepage.md" "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", "neighbouring-files",
"cmdr", "cmdr",
"sheets", "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": [], "filenameAsDateFolders": [],
"recurrenceOnNextLine": false, "recurrenceOnNextLine": false,
"removeScheduledDateOnRecurrence": false, "removeScheduledDateOnRecurrence": false,
"searchResults": {
"taskCountLocation": "bottom"
},
"statusSettings": { "statusSettings": {
"coreStatuses": [ "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 translator: Dora Round
type: incollection type: incollection
year: 1935 year: 1935
up: "[[poetry]]"
--- ---
# From the Point of View of a Cat # From the Point of View of a Cat
+15 -10
View File
@@ -1,18 +1,23 @@
---
title: Circular Mil
tags: []
up: "[[electrical-construction]]"
---
# Circular Mil # Circular Mil
> A [**circular mil**](https://en.wikipedia.org/wiki/Circular_mil) > A [**circular mil**](https://en.wikipedia.org/wiki/Circular_mil)
> is a unit of area, equal to the area of a circle with a diameter of one mil > is a unit of area, equal to the area of a circle with a diameter of one mil
> (one thousandth of an inch or 0.0254 mm). > (one thousandth of an inch or 0.0254 mm).
> It is equal to π/4 square mils... > It is equal to π/4 square mils...
> >
> The area in circular mils, A, of a circle with a diameter of d mils, is given by the formula: > The area in circular mils, A, of a circle with a diameter of d mils, is given by the formula:
> >
> $$ > $$
> A_{\rm{cmil}} = ( d_{\rm{mil}} )^{2} > A_{\rm{cmil}} = ( d_{\rm{mil}} )^{2}
> $$ > $$
> In square mils, the area of a circle with a diameter of 1 mil is: > In square mils, the area of a circle with a diameter of 1 mil is:
> >
> $$ > $$
> \begin{align} > \begin{align}
> A &= \pi r^{2} \\ > A &= \pi r^{2} \\
@@ -23,15 +28,15 @@
> &\approx 0.7854~\rm{mil}^{2} \\ > &\approx 0.7854~\rm{mil}^{2} \\
> \end{align} > \end{align}
> $$ > $$
> >
> By definition, this area is also equal to 1 circular mil, so > By definition, this area is also equal to 1 circular mil, so
> >
> $$ > $$
> \rm{ 1~cmil = \frac{\pi}{4}~mil^{2} } > \rm{ 1~cmil = \frac{\pi}{4}~mil^{2} }
> $$ > $$
> >
> The conversion factor from square mils to circular mils is therefore 4/π cmil per square mil: > The conversion factor from square mils to circular mils is therefore 4/π cmil per square mil:
> >
> $$ > $$
> \rm{ 1~mil^{2} = \frac{4}{\pi} }~cmil > \rm{ 1~mil^{2} = \frac{4}{\pi} }~cmil
> $$ > $$
@@ -40,13 +45,13 @@
> for any given AWG (American Wire Gauge) size > for any given AWG (American Wire Gauge) size
> is as follows. > is as follows.
> $A_{n}$ represents the area of number $n$ AWG. > $A_{n}$ represents the area of number $n$ AWG.
> >
> $$ > $$
> A_{n}=\left( 5 \times 92^{(36-n)/39} \right)^{2} > A_{n}=\left( 5 \times 92^{(36-n)/39} \right)^{2}
> $$ > $$
> >
> For example, a number 12 gauge wire would use $n=12$: > For example, a number 12 gauge wire would use $n=12$:
> >
> $$ > $$
> \left( 5 \times 92^{(36-12)/39} \right)^{2} > \left( 5 \times 92^{(36-12)/39} \right)^{2}
> = 6530~\rm{cmil} > = 6530~\rm{cmil}
+1
View File
@@ -12,6 +12,7 @@ dg-home: true
## TALK ## TALK
This is the homepage for the website only. This is the homepage for the website only.
See [[home]] for the [[obsidian]] entry point.
%% %%
+5 -3
View File
@@ -84,10 +84,12 @@ per [[fire-resistive-wiring-methods-takeoff]].
.../`CONDENSOR HOME RUNS` .../`CONDENSOR HOME RUNS`
* **Horizontal:** Distance from load center to FCU. * **Horizontal:** Distance from load center to FCU.
(~50ft expected) (~50ft expected)[^1]
* **Vertical:** floor-to-floor distance from FCU to CU * **Vertical:** floor-to-floor distance from FCU to CU
[^1]: [[2026-05-04_14-57-49#Unit Condensing Units]]
| Level | Horizontal | Vertical | Length | | Level | Horizontal | Vertical | Length |
| :------- | ---------: | -------: | -----: | | :------- | ---------: | -------: | -----: |
| Level 01 | 150 | 40 | 190 | | Level 01 | 150 | 40 | 190 |
@@ -117,7 +119,7 @@ with flex to the equipment.
Max 20 disconnects per rack Max 20 disconnects per rack
`DISTRIBUTION`/`TRAPEZE RACK SUPPORT ...`/`...` `DISTRIBUTION`/`TRAPEZE RACK SUPPORT ...`/...
## Trash Chute ## Trash Chute
@@ -149,4 +151,4 @@ so conductors must be run in a [[nfpa-70_national-electric-code#Chapter 3 Wiring
Count receptacles normally, Count receptacles normally,
using ==surface-mount EMT assemblies==. using ==surface-mount EMT assemblies==.
Create a temporary item for the raceway itself. Create a temporary item for the raceway itself.
+1
View File
@@ -4,6 +4,7 @@ aliases:
title: Jared DeFanti title: Jared DeFanti
tags: tags:
- type/person - type/person
- occupational
up: "[[conest]]" up: "[[conest]]"
--- ---
# Jared DeFanti # 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 - NECA
title: National Electrical Contractors Association (NECA) title: National Electrical Contractors Association (NECA)
tags: tags:
- topic/construction/electrical
- type/organization - type/organization
--- ---
# National Electrical Contractors Association (NECA) # 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 ## 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. 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 according the drawings that we take off
(or even their immediate successors) (or even their immediate successors)
I suspect is slim to zero. 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, fighting with Trimble Connect as they would be,
I suspect is even less. 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]]), Bid receives bonuses based on _awarded GP_ ([[markup-vs-margin|margin]]),
thus they are incentivized to underestimate cost. 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. 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 ### Free Notes
Ops creates, approves the labor plan. [[pdi-operations|Ops]] creates, approves the labor plan.
This limits our ability to make interesting decisions: This limits our ability to make interesting decisions:
MC cable ILO PVC in-slab pushes the schedule out. 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 # 2026-03-11 11:58:49
%%
Note concerning [[ambiguity-in-construction-estimating]]
and [[transparency-in-construction-estimating]].
%%
## Selling Scope ## Selling Scope
When an estimator provides a proposal, 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 > 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, Intent is to improve transparency,
an area the OneNote is poor in. 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, I suggested leaving the existing work alone,
citing that the limited information citing that the limited information
makes likely our superiors will have a different interpretation than us. makes likely our superiors will have a different interpretation than us.
**If we changed the takeoff then** **If we changed the takeoff now**
**we would have to change it again.** **then we would have to change it again.**
> Ultimately we did change the takeoff > Ultimately we did change the takeoff
> because there were less than a dozen outlets in the project. > 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, which I believe should be saved for review,
not raised with the senior. 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. being only the difference between RG6 and Cat5e.
2. The result of the decision will not affect our future takeoff. 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. 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 > Assume a single-point connection
> to a pool equipment panel. > to a pool equipment panel.
> 100A for the spa. > 100A for the spa.
+1 -1
View File
@@ -12,7 +12,7 @@ daily: "[[2026-05-30]]"
Hubbard doesn't explain the concept Hubbard doesn't explain the concept
of "record-breaking probability" to my tastes. of "record-breaking probability" to my tastes.
more to the point, More to the point,
he gives special attention to minimum and maximum he gives special attention to minimum and maximum
when the probability that the next sample will have _any_ rank when the probability that the next sample will have _any_ rank
is given by 1/(n+1). 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.