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,
|
"autoPairMarkdown": true,
|
||||||
"useTab": false,
|
"useTab": false,
|
||||||
"alwaysUpdateLinks": true,
|
"alwaysUpdateLinks": true,
|
||||||
"tabSize": 4,
|
"tabSize": 2,
|
||||||
"vimMode": true,
|
"vimMode": true,
|
||||||
"promptDelete": false,
|
"promptDelete": false,
|
||||||
"focusNewTab": true,
|
"focusNewTab": true,
|
||||||
@@ -20,5 +20,6 @@
|
|||||||
"landscape": false,
|
"landscape": false,
|
||||||
"margin": "0",
|
"margin": "0",
|
||||||
"downscalePercent": 100
|
"downscalePercent": 100
|
||||||
}
|
},
|
||||||
|
"showInlineTitle": true
|
||||||
}
|
}
|
||||||
Vendored
+3
-1
@@ -28,5 +28,7 @@
|
|||||||
"tabout",
|
"tabout",
|
||||||
"obsidian-tidy-footnotes",
|
"obsidian-tidy-footnotes",
|
||||||
"obsidian-citation-plugin",
|
"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",
|
"id": "homepage",
|
||||||
"name": "Homepage",
|
"name": "Homepage",
|
||||||
"version": "4.4.2",
|
"version": "4.4.4",
|
||||||
"minAppVersion": "1.12.2",
|
"minAppVersion": "1.12.2",
|
||||||
"description": "Open a specified note, canvas, base, or workspace on startup, or set it for quick access later.",
|
"description": "Open a specified note, canvas, base, or workspace on startup, or set it for quick access later.",
|
||||||
"author": "novov",
|
"author": "novov",
|
||||||
|
|||||||
+1
-1
@@ -3,6 +3,6 @@
|
|||||||
* https://github.com/logonoff/obsidian-inline-spoilers
|
* https://github.com/logonoff/obsidian-inline-spoilers
|
||||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
* 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 */
|
/* nosourcemap */
|
||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"id": "inline-spoilers",
|
"id": "inline-spoilers",
|
||||||
"name": "Inline spoilers",
|
"name": "Inline spoilers",
|
||||||
"version": "1.2.5",
|
"version": "1.2.6",
|
||||||
"minAppVersion": "1.6.5",
|
"minAppVersion": "1.6.5",
|
||||||
"description": "Adds Discord-like syntax for inline spoilers.",
|
"description": "Adds Discord-like syntax for inline spoilers.",
|
||||||
"author": "logonoff",
|
"author": "logonoff",
|
||||||
|
|||||||
+21
-5
@@ -13,15 +13,25 @@ body {
|
|||||||
--inline-spoilers-spoiler-radius: var(--radius-s);
|
--inline-spoilers-spoiler-radius: var(--radius-s);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* spoiler bar */
|
/**
|
||||||
|
* hidden spoilers
|
||||||
|
*/
|
||||||
|
/** used in reader mode */
|
||||||
.inline_spoilers-spoiler,
|
.inline_spoilers-spoiler,
|
||||||
|
|
||||||
|
/** used in spoiler content in editor mode */
|
||||||
.inline_spoilers-editor-spoiler,
|
.inline_spoilers-editor-spoiler,
|
||||||
|
|
||||||
|
/** used in delimiter in editor mode */
|
||||||
.inline_spoilers-editor-spoiler-delimiter {
|
.inline_spoilers-editor-spoiler-delimiter {
|
||||||
/* obscured */
|
/* obscured */
|
||||||
background-color: var(--inline-spoilers-hidden-background) !important;
|
background-color: var(--inline-spoilers-hidden-background) !important;
|
||||||
color: var(--inline-spoilers-hidden-foreground) !important;
|
color: var(--inline-spoilers-hidden-foreground) !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* revealed spoilers
|
||||||
|
*/
|
||||||
/** used when a hidden spoiler is revealed by clicking in reader mode */
|
/** used when a hidden spoiler is revealed by clicking in reader mode */
|
||||||
.inline_spoilers-spoiler.inline_spoilers-revealed,
|
.inline_spoilers-spoiler.inline_spoilers-revealed,
|
||||||
|
|
||||||
@@ -33,27 +43,31 @@ body {
|
|||||||
.inline_spoilers-revealed .inline_spoilers-spoiler,
|
.inline_spoilers-revealed .inline_spoilers-spoiler,
|
||||||
.inline_spoilers-revealed .inline_spoilers-editor-spoiler,
|
.inline_spoilers-revealed .inline_spoilers-editor-spoiler,
|
||||||
.inline_spoilers-revealed .inline_spoilers-editor-spoiler-delimiter {
|
.inline_spoilers-revealed .inline_spoilers-editor-spoiler-delimiter {
|
||||||
/* revealed */
|
|
||||||
background-color: var(--inline-spoilers-revealed-background) !important;
|
background-color: var(--inline-spoilers-revealed-background) !important;
|
||||||
color: var(--inline-spoilers-revealed-foreground) !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 {
|
.inline_spoilers-spoiler {
|
||||||
border-radius: var(--inline-spoilers-spoiler-radius);
|
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 {
|
.is-live-preview .inline_spoilers-editor-spoiler {
|
||||||
border-radius: var(--inline-spoilers-spoiler-radius);
|
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 {
|
.is-live-preview .cm-active .inline_spoilers-editor-spoiler {
|
||||||
/* contiguous border radius with the delimiter */
|
/* contiguous border radius with the delimiter */
|
||||||
border-radius: 0em;
|
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 {
|
.cm-line .inline_spoilers-editor-spoiler-delimiter {
|
||||||
&:has(+ .inline_spoilers-editor-spoiler) {
|
&:has(+ .inline_spoilers-editor-spoiler) {
|
||||||
border-radius: var(--inline-spoilers-spoiler-radius) 0 0 var(--inline-spoilers-spoiler-radius);
|
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 {
|
.is-live-preview .inline_spoilers-editor-spoiler-delimiter {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** reveal spoiler delimiters in editor mode when a spoiler is revealed */
|
||||||
.is-live-preview .cm-active .inline_spoilers-editor-spoiler-delimiter {
|
.is-live-preview .cm-active .inline_spoilers-editor-spoiler-delimiter {
|
||||||
display: unset;
|
display: unset;
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@
|
|||||||
"citationExportFormat": "biblatex",
|
"citationExportFormat": "biblatex",
|
||||||
"literatureNoteTitleTemplate": "@{{citekey}}",
|
"literatureNoteTitleTemplate": "@{{citekey}}",
|
||||||
"literatureNoteFolder": "",
|
"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}}]",
|
"markdownCitationTemplate": "[@{{citekey}}]",
|
||||||
"alternativeMarkdownCitationTemplate": "@{{citekey}}",
|
"alternativeMarkdownCitationTemplate": "[@{{citekey}}]",
|
||||||
"citationExportPath": "bibliography.bib"
|
"citationExportPath": "bibliography.bib"
|
||||||
}
|
}
|
||||||
+2
-2
File diff suppressed because one or more lines are too long
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"id": "obsidian-excalidraw-plugin",
|
"id": "obsidian-excalidraw-plugin",
|
||||||
"name": "Excalidraw",
|
"name": "Excalidraw",
|
||||||
"version": "2.23.7",
|
"version": "2.23.8",
|
||||||
"minAppVersion": "1.8.7",
|
"minAppVersion": "1.8.7",
|
||||||
"description": "Sketch Your Mind. Edit and view Excalidraw drawings. Enter the world of 4D Visual PKM.",
|
"description": "Sketch Your Mind. Edit and view Excalidraw drawings. Enter the world of 4D Visual PKM.",
|
||||||
"author": "Zsolt Viczian",
|
"author": "Zsolt Viczian",
|
||||||
|
|||||||
+1
-1
@@ -21,7 +21,7 @@
|
|||||||
"mathPreviewPositionIsAbove": true,
|
"mathPreviewPositionIsAbove": true,
|
||||||
"mathPreviewCursor": "▶",
|
"mathPreviewCursor": "▶",
|
||||||
"mathPreviewBracketHighlighting": false,
|
"mathPreviewBracketHighlighting": false,
|
||||||
"autofractionEnabled": false,
|
"autofractionEnabled": true,
|
||||||
"autofractionSymbol": "\\frac",
|
"autofractionSymbol": "\\frac",
|
||||||
"autofractionBreakingChars": "+-=\t",
|
"autofractionBreakingChars": "+-=\t",
|
||||||
"matrixShortcutsEnabled": false,
|
"matrixShortcutsEnabled": false,
|
||||||
|
|||||||
+7
@@ -353,6 +353,13 @@
|
|||||||
"replace": "...",
|
"replace": "...",
|
||||||
"flags": "gm",
|
"flags": "gm",
|
||||||
"enabled": true
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "remove whitespace from empty blockquote lines",
|
||||||
|
"find": "^> +(?=\\n>)",
|
||||||
|
"replace": ">",
|
||||||
|
"flags": "gm",
|
||||||
|
"enabled": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"commonStyles": {
|
"commonStyles": {
|
||||||
|
|||||||
+2
-2
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"search_support": true,
|
"search_support": false,
|
||||||
"level_switch": true,
|
"level_switch": true,
|
||||||
"markdown": true,
|
"markdown": true,
|
||||||
"expand_level": "0",
|
"expand_level": "0",
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
"export_format": "{title}",
|
"export_format": "{title}",
|
||||||
"lang_direction_decide_by": "system",
|
"lang_direction_decide_by": "system",
|
||||||
"auto_scroll_into_view": true,
|
"auto_scroll_into_view": true,
|
||||||
"vimlize_canvas": false,
|
"vimlize_canvas": true,
|
||||||
"canvas_sort_by": "area",
|
"canvas_sort_by": "area",
|
||||||
"shown_node_types": [
|
"shown_node_types": [
|
||||||
"file",
|
"file",
|
||||||
|
|||||||
+23
-41
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"tasksFolder": "tasks",
|
"tasksFolder": "",
|
||||||
"moveArchivedTasks": false,
|
"moveArchivedTasks": false,
|
||||||
"archiveFolder": "TaskNotes/Archive",
|
"archiveFolder": "TaskNotes/Archive",
|
||||||
"taskTag": "type/task",
|
"taskTag": "type/task",
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
"taskOrgFiltersCollapsed": false,
|
"taskOrgFiltersCollapsed": false,
|
||||||
"taskFilenameFormat": "custom",
|
"taskFilenameFormat": "custom",
|
||||||
"storeTitleInFilename": false,
|
"storeTitleInFilename": false,
|
||||||
"customFilenameTemplate": "{{date}}_{{hourPadded}}-{{minute}}-{{second}}",
|
"customFilenameTemplate": "{{titleKebab}}",
|
||||||
"taskCreationDefaults": {
|
"taskCreationDefaults": {
|
||||||
"defaultContexts": "",
|
"defaultContexts": "",
|
||||||
"defaultTags": "",
|
"defaultTags": "",
|
||||||
@@ -72,7 +72,7 @@
|
|||||||
"pomodoroAutoStartBreaks": false,
|
"pomodoroAutoStartBreaks": false,
|
||||||
"pomodoroAutoStartWork": false,
|
"pomodoroAutoStartWork": false,
|
||||||
"pomodoroNotifications": true,
|
"pomodoroNotifications": true,
|
||||||
"pomodoroSoundEnabled": true,
|
"pomodoroSoundEnabled": false,
|
||||||
"pomodoroSoundVolume": 50,
|
"pomodoroSoundVolume": 50,
|
||||||
"pomodoroStorageLocation": "daily-notes",
|
"pomodoroStorageLocation": "daily-notes",
|
||||||
"pomodoroMobileSidebar": "tab",
|
"pomodoroMobileSidebar": "tab",
|
||||||
@@ -220,6 +220,18 @@
|
|||||||
"order": 3,
|
"order": 3,
|
||||||
"autoArchive": false,
|
"autoArchive": false,
|
||||||
"autoArchiveDelay": 5
|
"autoArchiveDelay": 5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "status_1780921753724",
|
||||||
|
"value": "failed",
|
||||||
|
"label": "Failed",
|
||||||
|
"color": "#aa0000",
|
||||||
|
"completed": false,
|
||||||
|
"isCompleted": true,
|
||||||
|
"excludeFromCycle": false,
|
||||||
|
"order": 4,
|
||||||
|
"autoArchive": false,
|
||||||
|
"autoArchiveDelay": 5
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"customPriorities": [
|
"customPriorities": [
|
||||||
@@ -431,7 +443,8 @@
|
|||||||
"status",
|
"status",
|
||||||
"priority",
|
"priority",
|
||||||
"blocked",
|
"blocked",
|
||||||
"blocking"
|
"blocking",
|
||||||
|
"totalTrackedTime"
|
||||||
],
|
],
|
||||||
"inlineVisibleProperties": [
|
"inlineVisibleProperties": [
|
||||||
"status",
|
"status",
|
||||||
@@ -461,7 +474,7 @@
|
|||||||
"microsoftOAuthClientSecret": "",
|
"microsoftOAuthClientSecret": "",
|
||||||
"enableGoogleCalendar": false,
|
"enableGoogleCalendar": false,
|
||||||
"enableMicrosoftCalendar": false,
|
"enableMicrosoftCalendar": false,
|
||||||
"disableCalendarOnMobile": false,
|
"disableCalendarOnMobile": true,
|
||||||
"enabledGoogleCalendars": [],
|
"enabledGoogleCalendars": [],
|
||||||
"googleCalendarSyncTokens": {},
|
"googleCalendarSyncTokens": {},
|
||||||
"enabledMicrosoftCalendars": [],
|
"enabledMicrosoftCalendars": [],
|
||||||
@@ -469,10 +482,10 @@
|
|||||||
"googleCalendarExport": {
|
"googleCalendarExport": {
|
||||||
"enabled": false,
|
"enabled": false,
|
||||||
"targetCalendarId": "",
|
"targetCalendarId": "",
|
||||||
"syncOnTaskCreate": true,
|
"syncOnTaskCreate": false,
|
||||||
"syncOnTaskUpdate": true,
|
"syncOnTaskUpdate": false,
|
||||||
"syncOnTaskComplete": true,
|
"syncOnTaskComplete": false,
|
||||||
"syncOnTaskDelete": true,
|
"syncOnTaskDelete": false,
|
||||||
"eventTitleTemplate": "{{title}}",
|
"eventTitleTemplate": "{{title}}",
|
||||||
"includeDescription": true,
|
"includeDescription": true,
|
||||||
"eventColorId": null,
|
"eventColorId": null,
|
||||||
@@ -483,36 +496,5 @@
|
|||||||
"defaultReminderMinutes": null
|
"defaultReminderMinutes": null
|
||||||
},
|
},
|
||||||
"enableDebugLogging": false,
|
"enableDebugLogging": false,
|
||||||
"googleCalendarSyncQueue": [
|
"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"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
@@ -1 +0,0 @@
|
|||||||
[{"name":"Home","sticker":"ui//home","paths":["/"]}]
|
|
||||||
@@ -308,6 +308,14 @@
|
|||||||
langid = {english}
|
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,
|
@article{seppanen_2025_integrated-forecasting,
|
||||||
title = {Integrated {{Forecasting Approach}} for {{Takt}} and {{Location-Based Scheduling}}},
|
title = {Integrated {{Forecasting Approach}} for {{Takt}} and {{Location-Based Scheduling}}},
|
||||||
author = {Seppänen, Olli},
|
author = {Seppänen, Olli},
|
||||||
@@ -341,6 +349,14 @@
|
|||||||
langid = {english}
|
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,
|
@article{yucel_2026_startup-engagement,
|
||||||
title = {Startup {{Engagement}} and {{Innovation Strategies}} in {{Mid-}} to {{Large-Sized US Construction Firms}}},
|
title = {Startup {{Engagement}} and {{Innovation Strategies}} in {{Mid-}} to {{Large-Sized US Construction Firms}}},
|
||||||
author = {Yucel, Busra and Azhar, Salman},
|
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
|
- occupational
|
||||||
- type/guide
|
- type/guide
|
||||||
title: Accubid Setup
|
title: Accubid Setup
|
||||||
up: "[[pdi-estimating]]"
|
up: "[[conest-processes]]"
|
||||||
---
|
---
|
||||||
# Accubid Setup
|
# 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
|
- occupational/takeoff
|
||||||
- type/encyclopedia
|
- type/encyclopedia
|
||||||
title: Emergency Systems Research
|
title: Emergency Systems Research
|
||||||
|
up: "[[conest-processes]]"
|
||||||
---
|
---
|
||||||
# Emergency Systems Research
|
# Emergency Systems Research
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ tags:
|
|||||||
- occupational/takeoff
|
- occupational/takeoff
|
||||||
- type/encyclopedia
|
- type/encyclopedia
|
||||||
title: Low Voltage Raceway Selection
|
title: Low Voltage Raceway Selection
|
||||||
|
up: "[[conest-processes]]"
|
||||||
---
|
---
|
||||||
# Low Voltage Raceway Selection
|
# Low Voltage Raceway Selection
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ tags:
|
|||||||
- occupational/takeoff
|
- occupational/takeoff
|
||||||
- type/encyclopedia
|
- type/encyclopedia
|
||||||
title: Wiring Device Selection
|
title: Wiring Device Selection
|
||||||
|
up: "[[conest-processes]]"
|
||||||
---
|
---
|
||||||
# Wiring Device Selection
|
# Wiring Device Selection
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ tags:
|
|||||||
- occupational
|
- occupational
|
||||||
- type/guide
|
- type/guide
|
||||||
title: Wiring Method Selection
|
title: Wiring Method Selection
|
||||||
|
up: "[[conest-processes]]"
|
||||||
---
|
---
|
||||||
# Wiring Method Selection
|
# Wiring Method Selection
|
||||||
|
|
||||||
|
|||||||
@@ -45,8 +45,9 @@ add `ITEM DATABASE`/`WIRING & SYSTEM DEVICES`/`FLOOR BOXES & FITTTINGS`/`GENERIC
|
|||||||
|
|
||||||
### Lighting Homeruns
|
### Lighting Homeruns
|
||||||
|
|
||||||
* `Area` = "XX - Level XX Building"
|
> [!info] Breakdowns
|
||||||
* `Phase` = "Building - Back of House (BOH)"
|
> * `Area` = "XX - Level XX Building"
|
||||||
|
> * `Phase` = "Building - Back of House (BOH)"
|
||||||
|
|
||||||
Takeoff homeruns in Building breakdowns,
|
Takeoff homeruns in Building breakdowns,
|
||||||
even where serving Amenity spaces.
|
even where serving Amenity spaces.
|
||||||
@@ -79,7 +80,8 @@ per [[fire-resistive-wiring-methods-takeoff]].
|
|||||||
|
|
||||||
##### Homeruns
|
##### Homeruns
|
||||||
|
|
||||||
* `Area` = _Match unit_
|
> [!info] Breakdowns
|
||||||
|
> * `Area` = _Match unit_
|
||||||
|
|
||||||
.../`CONDENSOR HOME RUNS`
|
.../`CONDENSOR HOME RUNS`
|
||||||
|
|
||||||
@@ -99,7 +101,8 @@ per [[fire-resistive-wiring-methods-takeoff]].
|
|||||||
|
|
||||||
##### Connections
|
##### Connections
|
||||||
|
|
||||||
* `Area` = _Match CU (usually roof)_
|
> [!info] Breakdowns
|
||||||
|
> * `Area` = _Match CU (usually roof)_
|
||||||
|
|
||||||
.../`CU CONDENSER SLEEVE W/ FLEX - NO HMRN WIRE`
|
.../`CU CONDENSER SLEEVE W/ FLEX - NO HMRN WIRE`
|
||||||
|
|
||||||
|
|||||||
+52
-20
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
id: feeders
|
id:
|
||||||
aliases:
|
aliases:
|
||||||
- feeders takeoff
|
- feeders takeoff
|
||||||
title: Feeders Takeoff
|
title: Feeders Takeoff
|
||||||
@@ -16,12 +16,12 @@ up: "[[takeoff-scripts]]"
|
|||||||
> including [[conest-wiring-method-selection]],
|
> including [[conest-wiring-method-selection]],
|
||||||
> before beginning takeoff.
|
> before beginning takeoff.
|
||||||
|
|
||||||
## Execution
|
## Scope
|
||||||
|
|
||||||
1. Primaries
|
* Primaries
|
||||||
2. Secondaries
|
* Secondaries
|
||||||
3. Feeders
|
* Feeders
|
||||||
4. Grounding
|
* Grounding
|
||||||
|
|
||||||
### Formatting
|
### Formatting
|
||||||
|
|
||||||
@@ -46,38 +46,50 @@ For adjacent panels, use a minimum 10ft length.
|
|||||||
|
|
||||||
#### Adders
|
#### Adders
|
||||||
|
|
||||||
Use the difference in elevation between equipment
|
Use the difference in elevation between equipment[^2]
|
||||||
or 10ft, whichever is greater.
|
or 10ft, whichever is greater.
|
||||||
|
|
||||||
Add an additional 5ft (total 15ft) for site runs
|
[^2]: Not actually difference in elevation.
|
||||||
(primaries, secondaries, etc.).
|
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
|
## Primaries
|
||||||
|
|
||||||
* `Area` = "2 - Site"
|
> [!info] Breakdowns
|
||||||
* `Phase` = "Site"
|
> * `Area` = "2 - Site"
|
||||||
* `System` = "PRI - Primaries"
|
> * `Phase` = "Site"
|
||||||
|
> * `System` = "PRI - Primaries"
|
||||||
|
|
||||||
Usually only empty conduit if included.
|
Usually only empty conduit if included.
|
||||||
|
|
||||||
## Secondaries
|
## Secondaries
|
||||||
|
|
||||||
* `Area` = "2 - Site"
|
> [!info] Breakdowns
|
||||||
* `Phase` = "Site"
|
> * `Area` = "2 - Site"
|
||||||
* `System` = "SEC - Secondaries"
|
> * `Phase` = "Site"
|
||||||
|
> * `System` = "SEC - Secondaries"
|
||||||
|
|
||||||
### Wiring on Vault Racks
|
### Wiring on Vault Racks
|
||||||
|
|
||||||
Where secondary conductors run on racks in utility vaults
|
Where secondary conductors run on racks in utility vaults
|
||||||
manually set the length of conduit,
|
manually set the length of conduit,
|
||||||
measure the wire length,
|
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
|
## Feeders
|
||||||
|
|
||||||
* `Area` = "01 - Feeders/Risers Building"
|
> [!info] Breakdowns
|
||||||
* `Phase` = "Feeders"
|
> * `Area` = "01 - Feeders/Risers Building"
|
||||||
* `System` = "FRR - Feeders and Risers"
|
> * `Phase` = "Feeders"
|
||||||
|
> * `System` = "FRR - Feeders and Risers"
|
||||||
|
|
||||||
> [!info] Garage Feeders
|
> [!info] Garage Feeders
|
||||||
> `Area` "01 - Feeders/Risers Garage" is seldom used.
|
> `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`/...
|
`COMMON ASSEMBLIES`/`DISTRIBUTION`/`BUS DUCT`/...
|
||||||
|
|
||||||
|
Delete unnecessary items and change `Fct 1`
|
||||||
|
to get the correct quantities for the use case.
|
||||||
|
|
||||||
## Conductor Support
|
## 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`/...
|
`ITEM DATABASE`/`CONDUIT & FITTINGS`/`CABLE SUPPORT / WEDGES`/`... COMPLETE FITTING`/...
|
||||||
|
|
||||||
@@ -101,3 +129,7 @@ See [[grounding-takeoff]].
|
|||||||
## Sleeving
|
## Sleeving
|
||||||
|
|
||||||
See [[sleeving-takeoff]].
|
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]].
|
> This note is intended for practice specific to [[pdi-estimating]].
|
||||||
> See [[fire-alarm]] for information about fire alarm systems.
|
> See [[fire-alarm]] for information about fire alarm systems.
|
||||||
|
|
||||||
* `System` = "FA - Fire Alarm"
|
> [!info] Breakdowns
|
||||||
|
> * `System` = "FA - Fire Alarm"
|
||||||
|
|
||||||
## Assembly Selection
|
## Assembly Selection
|
||||||
|
|
||||||
@@ -59,8 +60,9 @@ Include [[sleeving-takeoff]] as necessary.
|
|||||||
|
|
||||||
> Also "Elevator Machine Room (EMR)"
|
> Also "Elevator Machine Room (EMR)"
|
||||||
|
|
||||||
* `Area` = Same as FACR.
|
> [!info] Breakdowns
|
||||||
* `Phase` = Same as FACR.
|
> * `Area` = Same as FACR.
|
||||||
|
> * `Phase` = Same as FACR.
|
||||||
|
|
||||||
For each Elevator Control Room (ECR):
|
For each Elevator Control Room (ECR):
|
||||||
|
|
||||||
@@ -73,8 +75,9 @@ For each Elevator Control Room (ECR):
|
|||||||
|
|
||||||
### Elevator Shafts
|
### Elevator Shafts
|
||||||
|
|
||||||
* `Area` = Same as FACR.
|
> [!info] Breakdowns
|
||||||
* `Phase` = Same as FACR.
|
> * `Area` = Same as FACR.
|
||||||
|
> * `Phase` = Same as FACR.
|
||||||
|
|
||||||
For each elevator shaft:
|
For each elevator shaft:
|
||||||
|
|
||||||
@@ -149,7 +152,8 @@ For each stairwell:
|
|||||||
|
|
||||||
## Central Monitoring Loop
|
## Central Monitoring Loop
|
||||||
|
|
||||||
* `System` = "FAR - Fire Alarm Loop"
|
> [!info] Breakdowns
|
||||||
|
> * `System` = "FAR - Fire Alarm Loop"
|
||||||
|
|
||||||
> [!important]
|
> [!important]
|
||||||
> Garden Style only.
|
> Garden Style only.
|
||||||
|
|||||||
+120
-89
@@ -10,20 +10,93 @@ title: Fixture Designations
|
|||||||
This note details creation of fixture designations
|
This note details creation of fixture designations
|
||||||
for use in [[fixtures-takeoff]].
|
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
|
```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]
|
### Phase Abbreviation (`<phase-abbr>`)
|
||||||
> `A - Surface (Pendant) = 2.0hrs - #12 MC+LV 20ft`
|
|
||||||
|
|
||||||
### 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.
|
Use empty designations to separate phases.
|
||||||
|
|
||||||
@@ -47,65 +120,21 @@ Use empty designations to separate phases.
|
|||||||
|
|
||||||
## Content
|
## 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
|
## Garage
|
||||||
|
|
||||||
%%
|
|
||||||
|
|
||||||
Use ENT assemblies unless forbidden by spec.
|
Use ENT assemblies unless forbidden by spec.
|
||||||
|
|
||||||
| Case | Assembly Path (`FIXTURE ACCESSORIES`/`PVC/ENT ASSEMBLIES`/...) |
|
| Case | Subassembly Path (`FIXTURE ACCESSORIES`/`PVC/ENT ASSEMBLIES`/...) |
|
||||||
| ----------------- | -------------------------------------------------------------- |
|
|:----------------- | ----------------------------------------------------------------- |
|
||||||
| Conventional Slab | .../`GARAGE FIXTURE ENT W/#10 - STEEL OCT RING` |
|
| Conventional Slab | .../`GARAGE FIXTURE ENT W/#10 - STEEL OCT RING` |
|
||||||
| Precast/I-Beam | .../`GARAGE FIXTURE W/T ROD 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:
|
If PVC is required, use following assemblies:
|
||||||
|
|
||||||
| Case | Assembly Path (`FIXTURE ACCESSORIES`/`PVC/ENT ASSEMBLIES`/...) |
|
| Case | Subassembly Path (`FIXTURE ACCESSORIES`/`PVC/ENT ASSEMBLIES`/...) |
|
||||||
| ------- | -------------------------------------------------------------- |
|
|:------- |:----------------------------------------------------------------- |
|
||||||
| Ceiling | .../`... - SLAB BOX / 45 DEG STUBBY` |
|
| Ceiling | .../`... - SLAB BOX / 45 DEG STUBBY` |
|
||||||
| Wall | .../`... - STL BOX & TILE RING / 45 DEG STUBBY/ ENT DROP` |
|
| Wall | .../`... - STL BOX & TILE RING / 45 DEG STUBBY/ ENT DROP` |
|
||||||
|
|
||||||
## Surface Mount
|
## Surface Mount
|
||||||
|
|
||||||
@@ -119,8 +148,8 @@ If PVC is required, use following assemblies:
|
|||||||
> * Tape
|
> * Tape
|
||||||
> * Track
|
> * Track
|
||||||
|
|
||||||
| Wiring Method | Assembly Path |
|
| Wiring Method | Subassembly Path |
|
||||||
| -------------- | ----------------------------------------------------------- |
|
|:-------------- |:----------------------------------------------------------- |
|
||||||
| NM Cable | `NM ASSEMBLIES`/`RND BOX BAR HNGR...` |
|
| NM Cable | `NM ASSEMBLIES`/`RND BOX BAR HNGR...` |
|
||||||
| MC Cable | `MC ASSEMBLIES`/`SQ BOX, ROUND P RING & MNTG BRKT...` |
|
| MC Cable | `MC ASSEMBLIES`/`SQ BOX, ROUND P RING & MNTG BRKT...` |
|
||||||
| PVC in Ceiling | `PVC/ENT ASSEMBLIES`/`... - SLAB BOX / 45 DEG STUBBY` |
|
| 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
|
however those terms are less specific
|
||||||
and potentially confusing.
|
and potentially confusing.
|
||||||
|
|
||||||
Use item `FIXTURE LABOR 1/2HR`
|
Use item `FIXTURE LABOR 1HR`
|
||||||
and change `Fct 1` to match the calculated labor
|
and change `Fct 1` to match the calculated labor
|
||||||
(1 hour per 12 feet).
|
(1 hour per 12 feet).
|
||||||
|
|
||||||
@@ -174,8 +203,8 @@ IA - Surface (Tape) = 7.0hr (78-89ft) - #12 MC+LV 40ft
|
|||||||
> * wall grazer
|
> * wall grazer
|
||||||
> * troffer
|
> * troffer
|
||||||
|
|
||||||
| Wiring Method | Assembly Path |
|
| Wiring Method | Subassembly Path |
|
||||||
| ------------- | ------------------------------ |
|
|:------------- |:------------------------------ |
|
||||||
| NM Cable | `NM ASSEMBLIES`/`HI HAT - ...` |
|
| NM Cable | `NM ASSEMBLIES`/`HI HAT - ...` |
|
||||||
| MC Cable | `MC ASSEMBLIES`/`HI HAT - ...` |
|
| MC Cable | `MC ASSEMBLIES`/`HI HAT - ...` |
|
||||||
|
|
||||||
@@ -188,8 +217,8 @@ round up to the nearest 5ft
|
|||||||
|
|
||||||
## Undercabinet Fixtures
|
## Undercabinet Fixtures
|
||||||
|
|
||||||
| Wiring Method | Assembly Path |
|
| Wiring Method | Subassembly Path |
|
||||||
| ------------- | ------------------------------------- |
|
|:------------- |:------------------------------------- |
|
||||||
| NM Cable | `NM ASSEMBLIES`/`UNDER CABINET - ...` |
|
| NM Cable | `NM ASSEMBLIES`/`UNDER CABINET - ...` |
|
||||||
| MC Cable | `MC ASSEMBLIES`/`UNDER CABINET - ...` |
|
| MC Cable | `MC ASSEMBLIES`/`UNDER CABINET - ...` |
|
||||||
|
|
||||||
@@ -198,41 +227,42 @@ round up to the nearest 5ft
|
|||||||
|
|
||||||
## Paddle Fans
|
## Paddle Fans
|
||||||
|
|
||||||
| Wiring Method | Assembly Path |
|
| Wiring Method | Subassembly Path |
|
||||||
| ------------- | ----------------------------------------------------- |
|
|:------------- |:----------------------------------------------------- |
|
||||||
| NM Cable | `NM ASSEMBLIES`/`RND BOX BAR HNGR...` |
|
| NM Cable | `NM ASSEMBLIES`/`RND BOX BAR HNGR...` |
|
||||||
| MC Cable | `MC ASSEMBLIES`/`FAN RATED OCT BOX W/ BAR HNGR - ...` |
|
| MC Cable | `MC ASSEMBLIES`/`FAN RATED OCT BOX W/ BAR HNGR - ...` |
|
||||||
| PVC | `PVC/ENT ASSEMBLIES`/`... - SLAB BOX / 45 DEG STUBBY` |
|
| PVC | `PVC/ENT ASSEMBLIES`/`... - SLAB BOX / 45 DEG STUBBY` |
|
||||||
|
|
||||||
## Guardrail Fixtures
|
## Guardrail Fixtures
|
||||||
|
|
||||||
|
> [!info] Designation Subassemblies
|
||||||
`FIXTURE ACCESSORIES`/`COURTYARDS & LANDSCAPE`/`ALUM BOX W/ FLEX FIX, 3/4" CONDUIT - PVC40 - ...`
|
`FIXTURE ACCESSORIES`/`COURTYARDS & LANDSCAPE`/`ALUM BOX W/ FLEX FIX, 3/4" CONDUIT - PVC40 - ...`
|
||||||
|
|
||||||
## Stairwells & Elevators
|
## Stairwells & Elevators
|
||||||
|
|
||||||
`PVC/ENT ASSEMBLIES`/`... - SLAB BOX / 45 DEG STUBBY`
|
> [!info] Designation Subassemblies
|
||||||
|
> 1. `PVC/ENT ASSEMBLIES`/`... - SLAB BOX / 45 DEG STUBBY`
|
||||||
|
|
||||||
## Facade
|
## Facade
|
||||||
|
|
||||||
|
> [!info] Breakdowns
|
||||||
> * `Phase` = "Facade"
|
> * `Phase` = "Facade"
|
||||||
|
|
||||||
Length and Labor will be more than a normal fixture in BOH/Amenity
|
Length and Labor will be more than a normal fixture in BOH/Amenity
|
||||||
|
|
||||||
| Fixture Type | Labor |
|
| Fixture Type | Labor |
|
||||||
| ------------ | ---------------------- |
|
|:------------ |:------------------------ |
|
||||||
| Non-Linear | 2hrs |
|
| Non-Linear | 2hrs |
|
||||||
| Linear | See [[#Tape Lighting]] |
|
| Linear | _See [[#Tape Lighting]]_ |
|
||||||
|
|
||||||
|
> [!info] Designation Subassemblies
|
||||||
> 1. `3/4" PVC W/ 3#10 - STL BOX & TILE RING / 45 DEG STUBBY/ ENT DROP`
|
> 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)
|
## Porte Cochere (Drive up Area)
|
||||||
|
|
||||||
Create its own breakout in WBS, and phase in [[accubid|Accubid]]
|
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
|
## Site & Courtyard
|
||||||
|
|
||||||
> [!important]
|
> [!important]
|
||||||
@@ -240,11 +270,12 @@ Create its own breakout in WBS, and phase in [[accubid|Accubid]]
|
|||||||
|
|
||||||
### Breakdowns
|
### Breakdowns
|
||||||
|
|
||||||
|
> [!info] Breakdowns
|
||||||
> * `System` = "FML - Site Fixtures Material & Labor"
|
> * `System` = "FML - Site Fixtures Material & Labor"
|
||||||
|
|
||||||
### Pole Lights
|
### Pole Lights
|
||||||
|
|
||||||
> [!info] Takeoff
|
> [!info] Designation Subassemblies
|
||||||
> 1. `FIXTURE ACCESSORIES`/`SITE POLE ASSEMBLIES`/...
|
> 1. `FIXTURE ACCESSORIES`/`SITE POLE ASSEMBLIES`/...
|
||||||
|
|
||||||
Add subassemblies for stub-outs, pole, base, and grounding as appropriate.
|
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
|
> * market lighting
|
||||||
> * catenary lighting
|
> * catenary lighting
|
||||||
|
|
||||||
> [!info] Takeoff
|
> [!info] Designation Subassemblies
|
||||||
> 1. `FIXTURE LABOR`/`FIXTURE LABOR 2HR`
|
> 1. `FIXTURE LABOR`/`FIXTURE LABOR 2HR`
|
||||||
>
|
>
|
||||||
> 2. `FESTOON & ROOF ASSEMBLIES`/`FESTOON CABLE HANGER & EYE BOLTS - LENGTH`
|
> 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
|
### Other Fixture Types
|
||||||
|
|
||||||
| Fixture Type | Path (`FIXTURE ACCESSORIES`/`COURTYARDS & LANDSCAPE`/...) |
|
| Fixture Type | Subassembly Path (`FIXTURE ACCESSORIES`/`COURTYARDS & LANDSCAPE`/...) |
|
||||||
| ------------------------------------ | ------------------------------------------------------------------ |
|
|:------------------------------------ |:--------------------------------------------------------------------- |
|
||||||
| Step Light | .../`STEP FIX, 3/4" CONDUIT - PVC40 - ...` |
|
| Step Light | .../`STEP FIX, 3/4" CONDUIT - PVC40 - ...` |
|
||||||
| Bollard | .../`BOLLARD, 3/4" CONDUIT - PVC40 - ...`[^2] |
|
| Bollard | .../`BOLLARD, 3/4" CONDUIT - PVC40 - ...`\* |
|
||||||
| Up-light | .../`PERMA POST, 3/4" CONDUIT - PVC40 - ...` |
|
| Up-light | .../`PERMA POST, 3/4" CONDUIT - PVC40 - ...` |
|
||||||
| In-grade up-light | .../`3/4" CONDUIT - PVC40, IMC Elbow, ...` |
|
| In-grade up-light | .../`3/4" CONDUIT - PVC40, IMC Elbow, ...` |
|
||||||
| Fixtures built into cabanas/pergolas | .../`ALUM BOX W/ FLEX FIX, 3/4" CONDUIT - PVC40 - ...` |
|
| 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 - ...` |
|
| 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
|
## FAA Lighting
|
||||||
|
|
||||||
> [!info] Takeoff
|
> [!info] Designation Subassemblies
|
||||||
> 1. `FIXTURE LABOR`/`FIXTURE LABOR 1HR`
|
> 1. `FIXTURE LABOR`/`FIXTURE LABOR 1HR`
|
||||||
> 2. `FESTOON & ROOF ASSEMBLIES`/`Aircraft Warning, 3/4" Conduit GRC/PVC 2#10, 1#10G`
|
> 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
|
## System Grounding
|
||||||
|
|
||||||
* `Area` = "01 - Feeders/Risers Building"
|
> [!info] Breakdowns
|
||||||
|
> * `Area` = "01 - Feeders/Risers Building"
|
||||||
|
|
||||||
1. `COMMON ASSEMBLIES`/`GROUNDING`/`GND = \#3/0 & 1" CONDUIT - EMT`
|
1. `COMMON ASSEMBLIES`/`GROUNDING`/`GND = \#3/0 & 1" CONDUIT - EMT`
|
||||||
* **Length:** Perimeter of the main electrical rooms plus length to each riser.
|
* **Length:** Perimeter of the main electrical rooms plus length to each riser.
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ tags:
|
|||||||
- topic/strategy
|
- topic/strategy
|
||||||
- type/media/book
|
- type/media/book
|
||||||
author: Daniel Kahneman
|
author: Daniel Kahneman
|
||||||
|
aliases:
|
||||||
|
- Thinking, Fast and Slow
|
||||||
---
|
---
|
||||||
# Thinking, Fast and Slow
|
# Thinking, Fast and Slow
|
||||||
|
|
||||||
|
|||||||
+15
-1
@@ -1,8 +1,13 @@
|
|||||||
|
---
|
||||||
|
title: Kombucha
|
||||||
|
tags: []
|
||||||
|
up: "[[recipes]]"
|
||||||
|
---
|
||||||
# Kombucha
|
# Kombucha
|
||||||
|
|
||||||
**Kombucha** is fermented tea, often flavored with fruit or spices.
|
**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.
|
that grows on the top of the kombucha during first fermentation.
|
||||||
the pellicle is often referred to as the **SCOBY**
|
the pellicle is often referred to as the **SCOBY**
|
||||||
(Symbiotic Colony of Bacteria and Yeast),
|
(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.
|
* Ignore recipes that direct you to "burp" your bottles during second fermentation.
|
||||||
It's pointless and slows carbonation.
|
It's pointless and slows carbonation.
|
||||||
Don't use shitty bottles and there's no risk of explosion.
|
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:
|
Determine which Systems and Codes are required:
|
||||||
* _IBC/IECC 2021 or later:_ all fixtures 0-10V dimmable.
|
* _IBC/IECC 2021 or later:_ all fixtures 0-10V dimmable.
|
||||||
|
|
||||||
* `System` = "LV - Lighting Control System"
|
> [!info] Breakdowns
|
||||||
|
> * `System` = "LV - Lighting Control System"
|
||||||
|
|
||||||
## Wall Switches
|
## Wall Switches
|
||||||
|
|
||||||
@@ -72,27 +73,29 @@ Room controllers distributed throughout controlled areas.
|
|||||||
`COMMON ASSEMBLIES`/`SWITCHES`/`LOW VOLTAGE SWITCHES & OCC SENSORS - ROUGH IN`/...
|
`COMMON ASSEMBLIES`/`SWITCHES`/`LOW VOLTAGE SWITCHES & OCC SENSORS - ROUGH IN`/...
|
||||||
|
|
||||||
1. .../`DLM LTG RM CONTROLLER - ...`
|
1. .../`DLM LTG RM CONTROLLER - ...`
|
||||||
**Count:** each lighting control zone.
|
* **Count:** each lighting control zone.
|
||||||
|
|
||||||
2. .../`REC PLUG CONTROLLER - ...`
|
2. .../`REC PLUG CONTROLLER - ...`
|
||||||
**Count:** each receptacle control zone.
|
* **Count:** each receptacle control zone.
|
||||||
|
|
||||||
3. `HEATING`/`Network Bridge - Blank 4SQ`
|
3. `HEATING`/`Network Bridge - Blank 4SQ`
|
||||||
**Count:** each controller.
|
* **Count:** each controller.
|
||||||
|
|
||||||
Coordinate with PDS to determine if necessary.
|
Coordinate with PDS to determine if necessary.
|
||||||
|
|
||||||
4. `COMMON ASSEMBLIES`/`PDI BRANCH CKT HOME RUNS`/... (_without_ dimming cable)
|
4. `COMMON ASSEMBLIES`/`PDI BRANCH CKT HOME RUNS`/... (_without_ dimming cable)
|
||||||
**Count:** each _circuit_.
|
* **Count:** each _circuit_.
|
||||||
|
|
||||||
### "Centralized" Systems
|
### "Centralized" Systems
|
||||||
|
|
||||||
Zones switched and dimmed from central lighting control panel (LCP).
|
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)
|
#### "Feed-Thru" Panels
|
||||||
**Count:** each _lighting control zone_.
|
|
||||||
|
1. `COMMON ASSEMBLIES`/`DISTRIBUTION`/`LIGHTING CONTROL PANEL INSTALLATION`/`_ - LIGHTING CONTROL PANEL INSTALLATION & TROUGH - ...`
|
||||||
|
|
||||||
### Somewhere In Between
|
### 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.
|
I think just as common is 3--5 circuit controllers above the ceiling.
|
||||||
|
|
||||||
1. `HEATING`/`Lighting Control Room Controller - n Circuit`
|
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)
|
2. `COMMON ASSEMBLIES`/`PDI BRANCH CKT HOME RUNS`/... (_without_ dimming cable)
|
||||||
**Length:** route to room.
|
* **Length:** route to room.
|
||||||
**Count:** each circuit.
|
* **Count:** each circuit.
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ If no quote is available:
|
|||||||
|
|
||||||
### Takeoff
|
### Takeoff
|
||||||
|
|
||||||
|
> [!info] Breakdowns
|
||||||
> * `Area` = "01 - Lightning Protection Building"
|
> * `Area` = "01 - Lightning Protection Building"
|
||||||
> * `Phase` = "Building - BOH, Storage & Common"
|
> * `Phase` = "Building - BOH, Storage & Common"
|
||||||
> * `System` = "LPT - Lightning Protection"
|
> * `System` = "LPT - Lightning Protection"
|
||||||
|
|||||||
+22
-13
@@ -1,29 +1,38 @@
|
|||||||
---
|
---
|
||||||
|
aliases:
|
||||||
|
- misc budgets takeoff
|
||||||
title: Misc Budgets Takeoff
|
title: Misc Budgets Takeoff
|
||||||
tags:
|
tags:
|
||||||
- occupational/takeoff
|
- occupational/takeoff
|
||||||
- status/draft
|
- status/draft
|
||||||
- type/guide
|
- type/guide
|
||||||
up: "[[takeoff-scripts]]"
|
up: "[[takeoff-scripts]]"
|
||||||
aliases:
|
|
||||||
- misc budgets takeoff
|
|
||||||
---
|
---
|
||||||
# Misc Budgets Takeoff
|
# Misc Budgets Takeoff
|
||||||
|
|
||||||
* `Drawing` = "N/A"
|
|
||||||
|
|
||||||
## Slab Deck
|
## 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)`
|
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)
|
### Building
|
||||||
* `Phase` = "Building - BOH, Storage & Common"
|
|
||||||
* **Count** = 1
|
|
||||||
* _High Density:_ 1 per Section
|
|
||||||
|
|
||||||
2. * `Area` = "Typical - Garage All Levels"
|
> [!info] Breakdowns
|
||||||
* `Phase` = "Garage"
|
> * `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: Site
|
||||||
|
|
||||||
* `Bid Item` = "1 - Site"
|
> * `Bid Item` = "1 - Site"
|
||||||
* `Area` = "2 - Site"
|
> * `Area` = "2 - Site"
|
||||||
* `Phase` = "Site"
|
> * `Phase` = "Site"
|
||||||
|
|
||||||
### Bid Item: Garage
|
### Bid Item: Garage
|
||||||
|
|
||||||
* `Bid Item` = "2 - Garage"
|
> * `Bid Item` = "2 - Garage"
|
||||||
* `Area` = "XX - Level XX Garage"
|
> * `Area` = "XX - Level XX Garage"
|
||||||
* `Phase` = "Garage"
|
> * `Phase` = "Garage"
|
||||||
|
|
||||||
#### Area: Stairwells Garage
|
#### Area: Stairwells Garage
|
||||||
|
|
||||||
* `Area` = "S - Stairwells Garage"
|
> * `Area` = "S - Stairwells Garage"
|
||||||
|
|
||||||
### Bid Item: Building
|
### Bid Item: Building
|
||||||
|
|
||||||
* `Bid Item` = "3 - Building"
|
> * `Bid Item` = "3 - Building"
|
||||||
|
|
||||||
#### Owner
|
#### Owner
|
||||||
|
|
||||||
##### Area: Building
|
##### Area: Building
|
||||||
|
|
||||||
* `Area` = "XX - Level XX Building"
|
> * `Area` = "XX - Level XX Building"
|
||||||
|
|
||||||
###### Phase: Back of House (BOH)
|
###### Phase: Back of House (BOH)
|
||||||
|
|
||||||
* `Phase` = "Building - Back of House (BOH)"
|
> * `Phase` = "Building - Back of House (BOH)"
|
||||||
|
|
||||||
Catch all for spaces not
|
Catch all for spaces not
|
||||||
|
|
||||||
@@ -47,17 +47,17 @@ Catch all for spaces not
|
|||||||
|
|
||||||
###### Phase: Corridor
|
###### Phase: Corridor
|
||||||
|
|
||||||
* `Phase` = "Building - Corridor"
|
> * `Phase` = "Building - Corridor"
|
||||||
|
|
||||||
###### Phase: Units
|
###### Phase: Units
|
||||||
|
|
||||||
* `Area` = "Typical - Unit A"
|
> * `Area` = "Typical - Unit A"
|
||||||
* `Phase` = "UNIT - ..."
|
> * `Phase` = "UNIT - ..."
|
||||||
|
|
||||||
##### Area: Interior Amenity
|
##### Area: Interior Amenity
|
||||||
|
|
||||||
* `Area` = "XX - Level XX Interior Amenity Building"
|
> * `Area` = "XX - Level XX Interior Amenity Building"
|
||||||
* `Phase` = "Interior Amenity"
|
> * `Phase` = "Interior Amenity"
|
||||||
|
|
||||||
High-finish, customer-facing spaces
|
High-finish, customer-facing spaces
|
||||||
|
|
||||||
@@ -79,8 +79,8 @@ Also includes
|
|||||||
|
|
||||||
##### Area: Kitchen
|
##### Area: Kitchen
|
||||||
|
|
||||||
* `Area` = "XX - Level XX Kitchen Building"
|
> * `Area` = "XX - Level XX Kitchen Building"
|
||||||
* `Phase` = "Kitchen"
|
> * `Phase` = "Kitchen"
|
||||||
|
|
||||||
Commercial kitchen spaces
|
Commercial kitchen spaces
|
||||||
defined by provisions for high-load equipment,
|
defined by provisions for high-load equipment,
|
||||||
@@ -93,13 +93,13 @@ which only include 20A provisions
|
|||||||
|
|
||||||
##### Area: Ballrooms
|
##### Area: Ballrooms
|
||||||
|
|
||||||
* `Area` = "XX - Level XX Ballrooms Building"
|
> * `Area` = "XX - Level XX Ballrooms Building"
|
||||||
* `Phase` = "Ballrooms"
|
> * `Phase` = "Ballrooms"
|
||||||
|
|
||||||
##### Area: Exterior Amenity
|
##### Area: Exterior Amenity
|
||||||
|
|
||||||
* `Area` = "XX - Level XX Exterior Amenity Building"
|
> * `Area` = "XX - Level XX Exterior Amenity Building"
|
||||||
* `Phase` = "Exterior Amenity"
|
> * `Phase` = "Exterior Amenity"
|
||||||
|
|
||||||
##### Area: Porte Cochere
|
##### Area: Porte Cochere
|
||||||
|
|
||||||
@@ -109,8 +109,8 @@ which only include 20A provisions
|
|||||||
|
|
||||||
##### Area: Stairwells Building
|
##### Area: Stairwells Building
|
||||||
|
|
||||||
* `Area` = "S - Stairwells Building"
|
> * `Area` = "S - Stairwells Building"
|
||||||
* `Phase` = "Building - Back of House (BOH)"
|
> * `Phase` = "Building - Back of House (BOH)"
|
||||||
|
|
||||||
#### Tenant
|
#### Tenant
|
||||||
|
|
||||||
@@ -121,16 +121,16 @@ These spaces seem to be, by definition, [[construction-methods#Core and Shell|sh
|
|||||||
|
|
||||||
##### Area: Retail
|
##### Area: Retail
|
||||||
|
|
||||||
* `Area` = "XX - Level XX Retail Building"
|
> * `Area` = "XX - Level XX Retail Building"
|
||||||
* `Phase` = "Retail"
|
> * `Phase` = "Retail"
|
||||||
|
|
||||||
Core and shell for mercantile occupancies.
|
Core and shell for mercantile occupancies.
|
||||||
Does not include finished restaurants
|
Does not include finished restaurants
|
||||||
|
|
||||||
##### Area: Office Space
|
##### Area: Office Space
|
||||||
|
|
||||||
* `Area` = "XX - Level XX Retail Building"
|
> * `Area` = "XX - Level XX Retail Building"
|
||||||
* `Phase` = "Office Space"
|
> * `Phase` = "Office Space"
|
||||||
|
|
||||||
> [!quote] [[joel-jansen]] to William Bonn 2025-12-05 (pp.)
|
> [!quote] [[joel-jansen]] to William Bonn 2025-12-05 (pp.)
|
||||||
> PDI Accubid `Phase` "Office Space"
|
> 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)
|
# Project Management Institute (PMI)
|
||||||
|
|
||||||
[The Project Management Institute](https://pmi.org)
|
[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
|
- type: speaker
|
||||||
text: Mario Savio
|
text: Mario Savio
|
||||||
date: 1964-12-02
|
date: 1964-12-02
|
||||||
description: >
|
description: |-
|
||||||
Address delivered by Mario Savio 2 December 1964,
|
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.
|
||||||
at The University of California at Berkeley,
|
The address is often called the "Bodies Upon the Gears" speech, in reference to Savio's second mode of civil disobedience.
|
||||||
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
|
url: https://www.americanrhetoric.com/speeches/mariosaviosproulhallsitin.htm
|
||||||
---
|
---
|
||||||
# Sit-in Address on the Steps of Sproul Hall
|
# Sit-in Address on the Steps of Sproul Hall
|
||||||
|
|||||||
+10
-6
@@ -1,13 +1,13 @@
|
|||||||
---
|
---
|
||||||
id: sleeving
|
id: sleeving
|
||||||
|
aliases:
|
||||||
|
- sleeving takeoff
|
||||||
|
title: Sleeving Takeoff
|
||||||
tags:
|
tags:
|
||||||
- occupational/takeoff
|
- occupational/takeoff
|
||||||
- status/draft
|
- status/draft
|
||||||
- type/guide
|
- type/guide
|
||||||
title: Sleeving Takeoff
|
|
||||||
up: "[[general-takeoff]]"
|
up: "[[general-takeoff]]"
|
||||||
aliases:
|
|
||||||
- sleeving takeoff
|
|
||||||
---
|
---
|
||||||
# Sleeving Takeoff
|
# Sleeving Takeoff
|
||||||
|
|
||||||
@@ -18,14 +18,14 @@ as well as any additional sleeves shown on the drawings.
|
|||||||
|
|
||||||
> [!important]
|
> [!important]
|
||||||
> The term "sleeve" may refer to
|
> The term "sleeve" may refer to
|
||||||
>
|
>
|
||||||
> * a short length of conduit
|
> * a short length of conduit
|
||||||
>
|
>
|
||||||
> * a Hilti-type firestop sleeve assembly
|
> * a Hilti-type firestop sleeve assembly
|
||||||
>
|
>
|
||||||
> * a short length of conduit
|
> * a short length of conduit
|
||||||
> _in_ a Hilti-type firestop sleeve assembly
|
> _in_ a Hilti-type firestop sleeve assembly
|
||||||
>
|
>
|
||||||
> Seek additional clarification.
|
> Seek additional clarification.
|
||||||
|
|
||||||
## Breakdowns
|
## Breakdowns
|
||||||
@@ -38,7 +38,11 @@ the assembly to be sleeved.[^1]
|
|||||||
|
|
||||||
## Item Selection
|
## 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-P** --- For plastic conduit
|
||||||
* **CP 680-M** --- For metal conduit[^2]
|
* **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.
|
Only for PVC subfeeds where we own voltage drop.
|
||||||
|
|
||||||
* `Area` = "Typical - Building Levels With Meter Centers"
|
> [!info] Breakdowns
|
||||||
* `System` = "Electrical"
|
> * `Area` = "Typical - Building Levels With Meter Centers"
|
||||||
* `Phase` = "Sub Feeders"
|
> * `System` = "Electrical"
|
||||||
|
> * `Phase` = "Sub Feeders"
|
||||||
|
|
||||||
`ITEM DATABASE`/`DISTRIBUTION`/`BUDGET ITEMS $ & LBR`/`METER CENTER WIRE TROUGH ($400/E)`
|
`ITEM DATABASE`/`DISTRIBUTION`/`BUDGET ITEMS $ & LBR`/`METER CENTER WIRE TROUGH ($400/E)`
|
||||||
|
|||||||
@@ -27,10 +27,11 @@ up: "[[takeoff-scripts]]"
|
|||||||
|
|
||||||
## Switchgear
|
## Switchgear
|
||||||
|
|
||||||
* `Area` = _As shown_
|
> [!info] Breakdowns
|
||||||
* `Phase` = "Switch Gear"
|
> * `Area` = _As shown_
|
||||||
* `System` = "SWG - Switchgear"
|
> * `Phase` = "Switch Gear"
|
||||||
* `Bid Item` = "3 - Building"
|
> * `System` = "SWG - Switchgear"
|
||||||
|
> * `Bid Item` = "3 - Building"
|
||||||
|
|
||||||
### Transformers
|
### Transformers
|
||||||
|
|
||||||
@@ -57,8 +58,9 @@ up: "[[takeoff-scripts]]"
|
|||||||
|
|
||||||
## Generator
|
## Generator
|
||||||
|
|
||||||
* `Area` = "01 - Generator"
|
> [!info] Breakdowns
|
||||||
* `Phase` = "Switch Gear"
|
> * `Area` = "01 - Generator"
|
||||||
* `System` = "Gen - Generator"
|
> * `Phase` = "Switch Gear"
|
||||||
|
> * `System` = "Gen - Generator"
|
||||||
|
|
||||||
1. [[distribution-designations#Generators]]
|
1. [[distribution-designations#Generators]]
|
||||||
|
|||||||
+22
-3
@@ -7,16 +7,35 @@ up: "[[conest-processes]]"
|
|||||||
|
|
||||||
I often refer to "ConEst takeoff scripts"
|
I often refer to "ConEst takeoff scripts"
|
||||||
as justification for certain of decisions,
|
as justification for certain of decisions,
|
||||||
but like the Project Management Body of Knowledge,
|
but they do not really exist in writing.[^1]
|
||||||
they do not really exist in writing.
|
|
||||||
|
[^1]: See [[conest-body-of-knowledge]]
|
||||||
|
|
||||||
Scripts should be directed,
|
Scripts should be directed,
|
||||||
limiting extraneous information.
|
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
|
## Citations
|
||||||
|
|
||||||
For the purpose of accountability,
|
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.
|
Use footnotes to reference timestamped notes.
|
||||||
|
|
||||||
|
|||||||
@@ -1,56 +1,51 @@
|
|||||||
# Agenda
|
|
||||||
|
|
||||||
filters:
|
filters:
|
||||||
and:
|
and:
|
||||||
- file.hasTag("type/task")
|
- file.hasTag("type/task")
|
||||||
- file.inFolder("templates") != true
|
- file.inFolder("templates") != true
|
||||||
|
|
||||||
formulas:
|
formulas:
|
||||||
priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))'
|
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)'
|
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")))))'
|
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)'
|
daysUntilScheduled: if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
|
||||||
daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'
|
daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
|
||||||
daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'
|
daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
|
||||||
isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != "done"'
|
isOverdue: (due.isEmpty() == false) && date(due) < today() && status != "done"
|
||||||
isDueToday: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'
|
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")'
|
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")'
|
isScheduledToday: (scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||||
isRecurring: 'recurrence && !recurrence.isEmpty()'
|
isRecurring: recurrence && !recurrence.isEmpty()
|
||||||
hasTimeEstimate: 'timeEstimate && timeEstimate > 0'
|
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)'
|
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)'
|
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)'
|
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)'
|
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")'
|
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")'
|
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")'
|
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")'
|
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")))))'
|
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)")))'
|
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")))'
|
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")'
|
createdMonth: file.ctime.format("YYYY-MM")
|
||||||
modifiedMonth: 'file.mtime.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"))))'
|
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"))'
|
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"))'
|
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")))'
|
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))'
|
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))'
|
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)'
|
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"))'
|
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"))'
|
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")))))'
|
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")))'
|
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")))'
|
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)))'
|
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")'
|
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")))))))'
|
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:
|
views:
|
||||||
- type: tasknotesCalendar
|
- type: tasknotesCalendar
|
||||||
name: "Agenda"
|
name: Agenda
|
||||||
order:
|
order:
|
||||||
- status
|
- status
|
||||||
- priority
|
- priority
|
||||||
@@ -62,7 +57,7 @@ views:
|
|||||||
options:
|
options:
|
||||||
showPropertyBasedEvents: false
|
showPropertyBasedEvents: false
|
||||||
createDailyNotesFromDateLinks: true
|
createDailyNotesFromDateLinks: true
|
||||||
calendarView: "listWeek"
|
calendarView: listWeek
|
||||||
startDateProperty: file.ctime
|
startDateProperty: file.ctime
|
||||||
listDayCount: 7
|
listDayCount: 7
|
||||||
titleProperty: file.basename
|
titleProperty: file.basename
|
||||||
|
|||||||
@@ -1,55 +1,51 @@
|
|||||||
# Calendar
|
|
||||||
|
|
||||||
filters:
|
filters:
|
||||||
and:
|
and:
|
||||||
- file.hasTag("type/task")
|
- file.hasTag("type/task")
|
||||||
- file.inFolder("templates") != true
|
- file.inFolder("templates") != true
|
||||||
|
|
||||||
formulas:
|
formulas:
|
||||||
priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))'
|
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)'
|
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")))))'
|
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)'
|
daysUntilScheduled: if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
|
||||||
daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'
|
daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
|
||||||
daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'
|
daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
|
||||||
isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != "done"'
|
isOverdue: (due.isEmpty() == false) && date(due) < today() && status != "done"
|
||||||
isDueToday: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'
|
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")'
|
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")'
|
isScheduledToday: (scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||||
isRecurring: 'recurrence && !recurrence.isEmpty()'
|
isRecurring: recurrence && !recurrence.isEmpty()
|
||||||
hasTimeEstimate: 'timeEstimate && timeEstimate > 0'
|
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)'
|
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)'
|
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)'
|
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)'
|
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")'
|
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")'
|
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")'
|
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")'
|
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")))))'
|
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)")))'
|
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")))'
|
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")'
|
createdMonth: file.ctime.format("YYYY-MM")
|
||||||
modifiedMonth: 'file.mtime.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"))))'
|
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"))'
|
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"))'
|
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")))'
|
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))'
|
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))'
|
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)'
|
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"))'
|
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"))'
|
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")))))'
|
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")))'
|
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")))'
|
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)))'
|
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")'
|
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")))))))'
|
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:
|
views:
|
||||||
- type: tasknotesCalendar
|
- type: tasknotesCalendar
|
||||||
name: "Calendar"
|
name: Calendar
|
||||||
order:
|
order:
|
||||||
- status
|
- status
|
||||||
- priority
|
- priority
|
||||||
@@ -66,7 +62,7 @@ views:
|
|||||||
showTimeblocks: true
|
showTimeblocks: true
|
||||||
showPropertyBasedEvents: true
|
showPropertyBasedEvents: true
|
||||||
createDailyNotesFromDateLinks: true
|
createDailyNotesFromDateLinks: true
|
||||||
calendarView: "timeGridWeek"
|
calendarView: timeGridWeek
|
||||||
customDayCount: 3
|
customDayCount: 3
|
||||||
firstDay: 0
|
firstDay: 0
|
||||||
slotDuration: "00:30:00"
|
slotDuration: 00:30:00
|
||||||
|
|||||||
@@ -1,55 +1,57 @@
|
|||||||
# Kanban Board
|
|
||||||
|
|
||||||
filters:
|
filters:
|
||||||
and:
|
and:
|
||||||
- file.hasTag("type/task")
|
- file.hasTag("type/task")
|
||||||
- file.inFolder("templates") != true
|
- file.inFolder("templates") != true
|
||||||
|
|
||||||
formulas:
|
formulas:
|
||||||
priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))'
|
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)'
|
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")))))'
|
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)'
|
daysUntilScheduled: if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
|
||||||
daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'
|
daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
|
||||||
daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'
|
daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
|
||||||
isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != "done"'
|
isOverdue: (due.isEmpty() == false) && date(due) < today() && status != "done"
|
||||||
isDueToday: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'
|
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")'
|
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")'
|
isScheduledToday: (scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||||
isRecurring: 'recurrence && !recurrence.isEmpty()'
|
isRecurring: recurrence && !recurrence.isEmpty()
|
||||||
hasTimeEstimate: 'timeEstimate && timeEstimate > 0'
|
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)'
|
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)'
|
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)'
|
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)'
|
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")'
|
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")'
|
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")'
|
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")'
|
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")))))'
|
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)")))'
|
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")))'
|
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")'
|
createdMonth: file.ctime.format("YYYY-MM")
|
||||||
modifiedMonth: 'file.mtime.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"))))'
|
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"))'
|
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"))'
|
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")))'
|
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))'
|
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))'
|
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)'
|
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"))'
|
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"))'
|
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")))))'
|
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")))'
|
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")))'
|
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)))'
|
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")'
|
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")))))))'
|
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:
|
views:
|
||||||
- type: tasknotesKanban
|
- type: tasknotesKanban
|
||||||
name: "Kanban Board"
|
name: Kanban Board
|
||||||
|
filters:
|
||||||
|
and:
|
||||||
|
- recurrence.isEmpty()
|
||||||
|
groupBy:
|
||||||
|
property: status
|
||||||
|
direction: ASC
|
||||||
order:
|
order:
|
||||||
- status
|
- status
|
||||||
- priority
|
- priority
|
||||||
@@ -59,11 +61,8 @@ views:
|
|||||||
- complete_instances
|
- complete_instances
|
||||||
- file.tasks
|
- file.tasks
|
||||||
sort:
|
sort:
|
||||||
- column: tasknotes_manual_order
|
- property: tasknotes_manual_order
|
||||||
direction: DESC
|
direction: DESC
|
||||||
groupBy:
|
|
||||||
property: status
|
|
||||||
direction: ASC
|
|
||||||
options:
|
options:
|
||||||
columnWidth: 280
|
columnWidth: 280
|
||||||
hideEmptyColumns: false
|
hideEmptyColumns: false
|
||||||
|
|||||||
@@ -1,56 +1,51 @@
|
|||||||
# Mini Calendar
|
|
||||||
# Generated with your TaskNotes settings
|
|
||||||
|
|
||||||
filters:
|
filters:
|
||||||
and:
|
and:
|
||||||
- file.hasTag("type/task")
|
- file.hasTag("type/task")
|
||||||
- file.inFolder("templates") != true
|
- file.inFolder("templates") != true
|
||||||
|
|
||||||
formulas:
|
formulas:
|
||||||
priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))'
|
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)'
|
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")))))'
|
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)'
|
daysUntilScheduled: if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
|
||||||
daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'
|
daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
|
||||||
daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'
|
daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
|
||||||
isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != "done"'
|
isOverdue: (due.isEmpty() == false) && date(due) < today() && status != "done"
|
||||||
isDueToday: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'
|
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")'
|
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")'
|
isScheduledToday: (scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||||
isRecurring: 'recurrence && !recurrence.isEmpty()'
|
isRecurring: recurrence && !recurrence.isEmpty()
|
||||||
hasTimeEstimate: 'timeEstimate && timeEstimate > 0'
|
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)'
|
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)'
|
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)'
|
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)'
|
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")'
|
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")'
|
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")'
|
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")'
|
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")))))'
|
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)")))'
|
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")))'
|
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")'
|
createdMonth: file.ctime.format("YYYY-MM")
|
||||||
modifiedMonth: 'file.mtime.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"))))'
|
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"))'
|
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"))'
|
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")))'
|
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))'
|
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))'
|
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)'
|
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"))'
|
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"))'
|
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")))))'
|
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")))'
|
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")))'
|
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)))'
|
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")'
|
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")))))))'
|
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:
|
views:
|
||||||
- type: tasknotesMiniCalendar
|
- type: tasknotesMiniCalendar
|
||||||
name: "Due"
|
name: Due
|
||||||
order:
|
order:
|
||||||
- status
|
- status
|
||||||
- priority
|
- priority
|
||||||
@@ -64,12 +59,12 @@ views:
|
|||||||
direction: ASC
|
direction: ASC
|
||||||
dateProperty: due
|
dateProperty: due
|
||||||
- type: tasknotesMiniCalendar
|
- type: tasknotesMiniCalendar
|
||||||
name: "Scheduled"
|
name: Scheduled
|
||||||
order: []
|
order: []
|
||||||
dateProperty: scheduled
|
dateProperty: scheduled
|
||||||
- type: tasknotesMiniCalendar
|
- type: tasknotesMiniCalendar
|
||||||
name: "Created"
|
name: Created
|
||||||
dateProperty: file.ctime
|
dateProperty: file.ctime
|
||||||
- type: tasknotesMiniCalendar
|
- type: tasknotesMiniCalendar
|
||||||
name: "Modified"
|
name: Modified
|
||||||
dateProperty: file.mtime
|
dateProperty: file.mtime
|
||||||
|
|||||||
+117
-143
@@ -1,71 +1,54 @@
|
|||||||
# All Tasks
|
|
||||||
|
|
||||||
filters:
|
filters:
|
||||||
and:
|
and:
|
||||||
- file.hasTag("type/task")
|
- file.hasTag("type/task")
|
||||||
- file.inFolder("templates") != true
|
- file.inFolder("templates") != true
|
||||||
|
|
||||||
formulas:
|
formulas:
|
||||||
priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))'
|
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)'
|
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")))))'
|
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)'
|
daysUntilScheduled: if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
|
||||||
daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'
|
daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
|
||||||
daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'
|
daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
|
||||||
isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != "done"'
|
isOverdue: (due.isEmpty() == false) && date(due) < today() && status != "done"
|
||||||
isDueToday: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'
|
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")'
|
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")'
|
isScheduledToday: (scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||||
isRecurring: 'recurrence && !recurrence.isEmpty()'
|
isRecurring: recurrence && !recurrence.isEmpty()
|
||||||
hasTimeEstimate: 'timeEstimate && timeEstimate > 0'
|
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)'
|
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)'
|
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)'
|
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)'
|
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")'
|
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")'
|
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")'
|
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")'
|
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")))))'
|
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)")))'
|
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")))'
|
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")'
|
createdMonth: file.ctime.format("YYYY-MM")
|
||||||
modifiedMonth: 'file.mtime.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"))))'
|
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"))'
|
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"))'
|
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")))'
|
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))'
|
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))'
|
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)'
|
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"))'
|
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"))'
|
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")))))'
|
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")))'
|
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")))'
|
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)))'
|
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")'
|
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")))))))'
|
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:
|
views:
|
||||||
- type: tasknotesTaskList
|
- type: tasknotesTaskList
|
||||||
name: "Manual Order"
|
name: Manual Order
|
||||||
order:
|
|
||||||
- status
|
|
||||||
- priority
|
|
||||||
- blockedBy
|
|
||||||
- file.name
|
|
||||||
- recurrence
|
|
||||||
- complete_instances
|
|
||||||
- file.tasks
|
|
||||||
sort:
|
|
||||||
- column: tasknotes_manual_order
|
|
||||||
direction: DESC
|
|
||||||
groupBy:
|
groupBy:
|
||||||
property: status
|
property: status
|
||||||
direction: ASC
|
direction: ASC
|
||||||
- type: tasknotesTaskList
|
|
||||||
name: "All Tasks"
|
|
||||||
order:
|
order:
|
||||||
- status
|
- status
|
||||||
- priority
|
- priority
|
||||||
@@ -75,28 +58,35 @@ views:
|
|||||||
- complete_instances
|
- complete_instances
|
||||||
- file.tasks
|
- file.tasks
|
||||||
sort:
|
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
|
direction: ASC
|
||||||
- type: tasknotesTaskList
|
- type: tasknotesTaskList
|
||||||
name: "Not Blocked"
|
name: Not Blocked
|
||||||
filters:
|
filters:
|
||||||
and:
|
and:
|
||||||
# Incomplete tasks
|
|
||||||
- or:
|
- or:
|
||||||
# Non-recurring task that's not in any completed status
|
- and:
|
||||||
- and:
|
- recurrence.isEmpty()
|
||||||
- recurrence.isEmpty()
|
- status != "done"
|
||||||
- status != "done"
|
- and:
|
||||||
# Recurring task where today is not in complete_instances
|
- recurrence.isEmpty() == false
|
||||||
- and:
|
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
||||||
- recurrence.isEmpty() == false
|
|
||||||
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
|
||||||
# Not blocked by any incomplete tasks
|
|
||||||
- or:
|
- or:
|
||||||
# No blocking dependencies at all
|
- blockedBy.isEmpty()
|
||||||
- blockedBy.isEmpty()
|
- list(blockedBy).filter(file(if(value.isType("object"), value.uid, value)).properties.status != "done").isEmpty()
|
||||||
# All blocking tasks are completed (filter returns only incomplete, then check if empty)
|
|
||||||
- 'list(blockedBy).filter(file(if(value.isType("object"), value.uid, value)).properties.status != "done").isEmpty()'
|
|
||||||
order:
|
order:
|
||||||
- status
|
- status
|
||||||
- priority
|
- priority
|
||||||
@@ -106,30 +96,26 @@ views:
|
|||||||
- complete_instances
|
- complete_instances
|
||||||
- file.tasks
|
- file.tasks
|
||||||
sort:
|
sort:
|
||||||
- column: formula.urgencyScore
|
- property: formula.urgencyScore
|
||||||
direction: DESC
|
direction: DESC
|
||||||
- type: tasknotesTaskList
|
- type: tasknotesTaskList
|
||||||
name: "Today"
|
name: Today
|
||||||
filters:
|
filters:
|
||||||
and:
|
and:
|
||||||
# Incomplete tasks (handles both recurring and non-recurring)
|
|
||||||
- or:
|
- or:
|
||||||
# Non-recurring task that's not in any completed status
|
- and:
|
||||||
- and:
|
- recurrence.isEmpty()
|
||||||
- recurrence.isEmpty()
|
- status != "done"
|
||||||
- status != "done"
|
- and:
|
||||||
# Recurring task where today is not in complete_instances
|
- recurrence.isEmpty() == false
|
||||||
- and:
|
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
||||||
- recurrence.isEmpty() == false
|
|
||||||
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
|
||||||
# Due or scheduled today
|
|
||||||
- or:
|
- or:
|
||||||
- and:
|
- and:
|
||||||
- due.isEmpty() == false
|
- due.isEmpty() == false
|
||||||
- date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
- date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||||
- and:
|
- and:
|
||||||
- scheduled.isEmpty() == false
|
- scheduled.isEmpty() == false
|
||||||
- date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
- date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||||
order:
|
order:
|
||||||
- status
|
- status
|
||||||
- priority
|
- priority
|
||||||
@@ -139,30 +125,26 @@ views:
|
|||||||
- complete_instances
|
- complete_instances
|
||||||
- file.tasks
|
- file.tasks
|
||||||
sort:
|
sort:
|
||||||
- column: formula.urgencyScore
|
- property: formula.urgencyScore
|
||||||
direction: DESC
|
direction: DESC
|
||||||
- type: tasknotesTaskList
|
- type: tasknotesTaskList
|
||||||
name: "Overdue"
|
name: Overdue
|
||||||
filters:
|
filters:
|
||||||
and:
|
and:
|
||||||
# Incomplete tasks
|
|
||||||
- or:
|
- or:
|
||||||
# Non-recurring task that's not in any completed status
|
- and:
|
||||||
- and:
|
- recurrence.isEmpty()
|
||||||
- recurrence.isEmpty()
|
- status != "done"
|
||||||
- status != "done"
|
- and:
|
||||||
# Recurring task where today is not in complete_instances
|
- recurrence.isEmpty() == false
|
||||||
- and:
|
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
||||||
- recurrence.isEmpty() == false
|
|
||||||
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
|
||||||
# Due or scheduled in the past
|
|
||||||
- or:
|
- or:
|
||||||
- and:
|
- and:
|
||||||
- due.isEmpty() == false
|
- due.isEmpty() == false
|
||||||
- date(due) < today()
|
- date(due) < today()
|
||||||
- and:
|
- and:
|
||||||
- scheduled.isEmpty() == false
|
- scheduled.isEmpty() == false
|
||||||
- date(scheduled) < today()
|
- date(scheduled) < today()
|
||||||
order:
|
order:
|
||||||
- status
|
- status
|
||||||
- priority
|
- priority
|
||||||
@@ -172,32 +154,28 @@ views:
|
|||||||
- complete_instances
|
- complete_instances
|
||||||
- file.tasks
|
- file.tasks
|
||||||
sort:
|
sort:
|
||||||
- column: formula.urgencyScore
|
- property: formula.urgencyScore
|
||||||
direction: DESC
|
direction: DESC
|
||||||
- type: tasknotesTaskList
|
- type: tasknotesTaskList
|
||||||
name: "This Week"
|
name: This Week
|
||||||
filters:
|
filters:
|
||||||
and:
|
and:
|
||||||
# Incomplete tasks
|
|
||||||
- or:
|
- or:
|
||||||
# Non-recurring task that's not in any completed status
|
- and:
|
||||||
- and:
|
- recurrence.isEmpty()
|
||||||
- recurrence.isEmpty()
|
- status != "done"
|
||||||
- status != "done"
|
- and:
|
||||||
# Recurring task where today is not in complete_instances
|
- recurrence.isEmpty() == false
|
||||||
- and:
|
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
||||||
- recurrence.isEmpty() == false
|
|
||||||
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
|
||||||
# Due or scheduled this week
|
|
||||||
- or:
|
- or:
|
||||||
- and:
|
- and:
|
||||||
- due.isEmpty() == false
|
- due.isEmpty() == false
|
||||||
- date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD")
|
- date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD")
|
||||||
- date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
|
- date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
|
||||||
- and:
|
- and:
|
||||||
- scheduled.isEmpty() == false
|
- scheduled.isEmpty() == false
|
||||||
- date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD")
|
- date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD")
|
||||||
- date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
|
- date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
|
||||||
order:
|
order:
|
||||||
- status
|
- status
|
||||||
- priority
|
- priority
|
||||||
@@ -207,23 +185,19 @@ views:
|
|||||||
- complete_instances
|
- complete_instances
|
||||||
- file.tasks
|
- file.tasks
|
||||||
sort:
|
sort:
|
||||||
- column: formula.urgencyScore
|
- property: formula.urgencyScore
|
||||||
direction: DESC
|
direction: DESC
|
||||||
- type: tasknotesTaskList
|
- type: tasknotesTaskList
|
||||||
name: "Unscheduled"
|
name: Unscheduled
|
||||||
filters:
|
filters:
|
||||||
and:
|
and:
|
||||||
# Incomplete tasks
|
|
||||||
- or:
|
- or:
|
||||||
# Non-recurring task that's not in any completed status
|
- and:
|
||||||
- and:
|
- recurrence.isEmpty()
|
||||||
- recurrence.isEmpty()
|
- status != "done"
|
||||||
- status != "done"
|
- and:
|
||||||
# Recurring task where today is not in complete_instances
|
- recurrence.isEmpty() == false
|
||||||
- and:
|
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
||||||
- recurrence.isEmpty() == false
|
|
||||||
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
|
||||||
# No due date and no scheduled date
|
|
||||||
- date(due).isEmpty()
|
- date(due).isEmpty()
|
||||||
- date(scheduled).isEmpty()
|
- date(scheduled).isEmpty()
|
||||||
order:
|
order:
|
||||||
@@ -235,5 +209,5 @@ views:
|
|||||||
- complete_instances
|
- complete_instances
|
||||||
- file.tasks
|
- file.tasks
|
||||||
sort:
|
sort:
|
||||||
- column: status
|
- property: status
|
||||||
direction: ASC
|
direction: ASC
|
||||||
|
|||||||
+3
-2
@@ -57,8 +57,9 @@ Alternative
|
|||||||
|
|
||||||
## Backbone Riser
|
## Backbone Riser
|
||||||
|
|
||||||
* `Phase` = "Building - BOH ..."
|
> [!info] Breakdowns
|
||||||
* `System` = "TC - Telecom Backbone"
|
> * `Phase` = "Building - BOH ..."
|
||||||
|
> * `System` = "TC - Telecom Backbone"
|
||||||
|
|
||||||
If not shown:
|
If not shown:
|
||||||
* _Garden Style:_ (2) 4"C
|
* _Garden Style:_ (2) 4"C
|
||||||
|
|||||||
+1
-1
@@ -7,4 +7,4 @@ priority: {{priority}}
|
|||||||
scheduled: {{scheduledDate}}
|
scheduled: {{scheduledDate}}
|
||||||
status: {{status}}
|
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
|
# 2025-08-15 14:15:41
|
||||||
|
|
||||||
Exact date of quote unknown.
|
> [!cite] [[joel-jansen]], in reference to Omni Hotels Raleigh (pp.)[^1]
|
||||||
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.)
|
|
||||||
> It is acceptable to use typicals for identical feeders
|
> It is acceptable to use typicals for identical feeders
|
||||||
> (i.e. meter centers fed from bus plugs)
|
> (i.e. meter centers fed from bus plugs)
|
||||||
> so long as the typical is in `Area` = "01 - Feeders/Risers ...".
|
> 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
|
## 303 Mariposa Residence Pre-takeoff Confirmation Email Review
|
||||||
|
|
||||||
Consultation with [[josh-ford|Josh]]
|
Consultation with [[josh-ford|Josh Ford]]
|
||||||
regarding [[conest-pre-takeoff-confirmation]]
|
regarding [[conest-pre-takeoff-confirmation]]
|
||||||
for [[303-mariposa-residence]].
|
for [[303-mariposa-residence]].
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ daily: "[[2026-05-20]]"
|
|||||||
# 2026-05-20 13:10:36
|
# 2026-05-20 13:10:36
|
||||||
|
|
||||||
Direction from [[josh-ford]]
|
Direction from [[josh-ford]]
|
||||||
|
relevant to [[electrical-takeoff]]
|
||||||
on [[303-mariposa-residence]]
|
on [[303-mariposa-residence]]
|
||||||
with application elsewhere as well.
|
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
|
### Load Centers
|
||||||
|
|
||||||
* `System` = "EL - Electrical"
|
> [!info] Breakdowns
|
||||||
|
> * `System` = "EL - Electrical"
|
||||||
|
|
||||||
| Rating | Assembly |
|
| Rating | Assembly |
|
||||||
| ------- | ---------------------------------------------------------------------------------- |
|
| ------- | ---------------------------------------------------------------------------------- |
|
||||||
@@ -161,7 +162,8 @@ Adjust cable length as needed.
|
|||||||
|
|
||||||
#### Residential
|
#### Residential
|
||||||
|
|
||||||
* `System` = "EL - Electrical"
|
> [!info] Breakdowns
|
||||||
|
> * `System` = "EL - Electrical"
|
||||||
|
|
||||||
##### Smoke Detectors & CO Detectors
|
##### Smoke Detectors & CO Detectors
|
||||||
|
|
||||||
@@ -175,7 +177,8 @@ For ADA units:
|
|||||||
|
|
||||||
##### Additional Signaling Devices
|
##### 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`
|
`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
|
#### Hospitality
|
||||||
|
|
||||||
* `System` = "FA - Fire Alarm"
|
> [!info] Breakdowns
|
||||||
|
> * `System` = "FA - Fire Alarm"
|
||||||
|
|
||||||
`COMMON ASSEMBLIES`/`FIRE ALARM & DAS SYSTEMS`/`... DEVICES WITH WIRE - FREE AIR`
|
`COMMON ASSEMBLIES`/`FIRE ALARM & DAS SYSTEMS`/`... DEVICES WITH WIRE - FREE AIR`
|
||||||
|
|
||||||
|
|||||||
+4
-67
@@ -3,77 +3,14 @@ id:
|
|||||||
aliases:
|
aliases:
|
||||||
- Me
|
- Me
|
||||||
- Zane Meyers
|
- Zane Meyers
|
||||||
title: Me
|
title: Zane Meyers
|
||||||
tags:
|
tags:
|
||||||
- topic/meta
|
- topic/meta
|
||||||
- type/encyclopedia
|
- type/encyclopedia
|
||||||
- type/person
|
- 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.
|
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