Compare commits
10 Commits
9af316db55
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| b7d5fdc0c6 | |||
| 246d38b470 | |||
| e746c6055c | |||
| 183d14e4c0 | |||
| 4696dfcc81 | |||
| 34ffae64b1 | |||
| edb1dbcfda | |||
| 32e24aab08 | |||
| d127008fb1 | |||
| ff3395126f |
Vendored
+3
-2
@@ -7,7 +7,7 @@
|
||||
"autoPairMarkdown": true,
|
||||
"useTab": false,
|
||||
"alwaysUpdateLinks": true,
|
||||
"tabSize": 4,
|
||||
"tabSize": 2,
|
||||
"vimMode": true,
|
||||
"promptDelete": false,
|
||||
"focusNewTab": true,
|
||||
@@ -20,5 +20,6 @@
|
||||
"landscape": false,
|
||||
"margin": "0",
|
||||
"downscalePercent": 100
|
||||
}
|
||||
},
|
||||
"showInlineTitle": true
|
||||
}
|
||||
Vendored
+3
-1
@@ -28,5 +28,7 @@
|
||||
"tabout",
|
||||
"obsidian-tidy-footnotes",
|
||||
"obsidian-citation-plugin",
|
||||
"obsidian-quiet-outline"
|
||||
"obsidian-quiet-outline",
|
||||
"inline-spoilers",
|
||||
"tasknotes"
|
||||
]
|
||||
-16
@@ -1,16 +0,0 @@
|
||||
{
|
||||
"hideFrontmatter": true,
|
||||
"hideBacklinks": false,
|
||||
"createAndOpenOnStartup": false,
|
||||
"useArrowUpOrDownToNavigate": false,
|
||||
"preset": [
|
||||
{
|
||||
"type": "folder",
|
||||
"target": "timestamped"
|
||||
},
|
||||
{
|
||||
"type": "folder",
|
||||
"target": "daily"
|
||||
}
|
||||
]
|
||||
}
|
||||
-4251
File diff suppressed because it is too large
Load Diff
@@ -1,15 +0,0 @@
|
||||
{
|
||||
"id": "daily-notes-editor",
|
||||
"name": "Daily Notes Editor",
|
||||
"version": "1.1.0",
|
||||
"minAppVersion": "0.15.0",
|
||||
"description": "Edit a bunch of daily notes in one page(inline), which works similar to Roam Research's default daily note view.",
|
||||
"author": "Boninall",
|
||||
"authorUrl": "https://github.com/Quorafind",
|
||||
"fundingUrl": {
|
||||
"Buy Me a Coffee": "https://www.buymeacoffee.com/boninall",
|
||||
"爱发电": "https://afdian.net/a/boninall",
|
||||
"支付宝": "https://cdn.jsdelivr.net/gh/Quorafind/.github@main/IMAGE/%E6%94%AF%E4%BB%98%E5%AE%9D%E4%BB%98%E6%AC%BE%E7%A0%81.jpg"
|
||||
},
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
-220
@@ -1,220 +0,0 @@
|
||||
.dn-editor {
|
||||
/*overflow-y: hidden;*/
|
||||
}
|
||||
|
||||
.dn-editor .cm-scroller {
|
||||
/*overflow-y: hidden;*/
|
||||
padding: unset;
|
||||
}
|
||||
|
||||
.dn-editor .workspace-leaf {
|
||||
all: unset;
|
||||
}
|
||||
|
||||
.dn-editor .dn-content {
|
||||
display: none;
|
||||
/*margin: 0;*/
|
||||
/*border-radius: var(--he-popover-border-radius);*/
|
||||
/*overflow: hidden;*/
|
||||
/*height: 100%;*/
|
||||
}
|
||||
|
||||
.dn-editor .workspace-leaf,
|
||||
.dn-editor .workspace-split {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.dn-editor .markdown-source-view.mod-cm6 .cm-editor {
|
||||
min-height: auto;
|
||||
}
|
||||
|
||||
.dn-editor .cm-content {
|
||||
padding-bottom: 0 !important;
|
||||
padding-top: 0 !important;
|
||||
}
|
||||
|
||||
.dn-editor .view-content {
|
||||
background: none !important;
|
||||
}
|
||||
|
||||
.dn-editor .cm-scroller {
|
||||
padding: 0 !important;
|
||||
overflow-y: clip;
|
||||
}
|
||||
.daily-note-view .daily-note-wrapper::before {
|
||||
content: "";
|
||||
display: block;
|
||||
height: 1px;
|
||||
width: var(--file-line-width);
|
||||
margin-bottom: 30px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
background-color: var(--background-modifier-border);
|
||||
}
|
||||
|
||||
.daily-note-view .daily-note-wrapper:first-of-type::before {
|
||||
height: 0px;
|
||||
}
|
||||
|
||||
.daily-note-view .dn-range-indicator + .daily-note-container::before {
|
||||
height: 0px;
|
||||
}
|
||||
|
||||
.is-popout-window .dn-editor .dn-content {
|
||||
margin: 0;
|
||||
border-radius: var(--he-popover-border-radius);
|
||||
overflow: hidden;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.is-popout-window .dn-editor .workspace-leaf,
|
||||
.is-popout-window .dn-editor .workspace-split {
|
||||
height: auto;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.is-popout-window .dn-editor .cm-scroller {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.is-popout-window .dn-editor .markdown-source-view.mod-cm6 {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.is-popout-window .dn-editor .view-content {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.is-popout-window .dn-editor .workspace-leaf-content {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.daily-note-view .embedded-backlinks {
|
||||
min-height: unset !important;
|
||||
}
|
||||
|
||||
.daily-note-view {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--size-4-4);
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
body.daily-notes-hide-frontmatter
|
||||
.daily-note-view
|
||||
.markdown-source-view.is-live-preview.show-properties
|
||||
.metadata-container {
|
||||
display: none;
|
||||
}
|
||||
|
||||
body.daily-notes-hide-backlinks .daily-note-view .embedded-backlinks {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Custom Range Modal Styles */
|
||||
.custom-range-date-container {
|
||||
margin-bottom: var(--size-4-2);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.custom-range-date-container span {
|
||||
width: 100px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.custom-range-date-container input {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.custom-range-button-container {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
margin-top: var(--size-4-4);
|
||||
gap: var(--size-4-2);
|
||||
}
|
||||
|
||||
/* Preset management styles */
|
||||
.preset-container {
|
||||
margin-bottom: var(--size-4-4);
|
||||
}
|
||||
|
||||
.no-presets-message {
|
||||
color: var(--text-muted);
|
||||
font-style: italic;
|
||||
margin: var(--size-4-2) 0;
|
||||
}
|
||||
|
||||
.preset-list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--size-4-2);
|
||||
margin: var(--size-4-2) 0;
|
||||
}
|
||||
|
||||
.preset-item {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: var(--size-2-4) var(--size-4-3);
|
||||
background-color: var(--background-secondary);
|
||||
border-radius: var(--radius-s);
|
||||
}
|
||||
|
||||
.preset-info {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.preset-type {
|
||||
font-weight: bold;
|
||||
margin-right: var(--size-2-2);
|
||||
}
|
||||
|
||||
.preset-actions {
|
||||
display: flex;
|
||||
gap: var(--size-4-2);
|
||||
}
|
||||
|
||||
.preset-action-button {
|
||||
padding: var(--size-2-2) var(--size-2-4);
|
||||
border-radius: var(--radius-s);
|
||||
font-size: var(--font-ui-small);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.preset-open-button {
|
||||
background-color: var(--interactive-accent);
|
||||
color: var(--text-on-accent);
|
||||
}
|
||||
|
||||
.preset-delete-button {
|
||||
background-color: var(--background-modifier-error);
|
||||
color: var(--text-on-accent);
|
||||
}
|
||||
|
||||
/* Add preset modal styles */
|
||||
.setting-item {
|
||||
margin-bottom: var(--size-4-4);
|
||||
}
|
||||
|
||||
.target-input {
|
||||
width: 100%;
|
||||
padding: var(--size-2-3);
|
||||
border-radius: var(--radius-s);
|
||||
border: 1px solid var(--background-modifier-border);
|
||||
background-color: var(--background-primary);
|
||||
}
|
||||
|
||||
.modal-button-container {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: var(--size-4-2);
|
||||
margin-top: var(--size-4-4);
|
||||
}
|
||||
|
||||
.is-phone .mod-root .workspace-tabs:not(.mod-visible):has(.daily-note-view) {
|
||||
display: flex !important;
|
||||
}
|
||||
.daily-note.svelte-1d2sruf.svelte-1d2sruf{margin-bottom:var(--size-4-5);padding-bottom:var(--size-4-8)}.daily-note.svelte-1d2sruf.svelte-1d2sruf:has(.daily-note-editor[data-collapsed="true"]){margin-bottom:0;padding-bottom:0}.daily-note-editor.svelte-1d2sruf.svelte-1d2sruf{min-height:100px}.daily-note-editor[data-collapsed="true"].svelte-1d2sruf.svelte-1d2sruf{display:none}.daily-note.svelte-1d2sruf .collapse-button.svelte-1d2sruf{display:none}.daily-note.svelte-1d2sruf:hover .collapse-button.svelte-1d2sruf{display:block}.daily-note.svelte-1d2sruf .collapse-button.svelte-1d2sruf{color:var(--text-muted)}.daily-note.svelte-1d2sruf .collapse-button.svelte-1d2sruf:hover{color:var(--text-normal)}.daily-note.svelte-1d2sruf:has(.is-readable-line-width) .daily-note-title.svelte-1d2sruf{max-width:calc(var(--file-line-width) + var(--size-4-4));width:calc(var(--file-line-width) + var(--size-4-4));margin-left:auto;margin-right:auto;margin-bottom:var(--size-4-8);display:flex;align-items:center;justify-content:start;gap:var(--size-4-2)}.collapse-button.svelte-1d2sruf.svelte-1d2sruf{margin-left:calc(var(--size-4-8) * -1)}.collapse-button[data-collapsed="true"].svelte-1d2sruf.svelte-1d2sruf{transform:rotate(-90deg);transition:transform 0.2s ease}.daily-note.svelte-1d2sruf:not(:has(.is-readable-line-width)) .daily-note-title.svelte-1d2sruf{display:flex;justify-content:start;align-items:center;width:100%;padding-left:calc(calc(100% - var(--file-line-width)) / 2 - var(--size-4-2));padding-right:calc(calc(100% - var(--file-line-width)) / 2 - var(--size-4-2));margin-top:var(--size-4-8);gap:var(--size-4-2)}.clickable-link.svelte-1d2sruf.svelte-1d2sruf{cursor:pointer;text-decoration:none}.clickable-link.svelte-1d2sruf.svelte-1d2sruf:hover{color:var(--color-accent);text-decoration:underline}.editor-placeholder.svelte-1d2sruf.svelte-1d2sruf{display:flex;justify-content:center;align-items:center;height:100px;color:var(--text-muted);font-style:italic}.collapse-button.svelte-1d2sruf.svelte-1d2sruf{cursor:pointer;display:flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:4px;color:var(--text-muted);transition:background-color 0.2s ease}.collapse-button.svelte-1d2sruf.svelte-1d2sruf:hover{color:var(--text-normal)}.dn-stock.svelte-4q3cv7{height:1000px;width:100%;display:flex;justify-content:center;align-items:center}.dn-stock-text.svelte-4q3cv7{text-align:center}.no-more-text.svelte-4q3cv7{margin-left:auto;margin-right:auto;text-align:center}.dn-blank-day.svelte-4q3cv7{display:flex;margin-left:auto;margin-right:auto;max-width:var(--file-line-width);color:var(--color-base-40);padding-top:20px;padding-bottom:20px;transition:all 300ms}.dn-blank-day.svelte-4q3cv7:hover{padding-top:40px;padding-bottom:40px;transition:padding 300ms}.dn-blank-day-text.svelte-4q3cv7{margin-left:auto;margin-right:auto;text-align:center}.daily-note-wrapper.svelte-4q3cv7{width:100%}
|
||||
Vendored
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "homepage",
|
||||
"name": "Homepage",
|
||||
"version": "4.4.2",
|
||||
"version": "4.4.4",
|
||||
"minAppVersion": "1.12.2",
|
||||
"description": "Open a specified note, canvas, base, or workspace on startup, or set it for quick access later.",
|
||||
"author": "novov",
|
||||
|
||||
+1
-1
@@ -3,6 +3,6 @@
|
||||
* https://github.com/logonoff/obsidian-inline-spoilers
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
"use strict";var u=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var A=Object.prototype.hasOwnProperty;var C=(t,e)=>{for(var i in e)u(t,i,{get:e[i],enumerable:!0})},_=(t,e,i,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of N(e))!A.call(t,o)&&o!==i&&u(t,o,{get:()=>e[o],enumerable:!(s=y(e,o))||s.enumerable});return t};var v=t=>_(u({},"__esModule",{value:!0}),t);var H={};C(H,{default:()=>g});module.exports=v(H);var D=require("@codemirror/language"),x=require("@codemirror/state"),c=require("@codemirror/view"),n=require("obsidian"),P=/\|\|(.+?)\|\|/g,M="p, li, h1, h2, h3, h4, h5, h6, blockquote, em, strong, b, i, a, th, td",T=t=>{if(t.nodeType===Node.TEXT_NODE){if(!t.textContent||!t.parentNode)return;let e=t.textContent.split(/(\|\|[^|]+\|\|)/g),i=document.createDocumentFragment();for(let s of e)if(P.test(s)){let o=s.slice(2,-2),l=createSpan({cls:"inline_spoilers-spoiler",text:o});i.appendChild(l)}else{let o=document.createTextNode(s);i.appendChild(o)}t.parentNode.replaceChild(i,t)}else t.nodeType===Node.ELEMENT_NODE&&Array.from(t.childNodes).forEach(T)},w=(t,e)=>{let i=t.findAll(M);for(let o of i)Array.from(o.childNodes).forEach(T);let s=t.findAll(".inline_spoilers-spoiler");for(let o of s)e.registerDomEvent(o,"click",()=>{o.classList.toggle("inline_spoilers-revealed")})},V=t=>{let e=Array.from(t.containerEl.querySelectorAll(".inline_spoilers-spoiler"));for(let i of e){let s=i.parentNode,o=document.createTextNode(`||${i.innerText}||`);s&&s.replaceChild(o,i)}},L=c.Decoration.mark({class:"inline_spoilers-editor-spoiler",tagName:"span"}),R=c.Decoration.mark({class:"inline_spoilers-editor-spoiler-delimiter",tagName:"span"}),m=class{constructor(e){this.decorations=this.buildDecorations(e)}update(e){(e.docChanged||e.viewportChanged)&&(this.decorations=this.buildDecorations(e.view))}destroy(){}buildDecorations(e){let i=new x.RangeSetBuilder,s=[];for(let{from:o,to:l}of e.visibleRanges)(0,D.syntaxTree)(e.state).iterate({from:o,to:l,enter(E){let k=e.state.sliceDoc(E.from,E.to),h;for(;(h=P.exec(k))!==null;){let a=h.index,p=a+h[0].length,S=e.state.sliceDoc(a,p);!S.startsWith("||")&&!S.endsWith("||")||(s.push({from:a,to:a+2,isDelimiter:!0}),s.push({from:a+2,to:p-2,isDelimiter:!1}),s.push({from:p-2,to:p,isDelimiter:!0}))}}});s.sort((o,l)=>o.from-l.from);for(let o of s)i.add(o.from,o.to,o.isDelimiter?R:L);return i.finish()}},I={decorations:t=>t.decorations},d=c.ViewPlugin.fromClass(m,I),r=[],O=t=>{r.includes(d)||r.push(d),t.updateOptions()},b=t=>{let e=r.indexOf(d);e!==-1&&r.splice(e,1),t.updateOptions()},W={showAllSpoilers:!1,enableEditorMode:!1},f=class extends n.PluginSettingTab{constructor(e,i){super(e,i),this.plugin=i}display(){let{containerEl:e}=this;e.empty(),new n.Setting(e).setName("Reveal all spoilers").setDesc("Always show all inline spoilers, regardless of whether they are clicked or not.").addToggle(i=>i.setValue(this.plugin.settings.showAllSpoilers).onChange(async s=>{this.plugin.settings.showAllSpoilers=s,this.app.workspace.containerEl.toggleClass("inline_spoilers-revealed",s),await this.plugin.saveSettings()})),new n.Setting(e).setName("Hide spoilers in editor view (experimental)").setDesc("Hide spoilers in the editor until your cursor is on the same line as the spoiler.").addToggle(i=>i.setValue(this.plugin.settings.enableEditorMode).onChange(async s=>{this.plugin.settings.enableEditorMode=s,s?O(this.app.workspace):b(this.app.workspace),await this.plugin.saveSettings()}))}},g=class extends n.Plugin{async onload(){await this.loadSettings();let e=this.app.workspace.containerEl.querySelector(".markdown-reading-view");e&&w(e,this),this.registerMarkdownPostProcessor(i=>{w(i,this)}),this.addCommand({id:"create-spoiler",name:"Create spoiler",editorCallback:i=>{let s=i.getSelection();i.replaceSelection(`||${s}||`)}}),this.registerEditorExtension(r),this.addSettingTab(new f(this.app,this))}onunload(){this.app.workspace.containerEl.classList.remove("inline_spoilers-revealed"),V(this.app.workspace),b(this.app.workspace)}async loadSettings(){this.settings=Object.assign({},W,await this.loadData()),this.app.workspace.containerEl.toggleClass("inline_spoilers-revealed",this.settings.showAllSpoilers),this.settings.enableEditorMode&&r.push(d)}async saveSettings(){await this.saveData(this.settings)}};
|
||||
"use strict";var u=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var A=Object.prototype.hasOwnProperty;var C=(t,e)=>{for(var i in e)u(t,i,{get:e[i],enumerable:!0})},v=(t,e,i,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of N(e))!A.call(t,o)&&o!==i&&u(t,o,{get:()=>e[o],enumerable:!(s=y(e,o))||s.enumerable});return t};var _=t=>v(u({},"__esModule",{value:!0}),t);var H={};C(H,{default:()=>g});module.exports=_(H);var D=require("@codemirror/language"),x=require("@codemirror/state"),c=require("@codemirror/view"),n=require("obsidian"),P=/\|\|(.+?)\|\|/g,M="p, li, h1, h2, h3, h4, h5, h6, blockquote, em, strong, b, i, a, th, td",T=t=>{if(t.nodeType===Node.TEXT_NODE){if(!t.textContent||!t.parentNode)return;let e=t.textContent.split(/(\|\|[^|]+\|\|)/g),i=createFragment();for(let s of e)if(P.test(s)){let o=s.slice(2,-2),l=createSpan({cls:"inline_spoilers-spoiler",text:o});i.appendChild(l)}else{let o=activeDocument.createTextNode(s);i.appendChild(o)}t.parentNode.replaceChild(i,t)}else t.nodeType===Node.ELEMENT_NODE&&Array.from(t.childNodes).forEach(T)},w=(t,e)=>{let i=t.findAll(M);for(let o of i)Array.from(o.childNodes).forEach(T);let s=t.findAll(".inline_spoilers-spoiler");for(let o of s)e.registerDomEvent(o,"click",()=>{o.classList.toggle("inline_spoilers-revealed")})},V=t=>{let e=Array.from(t.containerEl.querySelectorAll(".inline_spoilers-spoiler"));for(let i of e){let s=i.parentNode,o=activeDocument.createTextNode(`||${i.innerText}||`);s&&s.replaceChild(o,i)}},L=c.Decoration.mark({class:"inline_spoilers-editor-spoiler",tagName:"span"}),R=c.Decoration.mark({class:"inline_spoilers-editor-spoiler-delimiter",tagName:"span"}),m=class{constructor(e){this.decorations=this.buildDecorations(e)}update(e){(e.docChanged||e.viewportChanged)&&(this.decorations=this.buildDecorations(e.view))}destroy(){}buildDecorations(e){let i=new x.RangeSetBuilder,s=[];for(let{from:o,to:l}of e.visibleRanges)(0,D.syntaxTree)(e.state).iterate({from:o,to:l,enter(E){let k=e.state.sliceDoc(E.from,E.to),h;for(;(h=P.exec(k))!==null;){let a=h.index,p=a+h[0].length,S=e.state.sliceDoc(a,p);!S.startsWith("||")&&!S.endsWith("||")||(s.push({from:a,to:a+2,isDelimiter:!0}),s.push({from:a+2,to:p-2,isDelimiter:!1}),s.push({from:p-2,to:p,isDelimiter:!0}))}}});s.sort((o,l)=>o.from-l.from);for(let o of s)i.add(o.from,o.to,o.isDelimiter?R:L);return i.finish()}},I={decorations:t=>t.decorations},d=c.ViewPlugin.fromClass(m,I),r=[],O=t=>{r.includes(d)||r.push(d),t.updateOptions()},b=t=>{let e=r.indexOf(d);e!==-1&&r.splice(e,1),t.updateOptions()},W={showAllSpoilers:!1,enableEditorMode:!1},f=class extends n.PluginSettingTab{constructor(e,i){super(e,i),this.plugin=i}display(){let{containerEl:e}=this;e.empty(),new n.Setting(e).setName("Reveal all spoilers").setDesc("Always show all inline spoilers, regardless of whether they are clicked or not.").addToggle(i=>i.setValue(this.plugin.settings.showAllSpoilers).onChange(async s=>{this.plugin.settings.showAllSpoilers=s,this.app.workspace.containerEl.toggleClass("inline_spoilers-revealed",s),await this.plugin.saveSettings()})),new n.Setting(e).setName("Hide spoilers in editor view (experimental)").setDesc("Hide spoilers in the editor until your cursor is on the same line as the spoiler.").addToggle(i=>i.setValue(this.plugin.settings.enableEditorMode).onChange(async s=>{this.plugin.settings.enableEditorMode=s,s?O(this.app.workspace):b(this.app.workspace),await this.plugin.saveSettings()}))}},g=class extends n.Plugin{async onload(){await this.loadSettings();let e=this.app.workspace.containerEl.querySelector(".markdown-reading-view");e&&w(e,this),this.registerMarkdownPostProcessor(i=>{w(i,this)}),this.addCommand({id:"create-spoiler",name:"Create spoiler",editorCallback:i=>{let s=i.getSelection();i.replaceSelection(`||${s}||`)}}),this.registerEditorExtension(r),this.addSettingTab(new f(this.app,this))}onunload(){this.app.workspace.containerEl.classList.remove("inline_spoilers-revealed"),V(this.app.workspace),b(this.app.workspace)}async loadSettings(){this.settings=Object.assign({},W,await this.loadData()),this.app.workspace.containerEl.toggleClass("inline_spoilers-revealed",this.settings.showAllSpoilers),this.settings.enableEditorMode&&r.push(d)}async saveSettings(){await this.saveData(this.settings)}};
|
||||
|
||||
/* nosourcemap */
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "inline-spoilers",
|
||||
"name": "Inline spoilers",
|
||||
"version": "1.2.5",
|
||||
"version": "1.2.6",
|
||||
"minAppVersion": "1.6.5",
|
||||
"description": "Adds Discord-like syntax for inline spoilers.",
|
||||
"author": "logonoff",
|
||||
|
||||
+21
-5
@@ -13,15 +13,25 @@ body {
|
||||
--inline-spoilers-spoiler-radius: var(--radius-s);
|
||||
}
|
||||
|
||||
/* spoiler bar */
|
||||
/**
|
||||
* hidden spoilers
|
||||
*/
|
||||
/** used in reader mode */
|
||||
.inline_spoilers-spoiler,
|
||||
|
||||
/** used in spoiler content in editor mode */
|
||||
.inline_spoilers-editor-spoiler,
|
||||
|
||||
/** used in delimiter in editor mode */
|
||||
.inline_spoilers-editor-spoiler-delimiter {
|
||||
/* obscured */
|
||||
background-color: var(--inline-spoilers-hidden-background) !important;
|
||||
color: var(--inline-spoilers-hidden-foreground) !important;
|
||||
}
|
||||
|
||||
/**
|
||||
* revealed spoilers
|
||||
*/
|
||||
/** used when a hidden spoiler is revealed by clicking in reader mode */
|
||||
.inline_spoilers-spoiler.inline_spoilers-revealed,
|
||||
|
||||
@@ -33,27 +43,31 @@ body {
|
||||
.inline_spoilers-revealed .inline_spoilers-spoiler,
|
||||
.inline_spoilers-revealed .inline_spoilers-editor-spoiler,
|
||||
.inline_spoilers-revealed .inline_spoilers-editor-spoiler-delimiter {
|
||||
/* revealed */
|
||||
background-color: var(--inline-spoilers-revealed-background) !important;
|
||||
color: var(--inline-spoilers-revealed-foreground) !important;
|
||||
}
|
||||
|
||||
/* reader */
|
||||
/**
|
||||
* spoiler border radius
|
||||
*/
|
||||
/* reader mode always shows one contiguous spoiler with rounded corners */
|
||||
.inline_spoilers-spoiler {
|
||||
border-radius: var(--inline-spoilers-spoiler-radius);
|
||||
}
|
||||
|
||||
/* editor */
|
||||
/* editor mode, when a spoiler is hidden, does not display delimiters (||) */
|
||||
.is-live-preview .inline_spoilers-editor-spoiler {
|
||||
border-radius: var(--inline-spoilers-spoiler-radius);
|
||||
}
|
||||
|
||||
/* editor mode, when a spoiler is revealed, display delimiters */
|
||||
.is-live-preview .cm-active .inline_spoilers-editor-spoiler {
|
||||
/* contiguous border radius with the delimiter */
|
||||
border-radius: 0em;
|
||||
}
|
||||
|
||||
/* delimiter */
|
||||
/* editor mode, when a spoiler is revealed, display delimiters, which should have
|
||||
contiguous border radius with the spoiler content */
|
||||
.cm-line .inline_spoilers-editor-spoiler-delimiter {
|
||||
&:has(+ .inline_spoilers-editor-spoiler) {
|
||||
border-radius: var(--inline-spoilers-spoiler-radius) 0 0 var(--inline-spoilers-spoiler-radius);
|
||||
@@ -63,10 +77,12 @@ body {
|
||||
}
|
||||
}
|
||||
|
||||
/** hide spoiler delimiters in editor mode when spoilers are hidden */
|
||||
.is-live-preview .inline_spoilers-editor-spoiler-delimiter {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/** reveal spoiler delimiters in editor mode when a spoiler is revealed */
|
||||
.is-live-preview .cm-active .inline_spoilers-editor-spoiler-delimiter {
|
||||
display: unset;
|
||||
}
|
||||
|
||||
+2
-2
@@ -2,8 +2,8 @@
|
||||
"citationExportFormat": "biblatex",
|
||||
"literatureNoteTitleTemplate": "@{{citekey}}",
|
||||
"literatureNoteFolder": "",
|
||||
"literatureNoteContentTemplate": "---\ntitle: {{title}}\nauthors: {{authorString}}\nyear: {{year}}\n---\n\n",
|
||||
"literatureNoteContentTemplate": "---\naliases:\n - {{title}}\ntitle: {{title}}\nauthor: {{authorString}}\nyear: {{year}}\n---\n\n",
|
||||
"markdownCitationTemplate": "[@{{citekey}}]",
|
||||
"alternativeMarkdownCitationTemplate": "@{{citekey}}",
|
||||
"alternativeMarkdownCitationTemplate": "[@{{citekey}}]",
|
||||
"citationExportPath": "bibliography.bib"
|
||||
}
|
||||
+2
-2
File diff suppressed because one or more lines are too long
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "obsidian-excalidraw-plugin",
|
||||
"name": "Excalidraw",
|
||||
"version": "2.23.7",
|
||||
"version": "2.23.8",
|
||||
"minAppVersion": "1.8.7",
|
||||
"description": "Sketch Your Mind. Edit and view Excalidraw drawings. Enter the world of 4D Visual PKM.",
|
||||
"author": "Zsolt Viczian",
|
||||
|
||||
+1
-1
@@ -21,7 +21,7 @@
|
||||
"mathPreviewPositionIsAbove": true,
|
||||
"mathPreviewCursor": "▶",
|
||||
"mathPreviewBracketHighlighting": false,
|
||||
"autofractionEnabled": false,
|
||||
"autofractionEnabled": true,
|
||||
"autofractionSymbol": "\\frac",
|
||||
"autofractionBreakingChars": "+-=\t",
|
||||
"matrixShortcutsEnabled": false,
|
||||
|
||||
+7
@@ -353,6 +353,13 @@
|
||||
"replace": "...",
|
||||
"flags": "gm",
|
||||
"enabled": true
|
||||
},
|
||||
{
|
||||
"label": "remove whitespace from empty blockquote lines",
|
||||
"find": "^> +(?=\\n>)",
|
||||
"replace": ">",
|
||||
"flags": "gm",
|
||||
"enabled": true
|
||||
}
|
||||
],
|
||||
"commonStyles": {
|
||||
|
||||
+2
-2
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"search_support": true,
|
||||
"search_support": false,
|
||||
"level_switch": true,
|
||||
"markdown": true,
|
||||
"expand_level": "0",
|
||||
@@ -16,7 +16,7 @@
|
||||
"export_format": "{title}",
|
||||
"lang_direction_decide_by": "system",
|
||||
"auto_scroll_into_view": true,
|
||||
"vimlize_canvas": false,
|
||||
"vimlize_canvas": true,
|
||||
"canvas_sort_by": "area",
|
||||
"shown_node_types": [
|
||||
"file",
|
||||
|
||||
+23
-41
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"tasksFolder": "tasks",
|
||||
"tasksFolder": "",
|
||||
"moveArchivedTasks": false,
|
||||
"archiveFolder": "TaskNotes/Archive",
|
||||
"taskTag": "type/task",
|
||||
@@ -14,7 +14,7 @@
|
||||
"taskOrgFiltersCollapsed": false,
|
||||
"taskFilenameFormat": "custom",
|
||||
"storeTitleInFilename": false,
|
||||
"customFilenameTemplate": "{{date}}_{{hourPadded}}-{{minute}}-{{second}}",
|
||||
"customFilenameTemplate": "{{titleKebab}}",
|
||||
"taskCreationDefaults": {
|
||||
"defaultContexts": "",
|
||||
"defaultTags": "",
|
||||
@@ -72,7 +72,7 @@
|
||||
"pomodoroAutoStartBreaks": false,
|
||||
"pomodoroAutoStartWork": false,
|
||||
"pomodoroNotifications": true,
|
||||
"pomodoroSoundEnabled": true,
|
||||
"pomodoroSoundEnabled": false,
|
||||
"pomodoroSoundVolume": 50,
|
||||
"pomodoroStorageLocation": "daily-notes",
|
||||
"pomodoroMobileSidebar": "tab",
|
||||
@@ -220,6 +220,18 @@
|
||||
"order": 3,
|
||||
"autoArchive": false,
|
||||
"autoArchiveDelay": 5
|
||||
},
|
||||
{
|
||||
"id": "status_1780921753724",
|
||||
"value": "failed",
|
||||
"label": "Failed",
|
||||
"color": "#aa0000",
|
||||
"completed": false,
|
||||
"isCompleted": true,
|
||||
"excludeFromCycle": false,
|
||||
"order": 4,
|
||||
"autoArchive": false,
|
||||
"autoArchiveDelay": 5
|
||||
}
|
||||
],
|
||||
"customPriorities": [
|
||||
@@ -431,7 +443,8 @@
|
||||
"status",
|
||||
"priority",
|
||||
"blocked",
|
||||
"blocking"
|
||||
"blocking",
|
||||
"totalTrackedTime"
|
||||
],
|
||||
"inlineVisibleProperties": [
|
||||
"status",
|
||||
@@ -461,7 +474,7 @@
|
||||
"microsoftOAuthClientSecret": "",
|
||||
"enableGoogleCalendar": false,
|
||||
"enableMicrosoftCalendar": false,
|
||||
"disableCalendarOnMobile": false,
|
||||
"disableCalendarOnMobile": true,
|
||||
"enabledGoogleCalendars": [],
|
||||
"googleCalendarSyncTokens": {},
|
||||
"enabledMicrosoftCalendars": [],
|
||||
@@ -469,10 +482,10 @@
|
||||
"googleCalendarExport": {
|
||||
"enabled": false,
|
||||
"targetCalendarId": "",
|
||||
"syncOnTaskCreate": true,
|
||||
"syncOnTaskUpdate": true,
|
||||
"syncOnTaskComplete": true,
|
||||
"syncOnTaskDelete": true,
|
||||
"syncOnTaskCreate": false,
|
||||
"syncOnTaskUpdate": false,
|
||||
"syncOnTaskComplete": false,
|
||||
"syncOnTaskDelete": false,
|
||||
"eventTitleTemplate": "{{title}}",
|
||||
"includeDescription": true,
|
||||
"eventColorId": null,
|
||||
@@ -483,36 +496,5 @@
|
||||
"defaultReminderMinutes": null
|
||||
},
|
||||
"enableDebugLogging": false,
|
||||
"googleCalendarSyncQueue": [
|
||||
{
|
||||
"taskPath": "timestamped/YYYY-MM-DD_HH-mm-ss.md",
|
||||
"requestedAt": 1780346458397,
|
||||
"attempts": 0,
|
||||
"lastError": "Google Calendar sync is not ready"
|
||||
},
|
||||
{
|
||||
"taskPath": "timestamped/2026-06-01_16-44-31.md",
|
||||
"requestedAt": 1780346671952,
|
||||
"attempts": 0,
|
||||
"lastError": "Google Calendar sync is not ready"
|
||||
},
|
||||
{
|
||||
"taskPath": "timestamped/2026-06-01_16-54-37.md",
|
||||
"requestedAt": 1780347277788,
|
||||
"attempts": 0,
|
||||
"lastError": "Google Calendar sync is not ready"
|
||||
},
|
||||
{
|
||||
"taskPath": "timestamped/2026-06-01_17-07-41.md",
|
||||
"requestedAt": 1780348061498,
|
||||
"attempts": 0,
|
||||
"lastError": "Google Calendar sync is not ready"
|
||||
},
|
||||
{
|
||||
"taskPath": "timestamped/2026-06-01_17-09-04.md",
|
||||
"requestedAt": 1780348144101,
|
||||
"attempts": 0,
|
||||
"lastError": "Google Calendar sync is not ready"
|
||||
}
|
||||
]
|
||||
"googleCalendarSyncQueue": []
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
[{"name":"Home","sticker":"ui//home","paths":["/"]}]
|
||||
@@ -308,6 +308,14 @@
|
||||
langid = {english}
|
||||
}
|
||||
|
||||
@audio{savio_1964_sitin-address-steps,
|
||||
title = {Sit-in {{Address}} on the {{Steps}} of {{Sproul Hall}}},
|
||||
namea = {Savio, Mario},
|
||||
nameatype = {collaborator},
|
||||
date = {1964-12-02},
|
||||
location = {Sproul Hall, University of California at Berkeley}
|
||||
}
|
||||
|
||||
@article{seppanen_2025_integrated-forecasting,
|
||||
title = {Integrated {{Forecasting Approach}} for {{Takt}} and {{Location-Based Scheduling}}},
|
||||
author = {Seppänen, Olli},
|
||||
@@ -341,6 +349,14 @@
|
||||
langid = {english}
|
||||
}
|
||||
|
||||
@book{wolfe_1981_shadow-torturer,
|
||||
title = {The {{Shadow}} of the {{Torturer}}},
|
||||
shorttitle = {Shadow of the {{Torturer}}},
|
||||
author = {Wolfe, Gene},
|
||||
date = {1981},
|
||||
langid = {english}
|
||||
}
|
||||
|
||||
@article{yucel_2026_startup-engagement,
|
||||
title = {Startup {{Engagement}} and {{Innovation Strategies}} in {{Mid-}} to {{Large-Sized US Construction Firms}}},
|
||||
author = {Yucel, Busra and Azhar, Salman},
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
---
|
||||
title: Thanatopsis
|
||||
tags:
|
||||
- exclude-from-word-count
|
||||
- type/media/poetry
|
||||
author: William Cullen Bryant
|
||||
year: 1881
|
||||
---
|
||||
# Thanatopsis
|
||||
|
||||
To him who in the love of Nature holds \
|
||||
Communion with her visible forms, she speaks \
|
||||
A various language; for his gayer hours \
|
||||
She has a voice of gladness, and a smile \
|
||||
And eloquence of beauty, and she glides \
|
||||
Into his darker musings, with a mild \
|
||||
And healing sympathy, that steals away \
|
||||
Their sharpness, ere he is aware. When thoughts \
|
||||
Of the last bitter hour come like a blight \
|
||||
Over thy spirit, and sad images \
|
||||
Of the stern agony, and shroud, and pall, \
|
||||
And breathless darkness, and the narrow house, \
|
||||
Make thee to shudder, and grow sick at heart;--- \
|
||||
Go forth, under the open sky, and list \
|
||||
To Nature's teachings, while from all around--- \
|
||||
Earth and her waters, and the depths of air--- \
|
||||
Comes a still voice---Yet a few days, and thee \
|
||||
The all-beholding sun shall see no more \
|
||||
In all his course; nor yet in the cold ground, \
|
||||
Where thy pale form was laid, with many tears, \
|
||||
Nor in the embrace of ocean, shall exist \
|
||||
Thy image. Earth, that nourished thee, shall claim \
|
||||
Thy growth, to be resolved to earth again, \
|
||||
And, lost each human trace, surrendering up \
|
||||
Thine individual being, shalt thou go \
|
||||
To mix for ever with the elements, \
|
||||
To be a brother to the insensible rock \
|
||||
And to the sluggish clod, which the rude swain \
|
||||
Turns with his share, and treads upon. The oak \
|
||||
Shall send his roots abroad, and pierce thy mould.
|
||||
|
||||
\
|
||||
|
||||
Yet not to thine eternal resting-place \
|
||||
Shalt thou retire alone, nor couldst thou wish \
|
||||
Couch more magnificent. Thou shalt lie down \
|
||||
With patriarchs of the infant world---with kings, \
|
||||
The powerful of the earth---the wise, the good, \
|
||||
Fair forms, and hoary seers of ages past, \
|
||||
All in one mighty sepulchre. The hills \
|
||||
Rock-ribbed and ancient as the sun,---the vales \
|
||||
Stretching in pensive quietness between; \
|
||||
The venerable woods---rivers that move \
|
||||
In majesty, and the complaining brooks \
|
||||
That make the meadows green; and, poured round all, \
|
||||
Old Ocean's gray and melancholy waste,--- \
|
||||
Are but the solemn decorations all \
|
||||
Of the great tomb of man. The golden sun, \
|
||||
The planets, all the infinite host of heaven, \
|
||||
Are shining on the sad abodes of death, \
|
||||
Through the still lapse of ages. All that tread \
|
||||
The globe are but a handful to the tribes \
|
||||
That slumber in its bosom.---Take the wings \
|
||||
Of morning, pierce the Barcan wilderness, \
|
||||
Or lose thyself in the continuous woods \
|
||||
Where rolls the Oregon, and hears no sound, \
|
||||
Save his own dashings---yet the dead are there: \
|
||||
And millions in those solitudes, since first \
|
||||
The flight of years began, have laid them down \
|
||||
In their last sleep---the dead reign there alone. \
|
||||
So shalt thou rest, and what if thou withdraw \
|
||||
In silence from the living, and no friend \
|
||||
Take note of thy departure? All that breathe \
|
||||
Will share thy destiny. The gay will laugh \
|
||||
When thou art gone, the solemn brood of care \
|
||||
Plod on, and each one as before will chase \
|
||||
His favorite phantom; yet all these shall leave \
|
||||
Their mirth and their employments, and shall come \
|
||||
And make their bed with thee. As the long train \
|
||||
Of ages glide away, the sons of men, \
|
||||
The youth in life's green spring, and he who goes \
|
||||
In the full strength of years, matron and maid, \
|
||||
The speechless babe, and the gray-headed man--- \
|
||||
Shall one by one be gathered to thy side, \
|
||||
By those, who in their turn shall follow them.
|
||||
|
||||
So live, that when thy summons comes to join \
|
||||
The innumerable caravan, which moves \
|
||||
To that mysterious realm, where each shall take \
|
||||
His chamber in the silent halls of death, \
|
||||
Thou go not, like the quarry-slave at night, \
|
||||
Scourged to his dungeon, but, sustained and soothed \
|
||||
By an unfaltering trust, approach thy grave, \
|
||||
Like one who wraps the drapery of his couch \
|
||||
About him, and lies down to pleasant dreams.
|
||||
@@ -4,7 +4,7 @@ tags:
|
||||
- occupational
|
||||
- type/guide
|
||||
title: Accubid Setup
|
||||
up: "[[pdi-estimating]]"
|
||||
up: "[[conest-processes]]"
|
||||
---
|
||||
# Accubid Setup
|
||||
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
---
|
||||
title: ConEst Body of Knowledge
|
||||
tags:
|
||||
- occupational
|
||||
up: "[[conest]]"
|
||||
---
|
||||
# ConEst Body of Knowledge
|
||||
|
||||
_Official_ [[conest-processes|ConEst process]] documentation
|
||||
is limited to nonexistent.
|
||||
My attempt at documentation
|
||||
represents my own interpretation of expectations.
|
||||
|
||||
[[project-management-institute#PMBOK® Guide|The PMBOK® Guide]]
|
||||
is my basis for this model.
|
||||
The
|
||||
@@ -3,6 +3,7 @@ tags:
|
||||
- occupational/takeoff
|
||||
- type/encyclopedia
|
||||
title: Emergency Systems Research
|
||||
up: "[[conest-processes]]"
|
||||
---
|
||||
# Emergency Systems Research
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ tags:
|
||||
- occupational/takeoff
|
||||
- type/encyclopedia
|
||||
title: Low Voltage Raceway Selection
|
||||
up: "[[conest-processes]]"
|
||||
---
|
||||
# Low Voltage Raceway Selection
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ tags:
|
||||
- occupational/takeoff
|
||||
- type/encyclopedia
|
||||
title: Wiring Device Selection
|
||||
up: "[[conest-processes]]"
|
||||
---
|
||||
# Wiring Device Selection
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ tags:
|
||||
- occupational
|
||||
- type/guide
|
||||
title: Wiring Method Selection
|
||||
up: "[[conest-processes]]"
|
||||
---
|
||||
# Wiring Method Selection
|
||||
|
||||
|
||||
@@ -45,8 +45,9 @@ add `ITEM DATABASE`/`WIRING & SYSTEM DEVICES`/`FLOOR BOXES & FITTTINGS`/`GENERIC
|
||||
|
||||
### Lighting Homeruns
|
||||
|
||||
* `Area` = "XX - Level XX Building"
|
||||
* `Phase` = "Building - Back of House (BOH)"
|
||||
> [!info] Breakdowns
|
||||
> * `Area` = "XX - Level XX Building"
|
||||
> * `Phase` = "Building - Back of House (BOH)"
|
||||
|
||||
Takeoff homeruns in Building breakdowns,
|
||||
even where serving Amenity spaces.
|
||||
@@ -79,7 +80,8 @@ per [[fire-resistive-wiring-methods-takeoff]].
|
||||
|
||||
##### Homeruns
|
||||
|
||||
* `Area` = _Match unit_
|
||||
> [!info] Breakdowns
|
||||
> * `Area` = _Match unit_
|
||||
|
||||
.../`CONDENSOR HOME RUNS`
|
||||
|
||||
@@ -99,7 +101,8 @@ per [[fire-resistive-wiring-methods-takeoff]].
|
||||
|
||||
##### Connections
|
||||
|
||||
* `Area` = _Match CU (usually roof)_
|
||||
> [!info] Breakdowns
|
||||
> * `Area` = _Match CU (usually roof)_
|
||||
|
||||
.../`CU CONDENSER SLEEVE W/ FLEX - NO HMRN WIRE`
|
||||
|
||||
|
||||
+52
-20
@@ -1,5 +1,5 @@
|
||||
---
|
||||
id: feeders
|
||||
id:
|
||||
aliases:
|
||||
- feeders takeoff
|
||||
title: Feeders Takeoff
|
||||
@@ -16,12 +16,12 @@ up: "[[takeoff-scripts]]"
|
||||
> including [[conest-wiring-method-selection]],
|
||||
> before beginning takeoff.
|
||||
|
||||
## Execution
|
||||
## Scope
|
||||
|
||||
1. Primaries
|
||||
2. Secondaries
|
||||
3. Feeders
|
||||
4. Grounding
|
||||
* Primaries
|
||||
* Secondaries
|
||||
* Feeders
|
||||
* Grounding
|
||||
|
||||
### Formatting
|
||||
|
||||
@@ -46,38 +46,50 @@ For adjacent panels, use a minimum 10ft length.
|
||||
|
||||
#### Adders
|
||||
|
||||
Use the difference in elevation between equipment
|
||||
Use the difference in elevation between equipment[^2]
|
||||
or 10ft, whichever is greater.
|
||||
|
||||
Add an additional 5ft (total 15ft) for site runs
|
||||
(primaries, secondaries, etc.).
|
||||
[^2]: Not actually difference in elevation.
|
||||
A site run from the bottom to the top of a hill may still only need 10ft.
|
||||
This needs more precise wording.
|
||||
|
||||
It is not necessary to change this logic for site runs.[^3][^4]
|
||||
|
||||
[^3]: [[2026-06-03_14-05-39#Site Run Adders]]
|
||||
|
||||
[^4]: I will remove this line when I break the habit.
|
||||
|
||||
## Primaries
|
||||
|
||||
* `Area` = "2 - Site"
|
||||
* `Phase` = "Site"
|
||||
* `System` = "PRI - Primaries"
|
||||
> [!info] Breakdowns
|
||||
> * `Area` = "2 - Site"
|
||||
> * `Phase` = "Site"
|
||||
> * `System` = "PRI - Primaries"
|
||||
|
||||
Usually only empty conduit if included.
|
||||
|
||||
## Secondaries
|
||||
|
||||
* `Area` = "2 - Site"
|
||||
* `Phase` = "Site"
|
||||
* `System` = "SEC - Secondaries"
|
||||
> [!info] Breakdowns
|
||||
> * `Area` = "2 - Site"
|
||||
> * `Phase` = "Site"
|
||||
> * `System` = "SEC - Secondaries"
|
||||
|
||||
### Wiring on Vault Racks
|
||||
|
||||
Where secondary conductors run on racks in utility vaults
|
||||
manually set the length of conduit,
|
||||
measure the wire length,
|
||||
add 20ft in addition to previously mentioned adders.
|
||||
add 20ft in addition to previously mentioned adders.[^5]
|
||||
|
||||
[^5]: [[art-baldwin]] at some point, I think.
|
||||
|
||||
## Feeders
|
||||
|
||||
* `Area` = "01 - Feeders/Risers Building"
|
||||
* `Phase` = "Feeders"
|
||||
* `System` = "FRR - Feeders and Risers"
|
||||
> [!info] Breakdowns
|
||||
> * `Area` = "01 - Feeders/Risers Building"
|
||||
> * `Phase` = "Feeders"
|
||||
> * `System` = "FRR - Feeders and Risers"
|
||||
|
||||
> [!info] Garage Feeders
|
||||
> `Area` "01 - Feeders/Risers Garage" is seldom used.
|
||||
@@ -88,9 +100,25 @@ add 20ft in addition to previously mentioned adders.
|
||||
|
||||
`COMMON ASSEMBLIES`/`DISTRIBUTION`/`BUS DUCT`/...
|
||||
|
||||
Delete unnecessary items and change `Fct 1`
|
||||
to get the correct quantities for the use case.
|
||||
|
||||
## Conductor Support
|
||||
|
||||
![[nfpa-70_300_general-requirements#300.19(A) Spacing Intervals --- Maximum.]]
|
||||
In lieu of more stringent requirements
|
||||
that may be imposed by project requirements,
|
||||
minimum support for vertical conductors
|
||||
is determined by [[nfpa-70_300_general-requirements#300.19(A) Spacing Intervals --- Maximum.|NEC 300.19(A)]]
|
||||
|
||||
Various [[heuristics]] exist among ConEst teams.
|
||||
Assuming minimum 40ft spacing
|
||||
(the absolute minimum for feeders we're likely to encounter)
|
||||
for _all_ conductors is popular even among more detail-favoring seniors.
|
||||
I generally prefer not to use a heuristic
|
||||
because `takeoff-calcs.xlsm` trivializes accurate selection
|
||||
and results in far fewer necessary supports.
|
||||
|
||||
Like [[#Sleeving]], it is acceptable to takeoff total counts
|
||||
|
||||
`ITEM DATABASE`/`CONDUIT & FITTINGS`/`CABLE SUPPORT / WEDGES`/`... COMPLETE FITTING`/...
|
||||
|
||||
@@ -101,3 +129,7 @@ See [[grounding-takeoff]].
|
||||
## Sleeving
|
||||
|
||||
See [[sleeving-takeoff]].
|
||||
|
||||
Because feeders are not broken down by level
|
||||
(they use `Area` = "01 - Feeders/Risers ...")
|
||||
it is acceptable to use total counts.
|
||||
|
||||
+10
-6
@@ -17,7 +17,8 @@ aliases:
|
||||
> This note is intended for practice specific to [[pdi-estimating]].
|
||||
> See [[fire-alarm]] for information about fire alarm systems.
|
||||
|
||||
* `System` = "FA - Fire Alarm"
|
||||
> [!info] Breakdowns
|
||||
> * `System` = "FA - Fire Alarm"
|
||||
|
||||
## Assembly Selection
|
||||
|
||||
@@ -59,8 +60,9 @@ Include [[sleeving-takeoff]] as necessary.
|
||||
|
||||
> Also "Elevator Machine Room (EMR)"
|
||||
|
||||
* `Area` = Same as FACR.
|
||||
* `Phase` = Same as FACR.
|
||||
> [!info] Breakdowns
|
||||
> * `Area` = Same as FACR.
|
||||
> * `Phase` = Same as FACR.
|
||||
|
||||
For each Elevator Control Room (ECR):
|
||||
|
||||
@@ -73,8 +75,9 @@ For each Elevator Control Room (ECR):
|
||||
|
||||
### Elevator Shafts
|
||||
|
||||
* `Area` = Same as FACR.
|
||||
* `Phase` = Same as FACR.
|
||||
> [!info] Breakdowns
|
||||
> * `Area` = Same as FACR.
|
||||
> * `Phase` = Same as FACR.
|
||||
|
||||
For each elevator shaft:
|
||||
|
||||
@@ -149,7 +152,8 @@ For each stairwell:
|
||||
|
||||
## Central Monitoring Loop
|
||||
|
||||
* `System` = "FAR - Fire Alarm Loop"
|
||||
> [!info] Breakdowns
|
||||
> * `System` = "FAR - Fire Alarm Loop"
|
||||
|
||||
> [!important]
|
||||
> Garden Style only.
|
||||
|
||||
+120
-89
@@ -10,20 +10,93 @@ title: Fixture Designations
|
||||
This note details creation of fixture designations
|
||||
for use in [[fixtures-takeoff]].
|
||||
|
||||
[[luminaire-types]]
|
||||
## Name Format
|
||||
|
||||
## Naming
|
||||
There is no standard convention
|
||||
for fixture designation names
|
||||
in the [[conest-body-of-knowledge]].
|
||||
The best any estimator can do
|
||||
is be internally consistent.
|
||||
|
||||
### Format
|
||||
My own preference is similar to
|
||||
|
||||
`A - Surface (Pendant) = 2.0hrs - #12 MC+LV 20ft`,
|
||||
|
||||
described by the pseudo-[[regular-expression|regex]] below:
|
||||
|
||||
```regex
|
||||
<phase-abbr> - <assembly>(\: <assembly-subtype>)?( \(<comment>\))?( = <fixture-labor>)? <wiring-method> <branch-length>ft
|
||||
<phase-abbr> - <assembly>(: <assembly-subtype>)?( \(<comment>\))?( = <fixture-labor>)? <wiring-method> <branch-length>ft
|
||||
```
|
||||
|
||||
> [!example]
|
||||
> `A - Surface (Pendant) = 2.0hrs - #12 MC+LV 20ft`
|
||||
### Phase Abbreviation (`<phase-abbr>`)
|
||||
|
||||
### Order
|
||||
|
||||
|
||||
### Assembly (`<assembly>`)
|
||||
|
||||
[[luminaire-types]]
|
||||
|
||||
* "Surface" - Assembly includes a junction box
|
||||
* "Recessed" - Assembly does not include a junction box
|
||||
|
||||
### Assembly Subtype (`<assembly-subtype>`)
|
||||
|
||||
### Comment (`<comment>`)
|
||||
|
||||
In contrast to Assembly Subtype,
|
||||
Comment reflects a distinction between fixture types or use case
|
||||
_which does not affect the contents of the designation._
|
||||
That is, `Surface`, `Surface (Sconce)`, and `Surface (Pendant)`
|
||||
|
||||
### Fixture Labor (`<fixture-labor>`)
|
||||
|
||||
| Fixture Type | Labor |
|
||||
|:------------ | ----------:|
|
||||
| Paddle Fan | 1.5 hr/ea. |
|
||||
| Pendant | 1-4 hr/ea. |
|
||||
| Tape | 0.5 hr/6ft |
|
||||
| Site Poles | 1.5 hr/ea. |
|
||||
| Festoon | 2.0 hr/ea. |
|
||||
| All Others | 1.0 hr/ea. |
|
||||
|
||||
`FIXTURES`/`FIXTURE LABOR`/`FIXTURE LABOR 1HR`
|
||||
|
||||
### Wiring Method (`<wiring-method>`)
|
||||
|
||||
#### Conduit/Cable Type
|
||||
|
||||
#### Wire Size
|
||||
|
||||
| Case | Wire Size |
|
||||
| -------------- | --------- |
|
||||
| Site/Courtyard | #10 |
|
||||
| Garage | #10 |
|
||||
| NM Cable | #14\* |
|
||||
| All Others | #12 |
|
||||
|
||||
\*Minimum #12 in kitchens and bathrooms.
|
||||
|
||||
#### Dimming Conductors
|
||||
|
||||
### Branch Length (`<branch-length>`)
|
||||
|
||||
| Case | Standard Length |
|
||||
| --------------------- | --------------- |
|
||||
| Site/Courtyard | 50ft |
|
||||
| Garage | 50ft |
|
||||
| BOH | 40ft |
|
||||
| Corridors | 40ft |
|
||||
| Interior Amenity | 40ft |
|
||||
| Office/Retail | 50ft |
|
||||
| Exterior Amenity | 50ft |
|
||||
| Units | 20ft |
|
||||
| Undercabinet Fixtures | 10ft |
|
||||
| Stairwells | 20ft |
|
||||
| Kitchen | ? |
|
||||
|
||||
Reduce as appropriate.
|
||||
|
||||
## Order
|
||||
|
||||
Use empty designations to separate phases.
|
||||
|
||||
@@ -47,65 +120,21 @@ Use empty designations to separate phases.
|
||||
|
||||
## Content
|
||||
|
||||
### Fixture Labor
|
||||
|
||||
| Fixture Type | Labor |
|
||||
|:------------ | ----------:|
|
||||
| Paddle Fan | 1.5 hr/ea. |
|
||||
| Pendant | 1-4 hr/ea. |
|
||||
| Tape | 0.5 hr/6ft |
|
||||
| Site Poles | 1.5 hr/ea. |
|
||||
| Festoon | 2.0 hr/ea. |
|
||||
| All Others | 1.0 hr/ea. |
|
||||
|
||||
### Fixture Branch Length
|
||||
|
||||
| Case | Standard Length |
|
||||
| --------------------- | --------------- |
|
||||
| Site/Courtyard | 50ft |
|
||||
| Garage | 50ft |
|
||||
| BOH | 40ft |
|
||||
| Corridors | 40ft |
|
||||
| Interior Amenity | 40ft |
|
||||
| Office/Retail | 50ft |
|
||||
| Exterior Amenity | 50ft |
|
||||
| Units | 20ft |
|
||||
| Undercabinet Fixtures | 10ft |
|
||||
| Stairwells | 20ft |
|
||||
| Kitchen | ? |
|
||||
|
||||
Reduce as appropriate.
|
||||
|
||||
### Fixture Branch Wire size
|
||||
|
||||
| Case | Wire Size |
|
||||
| -------------- | --------- |
|
||||
| Site/Courtyard | #10 |
|
||||
| Garage | #10 |
|
||||
| NM Cable | #14[^1] |
|
||||
| All Others | #12 |
|
||||
|
||||
[^1]: Minimum #12 in kitchens and bathrooms.
|
||||
|
||||
## Garage
|
||||
|
||||
%%
|
||||
|
||||
Use ENT assemblies unless forbidden by spec.
|
||||
|
||||
| Case | Assembly Path (`FIXTURE ACCESSORIES`/`PVC/ENT ASSEMBLIES`/...) |
|
||||
| ----------------- | -------------------------------------------------------------- |
|
||||
| Conventional Slab | .../`GARAGE FIXTURE ENT W/#10 - STEEL OCT RING` |
|
||||
| Precast/I-Beam | .../`GARAGE FIXTURE W/T ROD ENT W/#10 - STEEL OCT RING` |
|
||||
|
||||
%%
|
||||
| Case | Subassembly Path (`FIXTURE ACCESSORIES`/`PVC/ENT ASSEMBLIES`/...) |
|
||||
|:----------------- | ----------------------------------------------------------------- |
|
||||
| Conventional Slab | .../`GARAGE FIXTURE ENT W/#10 - STEEL OCT RING` |
|
||||
| Precast/I-Beam | .../`GARAGE FIXTURE W/T ROD ENT W/#10 - STEEL OCT RING` |
|
||||
|
||||
If PVC is required, use following assemblies:
|
||||
|
||||
| Case | Assembly Path (`FIXTURE ACCESSORIES`/`PVC/ENT ASSEMBLIES`/...) |
|
||||
| ------- | -------------------------------------------------------------- |
|
||||
| Ceiling | .../`... - SLAB BOX / 45 DEG STUBBY` |
|
||||
| Wall | .../`... - STL BOX & TILE RING / 45 DEG STUBBY/ ENT DROP` |
|
||||
| Case | Subassembly Path (`FIXTURE ACCESSORIES`/`PVC/ENT ASSEMBLIES`/...) |
|
||||
|:------- |:----------------------------------------------------------------- |
|
||||
| Ceiling | .../`... - SLAB BOX / 45 DEG STUBBY` |
|
||||
| Wall | .../`... - STL BOX & TILE RING / 45 DEG STUBBY/ ENT DROP` |
|
||||
|
||||
## Surface Mount
|
||||
|
||||
@@ -119,8 +148,8 @@ If PVC is required, use following assemblies:
|
||||
> * Tape
|
||||
> * Track
|
||||
|
||||
| Wiring Method | Assembly Path |
|
||||
| -------------- | ----------------------------------------------------------- |
|
||||
| Wiring Method | Subassembly Path |
|
||||
|:-------------- |:----------------------------------------------------------- |
|
||||
| NM Cable | `NM ASSEMBLIES`/`RND BOX BAR HNGR...` |
|
||||
| MC Cable | `MC ASSEMBLIES`/`SQ BOX, ROUND P RING & MNTG BRKT...` |
|
||||
| PVC in Ceiling | `PVC/ENT ASSEMBLIES`/`... - SLAB BOX / 45 DEG STUBBY` |
|
||||
@@ -136,7 +165,7 @@ Also called "cove" or "strip" lighting,
|
||||
however those terms are less specific
|
||||
and potentially confusing.
|
||||
|
||||
Use item `FIXTURE LABOR 1/2HR`
|
||||
Use item `FIXTURE LABOR 1HR`
|
||||
and change `Fct 1` to match the calculated labor
|
||||
(1 hour per 12 feet).
|
||||
|
||||
@@ -174,8 +203,8 @@ IA - Surface (Tape) = 7.0hr (78-89ft) - #12 MC+LV 40ft
|
||||
> * wall grazer
|
||||
> * troffer
|
||||
|
||||
| Wiring Method | Assembly Path |
|
||||
| ------------- | ------------------------------ |
|
||||
| Wiring Method | Subassembly Path |
|
||||
|:------------- |:------------------------------ |
|
||||
| NM Cable | `NM ASSEMBLIES`/`HI HAT - ...` |
|
||||
| MC Cable | `MC ASSEMBLIES`/`HI HAT - ...` |
|
||||
|
||||
@@ -188,8 +217,8 @@ round up to the nearest 5ft
|
||||
|
||||
## Undercabinet Fixtures
|
||||
|
||||
| Wiring Method | Assembly Path |
|
||||
| ------------- | ------------------------------------- |
|
||||
| Wiring Method | Subassembly Path |
|
||||
|:------------- |:------------------------------------- |
|
||||
| NM Cable | `NM ASSEMBLIES`/`UNDER CABINET - ...` |
|
||||
| MC Cable | `MC ASSEMBLIES`/`UNDER CABINET - ...` |
|
||||
|
||||
@@ -198,41 +227,42 @@ round up to the nearest 5ft
|
||||
|
||||
## Paddle Fans
|
||||
|
||||
| Wiring Method | Assembly Path |
|
||||
| ------------- | ----------------------------------------------------- |
|
||||
| Wiring Method | Subassembly Path |
|
||||
|:------------- |:----------------------------------------------------- |
|
||||
| NM Cable | `NM ASSEMBLIES`/`RND BOX BAR HNGR...` |
|
||||
| MC Cable | `MC ASSEMBLIES`/`FAN RATED OCT BOX W/ BAR HNGR - ...` |
|
||||
| PVC | `PVC/ENT ASSEMBLIES`/`... - SLAB BOX / 45 DEG STUBBY` |
|
||||
|
||||
## Guardrail Fixtures
|
||||
|
||||
> [!info] Designation Subassemblies
|
||||
`FIXTURE ACCESSORIES`/`COURTYARDS & LANDSCAPE`/`ALUM BOX W/ FLEX FIX, 3/4" CONDUIT - PVC40 - ...`
|
||||
|
||||
## Stairwells & Elevators
|
||||
|
||||
`PVC/ENT ASSEMBLIES`/`... - SLAB BOX / 45 DEG STUBBY`
|
||||
> [!info] Designation Subassemblies
|
||||
> 1. `PVC/ENT ASSEMBLIES`/`... - SLAB BOX / 45 DEG STUBBY`
|
||||
|
||||
## Facade
|
||||
|
||||
> [!info] Breakdowns
|
||||
> * `Phase` = "Facade"
|
||||
|
||||
Length and Labor will be more than a normal fixture in BOH/Amenity
|
||||
|
||||
| Fixture Type | Labor |
|
||||
| ------------ | ---------------------- |
|
||||
| Non-Linear | 2hrs |
|
||||
| Linear | See [[#Tape Lighting]] |
|
||||
| Fixture Type | Labor |
|
||||
|:------------ |:------------------------ |
|
||||
| Non-Linear | 2hrs |
|
||||
| Linear | _See [[#Tape Lighting]]_ |
|
||||
|
||||
> [!info] Designation Subassemblies
|
||||
> 1. `3/4" PVC W/ 3#10 - STL BOX & TILE RING / 45 DEG STUBBY/ ENT DROP`
|
||||
> * `Length per Unit` = Distance to panel
|
||||
> * `Length per Unit` = Distance to panel
|
||||
|
||||
## Porte Cochere (Drive up Area)
|
||||
|
||||
Create its own breakout in WBS, and phase in [[accubid|Accubid]]
|
||||
|
||||
> [!quote]
|
||||
> This is not technically exposed or drop ceiling, but still use PVC
|
||||
|
||||
## Site & Courtyard
|
||||
|
||||
> [!important]
|
||||
@@ -240,11 +270,12 @@ Create its own breakout in WBS, and phase in [[accubid|Accubid]]
|
||||
|
||||
### Breakdowns
|
||||
|
||||
> [!info] Breakdowns
|
||||
> * `System` = "FML - Site Fixtures Material & Labor"
|
||||
|
||||
### Pole Lights
|
||||
|
||||
> [!info] Takeoff
|
||||
> [!info] Designation Subassemblies
|
||||
> 1. `FIXTURE ACCESSORIES`/`SITE POLE ASSEMBLIES`/...
|
||||
|
||||
Add subassemblies for stub-outs, pole, base, and grounding as appropriate.
|
||||
@@ -256,7 +287,7 @@ Add subassemblies for stub-outs, pole, base, and grounding as appropriate.
|
||||
> * market lighting
|
||||
> * catenary lighting
|
||||
|
||||
> [!info] Takeoff
|
||||
> [!info] Designation Subassemblies
|
||||
> 1. `FIXTURE LABOR`/`FIXTURE LABOR 2HR`
|
||||
>
|
||||
> 2. `FESTOON & ROOF ASSEMBLIES`/`FESTOON CABLE HANGER & EYE BOLTS - LENGTH`
|
||||
@@ -267,19 +298,19 @@ Add subassemblies for stub-outs, pole, base, and grounding as appropriate.
|
||||
|
||||
### Other Fixture Types
|
||||
|
||||
| Fixture Type | Path (`FIXTURE ACCESSORIES`/`COURTYARDS & LANDSCAPE`/...) |
|
||||
| ------------------------------------ | ------------------------------------------------------------------ |
|
||||
| Step Light | .../`STEP FIX, 3/4" CONDUIT - PVC40 - ...` |
|
||||
| Bollard | .../`BOLLARD, 3/4" CONDUIT - PVC40 - ...`[^2] |
|
||||
| Up-light | .../`PERMA POST, 3/4" CONDUIT - PVC40 - ...` |
|
||||
| In-grade up-light | .../`3/4" CONDUIT - PVC40, IMC Elbow, ...` |
|
||||
| Fixtures built into cabanas/pergolas | .../`ALUM BOX W/ FLEX FIX, 3/4" CONDUIT - PVC40 - ...` |
|
||||
| Handrail light | .../`ALUM BOX W/ FLEX FIX, 3/4" CONDUIT - PVC40, IMC ELBOW - ...` |
|
||||
| Fixture Type | Subassembly Path (`FIXTURE ACCESSORIES`/`COURTYARDS & LANDSCAPE`/...) |
|
||||
|:------------------------------------ |:--------------------------------------------------------------------- |
|
||||
| Step Light | .../`STEP FIX, 3/4" CONDUIT - PVC40 - ...` |
|
||||
| Bollard | .../`BOLLARD, 3/4" CONDUIT - PVC40 - ...`\* |
|
||||
| Up-light | .../`PERMA POST, 3/4" CONDUIT - PVC40 - ...` |
|
||||
| In-grade up-light | .../`3/4" CONDUIT - PVC40, IMC Elbow, ...` |
|
||||
| Fixtures built into cabanas/pergolas | .../`ALUM BOX W/ FLEX FIX, 3/4" CONDUIT - PVC40 - ...` |
|
||||
| Handrail light | .../`ALUM BOX W/ FLEX FIX, 3/4" CONDUIT - PVC40, IMC ELBOW - ...` |
|
||||
|
||||
[^2]: If we don't own concrete, delete pre-cast bollard base from assembly
|
||||
\*If we don't own concrete, delete pre-cast bollard base from assembly
|
||||
|
||||
## FAA Lighting
|
||||
|
||||
> [!info] Takeoff
|
||||
> [!info] Designation Subassemblies
|
||||
> 1. `FIXTURE LABOR`/`FIXTURE LABOR 1HR`
|
||||
> 2. `FESTOON & ROOF ASSEMBLIES`/`Aircraft Warning, 3/4" Conduit GRC/PVC 2#10, 1#10G`
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
---
|
||||
title: Garlic Chicken and Rice
|
||||
tags:
|
||||
- topic/hobbies/cooking
|
||||
up: "[[recipes]]"
|
||||
---
|
||||
# Garlic Chicken and Rice
|
||||
|
||||
## Ingredients
|
||||
|
||||
* **1 pound** boneless, skinless chicken breasts, cubed
|
||||
* **3/4 teaspoon** garlic salt
|
||||
* **1/4 teaspoon** ground black pepper
|
||||
* **4 cloves** garlic, minced
|
||||
* **1 cup** dry white rice
|
||||
* **3 cups** low-sodium chicken broth
|
||||
* **1/2 cup** heavy cream, room temperature
|
||||
* **2 cups** fresh spinach
|
||||
* **1/4 cup** freshly grated Parmesan cheese
|
||||
|
||||
## Instructions
|
||||
|
||||
* Season the **chicken** with the **garlic salt** and **pepper**.
|
||||
|
||||
* Add the chicken to a large oiled skillet.
|
||||
Sauté over medium-high heat until brown. (5--7 minutes)
|
||||
|
||||
* Add the **garlic** and sauté 1 minute more.
|
||||
|
||||
* Add **rice** and **chicken broth** to the pan.
|
||||
Bring to a boil then cover.
|
||||
Cook until most of the liquid is absorbed. (12--15 minutes)
|
||||
|
||||
* Stir in the **heavy cream** and **spinach**.
|
||||
Re-cover and cook for 5--7 minutes.
|
||||
|
||||
* Remove from heat.
|
||||
Stir in the **Parmesan cheese** and serve.
|
||||
@@ -0,0 +1,18 @@
|
||||
---
|
||||
title: Get Out of Bed by 06:00
|
||||
tags:
|
||||
- type/task
|
||||
daily: "[[2026-06-08]]"
|
||||
dateCreated: 2026-06-08T09:40:37.951-04:00
|
||||
dateModified: 2026-06-09T12:00:47.407-04:00
|
||||
priority: normal
|
||||
recurrence: DTSTART:20260608;FREQ=DAILY;INTERVAL=1
|
||||
recurrence_anchor: scheduled
|
||||
scheduled: 2026-06-10
|
||||
status: open
|
||||
skipped_instances:
|
||||
- 2026-06-08
|
||||
complete_instances:
|
||||
- 2026-06-09
|
||||
---
|
||||
# Get Out of Bed by 06:00
|
||||
@@ -0,0 +1,17 @@
|
||||
---
|
||||
title: Get to Work by 08:00
|
||||
tags:
|
||||
- type/task
|
||||
daily: "[[2026-06-08]]"
|
||||
priority: normal
|
||||
scheduled: 2026-06-10
|
||||
status: open
|
||||
dateCreated: 2026-06-08T08:25:10.870-04:00
|
||||
dateModified: 2026-06-09T12:00:49.023-04:00
|
||||
recurrence: DTSTART:20260608;FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR
|
||||
complete_instances:
|
||||
- 2026-06-09
|
||||
skipped_instances:
|
||||
- 2026-06-08
|
||||
---
|
||||
# Get to Work by 08:00
|
||||
@@ -0,0 +1,7 @@
|
||||
---
|
||||
title: Greek Yogurt
|
||||
tags: []
|
||||
up: "[[recipes]]"
|
||||
adapted-from: https://www.daringgourmet.com/easy-homemade-greek-yogurt/
|
||||
---
|
||||
# Greek Yogurt
|
||||
@@ -21,7 +21,8 @@ not especially consistent with the actual install.
|
||||
|
||||
## System Grounding
|
||||
|
||||
* `Area` = "01 - Feeders/Risers Building"
|
||||
> [!info] Breakdowns
|
||||
> * `Area` = "01 - Feeders/Risers Building"
|
||||
|
||||
1. `COMMON ASSEMBLIES`/`GROUNDING`/`GND = \#3/0 & 1" CONDUIT - EMT`
|
||||
* **Length:** Perimeter of the main electrical rooms plus length to each riser.
|
||||
|
||||
@@ -6,6 +6,8 @@ tags:
|
||||
- topic/strategy
|
||||
- type/media/book
|
||||
author: Daniel Kahneman
|
||||
aliases:
|
||||
- Thinking, Fast and Slow
|
||||
---
|
||||
# Thinking, Fast and Slow
|
||||
|
||||
|
||||
+15
-1
@@ -1,8 +1,13 @@
|
||||
---
|
||||
title: Kombucha
|
||||
tags: []
|
||||
up: "[[recipes]]"
|
||||
---
|
||||
# Kombucha
|
||||
|
||||
**Kombucha** is fermented tea, often flavored with fruit or spices.
|
||||
|
||||
The **pellicle** is the cellulose mat
|
||||
The **pellicle** is the cellulose mat
|
||||
that grows on the top of the kombucha during first fermentation.
|
||||
the pellicle is often referred to as the **SCOBY**
|
||||
(Symbiotic Colony of Bacteria and Yeast),
|
||||
@@ -70,3 +75,12 @@ although adding the pellicle does help speed things along.
|
||||
* Ignore recipes that direct you to "burp" your bottles during second fermentation.
|
||||
It's pointless and slows carbonation.
|
||||
Don't use shitty bottles and there's no risk of explosion.
|
||||
|
||||
## Quick Maintenance
|
||||
|
||||
1. Remove the pellicle from the jar
|
||||
to a temporary vessel.
|
||||
|
||||
2. Stir or swirl the kombucha
|
||||
to distribute the culture
|
||||
before filling
|
||||
@@ -0,0 +1,9 @@
|
||||
---
|
||||
title: Lasagna
|
||||
tags:
|
||||
- topic/hobbies/cooking
|
||||
up: "[[recipes]]"
|
||||
---
|
||||
# Lasagna
|
||||
|
||||
TODO
|
||||
@@ -24,7 +24,8 @@ aliases:
|
||||
Determine which Systems and Codes are required:
|
||||
* _IBC/IECC 2021 or later:_ all fixtures 0-10V dimmable.
|
||||
|
||||
* `System` = "LV - Lighting Control System"
|
||||
> [!info] Breakdowns
|
||||
> * `System` = "LV - Lighting Control System"
|
||||
|
||||
## Wall Switches
|
||||
|
||||
@@ -72,27 +73,29 @@ Room controllers distributed throughout controlled areas.
|
||||
`COMMON ASSEMBLIES`/`SWITCHES`/`LOW VOLTAGE SWITCHES & OCC SENSORS - ROUGH IN`/...
|
||||
|
||||
1. .../`DLM LTG RM CONTROLLER - ...`
|
||||
**Count:** each lighting control zone.
|
||||
* **Count:** each lighting control zone.
|
||||
|
||||
2. .../`REC PLUG CONTROLLER - ...`
|
||||
**Count:** each receptacle control zone.
|
||||
* **Count:** each receptacle control zone.
|
||||
|
||||
3. `HEATING`/`Network Bridge - Blank 4SQ`
|
||||
**Count:** each controller.
|
||||
* **Count:** each controller.
|
||||
|
||||
Coordinate with PDS to determine if necessary.
|
||||
|
||||
4. `COMMON ASSEMBLIES`/`PDI BRANCH CKT HOME RUNS`/... (_without_ dimming cable)
|
||||
**Count:** each _circuit_.
|
||||
* **Count:** each _circuit_.
|
||||
|
||||
### "Centralized" Systems
|
||||
|
||||
Zones switched and dimmed from central lighting control panel (LCP).
|
||||
|
||||
1. `COMMON ASSEMBLIES`/`DISTRIBUTION`/`LIGHTING CONTROL PANEL INSTALLATION`/...
|
||||
1. `COMMON ASSEMBLIES`/`PDI BRANCH CKT HOME RUNS`/... (_with_ dimming cable)
|
||||
* **Count:** each _lighting control zone_.
|
||||
|
||||
2. `COMMON ASSEMBLIES`/`PDI BRANCH CKT HOME RUNS`/... (_with_ dimming cable)
|
||||
**Count:** each _lighting control zone_.
|
||||
#### "Feed-Thru" Panels
|
||||
|
||||
1. `COMMON ASSEMBLIES`/`DISTRIBUTION`/`LIGHTING CONTROL PANEL INSTALLATION`/`_ - LIGHTING CONTROL PANEL INSTALLATION & TROUGH - ...`
|
||||
|
||||
### Somewhere In Between
|
||||
|
||||
@@ -103,8 +106,8 @@ assumes zones will be controlled either
|
||||
I think just as common is 3--5 circuit controllers above the ceiling.
|
||||
|
||||
1. `HEATING`/`Lighting Control Room Controller - n Circuit`
|
||||
**Count:** each controller.
|
||||
* **Count:** each controller.
|
||||
|
||||
2. `COMMON ASSEMBLIES`/`PDI BRANCH CKT HOME RUNS`/... (_without_ dimming cable)
|
||||
**Length:** route to room.
|
||||
**Count:** each circuit.
|
||||
* **Length:** route to room.
|
||||
* **Count:** each circuit.
|
||||
|
||||
@@ -42,6 +42,7 @@ If no quote is available:
|
||||
|
||||
### Takeoff
|
||||
|
||||
> [!info] Breakdowns
|
||||
> * `Area` = "01 - Lightning Protection Building"
|
||||
> * `Phase` = "Building - BOH, Storage & Common"
|
||||
> * `System` = "LPT - Lightning Protection"
|
||||
|
||||
+22
-13
@@ -1,29 +1,38 @@
|
||||
---
|
||||
aliases:
|
||||
- misc budgets takeoff
|
||||
title: Misc Budgets Takeoff
|
||||
tags:
|
||||
- occupational/takeoff
|
||||
- status/draft
|
||||
- type/guide
|
||||
up: "[[takeoff-scripts]]"
|
||||
aliases:
|
||||
- misc budgets takeoff
|
||||
---
|
||||
# Misc Budgets Takeoff
|
||||
|
||||
* `Drawing` = "N/A"
|
||||
|
||||
## Slab Deck
|
||||
|
||||
* `System` = "EL - Electrical"
|
||||
|
||||
Takeoff: `ITEM DATABASE`/`MISC PDI PRODUCT`/`MISC MATERIAL - SLAB/DECK & FEEDER`/`MISC MATERIAL - SLAB/DECK (NAILS, PAINT, TAPE, ETC = $250)`
|
||||
|
||||
1. * `Area` = "Typical - Building All Levels" (each level except roof)
|
||||
* `Phase` = "Building - BOH, Storage & Common"
|
||||
* **Count** = 1
|
||||
* _High Density:_ 1 per Section
|
||||
### Building
|
||||
|
||||
2. * `Area` = "Typical - Garage All Levels"
|
||||
* `Phase` = "Garage"
|
||||
> [!info] Breakdowns
|
||||
> * `Drawing` = "N/A"
|
||||
> * `Area` = "Typical - Building All Levels" (each level except roof)
|
||||
> * `Phase` = "Building - BOH, Storage & Common"
|
||||
> * `System` = "EL - Electrical"
|
||||
|
||||
[[temp-power-takeoff]]
|
||||
1. Takeoff: .../`MISC MATERIAL - SLAB/DECK ...`
|
||||
* **Count** = 1
|
||||
* _High Density:_ 1 per Section
|
||||
|
||||
### Garage
|
||||
|
||||
> [!info] Breakdowns
|
||||
> * `Drawing` = "N/A"
|
||||
> * `Area` = "Typical - Garage All Levels"
|
||||
> * `Phase` = "Garage"
|
||||
> * `System` = "EL - Electrical"
|
||||
|
||||
1. Takeoff: .../`MISC MATERIAL - SLAB/DECK ...`
|
||||
* **Count** = 1
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
---
|
||||
title: My Memory
|
||||
tags: []
|
||||
up: "[[zane-meyers]]"
|
||||
---
|
||||
# My Memory
|
||||
|
||||
I have a family history of dementia,
|
||||
and I am medically predisposed to transient forgetfulness.
|
||||
Several times in my life I have found months/years old notes in my handwriting
|
||||
that I could not recall writing, on subjects I could not recall having ever understood.
|
||||
|
||||
It deeply troubles me how much time I've wasted having the same ideas,
|
||||
working through the same problems, coming to the same conclusions.
|
||||
I am afraid that my memory has been deteriorating
|
||||
and will continue to until I'm intellectually useless well before my time.
|
||||
I'm not sure how much of this fear is real
|
||||
and how much is a subconscious ploy to justify not making the effort.
|
||||
|
||||
I project this insecurity on others strongly.
|
||||
I see the same signs in other people,
|
||||
and it reminds me of my own weakness.
|
||||
I get frustrated at others for not making efforts that I don't make myself.
|
||||
I don't use this notebook as often or as well as I should.
|
||||
|
||||
> [!note]
|
||||
> I give myself a hard time here,
|
||||
> but my "failure" to make lasting mental connections
|
||||
> is relative to my perception of my ability,
|
||||
> not to observation of others'.
|
||||
@@ -0,0 +1,33 @@
|
||||
---
|
||||
title: My Productivity
|
||||
tags: []
|
||||
up: "[[zane-meyers]]"
|
||||
---
|
||||
# My Productivity
|
||||
|
||||
In as few words as possible,
|
||||
I would say I am "High Efficiency, Low Productivity".
|
||||
|
||||
I have several problematic productivity habits.
|
||||
|
||||
#### Motivation
|
||||
|
||||
My primary motivators are curiosity and stress.
|
||||
|
||||
I find it very easy and natural
|
||||
to work on projects for extended, uninterrupted periods
|
||||
when I am investigating a new problem,
|
||||
or a potential new way to solve a problem.
|
||||
|
||||
Because of this I often spend hours working on things
|
||||
that will not benefit me or anyone else.
|
||||
Even if they _could_ be useful, my motivation ends with my curiosity
|
||||
around 90% progress, where I'm able to visualize the end result.
|
||||
|
||||
I find it near impossible to do work I'm not curious of
|
||||
until my subconscious determines that we have exactly enough time
|
||||
to finish it before the deadline.
|
||||
|
||||
I think I spend much more time bored than my peers.
|
||||
Others with as much free time as me
|
||||
tend to spend it exercising or in other more reasonable activities.
|
||||
@@ -0,0 +1,11 @@
|
||||
---
|
||||
title: My Purpose
|
||||
tags: []
|
||||
up: "[[zane-meyers]]"
|
||||
---
|
||||
# My Purpose
|
||||
|
||||
I want to be involved construction estimating for the rest of my working life.
|
||||
Current discourse on the subject is self-similar and sanitized.
|
||||
I'd like to be known as an innovator in [[heterodox-construction-estimating]],
|
||||
and for solving some of its open problems.
|
||||
@@ -1,197 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="generator" content="pandoc" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
||||
<title>letter-of-explanation_address-verification</title>
|
||||
<style>
|
||||
html {
|
||||
color: #1a1a1a;
|
||||
background-color: #fdfdfd;
|
||||
}
|
||||
body {
|
||||
margin: 0 auto;
|
||||
max-width: 36em;
|
||||
padding-left: 50px;
|
||||
padding-right: 50px;
|
||||
padding-top: 50px;
|
||||
padding-bottom: 50px;
|
||||
hyphens: auto;
|
||||
overflow-wrap: break-word;
|
||||
text-rendering: optimizeLegibility;
|
||||
font-kerning: normal;
|
||||
}
|
||||
@media (max-width: 600px) {
|
||||
body {
|
||||
font-size: 0.9em;
|
||||
padding: 12px;
|
||||
}
|
||||
h1 {
|
||||
font-size: 1.8em;
|
||||
}
|
||||
}
|
||||
@media print {
|
||||
html {
|
||||
background-color: white;
|
||||
}
|
||||
body {
|
||||
background-color: transparent;
|
||||
color: black;
|
||||
font-size: 12pt;
|
||||
}
|
||||
p, h2, h3 {
|
||||
orphans: 3;
|
||||
widows: 3;
|
||||
}
|
||||
h2, h3, h4 {
|
||||
page-break-after: avoid;
|
||||
}
|
||||
}
|
||||
p {
|
||||
margin: 1em 0;
|
||||
}
|
||||
a {
|
||||
color: #1a1a1a;
|
||||
}
|
||||
a:visited {
|
||||
color: #1a1a1a;
|
||||
}
|
||||
img {
|
||||
max-width: 100%;
|
||||
}
|
||||
svg {
|
||||
height: auto;
|
||||
max-width: 100%;
|
||||
}
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
margin-top: 1.4em;
|
||||
}
|
||||
h5, h6 {
|
||||
font-size: 1em;
|
||||
font-style: italic;
|
||||
}
|
||||
h6 {
|
||||
font-weight: normal;
|
||||
}
|
||||
ol, ul {
|
||||
padding-left: 1.7em;
|
||||
margin-top: 1em;
|
||||
}
|
||||
li > ol, li > ul {
|
||||
margin-top: 0;
|
||||
}
|
||||
blockquote {
|
||||
margin: 1em 0 1em 1.7em;
|
||||
padding-left: 1em;
|
||||
border-left: 2px solid #e6e6e6;
|
||||
color: #606060;
|
||||
}
|
||||
code {
|
||||
font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace;
|
||||
font-size: 85%;
|
||||
margin: 0;
|
||||
hyphens: manual;
|
||||
}
|
||||
pre {
|
||||
margin: 1em 0;
|
||||
overflow: auto;
|
||||
}
|
||||
pre code {
|
||||
padding: 0;
|
||||
overflow: visible;
|
||||
overflow-wrap: normal;
|
||||
}
|
||||
.sourceCode {
|
||||
background-color: transparent;
|
||||
overflow: visible;
|
||||
}
|
||||
hr {
|
||||
border: none;
|
||||
border-top: 1px solid #1a1a1a;
|
||||
height: 1px;
|
||||
margin: 1em 0;
|
||||
}
|
||||
table {
|
||||
margin: 1em 0;
|
||||
border-collapse: collapse;
|
||||
width: 100%;
|
||||
overflow-x: auto;
|
||||
display: block;
|
||||
font-variant-numeric: lining-nums tabular-nums;
|
||||
}
|
||||
table caption {
|
||||
margin-bottom: 0.75em;
|
||||
}
|
||||
tbody {
|
||||
margin-top: 0.5em;
|
||||
border-top: 1px solid #1a1a1a;
|
||||
border-bottom: 1px solid #1a1a1a;
|
||||
}
|
||||
th {
|
||||
border-top: 1px solid #1a1a1a;
|
||||
padding: 0.25em 0.5em 0.25em 0.5em;
|
||||
}
|
||||
td {
|
||||
padding: 0.125em 0.5em 0.25em 0.5em;
|
||||
}
|
||||
header {
|
||||
margin-bottom: 4em;
|
||||
text-align: center;
|
||||
}
|
||||
#TOC li {
|
||||
list-style: none;
|
||||
}
|
||||
#TOC ul {
|
||||
padding-left: 1.3em;
|
||||
}
|
||||
#TOC > ul {
|
||||
padding-left: 0;
|
||||
}
|
||||
#TOC a:not(:hover) {
|
||||
text-decoration: none;
|
||||
}
|
||||
code{white-space: pre-wrap;}
|
||||
span.smallcaps{font-variant: small-caps;}
|
||||
div.columns{display: flex; gap: min(4vw, 1.5em);}
|
||||
div.column{flex: auto; overflow-x: auto;}
|
||||
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
||||
/* The extra [class] is a hack that increases specificity enough to
|
||||
override a similar rule in reveal.js */
|
||||
ul.task-list[class]{list-style: none;}
|
||||
ul.task-list li input[type="checkbox"] {
|
||||
font-size: inherit;
|
||||
width: 0.8em;
|
||||
margin: 0 0.8em 0.2em -1.6em;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1 id="letter-of-explanation-address-verification">Letter of
|
||||
Explanation — Address Verification</h1>
|
||||
<p>To Whom It May Concern,</p>
|
||||
<p>I am writing in response to the request for clarification regarding
|
||||
my relationship to the properties listed below.</p>
|
||||
<ol type="1">
|
||||
<li><p><strong>104 Crest Pointe, Warner Robins, GA</strong></p>
|
||||
<p>This property is my parents’ primary residence. I did not participate
|
||||
in the purchase or ownership of this property and have never held any
|
||||
ownership interest in it. I resided at this address rent-free from
|
||||
<strong>September 2021 through June 2025</strong> as a family member. My
|
||||
role during this period was solely that of a resident; I was not a
|
||||
tenant under a lease, owner, or otherwise financially responsible for
|
||||
the property.</p></li>
|
||||
<li><p><strong>104 Crest Pointe, Centerville, GA</strong></p>
|
||||
<p>I have never lived at, owned, or otherwise been associated with a
|
||||
property at this address. I believe this is an erroneous address for 104
|
||||
Crest Pointe, Warner Robins, GA (Centerville is a neighboring
|
||||
municipality of Warner Robins).</p></li>
|
||||
</ol>
|
||||
<p>Please let me know if any additional information or clarification is
|
||||
required.</p>
|
||||
<p>Sincerely,</p>
|
||||
<p>Zane Meyers</p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,194 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="generator" content="pandoc" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
||||
<title>letter-of-explanation_withdrawals</title>
|
||||
<style>
|
||||
html {
|
||||
color: #1a1a1a;
|
||||
background-color: #fdfdfd;
|
||||
}
|
||||
body {
|
||||
margin: 0 auto;
|
||||
max-width: 36em;
|
||||
padding-left: 50px;
|
||||
padding-right: 50px;
|
||||
padding-top: 50px;
|
||||
padding-bottom: 50px;
|
||||
hyphens: auto;
|
||||
overflow-wrap: break-word;
|
||||
text-rendering: optimizeLegibility;
|
||||
font-kerning: normal;
|
||||
}
|
||||
@media (max-width: 600px) {
|
||||
body {
|
||||
font-size: 0.9em;
|
||||
padding: 12px;
|
||||
}
|
||||
h1 {
|
||||
font-size: 1.8em;
|
||||
}
|
||||
}
|
||||
@media print {
|
||||
html {
|
||||
background-color: white;
|
||||
}
|
||||
body {
|
||||
background-color: transparent;
|
||||
color: black;
|
||||
font-size: 12pt;
|
||||
}
|
||||
p, h2, h3 {
|
||||
orphans: 3;
|
||||
widows: 3;
|
||||
}
|
||||
h2, h3, h4 {
|
||||
page-break-after: avoid;
|
||||
}
|
||||
}
|
||||
p {
|
||||
margin: 1em 0;
|
||||
}
|
||||
a {
|
||||
color: #1a1a1a;
|
||||
}
|
||||
a:visited {
|
||||
color: #1a1a1a;
|
||||
}
|
||||
img {
|
||||
max-width: 100%;
|
||||
}
|
||||
svg {
|
||||
height: auto;
|
||||
max-width: 100%;
|
||||
}
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
margin-top: 1.4em;
|
||||
}
|
||||
h5, h6 {
|
||||
font-size: 1em;
|
||||
font-style: italic;
|
||||
}
|
||||
h6 {
|
||||
font-weight: normal;
|
||||
}
|
||||
ol, ul {
|
||||
padding-left: 1.7em;
|
||||
margin-top: 1em;
|
||||
}
|
||||
li > ol, li > ul {
|
||||
margin-top: 0;
|
||||
}
|
||||
blockquote {
|
||||
margin: 1em 0 1em 1.7em;
|
||||
padding-left: 1em;
|
||||
border-left: 2px solid #e6e6e6;
|
||||
color: #606060;
|
||||
}
|
||||
code {
|
||||
font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace;
|
||||
font-size: 85%;
|
||||
margin: 0;
|
||||
hyphens: manual;
|
||||
}
|
||||
pre {
|
||||
margin: 1em 0;
|
||||
overflow: auto;
|
||||
}
|
||||
pre code {
|
||||
padding: 0;
|
||||
overflow: visible;
|
||||
overflow-wrap: normal;
|
||||
}
|
||||
.sourceCode {
|
||||
background-color: transparent;
|
||||
overflow: visible;
|
||||
}
|
||||
hr {
|
||||
border: none;
|
||||
border-top: 1px solid #1a1a1a;
|
||||
height: 1px;
|
||||
margin: 1em 0;
|
||||
}
|
||||
table {
|
||||
margin: 1em 0;
|
||||
border-collapse: collapse;
|
||||
width: 100%;
|
||||
overflow-x: auto;
|
||||
display: block;
|
||||
font-variant-numeric: lining-nums tabular-nums;
|
||||
}
|
||||
table caption {
|
||||
margin-bottom: 0.75em;
|
||||
}
|
||||
tbody {
|
||||
margin-top: 0.5em;
|
||||
border-top: 1px solid #1a1a1a;
|
||||
border-bottom: 1px solid #1a1a1a;
|
||||
}
|
||||
th {
|
||||
border-top: 1px solid #1a1a1a;
|
||||
padding: 0.25em 0.5em 0.25em 0.5em;
|
||||
}
|
||||
td {
|
||||
padding: 0.125em 0.5em 0.25em 0.5em;
|
||||
}
|
||||
header {
|
||||
margin-bottom: 4em;
|
||||
text-align: center;
|
||||
}
|
||||
#TOC li {
|
||||
list-style: none;
|
||||
}
|
||||
#TOC ul {
|
||||
padding-left: 1.3em;
|
||||
}
|
||||
#TOC > ul {
|
||||
padding-left: 0;
|
||||
}
|
||||
#TOC a:not(:hover) {
|
||||
text-decoration: none;
|
||||
}
|
||||
code{white-space: pre-wrap;}
|
||||
span.smallcaps{font-variant: small-caps;}
|
||||
div.columns{display: flex; gap: min(4vw, 1.5em);}
|
||||
div.column{flex: auto; overflow-x: auto;}
|
||||
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
||||
/* The extra [class] is a hack that increases specificity enough to
|
||||
override a similar rule in reveal.js */
|
||||
ul.task-list[class]{list-style: none;}
|
||||
ul.task-list li input[type="checkbox"] {
|
||||
font-size: inherit;
|
||||
width: 0.8em;
|
||||
margin: 0 0.8em 0.2em -1.6em;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1 id="letter-of-explanation-withdrawals">Letter of Explanation —
|
||||
Withdrawals</h1>
|
||||
<p>To Whom It May Concern,</p>
|
||||
<p>I am writing in response to the request for clarification regarding
|
||||
the recurring withdrawals to “Loan 40” dated 11/20/2024 and 12/20/2024
|
||||
as shown on my bank statements.</p>
|
||||
<p>These withdrawals are automatic payments to my Visa Platinum credit
|
||||
card, which I hold with Robins Financial Credit Union. I use this credit
|
||||
card primarily to pay for gas for my vehicle.</p>
|
||||
<p>My understanding is that “Loan 40” is the friendly name of my credit
|
||||
card account ID, which ends in L40. In my statement for this card each
|
||||
payment is shown as “Loan Payment from Share 70”. My checking account ID
|
||||
ends in S70.</p>
|
||||
<p>These payments occur on the 20th of every month, unless my balance on
|
||||
the credit card is zero. The payments will continue to occur for as long
|
||||
as I continue to use the credit card. I currently have no plans to
|
||||
cancel or stop using the credit card.</p>
|
||||
<p>Please let me know if any additional information or clarification is
|
||||
required.</p>
|
||||
<p>Sincerely,</p>
|
||||
<p>Zane Meyers</p>
|
||||
</body>
|
||||
</html>
|
||||
+27
-27
@@ -12,33 +12,33 @@ title: PDI Breakdowns
|
||||
|
||||
### Bid Item: Site
|
||||
|
||||
* `Bid Item` = "1 - Site"
|
||||
* `Area` = "2 - Site"
|
||||
* `Phase` = "Site"
|
||||
> * `Bid Item` = "1 - Site"
|
||||
> * `Area` = "2 - Site"
|
||||
> * `Phase` = "Site"
|
||||
|
||||
### Bid Item: Garage
|
||||
|
||||
* `Bid Item` = "2 - Garage"
|
||||
* `Area` = "XX - Level XX Garage"
|
||||
* `Phase` = "Garage"
|
||||
> * `Bid Item` = "2 - Garage"
|
||||
> * `Area` = "XX - Level XX Garage"
|
||||
> * `Phase` = "Garage"
|
||||
|
||||
#### Area: Stairwells Garage
|
||||
|
||||
* `Area` = "S - Stairwells Garage"
|
||||
> * `Area` = "S - Stairwells Garage"
|
||||
|
||||
### Bid Item: Building
|
||||
|
||||
* `Bid Item` = "3 - Building"
|
||||
> * `Bid Item` = "3 - Building"
|
||||
|
||||
#### Owner
|
||||
|
||||
##### Area: Building
|
||||
|
||||
* `Area` = "XX - Level XX Building"
|
||||
> * `Area` = "XX - Level XX Building"
|
||||
|
||||
###### Phase: Back of House (BOH)
|
||||
|
||||
* `Phase` = "Building - Back of House (BOH)"
|
||||
> * `Phase` = "Building - Back of House (BOH)"
|
||||
|
||||
Catch all for spaces not
|
||||
|
||||
@@ -47,17 +47,17 @@ Catch all for spaces not
|
||||
|
||||
###### Phase: Corridor
|
||||
|
||||
* `Phase` = "Building - Corridor"
|
||||
> * `Phase` = "Building - Corridor"
|
||||
|
||||
###### Phase: Units
|
||||
|
||||
* `Area` = "Typical - Unit A"
|
||||
* `Phase` = "UNIT - ..."
|
||||
> * `Area` = "Typical - Unit A"
|
||||
> * `Phase` = "UNIT - ..."
|
||||
|
||||
##### Area: Interior Amenity
|
||||
|
||||
* `Area` = "XX - Level XX Interior Amenity Building"
|
||||
* `Phase` = "Interior Amenity"
|
||||
> * `Area` = "XX - Level XX Interior Amenity Building"
|
||||
> * `Phase` = "Interior Amenity"
|
||||
|
||||
High-finish, customer-facing spaces
|
||||
|
||||
@@ -79,8 +79,8 @@ Also includes
|
||||
|
||||
##### Area: Kitchen
|
||||
|
||||
* `Area` = "XX - Level XX Kitchen Building"
|
||||
* `Phase` = "Kitchen"
|
||||
> * `Area` = "XX - Level XX Kitchen Building"
|
||||
> * `Phase` = "Kitchen"
|
||||
|
||||
Commercial kitchen spaces
|
||||
defined by provisions for high-load equipment,
|
||||
@@ -93,13 +93,13 @@ which only include 20A provisions
|
||||
|
||||
##### Area: Ballrooms
|
||||
|
||||
* `Area` = "XX - Level XX Ballrooms Building"
|
||||
* `Phase` = "Ballrooms"
|
||||
> * `Area` = "XX - Level XX Ballrooms Building"
|
||||
> * `Phase` = "Ballrooms"
|
||||
|
||||
##### Area: Exterior Amenity
|
||||
|
||||
* `Area` = "XX - Level XX Exterior Amenity Building"
|
||||
* `Phase` = "Exterior Amenity"
|
||||
> * `Area` = "XX - Level XX Exterior Amenity Building"
|
||||
> * `Phase` = "Exterior Amenity"
|
||||
|
||||
##### Area: Porte Cochere
|
||||
|
||||
@@ -109,8 +109,8 @@ which only include 20A provisions
|
||||
|
||||
##### Area: Stairwells Building
|
||||
|
||||
* `Area` = "S - Stairwells Building"
|
||||
* `Phase` = "Building - Back of House (BOH)"
|
||||
> * `Area` = "S - Stairwells Building"
|
||||
> * `Phase` = "Building - Back of House (BOH)"
|
||||
|
||||
#### Tenant
|
||||
|
||||
@@ -121,16 +121,16 @@ These spaces seem to be, by definition, [[construction-methods#Core and Shell|sh
|
||||
|
||||
##### Area: Retail
|
||||
|
||||
* `Area` = "XX - Level XX Retail Building"
|
||||
* `Phase` = "Retail"
|
||||
> * `Area` = "XX - Level XX Retail Building"
|
||||
> * `Phase` = "Retail"
|
||||
|
||||
Core and shell for mercantile occupancies.
|
||||
Does not include finished restaurants
|
||||
|
||||
##### Area: Office Space
|
||||
|
||||
* `Area` = "XX - Level XX Retail Building"
|
||||
* `Phase` = "Office Space"
|
||||
> * `Area` = "XX - Level XX Retail Building"
|
||||
> * `Phase` = "Office Space"
|
||||
|
||||
> [!quote] [[joel-jansen]] to William Bonn 2025-12-05 (pp.)
|
||||
> PDI Accubid `Phase` "Office Space"
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
---
|
||||
id: 2026-05-31
|
||||
title: 2026-05-31
|
||||
tags: []
|
||||
weekly: "[[2026w23]]"
|
||||
monthly: "[[2026-05]]"
|
||||
quarterly: "[[2026q2]]"
|
||||
previous: "[[2026-05-30]]"
|
||||
---
|
||||
# 2026-05-31
|
||||
@@ -0,0 +1,10 @@
|
||||
---
|
||||
id: 2026-06-04
|
||||
title: 2026-06-04
|
||||
tags: []
|
||||
weekly: "[[2026w23]]"
|
||||
monthly: "[[2026-06]]"
|
||||
quarterly: "[[2026q2]]"
|
||||
previous: "[[2026-06-03]]"
|
||||
---
|
||||
# 2026-06-04
|
||||
@@ -0,0 +1,16 @@
|
||||
---
|
||||
id: 2026-06-05
|
||||
title: 2026-06-05
|
||||
tags: []
|
||||
weekly: "[[2026w23]]"
|
||||
monthly: "[[2026-06]]"
|
||||
quarterly: "[[2026q2]]"
|
||||
previous: "[[2026-06-04]]"
|
||||
---
|
||||
# 2026-06-05
|
||||
|
||||
When I got to work today, around 08:15,
|
||||
I watched one of the robot dogs plow into a bollard fixture.
|
||||
Unfortunately it kept going,
|
||||
and too fast for me to catch up
|
||||
to point and laugh into its camera.
|
||||
@@ -0,0 +1,10 @@
|
||||
---
|
||||
id: 2026-06-06
|
||||
title: 2026-06-06
|
||||
tags: []
|
||||
weekly: "[[2026w23]]"
|
||||
monthly: "[[2026-06]]"
|
||||
quarterly: "[[2026q2]]"
|
||||
previous: "[[2026-06-05]]"
|
||||
---
|
||||
# 2026-06-06
|
||||
@@ -0,0 +1,10 @@
|
||||
---
|
||||
id: 2026-06-07
|
||||
title: 2026-06-07
|
||||
tags: []
|
||||
weekly: "[[2026w24]]"
|
||||
monthly: "[[2026-06]]"
|
||||
quarterly: "[[2026q2]]"
|
||||
previous: "[[2026-06-06]]"
|
||||
---
|
||||
# 2026-06-07
|
||||
@@ -0,0 +1,10 @@
|
||||
---
|
||||
id: 2026-06-08
|
||||
title: 2026-06-08
|
||||
tags: []
|
||||
weekly: "[[2026w24]]"
|
||||
monthly: "[[2026-06]]"
|
||||
quarterly: "[[2026q2]]"
|
||||
previous: "[[2026-06-07]]"
|
||||
---
|
||||
# 2026-06-08
|
||||
@@ -0,0 +1,10 @@
|
||||
---
|
||||
id: 2026-06-09
|
||||
title: 2026-06-09
|
||||
tags: []
|
||||
weekly: "[[2026w24]]"
|
||||
monthly: "[[2026-06]]"
|
||||
quarterly: "[[2026q2]]"
|
||||
previous: "[[2026-06-08]]"
|
||||
---
|
||||
# 2026-06-09
|
||||
@@ -0,0 +1,7 @@
|
||||
---
|
||||
title: 2026w24
|
||||
tags: []
|
||||
yearly: "[[2026]]"
|
||||
previous: "[[2026w23]]"
|
||||
---
|
||||
# 2026w24
|
||||
@@ -8,3 +8,15 @@ tags: []
|
||||
# Project Management Institute (PMI)
|
||||
|
||||
[The Project Management Institute](https://pmi.org)
|
||||
|
||||
## PMBOK® Guide
|
||||
|
||||
[ _A Guide to the Project Management Body of Knowledge (PMBOK® Guide)_](https://www.pmi.org/standards/pmbok)
|
||||
is PMI's most notable publication.
|
||||
The namesake "project management body of knowledge"
|
||||
is not a separate document,
|
||||
but an abstract concept
|
||||
of the mutual understanding
|
||||
of all project management professionals.
|
||||
Concepts from the guide
|
||||
are ostensibly derived from this body of knowledge.
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
---
|
||||
title: Sauerkraut
|
||||
tags:
|
||||
- topic/hobbies/cooking
|
||||
adapted-from: https://www.daringgourmet.com/how-to-make-sauerkraut/
|
||||
up: "[[recipes]]"
|
||||
---
|
||||
# Sauerkraut
|
||||
|
||||
## Ingredients
|
||||
|
||||
* fresh green cabbage
|
||||
|
||||
* **1 1/2--2 tsp.** salt per pound of cabbage
|
||||
|
||||
## Instructions
|
||||
|
||||
1. Remove any bruised or damaged exterior leaves from the cabbage.
|
||||
Cut in half and remove the core.
|
||||
Slice the cabbage into ribbons about 1/8 inch thick.
|
||||
|
||||
2. Place the sliced cabbage in a large bowl and toss in the salt.
|
||||
Let it sit until the cabbage has begun to wilt. (~20 minutes)
|
||||
|
||||
3. Use a blunt utensil to thoroughly crush the cabbage.
|
||||
(This will takes several minutes.)
|
||||
|
||||
4. A bit at a time,
|
||||
transfer the cabbage and brine to a jar,
|
||||
mashing between additions.
|
||||
|
||||
5. Continue to mash the cabbage
|
||||
until it is completely submerged in the brine
|
||||
and any air pockets have been removed.
|
||||
|
||||
7. Add pickling weights
|
||||
and seal loosely
|
||||
then let ferment in a dark place for at least 2 weeks.
|
||||
|
||||
10. When the sauerkraut has reached the desired tanginess,
|
||||
seal tightly and refrigerate.
|
||||
@@ -7,14 +7,9 @@ creator:
|
||||
- type: speaker
|
||||
text: Mario Savio
|
||||
date: 1964-12-02
|
||||
description: >
|
||||
Address delivered by Mario Savio 2 December 1964,
|
||||
at The University of California at Berkeley,
|
||||
prior to a sit-in protesting the university's ban
|
||||
on political activities on campus.
|
||||
|
||||
The address is often called the "Bodies Upon the Gears" speech,
|
||||
in reference to Savio's second mode of civil disobedience.
|
||||
description: |-
|
||||
Address delivered by Mario Savio 2 December 1964, at The University of California at Berkeley, prior to a sit-in protesting the university's ban on political activities on campus.
|
||||
The address is often called the "Bodies Upon the Gears" speech, in reference to Savio's second mode of civil disobedience.
|
||||
url: https://www.americanrhetoric.com/speeches/mariosaviosproulhallsitin.htm
|
||||
---
|
||||
# Sit-in Address on the Steps of Sproul Hall
|
||||
|
||||
+10
-6
@@ -1,13 +1,13 @@
|
||||
---
|
||||
id: sleeving
|
||||
aliases:
|
||||
- sleeving takeoff
|
||||
title: Sleeving Takeoff
|
||||
tags:
|
||||
- occupational/takeoff
|
||||
- status/draft
|
||||
- type/guide
|
||||
title: Sleeving Takeoff
|
||||
up: "[[general-takeoff]]"
|
||||
aliases:
|
||||
- sleeving takeoff
|
||||
---
|
||||
# Sleeving Takeoff
|
||||
|
||||
@@ -18,14 +18,14 @@ as well as any additional sleeves shown on the drawings.
|
||||
|
||||
> [!important]
|
||||
> The term "sleeve" may refer to
|
||||
>
|
||||
>
|
||||
> * a short length of conduit
|
||||
>
|
||||
> * a Hilti-type firestop sleeve assembly
|
||||
>
|
||||
> * a short length of conduit
|
||||
> _in_ a Hilti-type firestop sleeve assembly
|
||||
>
|
||||
>
|
||||
> Seek additional clarification.
|
||||
|
||||
## Breakdowns
|
||||
@@ -38,7 +38,11 @@ the assembly to be sleeved.[^1]
|
||||
|
||||
## Item Selection
|
||||
|
||||
`ITEM DATABASE`/`HILTI`/`CAST-IN DEVICE CP 680-...`
|
||||
Conduit sleeve selection has nothing to do
|
||||
with the material of the floor it is installed in,
|
||||
only the material of the conduit.
|
||||
|
||||
`ITEM DATABASE`/`HILTI`/`CAST-IN DEVICE CP 680-_`
|
||||
|
||||
* **CP 680-P** --- For plastic conduit
|
||||
* **CP 680-M** --- For metal conduit[^2]
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
---
|
||||
title: Sourdough Bagels
|
||||
tags: []
|
||||
adapted-from: https://littlespoonfarm.com/sourdough-bagels-recipe/
|
||||
up: "[[recipes]]"
|
||||
---
|
||||
# Sourdough Bagels
|
||||
|
||||
## Ingredients
|
||||
|
||||
### Dough
|
||||
|
||||
- **100g** active sourdough starter
|
||||
- **255g** water
|
||||
- **40g** honey or sugar
|
||||
- **10g (2 tsp.)** fine sea salt
|
||||
- **500g** bread flour
|
||||
|
||||
### Water Bath
|
||||
|
||||
- **6 cups** water
|
||||
- **1 Tbsp.** granulated sugar
|
||||
|
||||
## Instructions
|
||||
|
||||
In a medium mixing bowl,
|
||||
stir together the starter, water, honey and salt with a spatula.
|
||||
Add the bread flour and knead to combine.
|
||||
Continue to knead for 10 minutes.
|
||||
Cover and let rest at room temperature for 8--12 hours.
|
||||
|
||||
%%
|
||||
11 hours was too long at 76°F.
|
||||
8--12 was based on 68°F.
|
||||
%%
|
||||
|
||||
Line a baking sheet with parchment paper.
|
||||
|
||||
Turn the dough out onto a clean work surface
|
||||
and divide into 8 equal pieces.
|
||||
|
||||
For each piece,
|
||||
poke a hole through the middle,
|
||||
then gently shape into a ring
|
||||
before placing on the baking sheet.
|
||||
|
||||
Cover the bagels with a towel
|
||||
and let rise until puffy. (30--60 minutes)
|
||||
|
||||
Preheat oven to 425°F.
|
||||
Bring 6 cups of water to a boil in a large stockpot
|
||||
and add 1 tablespoon of sugar.
|
||||
Boil the bagels for 2 minutes on each side.
|
||||
Do not crowd the pot, only boil 3--4 at a time.
|
||||
|
||||
Remove the bagels with a mesh strainer
|
||||
and let rest on the baking sheet until cool enough to handle.
|
||||
Dip one side into your choice of toppings
|
||||
and place back onto the baking sheet.
|
||||
|
||||
Bake at 425°F for 25--28 minutes or until golden brown.
|
||||
@@ -0,0 +1,22 @@
|
||||
---
|
||||
title: Sourdough
|
||||
tags: []
|
||||
---
|
||||
# Sourdough
|
||||
|
||||
| Temp (°F) | Bulk Proof Time (hrs) | < |
|
||||
| --------- | --------------:| --------:|
|
||||
| | **Min.** | **Max.** |
|
||||
| 64 | 10.0 | 12.0 |
|
||||
| 66 | 9.0 | 11.0 |
|
||||
| 68 | 8.0 | 10.0 |
|
||||
| 70 | 7.0 | 9.0 |
|
||||
| 72 | 6.0 | 8.0 |
|
||||
| 73 | 5.5 | 7.0 |
|
||||
| 75 | 4.5 | 5.5 |
|
||||
| 77 | 4.0 | 5.0 |
|
||||
| 78 | 3.5 | 4.5 |
|
||||
| 80 | 3.0 | 4.0 |
|
||||
| 82 | 2.5 | 3.5 |
|
||||
| 86 | 2.0 | 3.0 |
|
||||
| 90 | 1.5 | 2.5 |
|
||||
+4
-3
@@ -68,8 +68,9 @@ Use where conductors are oversized
|
||||
|
||||
Only for PVC subfeeds where we own voltage drop.
|
||||
|
||||
* `Area` = "Typical - Building Levels With Meter Centers"
|
||||
* `System` = "Electrical"
|
||||
* `Phase` = "Sub Feeders"
|
||||
> [!info] Breakdowns
|
||||
> * `Area` = "Typical - Building Levels With Meter Centers"
|
||||
> * `System` = "Electrical"
|
||||
> * `Phase` = "Sub Feeders"
|
||||
|
||||
`ITEM DATABASE`/`DISTRIBUTION`/`BUDGET ITEMS $ & LBR`/`METER CENTER WIRE TROUGH ($400/E)`
|
||||
|
||||
@@ -27,10 +27,11 @@ up: "[[takeoff-scripts]]"
|
||||
|
||||
## Switchgear
|
||||
|
||||
* `Area` = _As shown_
|
||||
* `Phase` = "Switch Gear"
|
||||
* `System` = "SWG - Switchgear"
|
||||
* `Bid Item` = "3 - Building"
|
||||
> [!info] Breakdowns
|
||||
> * `Area` = _As shown_
|
||||
> * `Phase` = "Switch Gear"
|
||||
> * `System` = "SWG - Switchgear"
|
||||
> * `Bid Item` = "3 - Building"
|
||||
|
||||
### Transformers
|
||||
|
||||
@@ -57,8 +58,9 @@ up: "[[takeoff-scripts]]"
|
||||
|
||||
## Generator
|
||||
|
||||
* `Area` = "01 - Generator"
|
||||
* `Phase` = "Switch Gear"
|
||||
* `System` = "Gen - Generator"
|
||||
> [!info] Breakdowns
|
||||
> * `Area` = "01 - Generator"
|
||||
> * `Phase` = "Switch Gear"
|
||||
> * `System` = "Gen - Generator"
|
||||
|
||||
1. [[distribution-designations#Generators]]
|
||||
|
||||
+22
-3
@@ -7,16 +7,35 @@ up: "[[conest-processes]]"
|
||||
|
||||
I often refer to "ConEst takeoff scripts"
|
||||
as justification for certain of decisions,
|
||||
but like the Project Management Body of Knowledge,
|
||||
they do not really exist in writing.
|
||||
but they do not really exist in writing.[^1]
|
||||
|
||||
[^1]: See [[conest-body-of-knowledge]]
|
||||
|
||||
Scripts should be directed,
|
||||
limiting extraneous information.
|
||||
|
||||
## Systems
|
||||
|
||||
The structure and names of scripts
|
||||
were originally intended to match how the terms
|
||||
are generally understood in ConEst,
|
||||
such that a new estimator could be told "Do _electrical_,"
|
||||
find `electrical-takeoff.md`, complete all its instructions,
|
||||
and in doing so satisfy the expectations of the estimator making the request.
|
||||
I've since come to the conclusion
|
||||
that the names of systems are ambiguously understood.
|
||||
A request that an estimator "do _electrical_"
|
||||
may or may not come with the expectation
|
||||
that any of lightning protection, slab deck budgets,
|
||||
or temporary power be completed as well.
|
||||
|
||||
Because I feel I lose nothing in doing so,
|
||||
|
||||
|
||||
## Citations
|
||||
|
||||
For the purpose of accountability,
|
||||
it is crucial that all direction have a documented origin.
|
||||
it is crucial that all direction has a documented origin.
|
||||
|
||||
Use footnotes to reference timestamped notes.
|
||||
|
||||
|
||||
@@ -1,56 +1,51 @@
|
||||
# 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")))))))'
|
||||
|
||||
|
||||
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"
|
||||
name: Agenda
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
@@ -62,7 +57,7 @@ views:
|
||||
options:
|
||||
showPropertyBasedEvents: false
|
||||
createDailyNotesFromDateLinks: true
|
||||
calendarView: "listWeek"
|
||||
calendarView: listWeek
|
||||
startDateProperty: file.ctime
|
||||
listDayCount: 7
|
||||
titleProperty: file.basename
|
||||
|
||||
@@ -1,55 +1,51 @@
|
||||
# Calendar
|
||||
|
||||
filters:
|
||||
and:
|
||||
- file.hasTag("type/task")
|
||||
- file.inFolder("templates") != true
|
||||
|
||||
formulas:
|
||||
priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))'
|
||||
daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'
|
||||
dueIn: 'if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))'
|
||||
daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'
|
||||
daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'
|
||||
daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'
|
||||
isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != "done"'
|
||||
isDueToday: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'
|
||||
isDueThisWeek: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")'
|
||||
isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'
|
||||
isRecurring: 'recurrence && !recurrence.isEmpty()'
|
||||
hasTimeEstimate: 'timeEstimate && timeEstimate > 0'
|
||||
timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'
|
||||
efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'
|
||||
timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'
|
||||
timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'
|
||||
dueMonth: 'if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")'
|
||||
dueWeek: 'if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")'
|
||||
scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")'
|
||||
scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")'
|
||||
dueDateCategory: 'if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))'
|
||||
timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))'
|
||||
ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))'
|
||||
createdMonth: 'file.ctime.format("YYYY-MM")'
|
||||
modifiedMonth: 'file.mtime.format("YYYY-MM")'
|
||||
priorityCategory: 'if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))'
|
||||
projectCount: 'if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))'
|
||||
contextCount: 'if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))'
|
||||
trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))'
|
||||
nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'
|
||||
daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'
|
||||
hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'
|
||||
isToday: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))'
|
||||
isThisWeek: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))'
|
||||
nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))'
|
||||
nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))'
|
||||
nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))'
|
||||
urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))'
|
||||
timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")'
|
||||
dueDateDisplay: 'if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))'
|
||||
|
||||
priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
|
||||
daysUntilDue: if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)
|
||||
dueIn: if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))
|
||||
daysUntilScheduled: if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
|
||||
daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
|
||||
daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
|
||||
isOverdue: (due.isEmpty() == false) && date(due) < today() && status != "done"
|
||||
isDueToday: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||
isDueThisWeek: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
|
||||
isScheduledToday: (scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||
isRecurring: recurrence && !recurrence.isEmpty()
|
||||
hasTimeEstimate: timeEstimate && timeEstimate > 0
|
||||
timeRemaining: if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
|
||||
efficiencyRatio: if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)
|
||||
timeTrackedThisWeek: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||
timeTrackedToday: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||
dueMonth: if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")
|
||||
dueWeek: if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")
|
||||
scheduledMonth: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")
|
||||
scheduledWeek: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")
|
||||
dueDateCategory: if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))
|
||||
timeEstimateCategory: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))
|
||||
ageCategory: if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))
|
||||
createdMonth: file.ctime.format("YYYY-MM")
|
||||
modifiedMonth: file.mtime.format("YYYY-MM")
|
||||
priorityCategory: if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))
|
||||
projectCount: if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))
|
||||
contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))
|
||||
trackingStatus: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
|
||||
nextDate: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))
|
||||
daysUntilNext: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))
|
||||
hasDate: (due.isEmpty() == false) || (scheduled.isEmpty() == false)
|
||||
isToday: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))
|
||||
isThisWeek: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))
|
||||
nextDateCategory: if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))
|
||||
nextDateMonth: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))
|
||||
nextDateWeek: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))
|
||||
urgencyScore: if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))
|
||||
timeTrackedFormatted: if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")
|
||||
dueDateDisplay: if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))
|
||||
views:
|
||||
- type: tasknotesCalendar
|
||||
name: "Calendar"
|
||||
name: Calendar
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
@@ -66,7 +62,7 @@ views:
|
||||
showTimeblocks: true
|
||||
showPropertyBasedEvents: true
|
||||
createDailyNotesFromDateLinks: true
|
||||
calendarView: "timeGridWeek"
|
||||
calendarView: timeGridWeek
|
||||
customDayCount: 3
|
||||
firstDay: 0
|
||||
slotDuration: "00:30:00"
|
||||
slotDuration: 00:30:00
|
||||
|
||||
@@ -1,55 +1,57 @@
|
||||
# Kanban Board
|
||||
|
||||
filters:
|
||||
and:
|
||||
- file.hasTag("type/task")
|
||||
- file.inFolder("templates") != true
|
||||
|
||||
formulas:
|
||||
priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))'
|
||||
daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'
|
||||
dueIn: 'if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))'
|
||||
daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'
|
||||
daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'
|
||||
daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'
|
||||
isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != "done"'
|
||||
isDueToday: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'
|
||||
isDueThisWeek: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")'
|
||||
isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'
|
||||
isRecurring: 'recurrence && !recurrence.isEmpty()'
|
||||
hasTimeEstimate: 'timeEstimate && timeEstimate > 0'
|
||||
timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'
|
||||
efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'
|
||||
timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'
|
||||
timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'
|
||||
dueMonth: 'if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")'
|
||||
dueWeek: 'if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")'
|
||||
scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")'
|
||||
scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")'
|
||||
dueDateCategory: 'if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))'
|
||||
timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))'
|
||||
ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))'
|
||||
createdMonth: 'file.ctime.format("YYYY-MM")'
|
||||
modifiedMonth: 'file.mtime.format("YYYY-MM")'
|
||||
priorityCategory: 'if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))'
|
||||
projectCount: 'if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))'
|
||||
contextCount: 'if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))'
|
||||
trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))'
|
||||
nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'
|
||||
daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'
|
||||
hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'
|
||||
isToday: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))'
|
||||
isThisWeek: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))'
|
||||
nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))'
|
||||
nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))'
|
||||
nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))'
|
||||
urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))'
|
||||
timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")'
|
||||
dueDateDisplay: 'if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))'
|
||||
|
||||
priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
|
||||
daysUntilDue: if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)
|
||||
dueIn: if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))
|
||||
daysUntilScheduled: if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
|
||||
daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
|
||||
daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
|
||||
isOverdue: (due.isEmpty() == false) && date(due) < today() && status != "done"
|
||||
isDueToday: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||
isDueThisWeek: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
|
||||
isScheduledToday: (scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||
isRecurring: recurrence && !recurrence.isEmpty()
|
||||
hasTimeEstimate: timeEstimate && timeEstimate > 0
|
||||
timeRemaining: if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
|
||||
efficiencyRatio: if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)
|
||||
timeTrackedThisWeek: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||
timeTrackedToday: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||
dueMonth: if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")
|
||||
dueWeek: if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")
|
||||
scheduledMonth: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")
|
||||
scheduledWeek: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")
|
||||
dueDateCategory: if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))
|
||||
timeEstimateCategory: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))
|
||||
ageCategory: if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))
|
||||
createdMonth: file.ctime.format("YYYY-MM")
|
||||
modifiedMonth: file.mtime.format("YYYY-MM")
|
||||
priorityCategory: if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))
|
||||
projectCount: if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))
|
||||
contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))
|
||||
trackingStatus: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
|
||||
nextDate: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))
|
||||
daysUntilNext: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))
|
||||
hasDate: (due.isEmpty() == false) || (scheduled.isEmpty() == false)
|
||||
isToday: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))
|
||||
isThisWeek: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))
|
||||
nextDateCategory: if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))
|
||||
nextDateMonth: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))
|
||||
nextDateWeek: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))
|
||||
urgencyScore: if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))
|
||||
timeTrackedFormatted: if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")
|
||||
dueDateDisplay: if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))
|
||||
views:
|
||||
- type: tasknotesKanban
|
||||
name: "Kanban Board"
|
||||
name: Kanban Board
|
||||
filters:
|
||||
and:
|
||||
- recurrence.isEmpty()
|
||||
groupBy:
|
||||
property: status
|
||||
direction: ASC
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
@@ -59,11 +61,8 @@ views:
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
sort:
|
||||
- column: tasknotes_manual_order
|
||||
- property: tasknotes_manual_order
|
||||
direction: DESC
|
||||
groupBy:
|
||||
property: status
|
||||
direction: ASC
|
||||
options:
|
||||
columnWidth: 280
|
||||
hideEmptyColumns: false
|
||||
|
||||
@@ -1,56 +1,51 @@
|
||||
# Mini Calendar
|
||||
# Generated with your TaskNotes settings
|
||||
|
||||
filters:
|
||||
and:
|
||||
- file.hasTag("type/task")
|
||||
- file.inFolder("templates") != true
|
||||
|
||||
formulas:
|
||||
priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))'
|
||||
daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'
|
||||
dueIn: 'if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))'
|
||||
daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'
|
||||
daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'
|
||||
daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'
|
||||
isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != "done"'
|
||||
isDueToday: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'
|
||||
isDueThisWeek: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")'
|
||||
isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'
|
||||
isRecurring: 'recurrence && !recurrence.isEmpty()'
|
||||
hasTimeEstimate: 'timeEstimate && timeEstimate > 0'
|
||||
timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'
|
||||
efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'
|
||||
timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'
|
||||
timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'
|
||||
dueMonth: 'if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")'
|
||||
dueWeek: 'if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")'
|
||||
scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")'
|
||||
scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")'
|
||||
dueDateCategory: 'if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))'
|
||||
timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))'
|
||||
ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))'
|
||||
createdMonth: 'file.ctime.format("YYYY-MM")'
|
||||
modifiedMonth: 'file.mtime.format("YYYY-MM")'
|
||||
priorityCategory: 'if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))'
|
||||
projectCount: 'if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))'
|
||||
contextCount: 'if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))'
|
||||
trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))'
|
||||
nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'
|
||||
daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'
|
||||
hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'
|
||||
isToday: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))'
|
||||
isThisWeek: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))'
|
||||
nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))'
|
||||
nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))'
|
||||
nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))'
|
||||
urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))'
|
||||
timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")'
|
||||
dueDateDisplay: 'if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))'
|
||||
|
||||
priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
|
||||
daysUntilDue: if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)
|
||||
dueIn: if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))
|
||||
daysUntilScheduled: if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
|
||||
daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
|
||||
daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
|
||||
isOverdue: (due.isEmpty() == false) && date(due) < today() && status != "done"
|
||||
isDueToday: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||
isDueThisWeek: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
|
||||
isScheduledToday: (scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||
isRecurring: recurrence && !recurrence.isEmpty()
|
||||
hasTimeEstimate: timeEstimate && timeEstimate > 0
|
||||
timeRemaining: if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
|
||||
efficiencyRatio: if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)
|
||||
timeTrackedThisWeek: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||
timeTrackedToday: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||
dueMonth: if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")
|
||||
dueWeek: if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")
|
||||
scheduledMonth: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")
|
||||
scheduledWeek: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")
|
||||
dueDateCategory: if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))
|
||||
timeEstimateCategory: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))
|
||||
ageCategory: if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))
|
||||
createdMonth: file.ctime.format("YYYY-MM")
|
||||
modifiedMonth: file.mtime.format("YYYY-MM")
|
||||
priorityCategory: if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))
|
||||
projectCount: if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))
|
||||
contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))
|
||||
trackingStatus: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
|
||||
nextDate: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))
|
||||
daysUntilNext: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))
|
||||
hasDate: (due.isEmpty() == false) || (scheduled.isEmpty() == false)
|
||||
isToday: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))
|
||||
isThisWeek: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))
|
||||
nextDateCategory: if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))
|
||||
nextDateMonth: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))
|
||||
nextDateWeek: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))
|
||||
urgencyScore: if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))
|
||||
timeTrackedFormatted: if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")
|
||||
dueDateDisplay: if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))
|
||||
views:
|
||||
- type: tasknotesMiniCalendar
|
||||
name: "Due"
|
||||
name: Due
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
@@ -64,12 +59,12 @@ views:
|
||||
direction: ASC
|
||||
dateProperty: due
|
||||
- type: tasknotesMiniCalendar
|
||||
name: "Scheduled"
|
||||
name: Scheduled
|
||||
order: []
|
||||
dateProperty: scheduled
|
||||
- type: tasknotesMiniCalendar
|
||||
name: "Created"
|
||||
name: Created
|
||||
dateProperty: file.ctime
|
||||
- type: tasknotesMiniCalendar
|
||||
name: "Modified"
|
||||
name: Modified
|
||||
dateProperty: file.mtime
|
||||
|
||||
+117
-143
@@ -1,71 +1,54 @@
|
||||
# All Tasks
|
||||
|
||||
filters:
|
||||
and:
|
||||
- file.hasTag("type/task")
|
||||
- file.inFolder("templates") != true
|
||||
|
||||
formulas:
|
||||
priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))'
|
||||
daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'
|
||||
dueIn: 'if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))'
|
||||
daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'
|
||||
daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'
|
||||
daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'
|
||||
isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != "done"'
|
||||
isDueToday: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'
|
||||
isDueThisWeek: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")'
|
||||
isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'
|
||||
isRecurring: 'recurrence && !recurrence.isEmpty()'
|
||||
hasTimeEstimate: 'timeEstimate && timeEstimate > 0'
|
||||
timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'
|
||||
efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'
|
||||
timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'
|
||||
timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'
|
||||
dueMonth: 'if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")'
|
||||
dueWeek: 'if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")'
|
||||
scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")'
|
||||
scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")'
|
||||
dueDateCategory: 'if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))'
|
||||
timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))'
|
||||
ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))'
|
||||
createdMonth: 'file.ctime.format("YYYY-MM")'
|
||||
modifiedMonth: 'file.mtime.format("YYYY-MM")'
|
||||
priorityCategory: 'if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))'
|
||||
projectCount: 'if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))'
|
||||
contextCount: 'if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))'
|
||||
trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))'
|
||||
nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'
|
||||
daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'
|
||||
hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'
|
||||
isToday: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))'
|
||||
isThisWeek: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))'
|
||||
nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))'
|
||||
nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))'
|
||||
nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))'
|
||||
urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))'
|
||||
timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")'
|
||||
dueDateDisplay: 'if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))'
|
||||
|
||||
priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
|
||||
daysUntilDue: if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)
|
||||
dueIn: if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))
|
||||
daysUntilScheduled: if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
|
||||
daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
|
||||
daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
|
||||
isOverdue: (due.isEmpty() == false) && date(due) < today() && status != "done"
|
||||
isDueToday: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||
isDueThisWeek: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
|
||||
isScheduledToday: (scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||
isRecurring: recurrence && !recurrence.isEmpty()
|
||||
hasTimeEstimate: timeEstimate && timeEstimate > 0
|
||||
timeRemaining: if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
|
||||
efficiencyRatio: if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)
|
||||
timeTrackedThisWeek: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||
timeTrackedToday: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||
dueMonth: if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")
|
||||
dueWeek: if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")
|
||||
scheduledMonth: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")
|
||||
scheduledWeek: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")
|
||||
dueDateCategory: if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))
|
||||
timeEstimateCategory: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))
|
||||
ageCategory: if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))
|
||||
createdMonth: file.ctime.format("YYYY-MM")
|
||||
modifiedMonth: file.mtime.format("YYYY-MM")
|
||||
priorityCategory: if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))
|
||||
projectCount: if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))
|
||||
contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))
|
||||
trackingStatus: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
|
||||
nextDate: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))
|
||||
daysUntilNext: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))
|
||||
hasDate: (due.isEmpty() == false) || (scheduled.isEmpty() == false)
|
||||
isToday: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))
|
||||
isThisWeek: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))
|
||||
nextDateCategory: if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))
|
||||
nextDateMonth: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))
|
||||
nextDateWeek: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))
|
||||
urgencyScore: if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))
|
||||
timeTrackedFormatted: if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")
|
||||
dueDateDisplay: if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))
|
||||
views:
|
||||
- type: tasknotesTaskList
|
||||
name: "Manual Order"
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
- blockedBy
|
||||
- file.name
|
||||
- recurrence
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
sort:
|
||||
- column: tasknotes_manual_order
|
||||
direction: DESC
|
||||
name: Manual Order
|
||||
groupBy:
|
||||
property: status
|
||||
direction: ASC
|
||||
- type: tasknotesTaskList
|
||||
name: "All Tasks"
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
@@ -75,28 +58,35 @@ views:
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
sort:
|
||||
- column: due
|
||||
- property: tasknotes_manual_order
|
||||
direction: DESC
|
||||
- type: tasknotesTaskList
|
||||
name: All Tasks
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
- blockedBy
|
||||
- file.name
|
||||
- recurrence
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
sort:
|
||||
- property: due
|
||||
direction: ASC
|
||||
- type: tasknotesTaskList
|
||||
name: "Not Blocked"
|
||||
name: Not Blocked
|
||||
filters:
|
||||
and:
|
||||
# Incomplete tasks
|
||||
- or:
|
||||
# Non-recurring task that's not in any completed status
|
||||
- and:
|
||||
- recurrence.isEmpty()
|
||||
- status != "done"
|
||||
# Recurring task where today is not in complete_instances
|
||||
- and:
|
||||
- recurrence.isEmpty() == false
|
||||
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
||||
# Not blocked by any incomplete tasks
|
||||
- and:
|
||||
- recurrence.isEmpty()
|
||||
- status != "done"
|
||||
- and:
|
||||
- recurrence.isEmpty() == false
|
||||
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
||||
- or:
|
||||
# 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()'
|
||||
- blockedBy.isEmpty()
|
||||
- list(blockedBy).filter(file(if(value.isType("object"), value.uid, value)).properties.status != "done").isEmpty()
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
@@ -106,30 +96,26 @@ views:
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
sort:
|
||||
- column: formula.urgencyScore
|
||||
- property: formula.urgencyScore
|
||||
direction: DESC
|
||||
- type: tasknotesTaskList
|
||||
name: "Today"
|
||||
name: Today
|
||||
filters:
|
||||
and:
|
||||
# Incomplete tasks (handles both recurring and non-recurring)
|
||||
- or:
|
||||
# Non-recurring task that's not in any completed status
|
||||
- and:
|
||||
- recurrence.isEmpty()
|
||||
- status != "done"
|
||||
# Recurring task where today is not in complete_instances
|
||||
- and:
|
||||
- recurrence.isEmpty() == false
|
||||
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
||||
# Due or scheduled today
|
||||
- and:
|
||||
- recurrence.isEmpty()
|
||||
- status != "done"
|
||||
- and:
|
||||
- recurrence.isEmpty() == false
|
||||
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
||||
- or:
|
||||
- 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")
|
||||
- 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
|
||||
@@ -139,30 +125,26 @@ views:
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
sort:
|
||||
- column: formula.urgencyScore
|
||||
- property: formula.urgencyScore
|
||||
direction: DESC
|
||||
- type: tasknotesTaskList
|
||||
name: "Overdue"
|
||||
name: Overdue
|
||||
filters:
|
||||
and:
|
||||
# Incomplete tasks
|
||||
- or:
|
||||
# Non-recurring task that's not in any completed status
|
||||
- and:
|
||||
- recurrence.isEmpty()
|
||||
- status != "done"
|
||||
# Recurring task where today is not in complete_instances
|
||||
- and:
|
||||
- recurrence.isEmpty() == false
|
||||
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
||||
# Due or scheduled in the past
|
||||
- and:
|
||||
- recurrence.isEmpty()
|
||||
- status != "done"
|
||||
- and:
|
||||
- recurrence.isEmpty() == false
|
||||
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
||||
- or:
|
||||
- and:
|
||||
- due.isEmpty() == false
|
||||
- date(due) < today()
|
||||
- and:
|
||||
- scheduled.isEmpty() == false
|
||||
- date(scheduled) < today()
|
||||
- and:
|
||||
- due.isEmpty() == false
|
||||
- date(due) < today()
|
||||
- and:
|
||||
- scheduled.isEmpty() == false
|
||||
- date(scheduled) < today()
|
||||
order:
|
||||
- status
|
||||
- priority
|
||||
@@ -172,32 +154,28 @@ views:
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
sort:
|
||||
- column: formula.urgencyScore
|
||||
- property: formula.urgencyScore
|
||||
direction: DESC
|
||||
- type: tasknotesTaskList
|
||||
name: "This Week"
|
||||
name: This Week
|
||||
filters:
|
||||
and:
|
||||
# Incomplete tasks
|
||||
- or:
|
||||
# Non-recurring task that's not in any completed status
|
||||
- and:
|
||||
- recurrence.isEmpty()
|
||||
- status != "done"
|
||||
# Recurring task where today is not in complete_instances
|
||||
- and:
|
||||
- recurrence.isEmpty() == false
|
||||
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
||||
# Due or scheduled this week
|
||||
- and:
|
||||
- recurrence.isEmpty()
|
||||
- status != "done"
|
||||
- and:
|
||||
- recurrence.isEmpty() == false
|
||||
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
||||
- or:
|
||||
- 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")
|
||||
- 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
|
||||
@@ -207,23 +185,19 @@ views:
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
sort:
|
||||
- column: formula.urgencyScore
|
||||
- property: formula.urgencyScore
|
||||
direction: DESC
|
||||
- type: tasknotesTaskList
|
||||
name: "Unscheduled"
|
||||
name: Unscheduled
|
||||
filters:
|
||||
and:
|
||||
# Incomplete tasks
|
||||
- or:
|
||||
# Non-recurring task that's not in any completed status
|
||||
- and:
|
||||
- recurrence.isEmpty()
|
||||
- status != "done"
|
||||
# Recurring task where today is not in complete_instances
|
||||
- and:
|
||||
- recurrence.isEmpty() == false
|
||||
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
||||
# No due date and no scheduled date
|
||||
- and:
|
||||
- recurrence.isEmpty()
|
||||
- status != "done"
|
||||
- and:
|
||||
- recurrence.isEmpty() == false
|
||||
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
||||
- date(due).isEmpty()
|
||||
- date(scheduled).isEmpty()
|
||||
order:
|
||||
@@ -235,5 +209,5 @@ views:
|
||||
- complete_instances
|
||||
- file.tasks
|
||||
sort:
|
||||
- column: status
|
||||
- property: status
|
||||
direction: ASC
|
||||
|
||||
+3
-2
@@ -57,8 +57,9 @@ Alternative
|
||||
|
||||
## Backbone Riser
|
||||
|
||||
* `Phase` = "Building - BOH ..."
|
||||
* `System` = "TC - Telecom Backbone"
|
||||
> [!info] Breakdowns
|
||||
> * `Phase` = "Building - BOH ..."
|
||||
> * `System` = "TC - Telecom Backbone"
|
||||
|
||||
If not shown:
|
||||
* _Garden Style:_ (2) 4"C
|
||||
|
||||
+1
-1
@@ -7,4 +7,4 @@ priority: {{priority}}
|
||||
scheduled: {{scheduledDate}}
|
||||
status: {{status}}
|
||||
---
|
||||
# <% moment(tp.file.title, 'YYYY-MM-DD_HH-mm-ss').format('YYYY-MM-DD HH:mm:ss') %>
|
||||
# {{title}}
|
||||
|
||||
@@ -7,13 +7,13 @@ daily: "[[2025-08-15]]"
|
||||
---
|
||||
# 2025-08-15 14:15:41
|
||||
|
||||
Exact date of quote unknown.
|
||||
Assumed date is that of commit 85d30c0,
|
||||
the first commit the quote appeared
|
||||
in its previous location [[feeders-takeoff]],
|
||||
formerly "feeders.md".
|
||||
|
||||
> [!cite] [[joel-jansen]], in reference to Omni Hotels Raleigh (pp.)
|
||||
> [!cite] [[joel-jansen]], in reference to Omni Hotels Raleigh (pp.)[^1]
|
||||
> It is acceptable to use typicals for identical feeders
|
||||
> (i.e. meter centers fed from bus plugs)
|
||||
> so long as the typical is in `Area` = "01 - Feeders/Risers ...".
|
||||
|
||||
[^1]: Exact date of quote unknown.
|
||||
Assumed date is that of commit 85d30c0,
|
||||
the first commit the quote appeared
|
||||
in its previous location [[feeders-takeoff]],
|
||||
formerly "feeders.md".
|
||||
@@ -9,7 +9,7 @@ daily: "[[2026-05-14]]"
|
||||
|
||||
## 303 Mariposa Residence Pre-takeoff Confirmation Email Review
|
||||
|
||||
Consultation with [[josh-ford|Josh]]
|
||||
Consultation with [[josh-ford|Josh Ford]]
|
||||
regarding [[conest-pre-takeoff-confirmation]]
|
||||
for [[303-mariposa-residence]].
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ daily: "[[2026-05-20]]"
|
||||
# 2026-05-20 13:10:36
|
||||
|
||||
Direction from [[josh-ford]]
|
||||
relevant to [[electrical-takeoff]]
|
||||
on [[303-mariposa-residence]]
|
||||
with application elsewhere as well.
|
||||
|
||||
|
||||
@@ -0,0 +1,120 @@
|
||||
---
|
||||
id: 2026-06-03T14:05:39-0400
|
||||
title: 2026-06-03 14:05:39
|
||||
tags: []
|
||||
daily: "[[2026-06-03]]"
|
||||
---
|
||||
# 2026-06-03 14:05:39
|
||||
|
||||
## 303 Mariposa Residence Senior Review
|
||||
|
||||
[[conest-senior-review]] for [[303-mariposa-residence]]
|
||||
lead by [[joel-jansen]] and attended by [[zane-meyers]] and [[jared-defanti]].
|
||||
|
||||
### Selling Price
|
||||
|
||||
[[pdi-bid-estimating|Bid]]'s proposal base bid was \$800,000,
|
||||
but in response to the [[conest-pre-takeoff-confirmation]]
|
||||
[[joshua-komis]] said to add \$65,000 for secondaries.
|
||||
|
||||
We found correspondence
|
||||
that the secondaries were sold as $10,000 for conduit
|
||||
and $65,000 for wire.
|
||||
|
||||
Joel messaged Komis to clarify.
|
||||
He responded to use \$875,000.
|
||||
|
||||
### Site Run Adders
|
||||
|
||||
Joel questioned the use of 15ft adders for secondaries.
|
||||
I explained their use was based on prior direction he had given below.
|
||||
|
||||
> [!quote] feeders-takeoff.md
|
||||
> #### Adders
|
||||
>
|
||||
> Use the difference in elevation between equipment
|
||||
> or 10ft, whichever is greater.
|
||||
>
|
||||
> Add an additional 5ft (total 15ft) for site runs
|
||||
> (primaries, secondaries, etc.).
|
||||
|
||||
Joel remembered and started to move on.
|
||||
Jared asked if the extra adder was for vertical distance or routing contingency,
|
||||
Joel responded that it was sort of both.
|
||||
|
||||
I suggested that if it may be necessary to adjust them anyway,
|
||||
and "site runs" often being up to interpretation,
|
||||
it may be preferable to assume 10ft to start for all cases
|
||||
where the start and end are on the same level.
|
||||
That is, remove the conditional 5ft extra adder from the script.
|
||||
Joel agreed.
|
||||
|
||||
Mariposa's site runs didn't need adders at all
|
||||
since we added PVC80 stub-ups.
|
||||
|
||||
### Site Low Voltage Duct Bank
|
||||
|
||||
We assumed 2in conduit,
|
||||
but did not note this visibly.
|
||||
|
||||
### Solar Feeders
|
||||
|
||||
Solar [[feeders-takeoff]] used copper feeder size
|
||||
based on aluminum size shown in Solar set.
|
||||
No change necessary.
|
||||
|
||||
We should have added the solar one-line to LiveCount.
|
||||
|
||||
### Material Pricing
|
||||
|
||||
Joel requested pricing for the dimmable receptacles from [[pdi-procurement]].
|
||||
|
||||
### Mechanical Connections
|
||||
|
||||
B-1, B-2 feeders were parallel runs,
|
||||
but taken off as 2 counts each.
|
||||
|
||||
### Telecom
|
||||
|
||||
[[telecom-takeoff]] assumed Cat5e
|
||||
but we did not note the assumption visibly.
|
||||
|
||||
### Fire Alarm
|
||||
|
||||
[[fire-alarm-takeoff]]
|
||||
|
||||
> PCM is supposed to keep Systems from
|
||||
|
||||
\$10,000 was my budget
|
||||
assuming a dozen or so interconnected smokes.
|
||||
|
||||
\$26,XXX was the quote
|
||||
for sprinkler monitoring only.
|
||||
"only one assembly"
|
||||
|
||||
### Closeout
|
||||
|
||||
#### Final Pricing
|
||||
|
||||
[[pdi-accubid-final-price]]
|
||||
|
||||
##### Sales Tax
|
||||
|
||||
10.35%
|
||||
|
||||
#### Equipment
|
||||
|
||||
#### General Expenses
|
||||
|
||||
"Just the PM so we only need one trip"
|
||||
|
||||
Got rid of APM, Foreman
|
||||
|
||||
Approved Labor Plan created by Bid,
|
||||
approved by (Efren's title)
|
||||
|
||||
only 3mil or above
|
||||
|
||||
coordination study
|
||||
\$15,000 up to x
|
||||
\$25,000 above x
|
||||
@@ -0,0 +1,245 @@
|
||||
---
|
||||
id: 2026-06-04T10:05:03-0400
|
||||
title: 2026-06-04 10:05:03
|
||||
tags: []
|
||||
daily: "[[2026-06-04]]"
|
||||
---
|
||||
# 2026-06-04 10:05:03
|
||||
|
||||
## Mechanical Rules of Thumb
|
||||
|
||||
### Cooling towers
|
||||
|
||||
Avoid single cell tower
|
||||
|
||||
Avoid tower without a bleed-off
|
||||
|
||||
Avoid tower without heat trace and insulation on the make-up water
|
||||
|
||||
Avoid line-to-line bypass (in lieu of dumping into the sump)
|
||||
|
||||
### Chillers/chilled water
|
||||
|
||||
|
||||
Avoid one chiller system (exception: dual circuit air-cooled)
|
||||
|
||||
Avoid series chillers without bypasses
|
||||
|
||||
Avoid a coil with more than 14 fins/inch
|
||||
|
||||
### Equipment/misc.
|
||||
|
||||
Avoid simplex air compressor
|
||||
|
||||
Avoid simplex sump pump
|
||||
|
||||
Avoid dx built-up systems (vav)
|
||||
|
||||
Avoid coil face velocity above 550 fpm (could send condensate down ductwork)
|
||||
|
||||
Avoid horizontal cold water lines or horizontal roof drain lines above ceilings without insulating (dripping/sweating)
|
||||
|
||||
Isolation valves on both sides of all equipment - good practice
|
||||
|
||||
Think about future service: don't locate where dangerous to service
|
||||
|
||||
Avoid discharging roof drains onto a driveway or where pedestrian traffic
|
||||
|
||||
Avoid floor mounted water closets in commercial buildings - cleaning issue
|
||||
|
||||
Minimum 4" housekeeping pads underneath all floor mounted equipment
|
||||
|
||||
Ashrae recommends 400 fpm face velocity maximum at intake louvers
|
||||
|
||||
Avoid standard filters at more than 500 fpm (see mfgr recommendations)
|
||||
|
||||
Trap primers on all floor drains
|
||||
|
||||
### Ashrae 62 (ventilation)
|
||||
|
||||
* 20 cfm/person oa in office buildings.
|
||||
exceptions: large assembly areas
|
||||
|
||||
* 15 cfm/person oa in schools.
|
||||
|
||||
note: this ventilation might exceed the local codes,
|
||||
but ashrae recommendations should be met.
|
||||
|
||||
### Smacna pressure class
|
||||
|
||||
* 1" wg - low pressure
|
||||
* 3" wg - medium pressure
|
||||
* Under 3" wg - smacna does not recommend duct testing
|
||||
|
||||
If higher static pressures are specified,
|
||||
try to get lower pressure classes approved.
|
||||
The savings in duct costs are significant.
|
||||
|
||||
### Ductwork sizing
|
||||
|
||||
| Case | Max Friction Per 100ft |
|
||||
| ------------ | ---------------------- |
|
||||
| Low pressure | 0.10" |
|
||||
| Exhaust duct | 0.15" |
|
||||
|
||||
|
||||
| Case | Velocity FPM |
|
||||
| --------------------- | ------------------------------- |
|
||||
| Medium pressure riser | Max 3000 |
|
||||
| Medium pressure | Max 2500 |
|
||||
| Low pressure | Max 1800-2000 |
|
||||
| Return air shaft | Max 1000 |
|
||||
| Outside air shaft | Max 1000 |
|
||||
| Grease duct | Target 1800, Min 1500, Max 2200 |
|
||||
|
||||
Due to excessive noise,
|
||||
Avoid fan-powered or VAV boxes larger than 2000 CFM.
|
||||
|
||||
Install a balance damper at each low-pressure runout to diffusers.
|
||||
|
||||
No more than 90° turn with flex duct, straight duct run into boxes.
|
||||
|
||||
Where space permits,
|
||||
consider converting rectangular ductwork to round ductwork.
|
||||
|
||||
Energy code requires all duct to be sealed.
|
||||
|
||||
### Pumps
|
||||
|
||||
Try to locate condenser water pumps as low as possible
|
||||
as compared to the cooling tower basin - NPSH - gravity flow.
|
||||
|
||||
Select pumps for "non-overloading".
|
||||
|
||||
Select impeller no larger than 90% of maximum impeller size.
|
||||
|
||||
### Air units
|
||||
|
||||
| Tons | CFM/Ton |
|
||||
| ------------- | ------- |
|
||||
| under 20 | ~400 |
|
||||
| 25 and larger | ~350 |
|
||||
|
||||
|
||||
Avoid VFD bypass on VAV fan systems
|
||||
because it can blow apart duct in manual mode.
|
||||
Consider a spare VFD, or dump damper/blow-out doors.
|
||||
|
||||
Avoid larger economizer systems without powered exhaust.
|
||||
|
||||
### Useful formulas (standard conditions)
|
||||
|
||||
Quantity (CFM) = Velocity (FPM) * Area (SF)
|
||||
|
||||
Sensible load (BTUH) = 1.08 * CFM * (Delta-T)
|
||||
|
||||
Latent load (BTUH) = 0.68 * CFM * (Delta-GR)
|
||||
|
||||
Total load (BTUH) = 4.45 * CFM * (Delta-H)
|
||||
|
||||
* Formula for water:
|
||||
* Load (BTUH) = 1.08 * CFM * (Delta-T)
|
||||
|
||||
$$
|
||||
\rm{GPM} = \frac{\text{Load (BTUH)}}{500 \times \text{Delta-T}}
|
||||
$$
|
||||
|
||||
* A/C equipment efficiencies:
|
||||
|
||||
$$
|
||||
|
||||
$$
|
||||
|
||||
### Conversion factors
|
||||
|
||||
* 1 PSI = 2.307 ft of water
|
||||
* 1 ton A/C = 12,000 BTUH
|
||||
* 1 hp = 2545.1 BTUH = 745.7 watts
|
||||
* 1 kW = 341 5 BTUH
|
||||
* 1 cubic foot = 7.48 gallons
|
||||
* 1 gal. of water = 8.345 lbs
|
||||
|
||||
### pipe sizing
|
||||
|
||||
* 8 to 10 FPS max. Velocity
|
||||
* 6 FPS max. Velocity (public areas - noise)
|
||||
* 10 to 15 FPS velocity in central plant headers or on roof
|
||||
* 3" ano smaller: max head loss 6 ft/100 ft
|
||||
* Schedule 40 blk. Stl. Pipe sizing: (* std wt)
|
||||
|
||||
### Hvac piping
|
||||
|
||||
* Chilled water: 2 GPM/ton (12°F Delta-t)
|
||||
* Condenser water: 3 GPM/ton
|
||||
|
||||
#### Thermal Expansion
|
||||
|
||||
(steel pipe): 1" expansion/100 ft of pipe/100°F rise
|
||||
|
||||
### A/C condensate/waste sizing
|
||||
|
||||
| Tons | Pipe Size |
|
||||
| -------- | --------- |
|
||||
| Up to 20 | 3/4" |
|
||||
| 21--40 | 1" |
|
||||
| 41--90 | 1-1/4" |
|
||||
| 91--125 | 1-1/2" |
|
||||
| 126--250 | 2" |
|
||||
|
||||
### Air device sizing
|
||||
|
||||
| CFM | Neck Size |
|
||||
| --------- | --------- |
|
||||
| Up to 150 | 6" |
|
||||
| 151--250 | 8" |
|
||||
| 251--450 | 10" |
|
||||
| 451--650 | 12" |
|
||||
| 651--800 | 14" |
|
||||
|
||||
### FPB/VAV sizing
|
||||
|
||||
| Inlet Size | Max CFM |
|
||||
| ---------- | ------- |
|
||||
| 6" | 450 |
|
||||
| 8" | 700 |
|
||||
| 10" | 1200 |
|
||||
| 12" | 1700 |
|
||||
| 14" | 2300 |
|
||||
|
||||
Note: runout distance is very important.
|
||||
The inlet size shown is not necessarily the correct runout size to the box.
|
||||
(Medium pressure runs 0.3 ft/100 ft max)
|
||||
|
||||
### Cooling loads
|
||||
|
||||
| Building Type | SF/Ton |
|
||||
| ------------------ | -------- |
|
||||
| Office buildings | 300--325 |
|
||||
| Tempered warehouse | 500 |
|
||||
| Call center | 275--300 |
|
||||
|
||||
* Typical air distribution for office bldgs:
|
||||
* north 1.5 CFM/SF
|
||||
(assumes 12 ft zone east 2.0 CFM/SF and 25°F Delta-t)
|
||||
* south 2.5 CFM/SF
|
||||
* west 2.5 CFM/SF
|
||||
* interior 0.8 CFM/SF
|
||||
* total should avg 0.8 to 1.0 CFM/SF gross
|
||||
|
||||
* Smoke evacuation: 1 CFM/SF
|
||||
|
||||
* Stairwell pressurization: 2000 CFM/floor
|
||||
|
||||
### Plumbing Fixture Runout Minimum Size Schedule
|
||||
|
||||
| Fixture | Waste | Vent | Cold | Hot |
|
||||
| ---------------------- | ------ | ------ | ---- | ---- |
|
||||
| Water Closets | 4" | 2" | 1" | - |
|
||||
| Lavatories | 1-1/2" | 1-1/2" | 1/2" | 1/2" |
|
||||
| Urinals | 2" | 1-1/2" | 3/4" | - |
|
||||
| Sinks | 2" | 1-1/2" | 1/2" | 1/2" |
|
||||
| Service Sinks | 3" | 2" | 3/4" | 3/4" |
|
||||
| Hose Bibbs | - | - | 3/4" | - |
|
||||
| Box Hydrants | - | - | 3/4" | - |
|
||||
| Electric Water Coolers | 2" | 1-1/2" | 1/2" | - |
|
||||
| Showers | 2" | 2" | 1/2" | 1/2" |
|
||||
@@ -0,0 +1,20 @@
|
||||
---
|
||||
id: 2026-06-04T11:40:49-0400
|
||||
title: 2026-06-04 11:40:49
|
||||
tags: []
|
||||
daily: "[[2026-06-04]]"
|
||||
---
|
||||
# 2026-06-04 11:40:49
|
||||
|
||||
Expect that people's explanations
|
||||
of what they do and why they do it
|
||||
will be related to what they _actually_ do
|
||||
and why they _actually_ do it,
|
||||
but if you care to meet or exceed their ability
|
||||
never take those explanations at face value.
|
||||
|
||||
It is well known that the ability of individuals
|
||||
to perform complex practiced tasks
|
||||
_far_ exceeds their ability to explain their process.[^1]
|
||||
|
||||
[^1]: See [[kahneman_2011_thinking]]
|
||||
@@ -0,0 +1,120 @@
|
||||
---
|
||||
id: 2026-06-04T13:20:08-0400
|
||||
title: 2026-06-04 13:20:08
|
||||
tags: []
|
||||
daily: "[[2026-06-04]]"
|
||||
---
|
||||
# 2026-06-04 13:20:08
|
||||
|
||||
## 303 Mariposa Residence
|
||||
|
||||
[[conest-manager-review]] for [[303-mariposa-residence]]
|
||||
lead by [[josh-ford]] as ConEst Manager
|
||||
attended by [[joel-jansen]] as ConEst Senior Estimator
|
||||
and [[jared-defanti]] and [[zane-meyers]] as ConEst Estimators.
|
||||
|
||||
### Temporary Power
|
||||
|
||||
> "Do they really need \$10,000 for temp power?"
|
||||
|
||||
\$2,500 and 50hrs
|
||||
|
||||
### Site Lighting
|
||||
|
||||
Pole Bases
|
||||
|
||||
> "I would leave it if it's for the bollards. It can't be that much."
|
||||
|
||||
### Site Low Voltage Duct Bank
|
||||
|
||||
Josh okayed assumptions for site runs
|
||||
secondaries
|
||||
|
||||
### Putty Pads
|
||||
|
||||
add putty pads equal to device boxes
|
||||
|
||||
### Feeders
|
||||
|
||||
%% is run from inverter to EM diff size from MDP to inverter? %%
|
||||
|
||||
### Dimmable Receptacles
|
||||
|
||||
> Lutron Homeworks devices are thicker,
|
||||
> need deep boxes.
|
||||
|
||||
### Lighting/Shade Controls
|
||||
|
||||
[[lighting-controls-takeoff]]
|
||||
|
||||
#### Trough
|
||||
|
||||
`COMMON ASSEMBLIES`/`DISTRIBUTION`/`LIGHTING CONTROL PANEL INSTALLATION`/`_ - LIGHTING CONTROL PANEL INSTALLATION & TROUGH - ...`
|
||||
|
||||
used 4 section
|
||||
changed labor time from 4 to 6
|
||||
added 500ft \#12/2 NM
|
||||
|
||||
### Telecom
|
||||
|
||||
> "I'm surprised this isn't a certified system"
|
||||
|
||||
Changed assumed Cat5e to Cat6
|
||||
|
||||
> "I feel like we don't ever install Cat5 anymore"
|
||||
>
|
||||
> "A house on the upper range like this isn't going to go with Cat5"
|
||||
|
||||
AV Coordination.pdf
|
||||
TV Specs: 3 Cat6
|
||||
|
||||
### Fire Alarm
|
||||
|
||||
Leaving smokes despite direction
|
||||
for budgetary purposes.
|
||||
|
||||
### Closeout
|
||||
|
||||
#### Labor Plan
|
||||
|
||||
> "I don't think you can even do a labor plan."
|
||||
> "Just leave it all at 100%."
|
||||
|
||||
> "I use World (Electric) for everything, I don't care where it is."
|
||||
|
||||
#### Subs
|
||||
|
||||
Excavation $5,000
|
||||
|
||||
Wireways, Troughs: $1,250
|
||||
|
||||
#### General Expenses
|
||||
|
||||
Lower Office Supplies to $2,500
|
||||
|
||||
Delete Customer Development
|
||||
|
||||
##### Duration
|
||||
|
||||
Approved Labor Plan says 16 months
|
||||
|
||||
Removed all under "Jobs > \$3mil COGs"
|
||||
|
||||
Josh said he removed COGs with Aaron's direction
|
||||
on a job sold at \$3.8 million.
|
||||
|
||||
#### Equipment
|
||||
|
||||
Removed two-way radio
|
||||
|
||||
#### Material Pricing
|
||||
|
||||
> Josh: "Put \$400 for the Quazite." \
|
||||
> Joel: "I put \$1,200." \
|
||||
> Josh: "You put \$1,200? Okay put \$500."
|
||||
|
||||
### Conclusion
|
||||
|
||||
surprised by high margin,
|
||||
checked bid takeoff
|
||||
found large cost difference in relocation budget
|
||||
@@ -0,0 +1,42 @@
|
||||
---
|
||||
id: 2026-06-05T09:20:40-0400
|
||||
title: 2026-06-05 09:20:40
|
||||
tags: []
|
||||
daily: "[[2026-06-05]]"
|
||||
---
|
||||
# 2026-06-05 09:20:40
|
||||
|
||||
## LiveCount Feedback
|
||||
|
||||
### Which LiveCount features do you **like**?
|
||||
|
||||
* Adding and deleting from existing runs immediately updating Accubid
|
||||
is an excellent pattern.
|
||||
I teach estimators to count the obvious symbols
|
||||
then move on to the next assembly,
|
||||
using Add to Run at the end to pick up what was missed.
|
||||
|
||||
* The new Overlay manual alignment pattern is much better.
|
||||
|
||||
### Which LiveCount features do you **not like**?
|
||||
|
||||
* Reverse takeoffs "un-reverse" when adding or deleting from a run.
|
||||
|
||||
* Overlay Auto-align is turned on by default,
|
||||
requiring me to wait seconds which feel like an eternity for each one,
|
||||
even when I know from the previous that it will not align correctly.
|
||||
|
||||
* Overlay Auto-align appears to give equal preference to drawing titles
|
||||
meaning it always results in a zero translation alignment.
|
||||
|
||||
* Overlays turn off when the overlay menu is closed.
|
||||
|
||||
### Which features do you miss and should be added?
|
||||
|
||||
### Is there anything else you would like to add?
|
||||
|
||||
* Gating LiveCount features behind Anywhere
|
||||
(Auto-homerun)
|
||||
but still mentioning them in the changelogs
|
||||
is up-selly and confusing.
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
---
|
||||
id: 2026-06-05T09:48:37-0400
|
||||
title: 2026-06-05 09:48:37
|
||||
tags: []
|
||||
daily: "[[2026-06-05]]"
|
||||
---
|
||||
# 2026-06-05 09:48:37
|
||||
|
||||
## Accubid Reverse Takeoff
|
||||
|
||||
I have mixed feelings
|
||||
about using negative or "reverse" takeoffs
|
||||
in [[accubid|Accubid]].
|
||||
|
||||
### Pros
|
||||
|
||||
Pros as an alternative to simply changing existing counts.
|
||||
|
||||
With more than one revision,
|
||||
it quickly becomes difficult to have confidence in count changes.
|
||||
|
||||
### Cons
|
||||
|
||||
This note specifically concerns using negative quantities
|
||||
to cancel out positive for breakdown purposes,
|
||||
which I suspect is the only practical purpose for them.
|
||||
Net negative quantities cause all kinds of problems.
|
||||
There is no link from the positive to the negative,
|
||||
so any change to the former must be repeated for the latter.
|
||||
|
||||
With more than one revision,
|
||||
determining net takeoff quickly becomes unwieldy.
|
||||
|
||||
LiveCount "un-reverses" reverse takeoffs
|
||||
when adding or deleting from an existing run,
|
||||
which is not intuitive or well known.
|
||||
@@ -0,0 +1,20 @@
|
||||
---
|
||||
id: 2026-06-05T10:07:40-0400
|
||||
title: 2026-06-05 10:07:40
|
||||
tags: []
|
||||
daily: "[[2026-06-05]]"
|
||||
---
|
||||
# 2026-06-05 10:07:40
|
||||
|
||||
In [[construction-estimating-software]]
|
||||
it would always make more sense
|
||||
to model count-based assemblies
|
||||
as individual line items
|
||||
rather than counts in a single run of that assembly type.
|
||||
This would allow per-instance breakdowns and substitution
|
||||
without need to delete from one to create another.
|
||||
|
||||
Were it not for Accubid's poor performance
|
||||
with 1000+ takeoff jobs,
|
||||
our own workflow could benefit from this arrangement
|
||||
if LiveCount would better support it.
|
||||
@@ -0,0 +1,123 @@
|
||||
---
|
||||
id: 2026-06-07T17:40:12-0400
|
||||
title: 2026-06-07 17:40:12
|
||||
tags: []
|
||||
daily: "[[2026-06-07]]"
|
||||
---
|
||||
# 2026-06-07 17:40:12
|
||||
|
||||
It is trivial to get home media server apps running and LAN accessible,
|
||||
and not so much harder to get them accessible from outside either
|
||||
if you have no reservations about using IP directly
|
||||
(i.e. `http://81.168.249.237:8096`),
|
||||
but mobile receiver apps don't usually play nice
|
||||
without certified HTTPS anyway.
|
||||
|
||||
### Setting Up DNS
|
||||
|
||||
#### Buy a Domain
|
||||
|
||||
This step is one of the easiest
|
||||
and, at the risk of [[drinking-ones-own-kool-aid]],
|
||||
I recommend most people do it soon
|
||||
even if they don't have plans for a home network yet.
|
||||
For the time being,
|
||||
if you have a reasonably unique name
|
||||
a domain is one of the cheapest things
|
||||
you could spend money on.
|
||||
|
||||
> `nick-decarlo.com` for example: \$10.46 per _year_
|
||||
|
||||
For that same price
|
||||
I get to send emails from `gmail@zanemeyers.com`
|
||||
and confuse the hell out of people.
|
||||
|
||||
#### Add DNS Records
|
||||
|
||||
For each service
|
||||
create a Type A record with the name of the service
|
||||
pointing at your _public_ IP,
|
||||
which you can find with
|
||||
`curl ifconfig.me`
|
||||
or at [WhatIsMyIp.com](https://www.whatismyip.com/).
|
||||
|
||||
#### Configure Encryption Mode
|
||||
|
||||
Without this step redirection will not work with Cloudflare's proxy.
|
||||
|
||||
```
|
||||
SSL/TLS > Overview > Configure
|
||||
```
|
||||
|
||||
Set to "Full (Strict)" and Save.
|
||||
|
||||
At this point the domain is configured
|
||||
and it shouldn't need to be touched again.
|
||||
|
||||
### Setting Up the Reverse Proxy Server
|
||||
|
||||
I decided to use a decade-and-change-old laptop
|
||||
for a reverse proxy server
|
||||
|
||||
> It is probably possible to forgo the server entirely
|
||||
> and just run Caddy on [WSL](https://en.wikipedia.org/wiki/Windows_Subsystem_for_Linux)
|
||||
|
||||
I'm assuming we've already booted [Ubuntu Server](https://ubuntu.com/download/server)
|
||||
and done the initial setup,
|
||||
if for no other reason
|
||||
than because I did that years ago
|
||||
so I can't remember all that entailed.
|
||||
|
||||
#### Set Up a Reverse Proxy
|
||||
|
||||
A reverse proxy will let us map requests for `<service>.zanemeyers.com`
|
||||
to internal IP's and ports.
|
||||
|
||||
There are a few options,
|
||||
but I used [Caddy](https://caddyserver.com/)
|
||||
because it automatically issues and renews SSL certificates.
|
||||
|
||||
##### Install Caddy
|
||||
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
|
||||
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
|
||||
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
|
||||
sudo apt update
|
||||
sudo apt install caddy
|
||||
```
|
||||
|
||||
##### Configure Caddy
|
||||
|
||||
open Caddy's configuration with your favorite text editor
|
||||
|
||||
```bash
|
||||
sudo vim /etc/caddy/Caddyfile
|
||||
```
|
||||
|
||||
and create entries for each app.
|
||||
For example using [Jellyfin](https://jellyfin.org/):
|
||||
|
||||
```caddy
|
||||
jellyfin.zanemeyers.com {
|
||||
# <desktop local ip>:<app port>
|
||||
reverse_proxy 192.168.1.20:8096
|
||||
}
|
||||
```
|
||||
|
||||
After saving the new config,
|
||||
reload the service to apply the changes.
|
||||
|
||||
```bash
|
||||
sudo systemctl reload caddy
|
||||
```
|
||||
|
||||
### Setting Up
|
||||
|
||||
In your router settings.
|
||||
forward TCP 80 (HTTP) and 443 (HTTPS)
|
||||
to your reverse proxy server.
|
||||
|
||||
That was the last step.
|
||||
I don't know how to end this note.
|
||||
@@ -0,0 +1,22 @@
|
||||
---
|
||||
id: 2026-06-08T08:36:43-0400
|
||||
title: 2026-06-08 08:36:43
|
||||
tags: []
|
||||
daily: "[[2026-06-08]]"
|
||||
---
|
||||
# 2026-06-08 08:36:43
|
||||
|
||||
## ConEst Schedule Meeting 2026W24
|
||||
|
||||
[[conest-schedule-meeting]] for [[2026w24]]
|
||||
|
||||
### ConEst Outing
|
||||
|
||||
ConEst outing scheduled for [[2026-06-12]],
|
||||
playing pickleball.
|
||||
Two warmup games then a tournament
|
||||
teams of two to be announced that day.
|
||||
|
||||
### Schedule
|
||||
|
||||
Still working on [[cincinnati-convention-center-hotel]].
|
||||
@@ -0,0 +1,14 @@
|
||||
---
|
||||
id: 2026-06-08T10:09:44-0400
|
||||
title: 2026-06-08 10:09:44
|
||||
tags: []
|
||||
daily: "[[2026-06-08]]"
|
||||
---
|
||||
# 2026-06-08 10:09:44
|
||||
|
||||
Working on revisions for [[cincinnati-convention-center-hotel]],
|
||||
I talked to [[benjamin-obrien]] about reverse takeoffs,
|
||||
which lead to a discussion about appropriate effort
|
||||
first with him, and then [[joel-jansen]].
|
||||
They agreed with each other
|
||||
that I was spending too much time
|
||||
@@ -0,0 +1,39 @@
|
||||
---
|
||||
id: 2026-06-08T13:31:11-0400
|
||||
title: 2026-06-08 13:31:11
|
||||
tags: []
|
||||
daily: "[[2026-06-08]]"
|
||||
---
|
||||
# 2026-06-08 13:31:11
|
||||
|
||||
## PDI Future Ready Town Hall
|
||||
|
||||
### Minutes
|
||||
|
||||
Mitch and Aaron reiterated positive sentiments
|
||||
about our volume of awarded work.
|
||||
|
||||
The current onboarding class has 74.
|
||||
|
||||
praised recruiting for recent success,
|
||||
noting a significant number
|
||||
of mechanical and plumbing foremen.
|
||||
|
||||
Noted that a major barrier to growth
|
||||
is the availability of skilled labor.
|
||||
PDI is largely not interested in buying competitors to address this,
|
||||
and would rather continue to train those early in their careers.
|
||||
|
||||
PDI has been looking into [[ai]] to create or find tools
|
||||
to make existing resources more productive.
|
||||
|
||||
> We estimate \$12 billion in scope per year,
|
||||
> but can only take \$1.5 billion.[^1]
|
||||
|
||||
[^1]: I may be misremembering these figures.
|
||||
|
||||
### Takeaway
|
||||
|
||||
We are years away from significant changes.
|
||||
|
||||
> "If anyone feels like they can contribute, please say so."
|
||||
@@ -0,0 +1,24 @@
|
||||
---
|
||||
id: 2026-06-08T13:49:31-0400
|
||||
title: 2026-06-08 13:49:31
|
||||
tags: []
|
||||
daily: "[[2026-06-08]]"
|
||||
---
|
||||
# 2026-06-08 13:49:31
|
||||
|
||||
> scratch notes points for an email to Mike Reynolds,
|
||||
> head of the Data & AI team.
|
||||
|
||||
I share Mitch and Aaron's vision
|
||||
of eliminating rote work...
|
||||
|
||||
Has the Data & AI team been in communication
|
||||
with stakeholders in the decision late last year
|
||||
to move to Accubid Anywhere?
|
||||
|
||||
I used Accubid Anywhere in my previous position only a year ago,
|
||||
and, while it is far and away superior to Classic,
|
||||
the few "AI" features it did have...
|
||||
Moreover, it lacked input patterns necessary
|
||||
As I see it, ConEst will be at Trimble's mercy
|
||||
for any meaningful benefit to our process
|
||||
@@ -0,0 +1,14 @@
|
||||
---
|
||||
id: 2026-06-09T07:27:14-0400
|
||||
title: 2026-06-09 07:27:14
|
||||
tags: []
|
||||
daily: "[[2026-06-09]]"
|
||||
---
|
||||
# 2026-06-09 07:27:14
|
||||
|
||||
[DaringGourmet.com](https://www.daringgourmet.com/)
|
||||
has many recipes that would be in service of food independence.
|
||||
|
||||
I added [[sauerkraut]] and [[greek-yogurt]]
|
||||
(to be filled out later),
|
||||
but other highlights include quark cheese and mascarpone.
|
||||
@@ -1,51 +0,0 @@
|
||||
"""
|
||||
This script ensures that every daily note linked in the timestamped notes exists.
|
||||
"""
|
||||
import frontmatter
|
||||
import io
|
||||
import glob
|
||||
from datetime import datetime
|
||||
import os
|
||||
|
||||
timestamped_notes = glob.glob("timestamped/*.md")
|
||||
|
||||
daily_links = set()
|
||||
for child in timestamped_notes:
|
||||
with io.open(child, 'r') as file:
|
||||
link = frontmatter.load(file).get('daily')
|
||||
daily_links.add(link)
|
||||
|
||||
new_daily_names = set()
|
||||
for link in daily_links:
|
||||
base_name = link[2:-2]
|
||||
path = f"periodic/daily/{base_name}.md"
|
||||
if not os.path.exists(path):
|
||||
new_daily_names.add(base_name)
|
||||
|
||||
print(new_daily_names)
|
||||
|
||||
# for name in new_daily_names:
|
||||
# date = datetime.strptime(name, '%Y-%m-%d')
|
||||
|
||||
# with io.open(f"periodic/daily/{name}.md", 'x', encoding='utf8') as f:
|
||||
# f.write(f"# {name}\n\n")
|
||||
|
||||
# post = frontmatter.load(f)
|
||||
|
||||
# post['id'] = name
|
||||
# post['aliases'] = []
|
||||
# post['title'] = name
|
||||
# post['tags'] = [
|
||||
# 'authorship/original',
|
||||
# 'destiny/permanent',
|
||||
# 'status/draft',
|
||||
# 'type/periodic/daily'
|
||||
# ]
|
||||
# post['dg-publish'] = True
|
||||
# post['date-created'] = datetime.now().strftime("%Y-%m-%dT%H:%M:%SZ")
|
||||
# post['weekly'] = f'"[[{date.strftime('%Y-[W]%W')}]]"'
|
||||
# post['monthly'] = f'"[[{date.strftime('%Y-%m')}]]"'
|
||||
# post['quarterly'] = f'"[[{date.strftime('%Y-[Q]%q')}]]"'
|
||||
# post['yearly'] = f'"[[{date.strftime('%Y')}]]"'
|
||||
|
||||
# frontmatter.dump(post, f)
|
||||
+8
-4
@@ -57,7 +57,8 @@ aliases:
|
||||
|
||||
### Load Centers
|
||||
|
||||
* `System` = "EL - Electrical"
|
||||
> [!info] Breakdowns
|
||||
> * `System` = "EL - Electrical"
|
||||
|
||||
| Rating | Assembly |
|
||||
| ------- | ---------------------------------------------------------------------------------- |
|
||||
@@ -161,7 +162,8 @@ Adjust cable length as needed.
|
||||
|
||||
#### Residential
|
||||
|
||||
* `System` = "EL - Electrical"
|
||||
> [!info] Breakdowns
|
||||
> * `System` = "EL - Electrical"
|
||||
|
||||
##### Smoke Detectors & CO Detectors
|
||||
|
||||
@@ -175,7 +177,8 @@ For ADA units:
|
||||
|
||||
##### Additional Signaling Devices
|
||||
|
||||
* `System` = "FA - Fire Alarm"[^3]
|
||||
> [!info] Breakdowns
|
||||
> * `System` = "FA - Fire Alarm"[^3]
|
||||
|
||||
`COMMON ASSEMBLIES`/`FIRE ALARM & DAS SYSTEMS`/`INDICATING DEVICES WITH WIRE - FREE AIR`/`INDOOR HORN STROBE - FREE AIR`
|
||||
|
||||
@@ -183,7 +186,8 @@ For ADA units:
|
||||
|
||||
#### Hospitality
|
||||
|
||||
* `System` = "FA - Fire Alarm"
|
||||
> [!info] Breakdowns
|
||||
> * `System` = "FA - Fire Alarm"
|
||||
|
||||
`COMMON ASSEMBLIES`/`FIRE ALARM & DAS SYSTEMS`/`... DEVICES WITH WIRE - FREE AIR`
|
||||
|
||||
|
||||
+4
-67
@@ -3,77 +3,14 @@ id:
|
||||
aliases:
|
||||
- Me
|
||||
- Zane Meyers
|
||||
title: Me
|
||||
title: Zane Meyers
|
||||
tags:
|
||||
- topic/meta
|
||||
- type/encyclopedia
|
||||
- type/person
|
||||
---
|
||||
# Me
|
||||
# Zane Meyers
|
||||
|
||||
Born to [[steven-meyers]] and [[valerie-sargent]]
|
||||
**Zane Meyers** is the author of [[this-notebook]].
|
||||
He was born to [[steven-meyers]] and [[valerie-sargent]]
|
||||
on April 19, 2002.
|
||||
|
||||
## Considerations
|
||||
|
||||
### My Memory
|
||||
|
||||
I have a family history of dementia,
|
||||
and I am medically predisposed to transient forgetfulness.
|
||||
Several times in my life I have found months/years old notes in my handwriting
|
||||
that I could not recall writing, on subjects I could not recall having ever understood.
|
||||
|
||||
It deeply troubles me how much time I've wasted having the same ideas,
|
||||
working through the same problems, coming to the same conclusions.
|
||||
I am afraid that my memory has been deteriorating
|
||||
and will continue to until I'm intellectually useless well before my time.
|
||||
I'm not sure how much of this fear is real
|
||||
and how much is a subconscious ploy to justify not making the effort.
|
||||
|
||||
I project this insecurity on others strongly.
|
||||
I see the same signs in other people,
|
||||
and it reminds me of my own weakness.
|
||||
I get frustrated at others for not making efforts that I don't make myself.
|
||||
I don't use this notebook as often or as well as I should.
|
||||
|
||||
> [!note]
|
||||
> I give myself a hard time here,
|
||||
> but my "failure" to make lasting mental connections
|
||||
> is relative to my perception of my ability,
|
||||
> not to observation of others'.
|
||||
|
||||
### My Productivity
|
||||
|
||||
In as few words as possible,
|
||||
I would say I am "High Efficiency, Low Productivity".
|
||||
|
||||
I have several problematic productivity habits.
|
||||
|
||||
#### Motivation
|
||||
|
||||
My primary motivators are curiosity and stress.
|
||||
|
||||
I find it very easy and natural
|
||||
to work on projects for extended, uninterrupted periods
|
||||
when I am investigating a new problem,
|
||||
or a potential new way to solve a problem.
|
||||
|
||||
Because of this I often spend hours working on things
|
||||
that will not benefit me or anyone else.
|
||||
Even if they _could_ be useful, my motivation ends with my curiosity
|
||||
around 90% progress, where I'm able to visualize the end result.
|
||||
|
||||
I find it near impossible to do work I'm not curious of
|
||||
until my subconscious determines that we have exactly enough time
|
||||
to finish it before the deadline.
|
||||
|
||||
I think I spend much more time bored than my peers.
|
||||
Others with as much free time as me
|
||||
tend to spend it exercising or in other more reasonable activities.
|
||||
|
||||
### My Purpose
|
||||
|
||||
I want to be involved construction estimating for the rest of my working life.
|
||||
Current discourse on the subject is self-similar and sanitized.
|
||||
I'd like to be known as an innovator in [[heterodox-construction-estimating]],
|
||||
and for solving some of its open problems.
|
||||
|
||||
Reference in New Issue
Block a user