Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5f357f351e | |||
| 6c149e0a85 | |||
| 97c035dfbf |
@@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
/.obsidian/workspace.json
|
||||||
|
/.obsidian/plugins/*
|
||||||
|
/.obsidian/workspace.json
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
Vendored
+6
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"cssTheme": "",
|
||||||
|
"accentColor": "#16ac20",
|
||||||
|
"theme": "system",
|
||||||
|
"interfaceFontFamily": ""
|
||||||
|
}
|
||||||
Vendored
+6
@@ -0,0 +1,6 @@
|
|||||||
|
[
|
||||||
|
"obsidian-git",
|
||||||
|
"tasknotes",
|
||||||
|
"advanced-canvas",
|
||||||
|
"awesome-format-bar"
|
||||||
|
]
|
||||||
Vendored
+33
@@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"file-explorer": true,
|
||||||
|
"global-search": true,
|
||||||
|
"switcher": true,
|
||||||
|
"graph": true,
|
||||||
|
"backlink": true,
|
||||||
|
"canvas": true,
|
||||||
|
"outgoing-link": true,
|
||||||
|
"tag-pane": true,
|
||||||
|
"footnotes": false,
|
||||||
|
"properties": true,
|
||||||
|
"page-preview": true,
|
||||||
|
"daily-notes": true,
|
||||||
|
"templates": true,
|
||||||
|
"note-composer": true,
|
||||||
|
"command-palette": true,
|
||||||
|
"slash-command": false,
|
||||||
|
"editor-status": true,
|
||||||
|
"bookmarks": true,
|
||||||
|
"markdown-importer": false,
|
||||||
|
"zk-prefixer": false,
|
||||||
|
"random-note": false,
|
||||||
|
"outline": true,
|
||||||
|
"word-count": true,
|
||||||
|
"slides": false,
|
||||||
|
"audio-recorder": false,
|
||||||
|
"workspaces": false,
|
||||||
|
"file-recovery": true,
|
||||||
|
"publish": false,
|
||||||
|
"sync": true,
|
||||||
|
"bases": true,
|
||||||
|
"webviewer": false
|
||||||
|
}
|
||||||
+8585
File diff suppressed because one or more lines are too long
+11
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"id": "advanced-canvas",
|
||||||
|
"name": "Advanced Canvas",
|
||||||
|
"version": "7.0.1",
|
||||||
|
"minAppVersion": "1.13.0",
|
||||||
|
"description": "Supercharge your canvas experience! Create presentations, flowcharts and more!",
|
||||||
|
"author": "Developer-Mike",
|
||||||
|
"authorUrl": "https://github.com/Developer-Mike",
|
||||||
|
"fundingUrl": "https://ko-fi.com/X8X27IA08",
|
||||||
|
"isDesktopOnly": false
|
||||||
|
}
|
||||||
+538
@@ -0,0 +1,538 @@
|
|||||||
|
/* src/styles.scss */
|
||||||
|
.canvas-wrapper > .document-search-container {
|
||||||
|
transform: translateZ(0);
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
.document-search-count.is-hidden {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.canvas-wrapper:not(.mod-readonly) .show-while-readonly {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.canvas-control-item[data-toggled=true] {
|
||||||
|
background-color: var(--color-accent);
|
||||||
|
}
|
||||||
|
.canvas-control-item[data-toggled=true] svg {
|
||||||
|
stroke: var(--text-on-accent);
|
||||||
|
}
|
||||||
|
.reactive-node,
|
||||||
|
.canvas-node[data-shape=database],
|
||||||
|
.canvas-node[data-shape=document],
|
||||||
|
.canvas-node[data-shape=predefined-process],
|
||||||
|
.canvas-node[data-shape=diamond] {
|
||||||
|
--border-color: var(--canvas-color);
|
||||||
|
--border-width: 3px;
|
||||||
|
--box-shadow: none;
|
||||||
|
}
|
||||||
|
.reactive-node.is-focused,
|
||||||
|
.is-focused.canvas-node[data-shape=database],
|
||||||
|
.is-focused.canvas-node[data-shape=document],
|
||||||
|
.is-focused.canvas-node[data-shape=predefined-process],
|
||||||
|
.is-focused.canvas-node[data-shape=diamond],
|
||||||
|
.reactive-node.is-selected,
|
||||||
|
.is-selected.canvas-node[data-shape=database],
|
||||||
|
.is-selected.canvas-node[data-shape=document],
|
||||||
|
.is-selected.canvas-node[data-shape=predefined-process],
|
||||||
|
.is-selected.canvas-node[data-shape=diamond] {
|
||||||
|
--border-color: var(--color-accent);
|
||||||
|
--border-width: 5px;
|
||||||
|
--box-shadow: var(--shadow-border-accent);
|
||||||
|
}
|
||||||
|
.reactive-node.is-themed,
|
||||||
|
.is-themed.canvas-node[data-shape=database],
|
||||||
|
.is-themed.canvas-node[data-shape=document],
|
||||||
|
.is-themed.canvas-node[data-shape=predefined-process],
|
||||||
|
.is-themed.canvas-node[data-shape=diamond] {
|
||||||
|
--border-color: rgb(from var(--canvas-color) r g b / 0.7);
|
||||||
|
}
|
||||||
|
.reactive-node.is-themed.is-focused,
|
||||||
|
.is-themed.is-focused.canvas-node[data-shape=database],
|
||||||
|
.is-themed.is-focused.canvas-node[data-shape=document],
|
||||||
|
.is-themed.is-focused.canvas-node[data-shape=predefined-process],
|
||||||
|
.is-themed.is-focused.canvas-node[data-shape=diamond],
|
||||||
|
.reactive-node.is-themed.is-selected,
|
||||||
|
.is-themed.is-selected.canvas-node[data-shape=database],
|
||||||
|
.is-themed.is-selected.canvas-node[data-shape=document],
|
||||||
|
.is-themed.is-selected.canvas-node[data-shape=predefined-process],
|
||||||
|
.is-themed.is-selected.canvas-node[data-shape=diamond] {
|
||||||
|
--border-color: var(--canvas-color);
|
||||||
|
--box-shadow: var(--shadow-border-themed);
|
||||||
|
}
|
||||||
|
.canvas-node[data-text-align=center] .markdown-preview-view {
|
||||||
|
scrollbar-gutter: auto;
|
||||||
|
}
|
||||||
|
.canvas-node[data-text-align=center] .markdown-preview-view .markdown-preview-section {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
text-align: center;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
.canvas-node[data-text-align=right] {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
.canvas-node[data-shape] .canvas-node-container .markdown-preview-view.markdown-rendered {
|
||||||
|
transform: unset;
|
||||||
|
}
|
||||||
|
.canvas-node[data-shape=pill] .canvas-node-container {
|
||||||
|
border-radius: 5000px;
|
||||||
|
}
|
||||||
|
.canvas-node[data-shape=diamond] {
|
||||||
|
}
|
||||||
|
.canvas-node[data-shape=diamond].is-focused,
|
||||||
|
.canvas-node[data-shape=diamond].is-selected {
|
||||||
|
border-radius: var(--radius-m);
|
||||||
|
outline: 2px solid var(--color-accent);
|
||||||
|
outline-offset: 5px;
|
||||||
|
}
|
||||||
|
.canvas-node[data-shape=diamond] .canvas-node-container {
|
||||||
|
border: none;
|
||||||
|
box-shadow: none !important;
|
||||||
|
}
|
||||||
|
.canvas-node[data-shape=diamond] .canvas-node-container:not(:has(.embed-iframe)) {
|
||||||
|
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 141.42135624 141.42135624' preserveAspectRatio='none'%3E%3Cstyle%3E rect %7B transform-origin: center; transform: rotate(45deg) scale(1.05); %7D %3C/style%3E%3Crect rx='8' x='20.71067812' y='20.71067812' width='100' height='100' /%3E%3C/svg%3E");
|
||||||
|
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 141.42135624 141.42135624' preserveAspectRatio='none'%3E%3Cstyle%3E rect %7B transform-origin: center; transform: rotate(45deg) scale(1.05); %7D %3C/style%3E%3Crect rx='8' x='20.71067812' y='20.71067812' width='100' height='100' /%3E%3C/svg%3E");
|
||||||
|
mask-repeat: no-repeat;
|
||||||
|
-webkit-mask-repeat: no-repeat;
|
||||||
|
mask-size: 100%;
|
||||||
|
-webkit-mask-size: 100%;
|
||||||
|
}
|
||||||
|
.canvas-node[data-shape=diamond] .canvas-node-container .canvas-node-placeholder::after {
|
||||||
|
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 141.42135624 141.42135624' preserveAspectRatio='none'%3E%3Cstyle%3E rect %7B transform-origin: center; transform: rotate(45deg) scale(1.05); %7D %3C/style%3E%3Crect rx='8' x='20.71067812' y='20.71067812' width='100' height='100' /%3E%3C/svg%3E");
|
||||||
|
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 141.42135624 141.42135624' preserveAspectRatio='none'%3E%3Cstyle%3E rect %7B transform-origin: center; transform: rotate(45deg) scale(1.05); %7D %3C/style%3E%3Crect rx='8' x='20.71067812' y='20.71067812' width='100' height='100' /%3E%3C/svg%3E");
|
||||||
|
mask-repeat: no-repeat;
|
||||||
|
-webkit-mask-repeat: no-repeat;
|
||||||
|
mask-size: 100%;
|
||||||
|
-webkit-mask-size: 100%;
|
||||||
|
}
|
||||||
|
.canvas-node[data-shape=diamond]::before {
|
||||||
|
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 141.42135624 141.42135624' preserveAspectRatio='none'%3E%3Cstyle%3E rect %7B transform-origin: center; transform: rotate(45deg) scale(1.05); %7D %3C/style%3E%3Crect rx='8' x='20.71067812' y='20.71067812' width='100' height='100' /%3E%3C/svg%3E");
|
||||||
|
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 141.42135624 141.42135624' preserveAspectRatio='none'%3E%3Cstyle%3E rect %7B transform-origin: center; transform: rotate(45deg) scale(1.05); %7D %3C/style%3E%3Crect rx='8' x='20.71067812' y='20.71067812' width='100' height='100' /%3E%3C/svg%3E");
|
||||||
|
mask-repeat: no-repeat;
|
||||||
|
-webkit-mask-repeat: no-repeat;
|
||||||
|
mask-size: 100%;
|
||||||
|
-webkit-mask-size: 100%;
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: calc(var(--border-width) * -1);
|
||||||
|
left: calc(var(--border-width) * -1);
|
||||||
|
width: calc(100% + var(--border-width) * 2);
|
||||||
|
height: calc(100% + var(--border-width) * 2);
|
||||||
|
background-color: var(--border-color);
|
||||||
|
}
|
||||||
|
.canvas-node[data-shape=parallelogram] .canvas-node-container {
|
||||||
|
transform: skewX(-20deg);
|
||||||
|
backface-visibility: hidden;
|
||||||
|
}
|
||||||
|
.canvas-node[data-shape=parallelogram] .canvas-node-container .canvas-node-content > .markdown-embed-content {
|
||||||
|
transform: skewX(20deg);
|
||||||
|
}
|
||||||
|
.canvas-node[data-shape=circle] .canvas-node-container {
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
.canvas-node[data-shape=circle] .canvas-node-container .markdown-preview-view {
|
||||||
|
overflow-y: initial;
|
||||||
|
}
|
||||||
|
.canvas-node[data-shape=predefined-process] .canvas-node-container .canvas-node-content {
|
||||||
|
padding: 0 10px;
|
||||||
|
}
|
||||||
|
.canvas-node[data-shape=predefined-process] .canvas-node-container::before,
|
||||||
|
.canvas-node[data-shape=predefined-process] .canvas-node-container::after {
|
||||||
|
content: "";
|
||||||
|
z-index: 1;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
width: 0;
|
||||||
|
height: 100%;
|
||||||
|
border-left: var(--border-width) solid var(--border-color);
|
||||||
|
}
|
||||||
|
.canvas-node[data-shape=predefined-process] .canvas-node-container::before {
|
||||||
|
left: calc(10px - var(--border-width));
|
||||||
|
}
|
||||||
|
.canvas-node[data-shape=predefined-process] .canvas-node-container::after {
|
||||||
|
right: calc(10px - var(--border-width));
|
||||||
|
}
|
||||||
|
.canvas-node[data-shape=document] {
|
||||||
|
--border-width: 2.5px;
|
||||||
|
filter: drop-shadow(0 var(--border-width) 0 var(--border-color)) drop-shadow(0 calc(var(--border-width) * -1) 0 var(--border-color));
|
||||||
|
}
|
||||||
|
.canvas-node[data-shape=document] .canvas-node-container {
|
||||||
|
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 75 45' preserveAspectRatio='none'%3E%3Cpath d='M75 0 75 39.375Q56.25 29.25 37.5 39.375 18.75 49.5 0 39.375L0 0Z' /%3E%3C/svg%3E");
|
||||||
|
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 75 45' preserveAspectRatio='none'%3E%3Cpath d='M75 0 75 39.375Q56.25 29.25 37.5 39.375 18.75 49.5 0 39.375L0 0Z' /%3E%3C/svg%3E");
|
||||||
|
mask-repeat: no-repeat;
|
||||||
|
-webkit-mask-repeat: no-repeat;
|
||||||
|
mask-size: 100%;
|
||||||
|
-webkit-mask-size: 100%;
|
||||||
|
border: var(--border-width) solid var(--border-color);
|
||||||
|
border-top: none;
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
.canvas-node[data-shape=document].is-focused,
|
||||||
|
.canvas-node[data-shape=document].is-selected {
|
||||||
|
--border-width: 4px;
|
||||||
|
}
|
||||||
|
.canvas-node[data-shape=database] {
|
||||||
|
}
|
||||||
|
.canvas-node[data-shape=database] .canvas-node-container {
|
||||||
|
border: var(--border-width) solid var(--border-color);
|
||||||
|
border-bottom: 0;
|
||||||
|
border-top: 0;
|
||||||
|
border-radius: 0;
|
||||||
|
box-shadow: none !important;
|
||||||
|
}
|
||||||
|
.canvas-node[data-shape=database] .canvas-node-container .canvas-node-placeholder {
|
||||||
|
transform: translateY(25px);
|
||||||
|
}
|
||||||
|
.canvas-node[data-shape=database]::before,
|
||||||
|
.canvas-node[data-shape=database]::after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
width: 100%;
|
||||||
|
height: 50px;
|
||||||
|
border-radius: 50%;
|
||||||
|
border: var(--border-width) solid var(--border-color);
|
||||||
|
background-color: var(--background-primary);
|
||||||
|
}
|
||||||
|
.canvas-node[data-shape=database]::after {
|
||||||
|
top: -25px;
|
||||||
|
}
|
||||||
|
.canvas-node[data-shape=database]::before {
|
||||||
|
bottom: -25px;
|
||||||
|
}
|
||||||
|
.canvas-node[data-shape=database].is-themed .canvas-node-content {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
.canvas-node[data-shape=database].is-themed:not(:has(.embed-iframe)) .canvas-node-container,
|
||||||
|
.canvas-node[data-shape=database].is-themed:not(:has(.embed-iframe))::after,
|
||||||
|
.canvas-node[data-shape=database].is-themed:not(:has(.embed-iframe))::before {
|
||||||
|
box-shadow: inset 0 0 0 1000px rgb(from var(--canvas-color) r g b/0.07) !important;
|
||||||
|
}
|
||||||
|
.canvas-node[data-shape=database] .canvas-node-content:not(:has(.embed-iframe)) {
|
||||||
|
transform: translateY(20px);
|
||||||
|
}
|
||||||
|
.canvas-node[data-shape=database]:has(.embed-iframe)::after {
|
||||||
|
z-index: -1;
|
||||||
|
}
|
||||||
|
.canvas-node[data-border=dashed] .canvas-node-container {
|
||||||
|
box-shadow: none;
|
||||||
|
border-style: dashed;
|
||||||
|
}
|
||||||
|
.canvas-node[data-border=dotted] .canvas-node-container {
|
||||||
|
box-shadow: none;
|
||||||
|
border-style: dotted;
|
||||||
|
}
|
||||||
|
.canvas-node[data-border=invisible] {
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
.canvas-node[data-border=invisible]:not(.is-focused):not(.is-selected) .canvas-node-container {
|
||||||
|
border-color: transparent !important;
|
||||||
|
}
|
||||||
|
.canvas-node[data-border=invisible] .canvas-node-label {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.canvas-node[data-border=invisible] .canvas-node-container {
|
||||||
|
background-color: transparent;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
.canvas-node[data-border][data-shape=predefined-process] {
|
||||||
|
--border-width: 2px;
|
||||||
|
}
|
||||||
|
.canvas-node[data-border][data-shape=predefined-process] .is-focused,
|
||||||
|
.canvas-node[data-border][data-shape=predefined-process] .is-selected {
|
||||||
|
--border-width: 2px;
|
||||||
|
}
|
||||||
|
.canvas-node[data-border=dashed][data-shape=predefined-process] .canvas-node-container::before,
|
||||||
|
.canvas-node[data-border=dashed][data-shape=predefined-process] .canvas-node-container::after {
|
||||||
|
border-left: var(--border-width) dashed var(--border-color);
|
||||||
|
}
|
||||||
|
.canvas-node[data-border=dotted][data-shape=predefined-process] .canvas-node-container::before,
|
||||||
|
.canvas-node[data-border=dotted][data-shape=predefined-process] .canvas-node-container::after {
|
||||||
|
border-left: var(--border-width) dotted var(--border-color);
|
||||||
|
}
|
||||||
|
.canvas-node[data-border][data-shape=document] .canvas-node-container {
|
||||||
|
border-top: none;
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
.canvas-edges path[data-path=dotted] {
|
||||||
|
stroke-dasharray: calc(3px * var(--zoom-multiplier));
|
||||||
|
}
|
||||||
|
.canvas-edges path[data-path=short-dashed] {
|
||||||
|
stroke-dasharray: 9px;
|
||||||
|
}
|
||||||
|
.canvas-edges path[data-path=long-dashed] {
|
||||||
|
stroke-dasharray: 18px;
|
||||||
|
}
|
||||||
|
.canvas-edges [data-arrow=triangle-outline] polygon,
|
||||||
|
.canvas-edges [data-arrow=diamond-outline] polygon,
|
||||||
|
.canvas-edges [data-arrow=circle-outline] polygon {
|
||||||
|
fill: var(--canvas-background);
|
||||||
|
stroke: var(--canvas-color);
|
||||||
|
stroke-width: calc(3px * var(--zoom-multiplier));
|
||||||
|
}
|
||||||
|
.canvas-edges [data-arrow=thin-triangle] polygon {
|
||||||
|
fill: transparent;
|
||||||
|
stroke: var(--canvas-color);
|
||||||
|
stroke-width: calc(4px * var(--zoom-multiplier));
|
||||||
|
}
|
||||||
|
.icon-modal-suggestion {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: var(--size-4-4);
|
||||||
|
}
|
||||||
|
.icon-modal-suggestion .icon-modal-suggestion-icon {
|
||||||
|
line-height: 0;
|
||||||
|
}
|
||||||
|
.icon-modal-suggestion .icon-modal-suggestion-id {
|
||||||
|
font-size: var(--font-ui-smaller);
|
||||||
|
color: var(--text-muted);
|
||||||
|
}
|
||||||
|
.ac-pinned-pdf-page-embed {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
.canvas.is-exporting {
|
||||||
|
--zoom-multiplier: 1;
|
||||||
|
}
|
||||||
|
.canvas.is-exporting * {
|
||||||
|
pointer-events: none !important;
|
||||||
|
transition: none !important;
|
||||||
|
}
|
||||||
|
.canvas.is-exporting .collapse-button {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.canvas.is-exporting #watermark-ac {
|
||||||
|
z-index: 9999999;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
.canvas-wrapper[data-collapsible-groups-feature-enabled=true] .canvas.is-exporting .canvas-node .canvas-group-label {
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
.progress-bar-modal-ac {
|
||||||
|
margin-top: 0.75em;
|
||||||
|
}
|
||||||
|
.progress-bar-modal-ac.error .setting-progress-bar {
|
||||||
|
color: var(--color-error);
|
||||||
|
}
|
||||||
|
.canvas-wrapper[data-disable-font-size-relative-to-zoom=true] {
|
||||||
|
--zoom-multiplier: 1 !important;
|
||||||
|
}
|
||||||
|
.canvas-wrapper.mod-readonly .canvas-controls .canvas-control-group:nth-child(3),
|
||||||
|
.canvas-wrapper.mod-readonly .canvas-card-menu {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.canvas-wrapper.mod-readonly[data-hide-background-grid-when-in-readonly=true] .canvas-background {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
.canvas-wrapper[data-reading-mode-fix-enabled=true] .canvas {
|
||||||
|
}
|
||||||
|
.canvas-wrapper[data-reading-mode-fix-enabled=true] .canvas .el-p > p:has(> span.vertical-space) {
|
||||||
|
margin-top: 0px;
|
||||||
|
}
|
||||||
|
.canvas-wrapper[data-reading-mode-fix-enabled=true] .canvas .el-p > p {
|
||||||
|
margin-top: 0px;
|
||||||
|
margin-bottom: 0px;
|
||||||
|
}
|
||||||
|
.canvas-wrapper[data-reading-mode-fix-enabled=true] .canvas :is(.el-ul, .el-ol) + .el-p > p:has(> span.vertical-space:first-child) {
|
||||||
|
margin-top: 24px;
|
||||||
|
}
|
||||||
|
.canvas-wrapper[data-reading-mode-fix-enabled=true] .canvas ol::before {
|
||||||
|
margin-left: -2px;
|
||||||
|
}
|
||||||
|
.canvas-wrapper[data-reading-mode-fix-enabled=true] .canvas ol {
|
||||||
|
margin-top: 0px;
|
||||||
|
margin-bottom: 0px;
|
||||||
|
}
|
||||||
|
.canvas-wrapper[data-reading-mode-fix-enabled=true] .canvas ul > li > ol > li {
|
||||||
|
margin-left: 36px;
|
||||||
|
}
|
||||||
|
.canvas-wrapper[data-reading-mode-fix-enabled=true] .canvas ul::before {
|
||||||
|
margin-left: -2px;
|
||||||
|
}
|
||||||
|
.canvas-wrapper[data-reading-mode-fix-enabled=true] .canvas ul {
|
||||||
|
margin-top: 0px;
|
||||||
|
margin-bottom: 0px;
|
||||||
|
}
|
||||||
|
.canvas-wrapper[data-reading-mode-fix-enabled=true] .canvas .el-ul > ul > li {
|
||||||
|
margin-top: 0px;
|
||||||
|
margin-bottom: 0px;
|
||||||
|
}
|
||||||
|
.canvas-wrapper[data-reading-mode-fix-enabled=true] .canvas ol > li > ul > li {
|
||||||
|
margin-left: 36px;
|
||||||
|
}
|
||||||
|
.canvas-wrapper[data-reading-mode-fix-enabled=true] .canvas ul > li > .list-bullet {
|
||||||
|
margin-top: 2px;
|
||||||
|
}
|
||||||
|
.canvas-wrapper[data-reading-mode-fix-enabled=true] .canvas .has-list-bullet .list-bullet::after {
|
||||||
|
margin-left: -4px;
|
||||||
|
margin-top: -3px;
|
||||||
|
}
|
||||||
|
.canvas-wrapper[data-reading-mode-fix-enabled=true] .canvas .el-h1 > h1,
|
||||||
|
.canvas-wrapper[data-reading-mode-fix-enabled=true] .canvas .el-h2 > h2,
|
||||||
|
.canvas-wrapper[data-reading-mode-fix-enabled=true] .canvas .el-h3 > h3,
|
||||||
|
.canvas-wrapper[data-reading-mode-fix-enabled=true] .canvas .el-h4 > h4,
|
||||||
|
.canvas-wrapper[data-reading-mode-fix-enabled=true] .canvas .el-h5 > h5,
|
||||||
|
.canvas-wrapper[data-reading-mode-fix-enabled=true] .canvas .el-h6 > h6 {
|
||||||
|
margin-top: 0px !important;
|
||||||
|
margin-bottom: 0px !important;
|
||||||
|
}
|
||||||
|
.canvas-wrapper[data-reading-mode-fix-enabled=true] .canvas .markdown-preview-section > .markdown-preview-pusher + :is(.el-h2) > :is(h2),
|
||||||
|
.canvas-wrapper[data-reading-mode-fix-enabled=true] .canvas .markdown-preview-section > .markdown-preview-pusher + :is(.el-h3) > :is(h3) {
|
||||||
|
margin-top: 0px !important;
|
||||||
|
}
|
||||||
|
.canvas-wrapper[data-reading-mode-fix-enabled=true] .canvas .el-table {
|
||||||
|
margin-top: 24px;
|
||||||
|
}
|
||||||
|
.canvas-node-iframe-body[data-reading-mode-fix-enabled=true] {
|
||||||
|
}
|
||||||
|
.canvas-node-iframe-body[data-reading-mode-fix-enabled=true] .markdown-source-view .cm-contentContainer > .cm-content.cm-lineWrapping > .cm-line {
|
||||||
|
margin-right: -2px !important;
|
||||||
|
}
|
||||||
|
.canvas-node-iframe-body[data-reading-mode-fix-enabled=true] .mod-inside-iframe .HyperMD-header {
|
||||||
|
padding-top: 0px !important;
|
||||||
|
}
|
||||||
|
.canvas-node-iframe-body[data-reading-mode-fix-enabled=true] .cm-formatting-list.cm-formatting-list-ul {
|
||||||
|
margin-right: 7px;
|
||||||
|
}
|
||||||
|
.collapse-button {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: calc(-1 * var(--size-4-1) * var(--zoom-multiplier));
|
||||||
|
padding: var(--size-4-1) var(--size-4-2);
|
||||||
|
transform-origin: bottom left;
|
||||||
|
transform: translate(0, -100%) scale(var(--zoom-multiplier));
|
||||||
|
border-radius: var(--radius-s);
|
||||||
|
color: var(--text-muted);
|
||||||
|
background-color: rgb(from var(--canvas-color) r g b/0.1);
|
||||||
|
font-size: 1.5em;
|
||||||
|
line-height: 1;
|
||||||
|
pointer-events: initial;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: transform 500ms cubic-bezier(0.16, 1, 0.3, 1);
|
||||||
|
}
|
||||||
|
.canvas-wrapper[data-collapsible-groups-feature-enabled=true] .canvas-node .canvas-group-label {
|
||||||
|
left: calc(40px * var(--zoom-multiplier));
|
||||||
|
}
|
||||||
|
.canvas-node[data-collapsed] .canvas-node-container {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.canvas-node[data-collapsed] .canvas-group-label {
|
||||||
|
max-width: initial;
|
||||||
|
}
|
||||||
|
.canvas-wrapper[data-collapsed-group-preview-on-drag=true][data-is-dragging] .canvas-node[data-collapsed] .canvas-node-container {
|
||||||
|
display: block;
|
||||||
|
opacity: 0.5;
|
||||||
|
border-style: dashed;
|
||||||
|
}
|
||||||
|
.canvas-wrapper[data-collapsed-group-preview-on-drag=true][data-is-dragging] .canvas-node[data-collapsed] .canvas-node-container .canvas-node-content {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
.canvas-node-interaction-layer[data-target-collapsed] .canvas-node-resizer {
|
||||||
|
pointer-events: none;
|
||||||
|
cursor: inherit;
|
||||||
|
}
|
||||||
|
.canvas-node-interaction-layer[data-target-collapsed] .canvas-node-resizer .canvas-node-connection-point {
|
||||||
|
display: none;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
.canvas-wrapper[data-allow-floating-edge-creation=true] .canvas.is-connecting .canvas-node:not(.canvas-node-group)::after {
|
||||||
|
all: unset;
|
||||||
|
content: "";
|
||||||
|
z-index: 100;
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
width: max(10px, 100% - 50px * var(--zoom-multiplier) * 2);
|
||||||
|
height: max(10px, 100% - 50px * var(--zoom-multiplier) * 2);
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
border-radius: var(--radius-m);
|
||||||
|
outline: calc(4px * var(--zoom-multiplier)) dashed hsla(var(--color-accent-hsl), 0.5);
|
||||||
|
}
|
||||||
|
.canvas-wrapper[data-allow-floating-edge-creation=true] .canvas.is-connecting .canvas-node:not(.canvas-node-group).hovering-floating-edge-zone::after {
|
||||||
|
outline-color: var(--color-accent);
|
||||||
|
outline-style: solid;
|
||||||
|
background-color: hsla(var(--color-accent-hsl), 0.1);
|
||||||
|
}
|
||||||
|
.canvas-wrapper[data-focus-mode-enabled=true] .canvas:has(.canvas-node.is-focused) .canvas-node:not(.is-focused) {
|
||||||
|
filter: blur(5px);
|
||||||
|
}
|
||||||
|
.canvas-wrapper[data-focus-mode-enabled=true] .canvas:has(.canvas-node.is-focused) .canvas-edges > g:not(.is-focused) {
|
||||||
|
filter: blur(5px);
|
||||||
|
}
|
||||||
|
.canvas-wrapper[data-focus-mode-enabled=true] .canvas:has(.canvas-node.is-focused) .canvas-path-label-wrapper > .canvas-path-label:not(.is-focused) {
|
||||||
|
filter: blur(5px);
|
||||||
|
}
|
||||||
|
.canvas-wrapper.presentation-mode .canvas-controls {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
.canvas-wrapper.presentation-mode .canvas-card-menu {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
.canvas-wrapper:not(.presentation-mode) .canvas-node[data-is-start-node=true]::before {
|
||||||
|
content: "Start";
|
||||||
|
position: absolute;
|
||||||
|
top: calc(-1 * var(--size-4-1) * var(--zoom-multiplier));
|
||||||
|
right: 0;
|
||||||
|
transform: translate(0, -100%) scale(var(--zoom-multiplier));
|
||||||
|
transform-origin: bottom right;
|
||||||
|
max-width: calc(100% / var(--zoom-multiplier));
|
||||||
|
padding: var(--size-4-1) var(--size-4-2);
|
||||||
|
font-size: 1em;
|
||||||
|
border-radius: var(--radius-s);
|
||||||
|
color: var(--color-green);
|
||||||
|
background-color: rgba(var(--color-green-rgb), 0.1);
|
||||||
|
}
|
||||||
|
.canvas-node[data-is-portal-loaded=true] {
|
||||||
|
pointer-events: all;
|
||||||
|
}
|
||||||
|
.canvas-node[data-is-portal-loaded=true]:not(.is-focused) {
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
.canvas-node[data-is-portal-loaded=true]:not(.is-focused) .canvas-node-label {
|
||||||
|
pointer-events: all;
|
||||||
|
}
|
||||||
|
.canvas-node[data-is-portal-loaded=true] .canvas-node-container {
|
||||||
|
background-color: transparent;
|
||||||
|
border-style: dashed;
|
||||||
|
}
|
||||||
|
.canvas-node[data-is-portal-loaded=true] .canvas-node-container .canvas-node-content {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.canvas-node-interaction-layer[data-is-from-portal=true] .canvas-node-resizer {
|
||||||
|
pointer-events: none;
|
||||||
|
cursor: inherit;
|
||||||
|
}
|
||||||
|
.canvas-node-interaction-layer[data-is-from-portal=true] .canvas-node-resizer .canvas-node-connection-point {
|
||||||
|
pointer-events: all;
|
||||||
|
}
|
||||||
|
.ac-card-embed {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
overflow: hidden;
|
||||||
|
background-color: var(--background-primary);
|
||||||
|
border: 1px solid var(--canvas-color);
|
||||||
|
border-radius: var(--radius-m);
|
||||||
|
box-shadow: var(--shadow-stationary);
|
||||||
|
}
|
||||||
|
.ac-card-embed.is-themed {
|
||||||
|
background-color: rgb(from var(--canvas-color) r g b/0.07);
|
||||||
|
border-color: rgb(from var(--canvas-color) r g b/0.7);
|
||||||
|
box-shadow: inset 0 0 0 1px rgb(from var(--canvas-color) r g b/0.7), var(--shadow-stationary);
|
||||||
|
}
|
||||||
|
.ac-card-embed > .markdown-content {
|
||||||
|
position: relative;
|
||||||
|
overflow-y: auto;
|
||||||
|
overflow-wrap: break-word;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
padding: 0 var(--size-4-4);
|
||||||
|
font-size: var(--font-text-size);
|
||||||
|
font-family: var(--font-text);
|
||||||
|
line-height: var(--line-height-normal);
|
||||||
|
color: var(--text-normal);
|
||||||
|
user-select: text;
|
||||||
|
-webkit-user-select: text;
|
||||||
|
scrollbar-gutter: stable;
|
||||||
|
}
|
||||||
+70
@@ -0,0 +1,70 @@
|
|||||||
|
{
|
||||||
|
"commitMessage": "vault backup: {{date}}",
|
||||||
|
"autoCommitMessage": "vault backup: {{date}}",
|
||||||
|
"commitMessageScript": "",
|
||||||
|
"commitDateFormat": "YYYY-MM-DD HH:mm:ss",
|
||||||
|
"autoSaveInterval": 0,
|
||||||
|
"autoPushInterval": 0,
|
||||||
|
"autoPullInterval": 0,
|
||||||
|
"autoPullOnBoot": false,
|
||||||
|
"autoCommitOnlyStaged": false,
|
||||||
|
"disablePush": false,
|
||||||
|
"pullBeforePush": true,
|
||||||
|
"squashCommitsBeforePush": false,
|
||||||
|
"disablePopups": false,
|
||||||
|
"showErrorNotices": true,
|
||||||
|
"disablePopupsForNoChanges": false,
|
||||||
|
"listChangedFilesInMessageBody": false,
|
||||||
|
"showStatusBar": true,
|
||||||
|
"updateSubmodules": false,
|
||||||
|
"syncMethod": "merge",
|
||||||
|
"mergeStrategy": "none",
|
||||||
|
"customMessageOnAutoBackup": false,
|
||||||
|
"autoBackupAfterFileChange": false,
|
||||||
|
"treeStructure": false,
|
||||||
|
"refreshSourceControl": true,
|
||||||
|
"basePath": "",
|
||||||
|
"differentIntervalCommitAndPush": false,
|
||||||
|
"changedFilesInStatusBar": false,
|
||||||
|
"showedMobileNotice": true,
|
||||||
|
"refreshSourceControlTimer": 7000,
|
||||||
|
"showBranchStatusBar": true,
|
||||||
|
"setLastSaveToLastCommit": false,
|
||||||
|
"submoduleRecurseCheckout": false,
|
||||||
|
"gitDir": "",
|
||||||
|
"showFileMenu": true,
|
||||||
|
"authorInHistoryView": "hide",
|
||||||
|
"dateInHistoryView": false,
|
||||||
|
"diffStyle": "split",
|
||||||
|
"diffTimeout": 50,
|
||||||
|
"autoStageOnEmptyIndex": true,
|
||||||
|
"hunks": {
|
||||||
|
"showSigns": false,
|
||||||
|
"hunkCommands": false,
|
||||||
|
"statusBar": "disabled"
|
||||||
|
},
|
||||||
|
"lineAuthor": {
|
||||||
|
"show": false,
|
||||||
|
"followMovement": "inactive",
|
||||||
|
"authorDisplay": "initials",
|
||||||
|
"showCommitHash": false,
|
||||||
|
"dateTimeFormatOptions": "date",
|
||||||
|
"dateTimeFormatCustomString": "YYYY-MM-DD HH:mm",
|
||||||
|
"dateTimeTimezone": "viewer-local",
|
||||||
|
"coloringMaxAge": "1y",
|
||||||
|
"colorNew": {
|
||||||
|
"r": 255,
|
||||||
|
"g": 150,
|
||||||
|
"b": 150
|
||||||
|
},
|
||||||
|
"colorOld": {
|
||||||
|
"r": 120,
|
||||||
|
"g": 160,
|
||||||
|
"b": 255
|
||||||
|
},
|
||||||
|
"textColorCss": "var(--text-muted)",
|
||||||
|
"ignoreWhitespace": false,
|
||||||
|
"lastShownAuthorDisplay": "initials",
|
||||||
|
"lastShownDateTimeFormatOptions": "date"
|
||||||
|
}
|
||||||
|
}
|
||||||
+427
File diff suppressed because one or more lines are too long
+10
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"author": "Vinzent",
|
||||||
|
"authorUrl": "https://github.com/Vinzent03",
|
||||||
|
"id": "obsidian-git",
|
||||||
|
"name": "Git",
|
||||||
|
"description": "Integrate Git version control with automatic backup and other advanced features.",
|
||||||
|
"isDesktopOnly": false,
|
||||||
|
"fundingUrl": "https://ko-fi.com/vinzent",
|
||||||
|
"version": "2.40.0"
|
||||||
|
}
|
||||||
+705
@@ -0,0 +1,705 @@
|
|||||||
|
@keyframes loading {
|
||||||
|
0% {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="git-view"] .button-border {
|
||||||
|
border: 2px solid var(--interactive-accent);
|
||||||
|
border-radius: var(--radius-s);
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="git-view"] .view-content {
|
||||||
|
padding-left: 0;
|
||||||
|
padding-top: 0;
|
||||||
|
padding-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="git-history-view"] .view-content {
|
||||||
|
padding-left: 0;
|
||||||
|
padding-top: 0;
|
||||||
|
padding-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loading {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loading > svg {
|
||||||
|
animation: 2s linear infinite loading;
|
||||||
|
transform-origin: 50% 50%;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.obsidian-git-center {
|
||||||
|
margin: auto;
|
||||||
|
text-align: center;
|
||||||
|
width: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.obsidian-git-textarea {
|
||||||
|
display: block;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.obsidian-git-disabled {
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.obsidian-git-center-button {
|
||||||
|
display: block;
|
||||||
|
margin: 20px auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tooltip.mod-left {
|
||||||
|
overflow-wrap: break-word;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tooltip.mod-right {
|
||||||
|
overflow-wrap: break-word;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Limits the scrollbar to the view body */
|
||||||
|
.git-view {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
position: relative;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Re-enable wrapping of nav buttns to prevent overflow on smaller screens #*/
|
||||||
|
.workspace-drawer .git-view .nav-buttons-container {
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-tools {
|
||||||
|
display: flex;
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
|
.git-tools .type {
|
||||||
|
padding-left: var(--size-2-1);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-tools .type[data-type="M"] {
|
||||||
|
color: orange;
|
||||||
|
}
|
||||||
|
.git-tools .type[data-type="D"] {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
.git-tools .buttons {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
.git-tools .buttons > * {
|
||||||
|
padding: 0;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="git-view"] .tree-item-self,
|
||||||
|
.workspace-leaf-content[data-type="git-history-view"] .tree-item-self {
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="git-view"]
|
||||||
|
.tree-item-self:hover
|
||||||
|
.clickable-icon,
|
||||||
|
.workspace-leaf-content[data-type="git-history-view"]
|
||||||
|
.tree-item-self:hover
|
||||||
|
.clickable-icon {
|
||||||
|
color: var(--icon-color-hover);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Highlight an item as active if it's diff is currently opened */
|
||||||
|
.is-active .git-tools .buttons > * {
|
||||||
|
color: var(--nav-item-color-active);
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-author {
|
||||||
|
color: var(--text-accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-date {
|
||||||
|
color: var(--text-accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-ref {
|
||||||
|
color: var(--text-accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ====== diff2html ======
|
||||||
|
The following styles are adapted from the obsidian-version-history plugin by
|
||||||
|
@kometenstaub https://github.com/kometenstaub/obsidian-version-history-diff/blob/main/src/styles.scss
|
||||||
|
which itself is adapted from the diff2html library with the following original license:
|
||||||
|
|
||||||
|
https://github.com/rtfpessoa/diff2html/blob/master/LICENSE.md
|
||||||
|
|
||||||
|
Copyright 2014-2016 Rodrigo Fernandes https://rtfpessoa.github.io/
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
|
||||||
|
documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
|
||||||
|
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||||
|
persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
|
||||||
|
Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||||
|
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||||
|
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
.theme-dark,
|
||||||
|
.theme-light {
|
||||||
|
--git-delete-bg: #ff475040;
|
||||||
|
--git-delete-hl: #96050a75;
|
||||||
|
--git-insert-bg: #68d36840;
|
||||||
|
--git-insert-hl: #23c02350;
|
||||||
|
--git-change-bg: #ffd55840;
|
||||||
|
--git-selected: #3572b0;
|
||||||
|
|
||||||
|
--git-delete: #cc3333;
|
||||||
|
--git-insert: #399839;
|
||||||
|
--git-change: #d0b44c;
|
||||||
|
--git-move: #3572b0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-diff {
|
||||||
|
.d2h-d-none {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.d2h-wrapper {
|
||||||
|
text-align: left;
|
||||||
|
border-radius: 0.25em;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
.d2h-file-header.d2h-file-header {
|
||||||
|
background-color: var(--background-secondary);
|
||||||
|
border-bottom: 1px solid var(--background-modifier-border);
|
||||||
|
font-family:
|
||||||
|
Source Sans Pro,
|
||||||
|
Helvetica Neue,
|
||||||
|
Helvetica,
|
||||||
|
Arial,
|
||||||
|
sans-serif;
|
||||||
|
height: 35px;
|
||||||
|
padding: 5px 10px;
|
||||||
|
}
|
||||||
|
.d2h-file-header,
|
||||||
|
.d2h-file-stats {
|
||||||
|
display: -webkit-box;
|
||||||
|
display: -ms-flexbox;
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
.d2h-file-header {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.d2h-file-stats {
|
||||||
|
font-size: 14px;
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
|
.d2h-lines-added {
|
||||||
|
border: 1px solid var(--color-green);
|
||||||
|
border-radius: 5px 0 0 5px;
|
||||||
|
color: var(--color-green);
|
||||||
|
padding: 2px;
|
||||||
|
text-align: right;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
.d2h-lines-deleted {
|
||||||
|
border: 1px solid var(--color-red);
|
||||||
|
border-radius: 0 5px 5px 0;
|
||||||
|
color: var(--color-red);
|
||||||
|
margin-left: 1px;
|
||||||
|
padding: 2px;
|
||||||
|
text-align: left;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
.d2h-file-name-wrapper {
|
||||||
|
-webkit-box-align: center;
|
||||||
|
-ms-flex-align: center;
|
||||||
|
align-items: center;
|
||||||
|
display: -webkit-box;
|
||||||
|
display: -ms-flexbox;
|
||||||
|
display: flex;
|
||||||
|
font-size: 15px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.d2h-file-name {
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
color: var(--text-normal);
|
||||||
|
font-size: var(--h5-size);
|
||||||
|
}
|
||||||
|
.d2h-file-wrapper {
|
||||||
|
border: 1px solid var(--background-secondary-alt);
|
||||||
|
border-radius: 3px;
|
||||||
|
margin-bottom: 1em;
|
||||||
|
max-height: 100%;
|
||||||
|
}
|
||||||
|
.d2h-file-collapse {
|
||||||
|
-webkit-box-pack: end;
|
||||||
|
-ms-flex-pack: end;
|
||||||
|
-webkit-box-align: center;
|
||||||
|
-ms-flex-align: center;
|
||||||
|
align-items: center;
|
||||||
|
border: 1px solid var(--background-secondary-alt);
|
||||||
|
border-radius: 3px;
|
||||||
|
cursor: pointer;
|
||||||
|
display: none;
|
||||||
|
font-size: 12px;
|
||||||
|
justify-content: flex-end;
|
||||||
|
padding: 4px 8px;
|
||||||
|
}
|
||||||
|
.d2h-file-collapse.d2h-selected {
|
||||||
|
background-color: var(--git-selected);
|
||||||
|
}
|
||||||
|
.d2h-file-collapse-input {
|
||||||
|
margin: 0 4px 0 0;
|
||||||
|
}
|
||||||
|
.d2h-diff-table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
font-family: var(--font-monospace);
|
||||||
|
font-size: var(--code-size);
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.d2h-files-diff {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.d2h-file-diff {
|
||||||
|
/*
|
||||||
|
overflow-y: scroll;
|
||||||
|
*/
|
||||||
|
border-radius: 5px;
|
||||||
|
font-size: var(--font-text-size);
|
||||||
|
line-height: var(--line-height-normal);
|
||||||
|
}
|
||||||
|
.d2h-file-side-diff {
|
||||||
|
display: inline-block;
|
||||||
|
margin-bottom: -8px;
|
||||||
|
margin-right: -4px;
|
||||||
|
overflow-x: scroll;
|
||||||
|
overflow-y: hidden;
|
||||||
|
width: 50%;
|
||||||
|
}
|
||||||
|
.d2h-code-line {
|
||||||
|
padding-left: 6em;
|
||||||
|
padding-right: 1.5em;
|
||||||
|
}
|
||||||
|
.d2h-code-line,
|
||||||
|
.d2h-code-side-line {
|
||||||
|
display: inline-block;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
white-space: nowrap;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.d2h-code-side-line {
|
||||||
|
/* needed to be changed */
|
||||||
|
padding-left: 0.5em;
|
||||||
|
padding-right: 0.5em;
|
||||||
|
}
|
||||||
|
.d2h-code-line-ctn {
|
||||||
|
word-wrap: normal;
|
||||||
|
background: none;
|
||||||
|
display: inline-block;
|
||||||
|
padding: 0;
|
||||||
|
-webkit-user-select: text;
|
||||||
|
-moz-user-select: text;
|
||||||
|
-ms-user-select: text;
|
||||||
|
user-select: text;
|
||||||
|
vertical-align: middle;
|
||||||
|
width: 100%;
|
||||||
|
/* only works for line-by-line */
|
||||||
|
white-space: pre-wrap;
|
||||||
|
}
|
||||||
|
.d2h-code-line del,
|
||||||
|
.d2h-code-side-line del {
|
||||||
|
background-color: var(--git-delete-hl);
|
||||||
|
color: var(--text-normal);
|
||||||
|
}
|
||||||
|
.d2h-code-line del,
|
||||||
|
.d2h-code-line ins,
|
||||||
|
.d2h-code-side-line del,
|
||||||
|
.d2h-code-side-line ins {
|
||||||
|
border-radius: 0.2em;
|
||||||
|
display: inline-block;
|
||||||
|
margin-top: -1px;
|
||||||
|
text-decoration: none;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
.d2h-code-line ins,
|
||||||
|
.d2h-code-side-line ins {
|
||||||
|
background-color: var(--git-insert-hl);
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
.d2h-code-line-prefix {
|
||||||
|
word-wrap: normal;
|
||||||
|
background: none;
|
||||||
|
display: inline;
|
||||||
|
padding: 0;
|
||||||
|
white-space: pre;
|
||||||
|
}
|
||||||
|
.line-num1 {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
.line-num1,
|
||||||
|
.line-num2 {
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
overflow: hidden;
|
||||||
|
/*
|
||||||
|
padding: 0 0.5em;
|
||||||
|
*/
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
width: 2.5em;
|
||||||
|
padding-left: 0;
|
||||||
|
}
|
||||||
|
.line-num2 {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
.d2h-code-linenumber {
|
||||||
|
background-color: var(--background-primary);
|
||||||
|
border: solid var(--background-modifier-border);
|
||||||
|
border-width: 0 1px;
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
color: var(--text-faint);
|
||||||
|
cursor: pointer;
|
||||||
|
display: inline-block;
|
||||||
|
position: absolute;
|
||||||
|
text-align: right;
|
||||||
|
width: 5.5em;
|
||||||
|
}
|
||||||
|
.d2h-code-linenumber:after {
|
||||||
|
content: "\200b";
|
||||||
|
}
|
||||||
|
.d2h-code-side-linenumber {
|
||||||
|
background-color: var(--background-primary);
|
||||||
|
border: solid var(--background-modifier-border);
|
||||||
|
border-width: 0 1px;
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
color: var(--text-faint);
|
||||||
|
cursor: pointer;
|
||||||
|
overflow: hidden;
|
||||||
|
padding: 0 0.5em;
|
||||||
|
text-align: right;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
width: 4em;
|
||||||
|
/* needed to be changed */
|
||||||
|
display: table-cell;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.d2h-code-side-linenumber:after {
|
||||||
|
content: "\200b";
|
||||||
|
}
|
||||||
|
.d2h-code-side-emptyplaceholder,
|
||||||
|
.d2h-emptyplaceholder {
|
||||||
|
background-color: var(--background-primary);
|
||||||
|
border-color: var(--background-modifier-border);
|
||||||
|
}
|
||||||
|
.d2h-code-line-prefix,
|
||||||
|
.d2h-code-linenumber,
|
||||||
|
.d2h-code-side-linenumber,
|
||||||
|
.d2h-emptyplaceholder {
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
.d2h-code-linenumber,
|
||||||
|
.d2h-code-side-linenumber {
|
||||||
|
direction: rtl;
|
||||||
|
}
|
||||||
|
.d2h-del {
|
||||||
|
background-color: var(--git-delete-bg);
|
||||||
|
border-color: var(--git-delete-hl);
|
||||||
|
}
|
||||||
|
.d2h-ins {
|
||||||
|
background-color: var(--git-insert-bg);
|
||||||
|
border-color: var(--git-insert-hl);
|
||||||
|
}
|
||||||
|
.d2h-info {
|
||||||
|
background-color: var(--background-primary);
|
||||||
|
border-color: var(--background-modifier-border);
|
||||||
|
color: var(--text-faint);
|
||||||
|
}
|
||||||
|
.d2h-del,
|
||||||
|
.d2h-ins,
|
||||||
|
.d2h-file-diff .d2h-change {
|
||||||
|
color: var(--text-normal);
|
||||||
|
}
|
||||||
|
.d2h-file-diff .d2h-del.d2h-change {
|
||||||
|
background-color: var(--git-change-bg);
|
||||||
|
}
|
||||||
|
.d2h-file-diff .d2h-ins.d2h-change {
|
||||||
|
background-color: var(--git-insert-bg);
|
||||||
|
}
|
||||||
|
.d2h-file-list-wrapper {
|
||||||
|
a {
|
||||||
|
text-decoration: none;
|
||||||
|
cursor: default;
|
||||||
|
-webkit-user-drag: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
svg {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.d2h-file-list-header {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
.d2h-file-list-title {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.d2h-file-list-line {
|
||||||
|
display: -webkit-box;
|
||||||
|
display: -ms-flexbox;
|
||||||
|
display: flex;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
.d2h-file-list {
|
||||||
|
}
|
||||||
|
.d2h-file-list > li {
|
||||||
|
border-bottom: 1px solid var(--background-modifier-border);
|
||||||
|
margin: 0;
|
||||||
|
padding: 5px 10px;
|
||||||
|
}
|
||||||
|
.d2h-file-list > li:last-child {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
.d2h-file-switch {
|
||||||
|
cursor: pointer;
|
||||||
|
display: none;
|
||||||
|
font-size: 10px;
|
||||||
|
}
|
||||||
|
.d2h-icon {
|
||||||
|
fill: currentColor;
|
||||||
|
margin-right: 10px;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
.d2h-deleted {
|
||||||
|
color: var(--git-delete);
|
||||||
|
}
|
||||||
|
.d2h-added {
|
||||||
|
color: var(--git-insert);
|
||||||
|
}
|
||||||
|
.d2h-changed {
|
||||||
|
color: var(--git-change);
|
||||||
|
}
|
||||||
|
.d2h-moved {
|
||||||
|
color: var(--git-move);
|
||||||
|
}
|
||||||
|
.d2h-tag {
|
||||||
|
background-color: var(--background-secondary);
|
||||||
|
display: -webkit-box;
|
||||||
|
display: -ms-flexbox;
|
||||||
|
display: flex;
|
||||||
|
font-size: 10px;
|
||||||
|
margin-left: 5px;
|
||||||
|
padding: 0 2px;
|
||||||
|
}
|
||||||
|
.d2h-deleted-tag {
|
||||||
|
border: 1px solid var(--git-delete);
|
||||||
|
}
|
||||||
|
.d2h-added-tag {
|
||||||
|
border: 1px solid var(--git-insert);
|
||||||
|
}
|
||||||
|
.d2h-changed-tag {
|
||||||
|
border: 1px solid var(--git-change);
|
||||||
|
}
|
||||||
|
.d2h-moved-tag {
|
||||||
|
border: 1px solid var(--git-move);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* needed for line-by-line*/
|
||||||
|
|
||||||
|
.d2h-diff-tbody {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* My additions */
|
||||||
|
.cm-merge-revert {
|
||||||
|
width: 4em;
|
||||||
|
}
|
||||||
|
/* Ensure that merge revert markers are positioned correctly */
|
||||||
|
.cm-merge-revert > * {
|
||||||
|
position: absolute;
|
||||||
|
background-color: var(--background-secondary);
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ====================== Line Authoring Information ====================== */
|
||||||
|
|
||||||
|
.cm-gutterElement.obs-git-blame-gutter {
|
||||||
|
/* Add background color to spacing inbetween and around the gutter for better aesthetics */
|
||||||
|
border-width: 0px 2px 0.2px;
|
||||||
|
border-style: solid;
|
||||||
|
border-color: var(--background-secondary);
|
||||||
|
background-color: var(--background-secondary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cm-gutterElement.obs-git-blame-gutter > div,
|
||||||
|
.line-author-settings-preview {
|
||||||
|
/* delegate text color to settings */
|
||||||
|
color: var(--obs-git-gutter-text);
|
||||||
|
font-family: monospace;
|
||||||
|
height: 100%; /* ensure, that age-based background color occupies entire parent */
|
||||||
|
text-align: right;
|
||||||
|
padding: 0px 6px;
|
||||||
|
white-space: pre; /* Keep spaces and do not collapse them. */
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 800px) {
|
||||||
|
/* hide git blame gutter not to superpose text */
|
||||||
|
.cm-gutterElement.obs-git-blame-gutter {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-unified-diff-view,
|
||||||
|
.git-split-diff-view .cm-deletedLine .cm-changedText {
|
||||||
|
background-color: #ee443330;
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-unified-diff-view,
|
||||||
|
.git-split-diff-view .cm-insertedLine .cm-changedText {
|
||||||
|
background-color: #22bb2230;
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-obscure-prompt[git-is-obscured="true"] #git-show-password:after {
|
||||||
|
-webkit-mask-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svg-icon lucide-eye"><path d="M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0"></path><circle cx="12" cy="12" r="3"></circle></svg>');
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-obscure-prompt[git-is-obscured="false"] #git-show-password:after {
|
||||||
|
-webkit-mask-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svg-icon lucide-eye-off"><path d="M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49"></path><path d="M14.084 14.158a3 3 0 0 1-4.242-4.242"></path><path d="M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143"></path><path d="m2 2 20 20"></path></svg>');
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Override styling of Codemirror merge view "collapsed lines" indicator */
|
||||||
|
.git-split-diff-view .ͼ2 .cm-collapsedLines {
|
||||||
|
background: var(--interactive-normal);
|
||||||
|
border-radius: var(--radius-m);
|
||||||
|
color: var(--text-accent);
|
||||||
|
font-size: var(--font-small);
|
||||||
|
padding: var(--size-4-1) var(--size-4-1);
|
||||||
|
}
|
||||||
|
.git-split-diff-view .ͼ2 .cm-collapsedLines:hover {
|
||||||
|
background: var(--interactive-hover);
|
||||||
|
color: var(--text-accent-hover);
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-signs-gutter {
|
||||||
|
.cm-gutterElement {
|
||||||
|
display: grid;
|
||||||
|
|
||||||
|
/* Needed to align the sign properly for different line heigts. Such as
|
||||||
|
* when having a heading or list item.
|
||||||
|
*/
|
||||||
|
padding-top: 0 !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-gutter-marker:hover {
|
||||||
|
border-radius: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-gutter-marker.git-add {
|
||||||
|
background-color: var(--color-green);
|
||||||
|
justify-self: center;
|
||||||
|
height: inherit;
|
||||||
|
width: 0.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-gutter-marker.git-change {
|
||||||
|
background-color: var(--color-yellow);
|
||||||
|
justify-self: center;
|
||||||
|
height: inherit;
|
||||||
|
width: 0.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-gutter-marker.git-changedelete {
|
||||||
|
color: var(--color-yellow);
|
||||||
|
font-weight: var(--font-bold);
|
||||||
|
font-size: 1rem;
|
||||||
|
justify-self: center;
|
||||||
|
height: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-gutter-marker.git-delete {
|
||||||
|
background-color: var(--color-red);
|
||||||
|
height: 0.2rem;
|
||||||
|
width: 0.8rem;
|
||||||
|
align-self: end;
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-gutter-marker.git-topdelete {
|
||||||
|
background-color: var(--color-red);
|
||||||
|
height: 0.2rem;
|
||||||
|
width: 0.8rem;
|
||||||
|
align-self: start;
|
||||||
|
}
|
||||||
|
|
||||||
|
div:hover > .git-gutter-marker.git-change {
|
||||||
|
width: 0.6rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
div:hover > .git-gutter-marker.git-add {
|
||||||
|
width: 0.6rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
div:hover > .git-gutter-marker.git-delete {
|
||||||
|
height: 0.6rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
div:hover > .git-gutter-marker.git-topdelete {
|
||||||
|
height: 0.6rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
div:hover > .git-gutter-marker.git-changedelete {
|
||||||
|
font-weight: var(--font-bold);
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-gutter-marker.staged {
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Prevent shifting of the editor when git signs gutter is the only gutter present */
|
||||||
|
.cm-gutters.cm-gutters-before:has(> .git-signs-gutter:only-child) {
|
||||||
|
margin-inline-end: 0;
|
||||||
|
.git-signs-gutter {
|
||||||
|
margin-inline-start: -1rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-changes-status-bar-colored {
|
||||||
|
.git-add {
|
||||||
|
color: var(--color-green);
|
||||||
|
}
|
||||||
|
.git-change {
|
||||||
|
color: var(--color-yellow);
|
||||||
|
}
|
||||||
|
.git-delete {
|
||||||
|
color: var(--color-red);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-changes-status-bar .git-add {
|
||||||
|
margin-right: 0.3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-changes-status-bar .git-change {
|
||||||
|
margin-right: 0.3em;
|
||||||
|
}
|
||||||
+492
@@ -0,0 +1,492 @@
|
|||||||
|
{
|
||||||
|
"tasksFolder": "TaskNotes/Tasks",
|
||||||
|
"moveArchivedTasks": false,
|
||||||
|
"archiveFolder": "TaskNotes/Archive",
|
||||||
|
"taskTag": "task",
|
||||||
|
"taskIdentificationMethod": "tag",
|
||||||
|
"hideIdentifyingTagsInCards": false,
|
||||||
|
"hideIdentifyingTagsMode": "all",
|
||||||
|
"taskPropertyName": "",
|
||||||
|
"taskPropertyValue": "",
|
||||||
|
"excludedFolders": "",
|
||||||
|
"defaultTaskPriority": "normal",
|
||||||
|
"defaultTaskStatus": "open",
|
||||||
|
"taskOrgFiltersCollapsed": false,
|
||||||
|
"taskFilenameFormat": "zettel",
|
||||||
|
"storeTitleInFilename": true,
|
||||||
|
"customFilenameTemplate": "{{title}}",
|
||||||
|
"occurrenceFilenameTemplate": "",
|
||||||
|
"occurrenceFilenameTemplateProperty": "occurrenceFilenameTemplate",
|
||||||
|
"taskCreationDefaults": {
|
||||||
|
"defaultContexts": "",
|
||||||
|
"defaultTags": "",
|
||||||
|
"defaultProjects": "",
|
||||||
|
"useParentNoteForTaskCreation": false,
|
||||||
|
"useParentNoteAsProject": false,
|
||||||
|
"useParentHeaderAsProject": false,
|
||||||
|
"inheritParentTaskProperties": false,
|
||||||
|
"defaultTimeEstimate": 0,
|
||||||
|
"defaultRecurrence": "none",
|
||||||
|
"defaultDueDate": "none",
|
||||||
|
"defaultDueTime": "none",
|
||||||
|
"defaultScheduledDate": "today",
|
||||||
|
"defaultScheduledTime": "none",
|
||||||
|
"bodyTemplate": "",
|
||||||
|
"useBodyTemplate": false,
|
||||||
|
"occurrenceBodyTemplate": "",
|
||||||
|
"useOccurrenceBodyTemplate": false,
|
||||||
|
"defaultReminders": []
|
||||||
|
},
|
||||||
|
"openTaskAfterCreation": "none",
|
||||||
|
"calendarViewSettings": {
|
||||||
|
"defaultView": "dayGridMonth",
|
||||||
|
"customDayCount": 3,
|
||||||
|
"slotDuration": "00:30:00",
|
||||||
|
"slotMinTime": "00:00:00",
|
||||||
|
"slotMaxTime": "24:00:00",
|
||||||
|
"scrollTime": "08:00:00",
|
||||||
|
"firstDay": 1,
|
||||||
|
"timeFormat": "24",
|
||||||
|
"showWeekends": true,
|
||||||
|
"locale": "",
|
||||||
|
"defaultShowScheduled": true,
|
||||||
|
"defaultShowDue": true,
|
||||||
|
"defaultShowDueWhenScheduled": true,
|
||||||
|
"defaultShowScheduledToDueSpan": false,
|
||||||
|
"defaultShowTimeEntries": false,
|
||||||
|
"defaultShowRecurring": true,
|
||||||
|
"defaultShowICSEvents": true,
|
||||||
|
"enableTimeblocking": false,
|
||||||
|
"defaultShowTimeblocks": true,
|
||||||
|
"defaultTimeblockColor": "#6366f1",
|
||||||
|
"timeblockAttachmentSearchOrder": "name-asc",
|
||||||
|
"nowIndicator": true,
|
||||||
|
"selectMirror": true,
|
||||||
|
"weekNumbers": false,
|
||||||
|
"showTodayHighlight": true,
|
||||||
|
"eventMinHeight": 15,
|
||||||
|
"slotEventOverlap": true,
|
||||||
|
"eventMaxStack": null,
|
||||||
|
"dayMaxEvents": true,
|
||||||
|
"dayMaxEventRows": false
|
||||||
|
},
|
||||||
|
"pomodoroWorkDuration": 25,
|
||||||
|
"pomodoroShortBreakDuration": 5,
|
||||||
|
"pomodoroLongBreakDuration": 15,
|
||||||
|
"pomodoroLongBreakInterval": 4,
|
||||||
|
"pomodoroAutoStartBreaks": true,
|
||||||
|
"pomodoroAutoStartWork": false,
|
||||||
|
"pomodoroNotifications": true,
|
||||||
|
"pomodoroSoundEnabled": true,
|
||||||
|
"pomodoroSoundVolume": 50,
|
||||||
|
"pomodoroStorageLocation": "plugin",
|
||||||
|
"pomodoroMobileSidebar": "tab",
|
||||||
|
"showPomodoroInStatusBar": true,
|
||||||
|
"enableTaskLinkOverlay": true,
|
||||||
|
"disableOverlayOnAlias": false,
|
||||||
|
"enableInstantTaskConvert": true,
|
||||||
|
"useDefaultsOnInstantConvert": true,
|
||||||
|
"preserveCheckboxOnConvert": false,
|
||||||
|
"taskModalTabMovesFocus": true,
|
||||||
|
"enableNaturalLanguageInput": true,
|
||||||
|
"nlpDefaultToScheduled": true,
|
||||||
|
"nlpLanguage": "en",
|
||||||
|
"uiLanguage": "system",
|
||||||
|
"statusSuggestionTrigger": "*",
|
||||||
|
"nlpTriggers": {
|
||||||
|
"triggers": [
|
||||||
|
{
|
||||||
|
"propertyId": "tags",
|
||||||
|
"trigger": "#",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"propertyId": "contexts",
|
||||||
|
"trigger": "@",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"propertyId": "projects",
|
||||||
|
"trigger": "+",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"propertyId": "status",
|
||||||
|
"trigger": "*",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"propertyId": "priority",
|
||||||
|
"trigger": "!",
|
||||||
|
"enabled": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"singleClickAction": "edit",
|
||||||
|
"doubleClickAction": "openNote",
|
||||||
|
"projectAutosuggest": {
|
||||||
|
"enableFuzzy": false,
|
||||||
|
"rows": [
|
||||||
|
"{title|n(Title)}",
|
||||||
|
"{aliases|n(Aliases)}",
|
||||||
|
"{file.path|n(Path)}"
|
||||||
|
],
|
||||||
|
"showAdvanced": false,
|
||||||
|
"requiredTags": [],
|
||||||
|
"includeFolders": [],
|
||||||
|
"propertyKey": "",
|
||||||
|
"propertyValue": ""
|
||||||
|
},
|
||||||
|
"inlineTaskConvertFolder": "{{currentNotePath}}",
|
||||||
|
"disableNoteIndexing": false,
|
||||||
|
"suggestionDebounceMs": 0,
|
||||||
|
"fieldMapping": {
|
||||||
|
"title": "title",
|
||||||
|
"status": "status",
|
||||||
|
"priority": "priority",
|
||||||
|
"due": "due",
|
||||||
|
"scheduled": "scheduled",
|
||||||
|
"contexts": "contexts",
|
||||||
|
"projects": "projects",
|
||||||
|
"attachments": "attachments",
|
||||||
|
"timeEstimate": "timeEstimate",
|
||||||
|
"completedDate": "completedDate",
|
||||||
|
"dateCreated": "dateCreated",
|
||||||
|
"dateModified": "dateModified",
|
||||||
|
"recurrence": "recurrence",
|
||||||
|
"recurrenceAnchor": "recurrence_anchor",
|
||||||
|
"recurrenceParent": "recurrence_parent",
|
||||||
|
"occurrenceDate": "occurrence_date",
|
||||||
|
"occurrenceMaterialization": "occurrence_materialization",
|
||||||
|
"occurrenceNextTrigger": "occurrence_next_trigger",
|
||||||
|
"occurrenceTemplate": "occurrence_template",
|
||||||
|
"occurrencePastHorizon": "occurrence_past_horizon",
|
||||||
|
"occurrenceFutureHorizon": "occurrence_future_horizon",
|
||||||
|
"archiveTag": "archived",
|
||||||
|
"timeEntries": "timeEntries",
|
||||||
|
"completeInstances": "complete_instances",
|
||||||
|
"skippedInstances": "skipped_instances",
|
||||||
|
"blockedBy": "blockedBy",
|
||||||
|
"pomodoros": "pomodoros",
|
||||||
|
"icsEventId": "icsEventId",
|
||||||
|
"icsEventTag": "ics_event",
|
||||||
|
"googleCalendarEventId": "googleCalendarEventId",
|
||||||
|
"googleCalendarExceptionEventId": "googleCalendarExceptionEventId",
|
||||||
|
"googleCalendarExceptionOriginalScheduled": "googleCalendarExceptionOriginalScheduled",
|
||||||
|
"googleCalendarMovedOriginalDates": "googleCalendarMovedOriginalDates",
|
||||||
|
"reminders": "reminders",
|
||||||
|
"sortOrder": "tasknotes_manual_order"
|
||||||
|
},
|
||||||
|
"customStatuses": [
|
||||||
|
{
|
||||||
|
"id": "none",
|
||||||
|
"value": "none",
|
||||||
|
"label": "None",
|
||||||
|
"color": "#cccccc",
|
||||||
|
"isCompleted": false,
|
||||||
|
"excludeFromCycle": false,
|
||||||
|
"order": 0,
|
||||||
|
"autoArchive": false,
|
||||||
|
"autoArchiveDelay": 5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "open",
|
||||||
|
"value": "open",
|
||||||
|
"label": "Open",
|
||||||
|
"color": "#808080",
|
||||||
|
"isCompleted": false,
|
||||||
|
"excludeFromCycle": false,
|
||||||
|
"order": 1,
|
||||||
|
"autoArchive": false,
|
||||||
|
"autoArchiveDelay": 5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "in-progress",
|
||||||
|
"value": "in-progress",
|
||||||
|
"label": "In progress",
|
||||||
|
"color": "#0066cc",
|
||||||
|
"isCompleted": false,
|
||||||
|
"excludeFromCycle": false,
|
||||||
|
"order": 2,
|
||||||
|
"autoArchive": false,
|
||||||
|
"autoArchiveDelay": 5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "done",
|
||||||
|
"value": "done",
|
||||||
|
"label": "Done",
|
||||||
|
"color": "#00aa00",
|
||||||
|
"isCompleted": true,
|
||||||
|
"excludeFromCycle": false,
|
||||||
|
"order": 3,
|
||||||
|
"autoArchive": false,
|
||||||
|
"autoArchiveDelay": 5
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"customPriorities": [
|
||||||
|
{
|
||||||
|
"id": "none",
|
||||||
|
"value": "none",
|
||||||
|
"label": "None",
|
||||||
|
"color": "#cccccc",
|
||||||
|
"weight": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "low",
|
||||||
|
"value": "low",
|
||||||
|
"label": "Low",
|
||||||
|
"color": "#00aa00",
|
||||||
|
"weight": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "normal",
|
||||||
|
"value": "normal",
|
||||||
|
"label": "Normal",
|
||||||
|
"color": "#ffaa00",
|
||||||
|
"weight": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "high",
|
||||||
|
"value": "high",
|
||||||
|
"label": "High",
|
||||||
|
"color": "#ff0000",
|
||||||
|
"weight": 3
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"recurrenceMigrated": false,
|
||||||
|
"showReleaseNotesOnUpdate": true,
|
||||||
|
"checkForUpdatesOnStartup": true,
|
||||||
|
"starterNoteCreated": true,
|
||||||
|
"showTrackedTasksInStatusBar": false,
|
||||||
|
"autoStopTimeTrackingOnComplete": true,
|
||||||
|
"autoStopTimeTrackingNotification": false,
|
||||||
|
"showRelationships": true,
|
||||||
|
"relationshipsPosition": "bottom",
|
||||||
|
"showTaskCardInNote": true,
|
||||||
|
"showCompletedTaskStrikethrough": true,
|
||||||
|
"completionMenuAsSubmenu": true,
|
||||||
|
"showExpandableSubtasks": true,
|
||||||
|
"expandSubtasksByDefault": false,
|
||||||
|
"subtaskChevronPosition": "right",
|
||||||
|
"viewsButtonAlignment": "right",
|
||||||
|
"hideCompletedFromOverdue": true,
|
||||||
|
"icsIntegration": {
|
||||||
|
"defaultNoteTemplate": "",
|
||||||
|
"defaultNoteFolder": "",
|
||||||
|
"icsNoteFilenameFormat": "title",
|
||||||
|
"customICSNoteFilenameTemplate": "{title}",
|
||||||
|
"enableAutoExport": false,
|
||||||
|
"autoExportPath": "tasknotes-calendar.ics",
|
||||||
|
"autoExportInterval": 60,
|
||||||
|
"useDurationForExport": false,
|
||||||
|
"excludeArchivedFromExport": false,
|
||||||
|
"excludeCompletedFromExport": false,
|
||||||
|
"requireDueDateForExport": false,
|
||||||
|
"requireScheduledDateForExport": false,
|
||||||
|
"useICSEndAsDue": false,
|
||||||
|
"recurringEventRelatedNotesMode": "series"
|
||||||
|
},
|
||||||
|
"savedViews": [],
|
||||||
|
"enableNotifications": true,
|
||||||
|
"notificationType": "system",
|
||||||
|
"notificationSoundEnabled": false,
|
||||||
|
"notificationSoundVolume": 50,
|
||||||
|
"enableAPI": false,
|
||||||
|
"apiPort": 8080,
|
||||||
|
"apiAuthToken": "",
|
||||||
|
"enableMCP": false,
|
||||||
|
"webhooks": [],
|
||||||
|
"userFields": [],
|
||||||
|
"modalFieldsConfig": {
|
||||||
|
"version": 1,
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"id": "title",
|
||||||
|
"fieldType": "core",
|
||||||
|
"group": "basic",
|
||||||
|
"displayName": "Title",
|
||||||
|
"visibleInCreation": true,
|
||||||
|
"visibleInEdit": true,
|
||||||
|
"order": 0,
|
||||||
|
"enabled": true,
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "details",
|
||||||
|
"fieldType": "core",
|
||||||
|
"group": "basic",
|
||||||
|
"displayName": "Details",
|
||||||
|
"visibleInCreation": true,
|
||||||
|
"visibleInEdit": true,
|
||||||
|
"order": 1,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "contexts",
|
||||||
|
"fieldType": "core",
|
||||||
|
"group": "metadata",
|
||||||
|
"displayName": "Contexts",
|
||||||
|
"visibleInCreation": true,
|
||||||
|
"visibleInEdit": true,
|
||||||
|
"order": 0,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tags",
|
||||||
|
"fieldType": "core",
|
||||||
|
"group": "metadata",
|
||||||
|
"displayName": "Tags",
|
||||||
|
"visibleInCreation": true,
|
||||||
|
"visibleInEdit": true,
|
||||||
|
"order": 1,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "time-estimate",
|
||||||
|
"fieldType": "core",
|
||||||
|
"group": "metadata",
|
||||||
|
"displayName": "Time Estimate",
|
||||||
|
"visibleInCreation": true,
|
||||||
|
"visibleInEdit": true,
|
||||||
|
"order": 2,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "projects",
|
||||||
|
"fieldType": "organization",
|
||||||
|
"group": "organization",
|
||||||
|
"displayName": "Projects",
|
||||||
|
"visibleInCreation": true,
|
||||||
|
"visibleInEdit": true,
|
||||||
|
"order": 0,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "subtasks",
|
||||||
|
"fieldType": "organization",
|
||||||
|
"group": "organization",
|
||||||
|
"displayName": "Subtasks",
|
||||||
|
"visibleInCreation": true,
|
||||||
|
"visibleInEdit": true,
|
||||||
|
"order": 1,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "blocked-by",
|
||||||
|
"fieldType": "dependency",
|
||||||
|
"group": "dependencies",
|
||||||
|
"displayName": "Blocked By",
|
||||||
|
"visibleInCreation": true,
|
||||||
|
"visibleInEdit": true,
|
||||||
|
"order": 0,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "blocking",
|
||||||
|
"fieldType": "dependency",
|
||||||
|
"group": "dependencies",
|
||||||
|
"displayName": "Blocking",
|
||||||
|
"visibleInCreation": true,
|
||||||
|
"visibleInEdit": true,
|
||||||
|
"order": 1,
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"groups": [
|
||||||
|
{
|
||||||
|
"id": "basic",
|
||||||
|
"displayName": "Basic Information",
|
||||||
|
"order": 0,
|
||||||
|
"collapsible": false,
|
||||||
|
"defaultCollapsed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "metadata",
|
||||||
|
"displayName": "Metadata",
|
||||||
|
"order": 1,
|
||||||
|
"collapsible": true,
|
||||||
|
"defaultCollapsed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "organization",
|
||||||
|
"displayName": "Organization",
|
||||||
|
"order": 2,
|
||||||
|
"collapsible": true,
|
||||||
|
"defaultCollapsed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "dependencies",
|
||||||
|
"displayName": "Dependencies",
|
||||||
|
"order": 3,
|
||||||
|
"collapsible": true,
|
||||||
|
"defaultCollapsed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "custom",
|
||||||
|
"displayName": "Custom Fields",
|
||||||
|
"order": 4,
|
||||||
|
"collapsible": true,
|
||||||
|
"defaultCollapsed": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"enableModalSplitLayout": true,
|
||||||
|
"defaultVisibleProperties": [
|
||||||
|
"status",
|
||||||
|
"priority",
|
||||||
|
"due",
|
||||||
|
"scheduled",
|
||||||
|
"projects",
|
||||||
|
"contexts",
|
||||||
|
"tags",
|
||||||
|
"blocked",
|
||||||
|
"blocking"
|
||||||
|
],
|
||||||
|
"inlineVisibleProperties": [
|
||||||
|
"status",
|
||||||
|
"priority",
|
||||||
|
"due",
|
||||||
|
"scheduled",
|
||||||
|
"recurrence"
|
||||||
|
],
|
||||||
|
"enableBases": true,
|
||||||
|
"enableMdbaseSpec": false,
|
||||||
|
"autoCreateDefaultBasesFiles": true,
|
||||||
|
"commandFileMapping": {
|
||||||
|
"open-calendar-view": "TaskNotes/Views/mini-calendar-default.base",
|
||||||
|
"open-kanban-view": "TaskNotes/Views/kanban-default.base",
|
||||||
|
"open-tasks-view": "TaskNotes/Views/tasks-default.base",
|
||||||
|
"open-advanced-calendar-view": "TaskNotes/Views/calendar-default.base",
|
||||||
|
"open-agenda-view": "TaskNotes/Views/agenda-default.base",
|
||||||
|
"pomodoro-stats-base": "TaskNotes/Views/pomodoro-stats.base",
|
||||||
|
"relationships": "TaskNotes/Views/relationships.base"
|
||||||
|
},
|
||||||
|
"maintainDueDateOffsetInRecurring": false,
|
||||||
|
"resetCheckboxesOnRecurrence": false,
|
||||||
|
"useFrontmatterMarkdownLinks": false,
|
||||||
|
"enableGoogleCalendar": false,
|
||||||
|
"enableMicrosoftCalendar": false,
|
||||||
|
"disableCalendarOnMobile": false,
|
||||||
|
"enabledGoogleCalendars": [],
|
||||||
|
"googleCalendarSyncTokens": {},
|
||||||
|
"enabledMicrosoftCalendars": [],
|
||||||
|
"microsoftCalendarSyncTokens": {},
|
||||||
|
"googleCalendarExport": {
|
||||||
|
"enabled": false,
|
||||||
|
"targetCalendarId": "",
|
||||||
|
"syncOnTaskCreate": true,
|
||||||
|
"syncOnTaskUpdate": true,
|
||||||
|
"syncOnTaskComplete": true,
|
||||||
|
"syncOnTaskDelete": true,
|
||||||
|
"eventTitleTemplate": "{{title}}",
|
||||||
|
"includeDescription": true,
|
||||||
|
"eventColorId": null,
|
||||||
|
"syncTrigger": "scheduled",
|
||||||
|
"createAsAllDay": true,
|
||||||
|
"defaultEventDuration": 60,
|
||||||
|
"includeObsidianLink": true,
|
||||||
|
"defaultReminderMinutes": null
|
||||||
|
},
|
||||||
|
"enableDebugLogging": false,
|
||||||
|
"lastSeenVersion": "4.13.5"
|
||||||
|
}
|
||||||
Vendored
+3683
File diff suppressed because one or more lines are too long
+10
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"id": "tasknotes",
|
||||||
|
"name": "TaskNotes",
|
||||||
|
"version": "4.13.5",
|
||||||
|
"minAppVersion": "1.12.2",
|
||||||
|
"description": "Note-based task management with calendar, pomodoro and time-tracking integration.",
|
||||||
|
"author": "Callum Alpass",
|
||||||
|
"authorUrl": "https://github.com/callumalpass",
|
||||||
|
"isDesktopOnly": false
|
||||||
|
}
|
||||||
+22524
File diff suppressed because it is too large
Load Diff
Vendored
+219
@@ -0,0 +1,219 @@
|
|||||||
|
{
|
||||||
|
"main": {
|
||||||
|
"id": "3049eab53c62d3da",
|
||||||
|
"type": "split",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "6cfedf15c65a27df",
|
||||||
|
"type": "tabs",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "060120ed5e7b1b64",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "canvas",
|
||||||
|
"state": {
|
||||||
|
"file": "00 About/Overview diagram.canvas",
|
||||||
|
"viewState": {
|
||||||
|
"x": -630,
|
||||||
|
"y": -340,
|
||||||
|
"zoom": -0.5081109222000615
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"icon": "lucide-layout-dashboard",
|
||||||
|
"title": "Overview diagram"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"direction": "vertical"
|
||||||
|
},
|
||||||
|
"left": {
|
||||||
|
"id": "f63050778d3ea754",
|
||||||
|
"type": "split",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "d384721a4f58f541",
|
||||||
|
"type": "tabs",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "9abc999355593ec7",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "file-explorer",
|
||||||
|
"state": {
|
||||||
|
"sortOrder": "alphabetical",
|
||||||
|
"autoReveal": false,
|
||||||
|
"showSearch": false,
|
||||||
|
"searchQuery": ""
|
||||||
|
},
|
||||||
|
"icon": "lucide-folder-closed",
|
||||||
|
"title": "Files"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "ba0b83c0068b2e55",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "search",
|
||||||
|
"state": {
|
||||||
|
"query": "",
|
||||||
|
"matchingCase": false,
|
||||||
|
"explainSearch": false,
|
||||||
|
"collapseAll": false,
|
||||||
|
"extraContext": false,
|
||||||
|
"sortOrder": "alphabetical"
|
||||||
|
},
|
||||||
|
"icon": "lucide-search",
|
||||||
|
"title": "Search"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "8b5f4c5ed4127f49",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "bookmarks",
|
||||||
|
"state": {
|
||||||
|
"showSearch": false,
|
||||||
|
"searchQuery": ""
|
||||||
|
},
|
||||||
|
"icon": "lucide-bookmark",
|
||||||
|
"title": "Bookmarks"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"direction": "horizontal",
|
||||||
|
"width": 300
|
||||||
|
},
|
||||||
|
"right": {
|
||||||
|
"id": "f94acf22c7ca01cf",
|
||||||
|
"type": "split",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "b5f2b855e02a43b1",
|
||||||
|
"type": "tabs",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "1f985f83b3a46d74",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "backlink",
|
||||||
|
"state": {
|
||||||
|
"collapseAll": false,
|
||||||
|
"extraContext": false,
|
||||||
|
"sortOrder": "alphabetical",
|
||||||
|
"showSearch": false,
|
||||||
|
"searchQuery": "",
|
||||||
|
"backlinkCollapsed": false,
|
||||||
|
"unlinkedCollapsed": true
|
||||||
|
},
|
||||||
|
"icon": "links-coming-in",
|
||||||
|
"title": "Backlinks"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "8fe08281bf7c8be0",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "outgoing-link",
|
||||||
|
"state": {
|
||||||
|
"linksCollapsed": false,
|
||||||
|
"unlinkedCollapsed": true
|
||||||
|
},
|
||||||
|
"icon": "links-going-out",
|
||||||
|
"title": "Outgoing links"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "69f5ad35c12cb6ed",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "tag",
|
||||||
|
"state": {
|
||||||
|
"sortOrder": "frequency",
|
||||||
|
"useHierarchy": true,
|
||||||
|
"showSearch": false,
|
||||||
|
"searchQuery": ""
|
||||||
|
},
|
||||||
|
"icon": "lucide-tags",
|
||||||
|
"title": "Tags"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "4af6f2df6a058a49",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "all-properties",
|
||||||
|
"state": {
|
||||||
|
"sortOrder": "frequency",
|
||||||
|
"showSearch": false,
|
||||||
|
"searchQuery": ""
|
||||||
|
},
|
||||||
|
"icon": "lucide-archive",
|
||||||
|
"title": "All properties"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "03319abf755c0835",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "outline",
|
||||||
|
"state": {
|
||||||
|
"followCursor": false,
|
||||||
|
"showSearch": false,
|
||||||
|
"searchQuery": ""
|
||||||
|
},
|
||||||
|
"icon": "lucide-list",
|
||||||
|
"title": "Outline"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "e9d1550d481f46f6",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "git-view",
|
||||||
|
"state": {},
|
||||||
|
"icon": "git-pull-request",
|
||||||
|
"title": "Source Control"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"currentTab": 5
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"direction": "horizontal",
|
||||||
|
"width": 323.5
|
||||||
|
},
|
||||||
|
"left-ribbon": {
|
||||||
|
"hiddenItems": {
|
||||||
|
"switcher:Open quick switcher": true,
|
||||||
|
"canvas:Create new canvas": false,
|
||||||
|
"daily-notes:Open today's daily note": true,
|
||||||
|
"templates:Insert template": false,
|
||||||
|
"command-palette:Open command palette": false,
|
||||||
|
"bases:Create new base": true,
|
||||||
|
"obsidian-git:Open Git source control": false,
|
||||||
|
"tasknotes:Open mini calendar view": true,
|
||||||
|
"tasknotes:Open calendar view": true,
|
||||||
|
"tasknotes:Open tasks view": false,
|
||||||
|
"tasknotes:Open agenda view": true,
|
||||||
|
"tasknotes:Open Kanban board": false,
|
||||||
|
"graph:Open graph view": false,
|
||||||
|
"tasknotes:Open Pomodoro timer": true,
|
||||||
|
"tasknotes:Open Pomodoro statistics": true,
|
||||||
|
"tasknotes:Create new task": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"active": "060120ed5e7b1b64",
|
||||||
|
"lastOpenFiles": [
|
||||||
|
"00 About/Requirements.md",
|
||||||
|
"00 About/Overview diagram.canvas",
|
||||||
|
"TaskNotes/Start Here.md",
|
||||||
|
"Untitled Document",
|
||||||
|
"TaskNotes/Views/kanban-default.base",
|
||||||
|
"TaskNotes/Views/calendar-default.base"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,222 @@
|
|||||||
|
{
|
||||||
|
"nodes":[
|
||||||
|
{"id":"c9a1e0728bdcc861","type":"group","x":-480,"y":-640,"width":660,"height":600,"color":"5","label":"Telefon app"},
|
||||||
|
{"id":"9e98d621e890e3ee","type":"group","x":-1100,"y":-640,"width":580,"height":600,"color":"4","label":"Spletna stran"},
|
||||||
|
{"id":"30bb54e05f861c18","type":"group","x":-1440,"y":-640,"width":300,"height":600,"label":"Server"},
|
||||||
|
{
|
||||||
|
"id":"85bc602d979be455",
|
||||||
|
"type":"text",
|
||||||
|
"text":"Plačilo karte\n",
|
||||||
|
"styleAttributes":{"textAlign":"center"},
|
||||||
|
"x":-1020,
|
||||||
|
"y":-230,
|
||||||
|
"width":180,
|
||||||
|
"height":60
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id":"509a0a9cb4f5363c",
|
||||||
|
"type":"text",
|
||||||
|
"text":"Naročilo karte\n",
|
||||||
|
"styleAttributes":{"textAlign":"center"},
|
||||||
|
"x":-1020,
|
||||||
|
"y":-330,
|
||||||
|
"width":180,
|
||||||
|
"height":60
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id":"4d56478e67b6f080",
|
||||||
|
"type":"text",
|
||||||
|
"text":"Uporabnik",
|
||||||
|
"styleAttributes":{"textAlign":"center"},
|
||||||
|
"x":-1000,
|
||||||
|
"y":-440,
|
||||||
|
"width":140,
|
||||||
|
"height":60
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id":"f29817c022d2a642",
|
||||||
|
"type":"text",
|
||||||
|
"text":"Prijava",
|
||||||
|
"styleAttributes":{"textAlign":"center"},
|
||||||
|
"x":-1000,
|
||||||
|
"y":-600,
|
||||||
|
"width":140,
|
||||||
|
"height":60,
|
||||||
|
"color":"2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id":"749aff8506161b4c",
|
||||||
|
"type":"text",
|
||||||
|
"text":"MAIL\nuser + admin\n\n*odvisno lahko samo user*\n\npa samo app notification\n",
|
||||||
|
"styleAttributes":{"textAlign":"center"},
|
||||||
|
"x":-760,
|
||||||
|
"y":-440,
|
||||||
|
"width":220,
|
||||||
|
"height":270,
|
||||||
|
"color":"6"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id":"02dbc1e4176bfdb2",
|
||||||
|
"type":"text",
|
||||||
|
"text":"Zapis ID na server",
|
||||||
|
"styleAttributes":{"textAlign":"center"},
|
||||||
|
"x":-1400,
|
||||||
|
"y":-230,
|
||||||
|
"width":220,
|
||||||
|
"height":60
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id":"2c487b3e75df4b71",
|
||||||
|
"type":"text",
|
||||||
|
"text":"ID check",
|
||||||
|
"styleAttributes":{"textAlign":"center"},
|
||||||
|
"x":-1400,
|
||||||
|
"y":-140,
|
||||||
|
"width":220,
|
||||||
|
"height":60
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id":"8c0e59f7ddb28ce6",
|
||||||
|
"type":"text",
|
||||||
|
"text":"User/admin check",
|
||||||
|
"styleAttributes":{},
|
||||||
|
"x":-1400,
|
||||||
|
"y":-600,
|
||||||
|
"width":220,
|
||||||
|
"height":60,
|
||||||
|
"color":"2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id":"0648cf705ffedc6f",
|
||||||
|
"type":"text",
|
||||||
|
"text":"Overview board:\n- pregled nad vsemi naročili\n",
|
||||||
|
"styleAttributes":{"textAlign":"center"},
|
||||||
|
"x":-440,
|
||||||
|
"y":-300,
|
||||||
|
"width":260,
|
||||||
|
"height":160
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id":"5e0af7712a4944dd",
|
||||||
|
"type":"text",
|
||||||
|
"text":"Admin",
|
||||||
|
"styleAttributes":{"textAlign":"center"},
|
||||||
|
"x":-220,
|
||||||
|
"y":-440,
|
||||||
|
"width":140,
|
||||||
|
"height":60
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id":"909284a7d8e1f746",
|
||||||
|
"type":"text",
|
||||||
|
"text":"QR code scan\n",
|
||||||
|
"styleAttributes":{"textAlign":"center"},
|
||||||
|
"x":-120,
|
||||||
|
"y":-300,
|
||||||
|
"width":260,
|
||||||
|
"height":100
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id":"9e2bb4fd16870db1",
|
||||||
|
"type":"text",
|
||||||
|
"text":"Prijava",
|
||||||
|
"styleAttributes":{"textAlign":"center"},
|
||||||
|
"x":-220,
|
||||||
|
"y":-600,
|
||||||
|
"width":140,
|
||||||
|
"height":60,
|
||||||
|
"color":"2"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"edges":[
|
||||||
|
{
|
||||||
|
"id":"cbe74b9f09534cb6",
|
||||||
|
"styleAttributes":{"pathfindingMethod":"square"},
|
||||||
|
"toFloating":false,
|
||||||
|
"fromNode":"5e0af7712a4944dd",
|
||||||
|
"fromSide":"bottom",
|
||||||
|
"toNode":"0648cf705ffedc6f",
|
||||||
|
"toSide":"top"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id":"b8c23bdb2b46f116",
|
||||||
|
"styleAttributes":{},
|
||||||
|
"toFloating":false,
|
||||||
|
"fromNode":"4d56478e67b6f080",
|
||||||
|
"fromSide":"bottom",
|
||||||
|
"toNode":"509a0a9cb4f5363c",
|
||||||
|
"toSide":"top"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id":"77e501791d6e08d4",
|
||||||
|
"styleAttributes":{},
|
||||||
|
"toFloating":false,
|
||||||
|
"fromNode":"509a0a9cb4f5363c",
|
||||||
|
"fromSide":"bottom",
|
||||||
|
"toNode":"85bc602d979be455",
|
||||||
|
"toSide":"top"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id":"7b0d68babe5ca410",
|
||||||
|
"styleAttributes":{"pathfindingMethod":"square"},
|
||||||
|
"toFloating":false,
|
||||||
|
"fromNode":"5e0af7712a4944dd",
|
||||||
|
"fromSide":"bottom",
|
||||||
|
"toNode":"909284a7d8e1f746",
|
||||||
|
"toSide":"top"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id":"97578715081ce76a",
|
||||||
|
"styleAttributes":{},
|
||||||
|
"toFloating":false,
|
||||||
|
"fromNode":"85bc602d979be455",
|
||||||
|
"fromSide":"left",
|
||||||
|
"toNode":"02dbc1e4176bfdb2",
|
||||||
|
"toSide":"right"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id":"cbcc8e00990228cc",
|
||||||
|
"styleAttributes":{
|
||||||
|
"pathfindingMethod":"square",
|
||||||
|
"arrow":null
|
||||||
|
},
|
||||||
|
"toFloating":false,
|
||||||
|
"fromNode":"909284a7d8e1f746",
|
||||||
|
"fromSide":"bottom",
|
||||||
|
"toNode":"2c487b3e75df4b71",
|
||||||
|
"toSide":"right",
|
||||||
|
"fromEnd":"arrow"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id":"eaa318243de35bca",
|
||||||
|
"styleAttributes":{"pathfindingMethod":"square"},
|
||||||
|
"toFloating":false,
|
||||||
|
"fromNode":"85bc602d979be455",
|
||||||
|
"fromSide":"right",
|
||||||
|
"toNode":"749aff8506161b4c",
|
||||||
|
"toSide":"left"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id":"cf337fea9669f9bc",
|
||||||
|
"styleAttributes":{},
|
||||||
|
"toFloating":false,
|
||||||
|
"fromNode":"9e2bb4fd16870db1",
|
||||||
|
"fromSide":"bottom",
|
||||||
|
"toNode":"5e0af7712a4944dd",
|
||||||
|
"toSide":"top"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id":"a8cae67a3ac3a8f4",
|
||||||
|
"styleAttributes":{},
|
||||||
|
"toFloating":false,
|
||||||
|
"fromNode":"f29817c022d2a642",
|
||||||
|
"fromSide":"bottom",
|
||||||
|
"toNode":"4d56478e67b6f080",
|
||||||
|
"toSide":"top"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata":{
|
||||||
|
"version":"1.0-1.0",
|
||||||
|
"frontmatter":{}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
### 📱 PERSON A — Web App (Customer-Facing)
|
||||||
|
|
||||||
|
#### Functional Requirements
|
||||||
|
|
||||||
|
- **WEB-FR-1**: User registration (email + password) with email verification
|
||||||
|
- **WEB-FR-2**: Login / logout
|
||||||
|
- **WEB-FR-3**: Password reset flow
|
||||||
|
- **WEB-FR-4**: Display the event's card offering — name, description, price, expiration date
|
||||||
|
- **WEB-FR-5**: Checkout flow via Stripe (EUR)
|
||||||
|
- _Open item: single card per order, or multiple?_
|
||||||
|
- **WEB-FR-6**: On confirmed payment (via Stripe webhook), trigger card/QR generation (calls shared backend)
|
||||||
|
- **WEB-FR-7**: Send confirmation email with QR code attached/embedded (via transactional email service)
|
||||||
|
- **WEB-FR-8**: "My Cards" account page — shows purchase history, card status (unused/used/expired), QR re-download button
|
||||||
|
- **WEB-FR-9**: Basic account settings page (update email/password)
|
||||||
|
|
||||||
|
#### Non-Functional Requirements
|
||||||
|
|
||||||
|
- **WEB-NFR-1**: HTTPS only
|
||||||
|
- **WEB-NFR-2**: GDPR-compliant — privacy policy, consent checkbox at registration, data retention/erasure process
|
||||||
|
- **WEB-NFR-3**: No raw card/payment data stored — Stripe handles PCI compliance, you only store payment references
|
||||||
|
- **WEB-NFR-4**: Responsive design (mobile browser support, since users will pull up emails on phones too, though the QR itself is scanned by the admin's phone, not theirs)
|
||||||
|
|
||||||
|
#### Open Items for This Side
|
||||||
|
|
||||||
|
1. Multi-card orders — yes/no, and if yes, does each card need a separate recipient email field?
|
||||||
|
2. Refund/cancellation flow — in scope for v1 or not?
|
||||||
|
3. Any requirement to resend the QR email if a user loses it (vs. just downloading from account page)?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 📷 PERSON B — Android Scanner App (Admin-Facing)
|
||||||
|
|
||||||
|
#### Functional Requirements
|
||||||
|
|
||||||
|
- **APP-FR-1**: Single admin login (one hardcoded/managed admin role — no multi-account complexity)
|
||||||
|
- **APP-FR-2**: Camera-based QR scanning (use a standard library — e.g., ML Kit or ZXing)
|
||||||
|
- **APP-FR-3**: On scan, send token to backend validation endpoint
|
||||||
|
- **APP-FR-4**: Display result clearly and immediately:
|
||||||
|
- ✅ **Valid** → show card owner name + card type, mark as used
|
||||||
|
- ❌ **Already Used** → show when it was originally used
|
||||||
|
- ❌ **Expired** → show expiration date
|
||||||
|
- ❌ **Not Found** → invalid/forged code
|
||||||
|
- **APP-FR-5**: Local on-device scan log (timestamp + result) for admin's own reference during the event
|
||||||
|
- **APP-FR-6**: Manual entry fallback (in case camera/QR fails to scan — type in code manually)
|
||||||
|
|
||||||
|
#### Non-Functional Requirements
|
||||||
|
|
||||||
|
- **APP-NFR-1**: Requires internet connectivity to validate (confirm: acceptable, or do you need offline fallback?)
|
||||||
|
- **APP-NFR-2**: Fast response time — scan-to-result should feel instant (sub-1s ideally) since there may be a line of people
|
||||||
|
- **APP-NFR-3**: Simple, high-contrast UI readable in bright outdoor daylight or dark event lighting
|
||||||
|
- **APP-NFR-4**: Since it's single-admin/single-device, no need to handle concurrent scan conflicts — backend validation is still atomic, but app itself doesn't need sync logic
|
||||||
|
|
||||||
|
#### Open Items for This Side
|
||||||
|
|
||||||
|
1. **Offline fallback** — if there's no signal at the venue, what happens? Worth deciding now since it affects architecture (native online-only call vs. local cache + sync).
|
||||||
|
2. Does the admin need to _undo_ an accidental valid scan (e.g., mis-scan, wrong card)?
|
||||||
|
3. Any requirement to see a running count (e.g., "142 checked in") during the event?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 🔗 SHARED — Backend Contract (Both of you depend on this)
|
||||||
|
|
||||||
|
This is the glue between your two apps — worth agreeing on before you start building independently, since a mismatch here is the most likely source of integration pain later.
|
||||||
|
|
||||||
|
- **API-1**: `POST /api/orders` — creates order, integrates Stripe checkout
|
||||||
|
- **API-2**: Stripe webhook handler — on payment success, generates Card record + signed QR token, triggers email
|
||||||
|
- **API-3**: `POST /api/cards/validate` — takes scanned token, returns `{status: valid|used|expired|not_found, owner_name, card_type, used_at?}`, atomically updates status if valid
|
||||||
|
- **API-4**: `GET /api/users/me/cards` — for the web app's "My Cards" page
|
||||||
|
- **API-5**: Shared **Card** data model: `id, unique_token (signed), user_id, card_type, status, purchased_at, expires_at, used_at`
|
||||||
|
- **API-6**: Auth — separate token/role for admin scanner vs. customer web sessions
|
||||||
|
|
||||||
|
**Recommendation:** whoever owns the backend (or whoever's building it jointly) should nail down the exact JSON shape of `API-3`'s response first, since that's the contract Person B's UI directly renders.
|
||||||
@@ -0,0 +1,115 @@
|
|||||||
|
# Start Here with TaskNotes
|
||||||
|
|
||||||
|
This note is a small tour of TaskNotes inside your own vault. Work through it in place, then keep it as a reference or delete it when you no longer need it.
|
||||||
|
|
||||||
|
TaskNotes works best when three things feel connected:
|
||||||
|
|
||||||
|
1. Capture a task quickly.
|
||||||
|
2. Store the task as a normal Markdown note.
|
||||||
|
3. Review tasks through Bases views.
|
||||||
|
|
||||||
|
## Before you start
|
||||||
|
|
||||||
|
- [ ] Enable the Obsidian **Bases** core plugin.
|
||||||
|
- [ ] Confirm TaskNotes has created the default `.base` files in `TaskNotes/Views/`.
|
||||||
|
- [ ] Open the command palette and run **TaskNotes: Open tasks view**.
|
||||||
|
|
||||||
|
TaskNotes creates missing default `.base` files automatically on startup when **Auto-create default files** is enabled. If the files are missing, use **Settings -> TaskNotes -> General -> Views & base files -> Create files**.
|
||||||
|
|
||||||
|
## 1. Create a task from the command palette
|
||||||
|
|
||||||
|
Run **TaskNotes: Create new task** and create a real task you intend to do soon.
|
||||||
|
|
||||||
|
Try a title like:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Review my TaskNotes setup tomorrow #admin
|
||||||
|
```
|
||||||
|
|
||||||
|
After saving, TaskNotes creates a Markdown note for that task. Open the task note and look at the YAML properties at the top. Those properties are what Bases reads for filtering, sorting, grouping, and calendar placement.
|
||||||
|
|
||||||
|
## 2. Convert inline tasks into TaskNotes
|
||||||
|
|
||||||
|
The checkboxes below are ordinary Markdown tasks. Convert each one into a TaskNote from the line's inline action or the command palette.
|
||||||
|
|
||||||
|
- [ ] Create a TaskNotes inbox task due tomorrow #admin
|
||||||
|
- [ ] Schedule a 20 minute planning task for next Monday #planning
|
||||||
|
- [ ] Make a task linked to an active project note
|
||||||
|
|
||||||
|
After conversion, notice a few things:
|
||||||
|
|
||||||
|
- The source line can stay in this note as context.
|
||||||
|
- The actual task now lives as its own Markdown note, so it can appear in TaskNotes views.
|
||||||
|
- The converted line links to the TaskNote. Right-click that TaskNote link to open the task menu, then try changing a property such as status, priority, due date, scheduled date, or project.
|
||||||
|
|
||||||
|
## 3. Review your tasks
|
||||||
|
|
||||||
|
The embedded views below use the default TaskNotes Bases files.
|
||||||
|
|
||||||
|
### Task list
|
||||||
|
|
||||||
|
![[TaskNotes/Views/tasks-default.base]]
|
||||||
|
|
||||||
|
Use this when you want a straightforward list of everything open.
|
||||||
|
|
||||||
|
### Agenda
|
||||||
|
|
||||||
|
![[TaskNotes/Views/agenda-default.base]]
|
||||||
|
|
||||||
|
Use this when you care about due dates, scheduled dates, and what needs attention soon.
|
||||||
|
|
||||||
|
### Mini calendar
|
||||||
|
|
||||||
|
![[TaskNotes/Views/mini-calendar-default.base]]
|
||||||
|
|
||||||
|
Use this when you want a compact calendar alongside your notes.
|
||||||
|
|
||||||
|
### Calendar
|
||||||
|
|
||||||
|
![[TaskNotes/Views/calendar-default.base]]
|
||||||
|
|
||||||
|
Use this when you want a larger calendar for scheduled work, due dates, timeblocks, and calendar events.
|
||||||
|
|
||||||
|
### Kanban
|
||||||
|
|
||||||
|
![[TaskNotes/Views/kanban-default.base]]
|
||||||
|
|
||||||
|
Use this when you want to move work through statuses like open, in progress, and done.
|
||||||
|
|
||||||
|
## 4. Adjust only what gets in your way
|
||||||
|
|
||||||
|
The defaults are enough to start. Visit settings later when you know what you want to change:
|
||||||
|
|
||||||
|
- If task files are going to the wrong place, check **Settings -> TaskNotes -> General**.
|
||||||
|
- If converted inline tasks should be created somewhere else, check **Settings -> TaskNotes -> Inline Task Settings**.
|
||||||
|
- If the task modal shows too much or too little, check **Settings -> TaskNotes -> Modal Fields**.
|
||||||
|
- If your vault uses different property names, statuses, priorities, or custom fields, check **Settings -> TaskNotes -> Task Properties**.
|
||||||
|
|
||||||
|
## 5. Make it yours
|
||||||
|
|
||||||
|
Try adding one custom property to a task, such as `energy`, `client`, or `area`. Because tasks are Markdown notes, custom properties can be used in Bases without locking you into a separate task database.
|
||||||
|
|
||||||
|
## 6. Contextual views
|
||||||
|
|
||||||
|
You can embed Bases views inside daily notes, project notes, meeting notes, or task notes. Advanced Bases filters can use the current note as context, so one view can show tasks related to whatever note it is embedded in.
|
||||||
|
|
||||||
|
TaskNotes uses this pattern for the Relationships widget in task notes. When you are ready to customize views, see the TaskNotes documentation for examples.
|
||||||
|
|
||||||
|
Useful next experiments:
|
||||||
|
|
||||||
|
- Duplicate `TaskNotes/Views/tasks-default.base` and make a view for one project.
|
||||||
|
- Add a group to a Base view, such as status or priority.
|
||||||
|
- Add a filter for tasks due this week.
|
||||||
|
- Link a task to a project note and use backlinks to see where it is mentioned.
|
||||||
|
|
||||||
|
## More help and extensions
|
||||||
|
|
||||||
|
- Documentation: [tasknotes.dev](https://tasknotes.dev/)
|
||||||
|
- Problems or bugs: [open an issue on GitHub](https://github.com/callumalpass/tasknotes/issues)
|
||||||
|
- Companion plugins:
|
||||||
|
- [Canvas Bases](https://tasknotes.dev/companion-plugins/canvas-bases/) adds canvas-style boards and JSON Canvas snapshots for Bases views, with optional TaskNotes badges, actions, and relationship edges.
|
||||||
|
- [TaskNotes Workflows](https://tasknotes.dev/companion-plugins/tasknotes-workflows/) adds Markdown-defined automation for TaskNotes events, schedules, manual commands, and task actions.
|
||||||
|
|
||||||
|
## Finished
|
||||||
|
|
||||||
|
Now you know the core idea: tasks are notes, properties make them queryable, and Bases turns them into views.
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
status: open
|
||||||
|
priority: normal
|
||||||
|
scheduled: 2026-09-25
|
||||||
|
dateCreated: 2026-09-25T16:58:43.574+02:00
|
||||||
|
dateModified: 2026-09-25T16:58:59.205+02:00
|
||||||
|
tags:
|
||||||
|
- task
|
||||||
|
---
|
||||||
|
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
filters:
|
||||||
|
and:
|
||||||
|
- file.hasTag("task")
|
||||||
|
formulas:
|
||||||
|
priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
|
||||||
|
daysUntilDue: if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)
|
||||||
|
dueIn: if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))
|
||||||
|
daysUntilScheduled: if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
|
||||||
|
daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
|
||||||
|
daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
|
||||||
|
isOverdue: (due.isEmpty() == false) && date(due) < today() && status != "done"
|
||||||
|
isDueToday: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||||
|
isDueThisWeek: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
|
||||||
|
isScheduledToday: (scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||||
|
isRecurring: recurrence && !recurrence.isEmpty()
|
||||||
|
hasTimeEstimate: timeEstimate && timeEstimate > 0
|
||||||
|
timeRemaining: if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
|
||||||
|
efficiencyRatio: if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)
|
||||||
|
timeTrackedThisWeek: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||||
|
timeTrackedToday: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||||
|
dueMonth: if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")
|
||||||
|
dueWeek: if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")
|
||||||
|
scheduledMonth: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")
|
||||||
|
scheduledWeek: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")
|
||||||
|
dueDateCategory: if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))
|
||||||
|
timeEstimateCategory: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))
|
||||||
|
ageCategory: if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))
|
||||||
|
createdMonth: file.ctime.format("YYYY-MM")
|
||||||
|
modifiedMonth: file.mtime.format("YYYY-MM")
|
||||||
|
priorityCategory: if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))
|
||||||
|
projectCount: if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))
|
||||||
|
contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))
|
||||||
|
trackingStatus: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
|
||||||
|
nextDate: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))
|
||||||
|
daysUntilNext: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))
|
||||||
|
hasDate: (due.isEmpty() == false) || (scheduled.isEmpty() == false)
|
||||||
|
isToday: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))
|
||||||
|
isThisWeek: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))
|
||||||
|
nextDateCategory: if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))
|
||||||
|
nextDateMonth: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))
|
||||||
|
nextDateWeek: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))
|
||||||
|
urgencyScore: if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))
|
||||||
|
timeTrackedFormatted: if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")
|
||||||
|
dueDateDisplay: if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))
|
||||||
|
properties:
|
||||||
|
formula.dueIn:
|
||||||
|
displayName: Due in
|
||||||
|
views:
|
||||||
|
- type: tasknotesCalendar
|
||||||
|
name: Agenda
|
||||||
|
order:
|
||||||
|
- status
|
||||||
|
- priority
|
||||||
|
- due
|
||||||
|
- formula.dueIn
|
||||||
|
- scheduled
|
||||||
|
- projects
|
||||||
|
- contexts
|
||||||
|
- file.tags
|
||||||
|
- blockedBy
|
||||||
|
- file.name
|
||||||
|
- recurrence
|
||||||
|
- complete_instances
|
||||||
|
- file.tasks
|
||||||
|
options:
|
||||||
|
showPropertyBasedEvents: false
|
||||||
|
showOverdueOnToday: true
|
||||||
|
createDailyNotesFromDateLinks: true
|
||||||
|
calendarView: listWeek
|
||||||
|
startDateProperty: file.ctime
|
||||||
|
listDayCount: 7
|
||||||
|
titleProperty: file.basename
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
filters:
|
||||||
|
and:
|
||||||
|
- file.hasTag("task")
|
||||||
|
formulas:
|
||||||
|
priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
|
||||||
|
daysUntilDue: if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)
|
||||||
|
dueIn: if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))
|
||||||
|
daysUntilScheduled: if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
|
||||||
|
daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
|
||||||
|
daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
|
||||||
|
isOverdue: (due.isEmpty() == false) && date(due) < today() && status != "done"
|
||||||
|
isDueToday: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||||
|
isDueThisWeek: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
|
||||||
|
isScheduledToday: (scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||||
|
isRecurring: recurrence && !recurrence.isEmpty()
|
||||||
|
hasTimeEstimate: timeEstimate && timeEstimate > 0
|
||||||
|
timeRemaining: if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
|
||||||
|
efficiencyRatio: if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)
|
||||||
|
timeTrackedThisWeek: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||||
|
timeTrackedToday: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||||
|
dueMonth: if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")
|
||||||
|
dueWeek: if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")
|
||||||
|
scheduledMonth: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")
|
||||||
|
scheduledWeek: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")
|
||||||
|
dueDateCategory: if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))
|
||||||
|
timeEstimateCategory: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))
|
||||||
|
ageCategory: if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))
|
||||||
|
createdMonth: file.ctime.format("YYYY-MM")
|
||||||
|
modifiedMonth: file.mtime.format("YYYY-MM")
|
||||||
|
priorityCategory: if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))
|
||||||
|
projectCount: if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))
|
||||||
|
contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))
|
||||||
|
trackingStatus: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
|
||||||
|
nextDate: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))
|
||||||
|
daysUntilNext: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))
|
||||||
|
hasDate: (due.isEmpty() == false) || (scheduled.isEmpty() == false)
|
||||||
|
isToday: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))
|
||||||
|
isThisWeek: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))
|
||||||
|
nextDateCategory: if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))
|
||||||
|
nextDateMonth: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))
|
||||||
|
nextDateWeek: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))
|
||||||
|
urgencyScore: if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))
|
||||||
|
timeTrackedFormatted: if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")
|
||||||
|
dueDateDisplay: if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))
|
||||||
|
views:
|
||||||
|
- type: tasknotesCalendar
|
||||||
|
name: Calendar
|
||||||
|
order:
|
||||||
|
- status
|
||||||
|
- priority
|
||||||
|
- due
|
||||||
|
- scheduled
|
||||||
|
- projects
|
||||||
|
- contexts
|
||||||
|
- file.tags
|
||||||
|
- blockedBy
|
||||||
|
- file.name
|
||||||
|
- recurrence
|
||||||
|
- complete_instances
|
||||||
|
- file.tasks
|
||||||
|
options:
|
||||||
|
showScheduled: true
|
||||||
|
showDue: true
|
||||||
|
showRecurring: true
|
||||||
|
showTimeEntries: true
|
||||||
|
showTimeblocks: true
|
||||||
|
showPropertyBasedEvents: true
|
||||||
|
createDailyNotesFromDateLinks: true
|
||||||
|
calendarView: timeGridWeek
|
||||||
|
customDayCount: 3
|
||||||
|
firstDay: 1
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
filters:
|
||||||
|
and:
|
||||||
|
- file.hasTag("task")
|
||||||
|
formulas:
|
||||||
|
priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
|
||||||
|
daysUntilDue: if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)
|
||||||
|
dueIn: if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))
|
||||||
|
daysUntilScheduled: if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
|
||||||
|
daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
|
||||||
|
daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
|
||||||
|
isOverdue: (due.isEmpty() == false) && date(due) < today() && status != "done"
|
||||||
|
isDueToday: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||||
|
isDueThisWeek: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
|
||||||
|
isScheduledToday: (scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||||
|
isRecurring: recurrence && !recurrence.isEmpty()
|
||||||
|
hasTimeEstimate: timeEstimate && timeEstimate > 0
|
||||||
|
timeRemaining: if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
|
||||||
|
efficiencyRatio: if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)
|
||||||
|
timeTrackedThisWeek: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||||
|
timeTrackedToday: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||||
|
dueMonth: if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")
|
||||||
|
dueWeek: if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")
|
||||||
|
scheduledMonth: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")
|
||||||
|
scheduledWeek: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")
|
||||||
|
dueDateCategory: if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))
|
||||||
|
timeEstimateCategory: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))
|
||||||
|
ageCategory: if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))
|
||||||
|
createdMonth: file.ctime.format("YYYY-MM")
|
||||||
|
modifiedMonth: file.mtime.format("YYYY-MM")
|
||||||
|
priorityCategory: if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))
|
||||||
|
projectCount: if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))
|
||||||
|
contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))
|
||||||
|
trackingStatus: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
|
||||||
|
nextDate: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))
|
||||||
|
daysUntilNext: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))
|
||||||
|
hasDate: (due.isEmpty() == false) || (scheduled.isEmpty() == false)
|
||||||
|
isToday: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))
|
||||||
|
isThisWeek: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))
|
||||||
|
nextDateCategory: if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))
|
||||||
|
nextDateMonth: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))
|
||||||
|
nextDateWeek: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))
|
||||||
|
urgencyScore: if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))
|
||||||
|
timeTrackedFormatted: if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")
|
||||||
|
dueDateDisplay: if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))
|
||||||
|
views:
|
||||||
|
- type: tasknotesKanban
|
||||||
|
name: Kanban Board
|
||||||
|
groupBy:
|
||||||
|
property: status
|
||||||
|
direction: ASC
|
||||||
|
order:
|
||||||
|
- status
|
||||||
|
- priority
|
||||||
|
- due
|
||||||
|
- scheduled
|
||||||
|
- projects
|
||||||
|
- contexts
|
||||||
|
- file.tags
|
||||||
|
- blockedBy
|
||||||
|
- file.name
|
||||||
|
- recurrence
|
||||||
|
- complete_instances
|
||||||
|
- file.tasks
|
||||||
|
sort:
|
||||||
|
- property: tasknotes_manual_order
|
||||||
|
direction: DESC
|
||||||
|
config:
|
||||||
|
columnWidth: 280
|
||||||
|
hideEmptyColumns: false
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
filters:
|
||||||
|
and:
|
||||||
|
- file.hasTag("task")
|
||||||
|
formulas:
|
||||||
|
priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
|
||||||
|
daysUntilDue: if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)
|
||||||
|
dueIn: if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))
|
||||||
|
daysUntilScheduled: if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
|
||||||
|
daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
|
||||||
|
daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
|
||||||
|
isOverdue: (due.isEmpty() == false) && date(due) < today() && status != "done"
|
||||||
|
isDueToday: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||||
|
isDueThisWeek: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
|
||||||
|
isScheduledToday: (scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||||
|
isRecurring: recurrence && !recurrence.isEmpty()
|
||||||
|
hasTimeEstimate: timeEstimate && timeEstimate > 0
|
||||||
|
timeRemaining: if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
|
||||||
|
efficiencyRatio: if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)
|
||||||
|
timeTrackedThisWeek: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||||
|
timeTrackedToday: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||||
|
dueMonth: if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")
|
||||||
|
dueWeek: if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")
|
||||||
|
scheduledMonth: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")
|
||||||
|
scheduledWeek: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")
|
||||||
|
dueDateCategory: if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))
|
||||||
|
timeEstimateCategory: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))
|
||||||
|
ageCategory: if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))
|
||||||
|
createdMonth: file.ctime.format("YYYY-MM")
|
||||||
|
modifiedMonth: file.mtime.format("YYYY-MM")
|
||||||
|
priorityCategory: if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))
|
||||||
|
projectCount: if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))
|
||||||
|
contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))
|
||||||
|
trackingStatus: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
|
||||||
|
nextDate: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))
|
||||||
|
daysUntilNext: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))
|
||||||
|
hasDate: (due.isEmpty() == false) || (scheduled.isEmpty() == false)
|
||||||
|
isToday: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))
|
||||||
|
isThisWeek: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))
|
||||||
|
nextDateCategory: if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))
|
||||||
|
nextDateMonth: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))
|
||||||
|
nextDateWeek: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))
|
||||||
|
urgencyScore: if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))
|
||||||
|
timeTrackedFormatted: if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")
|
||||||
|
dueDateDisplay: if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))
|
||||||
|
views:
|
||||||
|
- type: tasknotesMiniCalendar
|
||||||
|
name: Due
|
||||||
|
order:
|
||||||
|
- status
|
||||||
|
- priority
|
||||||
|
- due
|
||||||
|
- scheduled
|
||||||
|
- projects
|
||||||
|
- contexts
|
||||||
|
- file.tags
|
||||||
|
- blockedBy
|
||||||
|
- file.name
|
||||||
|
- recurrence
|
||||||
|
- complete_instances
|
||||||
|
- file.tasks
|
||||||
|
sort:
|
||||||
|
- property: due
|
||||||
|
direction: ASC
|
||||||
|
dateProperty: due
|
||||||
|
- type: tasknotesMiniCalendar
|
||||||
|
name: Scheduled
|
||||||
|
order: []
|
||||||
|
dateProperty: scheduled
|
||||||
|
- type: tasknotesMiniCalendar
|
||||||
|
name: Created
|
||||||
|
dateProperty: file.ctime
|
||||||
|
- type: tasknotesMiniCalendar
|
||||||
|
name: Modified
|
||||||
|
dateProperty: file.mtime
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
filters:
|
||||||
|
and:
|
||||||
|
- file.hasProperty("pomodoros")
|
||||||
|
- list(note["pomodoros"]).filter(value.startTime).isEmpty() == false
|
||||||
|
formulas:
|
||||||
|
pomodoroDate: if(note["pomodoros"], list(note["pomodoros"]).filter(value.startTime).map(date(value.startTime).format("YYYY-MM-DD")).unique().join(", "), file.basename)
|
||||||
|
pomodoroMonth: if(note["pomodoros"], list(note["pomodoros"]).filter(value.startTime).map(date(value.startTime).format("YYYY-MM")).unique().join(", "), "")
|
||||||
|
completedPomos: if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "work" && value.completed == true).length, 0)
|
||||||
|
attemptedPomos: if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "work").length, 0)
|
||||||
|
interruptedPomos: if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "work" && value.completed == false).length, 0)
|
||||||
|
focusMinutes: if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "work" && value.completed == true).map(if(value.plannedDuration && value.plannedDuration > 0, value.plannedDuration, if(value.startTime && value.endTime, ((number(date(value.endTime)) - number(date(value.startTime))) / 60000).round(), 0))).reduce(acc + value, 0).round(), 0)
|
||||||
|
focusTime: if(formula.focusMinutes >= 60, (formula.focusMinutes / 60).floor() + "h " + (formula.focusMinutes % 60).round() + "m", formula.focusMinutes + "m")
|
||||||
|
completionRate: if(formula.attemptedPomos > 0, (formula.completedPomos / formula.attemptedPomos * 100).round() + "%", "0%")
|
||||||
|
shortBreaks: if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "short-break").length, 0)
|
||||||
|
longBreaks: if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "long-break").length, 0)
|
||||||
|
properties:
|
||||||
|
formula.pomodoroDate:
|
||||||
|
displayName: Date
|
||||||
|
formula.pomodoroMonth:
|
||||||
|
displayName: Month
|
||||||
|
formula.completedPomos:
|
||||||
|
displayName: Completed
|
||||||
|
formula.attemptedPomos:
|
||||||
|
displayName: Attempted
|
||||||
|
formula.interruptedPomos:
|
||||||
|
displayName: Interrupted
|
||||||
|
formula.focusMinutes:
|
||||||
|
displayName: Focus minutes
|
||||||
|
formula.focusTime:
|
||||||
|
displayName: Focus time
|
||||||
|
formula.completionRate:
|
||||||
|
displayName: Completion
|
||||||
|
formula.shortBreaks:
|
||||||
|
displayName: Short breaks
|
||||||
|
formula.longBreaks:
|
||||||
|
displayName: Long breaks
|
||||||
|
views:
|
||||||
|
- type: table
|
||||||
|
name: Daily
|
||||||
|
order:
|
||||||
|
- formula.pomodoroDate
|
||||||
|
- formula.completedPomos
|
||||||
|
- formula.focusTime
|
||||||
|
- formula.attemptedPomos
|
||||||
|
- formula.completionRate
|
||||||
|
- formula.interruptedPomos
|
||||||
|
- formula.shortBreaks
|
||||||
|
- formula.longBreaks
|
||||||
|
- file.name
|
||||||
|
sort:
|
||||||
|
- property: formula.pomodoroDate
|
||||||
|
direction: DESC
|
||||||
|
- type: table
|
||||||
|
name: Monthly
|
||||||
|
groupBy:
|
||||||
|
property: formula.pomodoroMonth
|
||||||
|
direction: DESC
|
||||||
|
order:
|
||||||
|
- formula.pomodoroDate
|
||||||
|
- formula.completedPomos
|
||||||
|
- formula.focusMinutes
|
||||||
|
- formula.focusTime
|
||||||
|
- formula.attemptedPomos
|
||||||
|
- formula.completionRate
|
||||||
|
- formula.interruptedPomos
|
||||||
|
- formula.shortBreaks
|
||||||
|
- formula.longBreaks
|
||||||
|
- file.name
|
||||||
|
sort:
|
||||||
|
- property: formula.pomodoroDate
|
||||||
|
direction: DESC
|
||||||
|
summaries:
|
||||||
|
formula.completedPomos: Sum
|
||||||
|
formula.focusMinutes: Sum
|
||||||
|
formula.attemptedPomos: Sum
|
||||||
|
formula.interruptedPomos: Sum
|
||||||
|
formula.shortBreaks: Sum
|
||||||
|
formula.longBreaks: Sum
|
||||||
@@ -0,0 +1,155 @@
|
|||||||
|
formulas:
|
||||||
|
priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
|
||||||
|
daysUntilDue: if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)
|
||||||
|
dueIn: if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))
|
||||||
|
daysUntilScheduled: if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
|
||||||
|
daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
|
||||||
|
daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
|
||||||
|
isOverdue: (due.isEmpty() == false) && date(due) < today() && status != "done"
|
||||||
|
isDueToday: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||||
|
isDueThisWeek: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
|
||||||
|
isScheduledToday: (scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||||
|
isRecurring: recurrence && !recurrence.isEmpty()
|
||||||
|
hasTimeEstimate: timeEstimate && timeEstimate > 0
|
||||||
|
timeRemaining: if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
|
||||||
|
efficiencyRatio: if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)
|
||||||
|
timeTrackedThisWeek: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||||
|
timeTrackedToday: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||||
|
dueMonth: if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")
|
||||||
|
dueWeek: if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")
|
||||||
|
scheduledMonth: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")
|
||||||
|
scheduledWeek: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")
|
||||||
|
dueDateCategory: if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))
|
||||||
|
timeEstimateCategory: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))
|
||||||
|
ageCategory: if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))
|
||||||
|
createdMonth: file.ctime.format("YYYY-MM")
|
||||||
|
modifiedMonth: file.mtime.format("YYYY-MM")
|
||||||
|
priorityCategory: if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))
|
||||||
|
projectCount: if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))
|
||||||
|
contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))
|
||||||
|
trackingStatus: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
|
||||||
|
nextDate: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))
|
||||||
|
daysUntilNext: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))
|
||||||
|
hasDate: (due.isEmpty() == false) || (scheduled.isEmpty() == false)
|
||||||
|
isToday: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))
|
||||||
|
isThisWeek: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))
|
||||||
|
nextDateCategory: if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))
|
||||||
|
nextDateMonth: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))
|
||||||
|
nextDateWeek: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))
|
||||||
|
urgencyScore: if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))
|
||||||
|
timeTrackedFormatted: if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")
|
||||||
|
dueDateDisplay: if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))
|
||||||
|
views:
|
||||||
|
- type: tasknotesKanban
|
||||||
|
name: Subtasks
|
||||||
|
filters:
|
||||||
|
and:
|
||||||
|
- file.hasTag("task")
|
||||||
|
- file.hasLink(this.file) && list(note.projects).map(file(value.replace(/^\[[^\]]+\]\((.*)\)$/, "$1").replace(/%20/g, " ")).asLink()).contains(this.file.asLink())
|
||||||
|
groupBy:
|
||||||
|
property: status
|
||||||
|
direction: ASC
|
||||||
|
order:
|
||||||
|
- status
|
||||||
|
- priority
|
||||||
|
- due
|
||||||
|
- scheduled
|
||||||
|
- projects
|
||||||
|
- contexts
|
||||||
|
- file.tags
|
||||||
|
- blockedBy
|
||||||
|
- file.name
|
||||||
|
- recurrence
|
||||||
|
- complete_instances
|
||||||
|
- file.tasks
|
||||||
|
sort:
|
||||||
|
- property: tasknotes_manual_order
|
||||||
|
direction: DESC
|
||||||
|
- type: tasknotesTaskList
|
||||||
|
name: Occurrences
|
||||||
|
filters:
|
||||||
|
and:
|
||||||
|
- file.hasTag("task")
|
||||||
|
- file.hasLink(this.file) && note.recurrence_parent && file(note.recurrence_parent.replace(/^\[[^\]]+\]\((.*)\)$/, "$1").replace(/%20/g, " ")).asLink() == this.file.asLink()
|
||||||
|
order:
|
||||||
|
- status
|
||||||
|
- priority
|
||||||
|
- due
|
||||||
|
- scheduled
|
||||||
|
- occurrence_date
|
||||||
|
- projects
|
||||||
|
- contexts
|
||||||
|
- file.tags
|
||||||
|
- blockedBy
|
||||||
|
- file.name
|
||||||
|
- recurrence
|
||||||
|
- complete_instances
|
||||||
|
- file.tasks
|
||||||
|
sort:
|
||||||
|
- property: occurrence_date
|
||||||
|
direction: ASC
|
||||||
|
- type: tasknotesTaskList
|
||||||
|
name: Projects
|
||||||
|
filters:
|
||||||
|
and:
|
||||||
|
- list(this.projects).map(file(value.replace(/^\[[^\]]+\]\((.*)\)$/, "$1").replace(/%20/g, " ")).asLink()).contains(file.asLink())
|
||||||
|
order:
|
||||||
|
- status
|
||||||
|
- priority
|
||||||
|
- due
|
||||||
|
- scheduled
|
||||||
|
- projects
|
||||||
|
- contexts
|
||||||
|
- file.tags
|
||||||
|
- blockedBy
|
||||||
|
- file.name
|
||||||
|
- recurrence
|
||||||
|
- complete_instances
|
||||||
|
- file.tasks
|
||||||
|
- type: tasknotesTaskList
|
||||||
|
name: Blocked By
|
||||||
|
filters:
|
||||||
|
and:
|
||||||
|
- file.hasTag("task")
|
||||||
|
- list(this.note.blockedBy).map(file(if(value.isType("object"), value.uid, value)).asLink()).contains(file.asLink())
|
||||||
|
order:
|
||||||
|
- status
|
||||||
|
- priority
|
||||||
|
- due
|
||||||
|
- scheduled
|
||||||
|
- projects
|
||||||
|
- contexts
|
||||||
|
- file.tags
|
||||||
|
- blockedBy
|
||||||
|
- file.name
|
||||||
|
- recurrence
|
||||||
|
- complete_instances
|
||||||
|
- file.tasks
|
||||||
|
sort:
|
||||||
|
- property: tasknotes_manual_order
|
||||||
|
direction: DESC
|
||||||
|
- type: tasknotesKanban
|
||||||
|
name: Blocking
|
||||||
|
filters:
|
||||||
|
and:
|
||||||
|
- file.hasTag("task")
|
||||||
|
- list(note.blockedBy).map(file(if(value.isType("object"), value.uid, value)).asLink()).contains(this.file.asLink())
|
||||||
|
groupBy:
|
||||||
|
property: status
|
||||||
|
direction: ASC
|
||||||
|
order:
|
||||||
|
- status
|
||||||
|
- priority
|
||||||
|
- due
|
||||||
|
- scheduled
|
||||||
|
- projects
|
||||||
|
- contexts
|
||||||
|
- file.tags
|
||||||
|
- blockedBy
|
||||||
|
- file.name
|
||||||
|
- recurrence
|
||||||
|
- complete_instances
|
||||||
|
- file.tasks
|
||||||
|
sort:
|
||||||
|
- property: tasknotes_manual_order
|
||||||
|
direction: DESC
|
||||||
@@ -0,0 +1,247 @@
|
|||||||
|
filters:
|
||||||
|
and:
|
||||||
|
- file.hasTag("task")
|
||||||
|
formulas:
|
||||||
|
priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
|
||||||
|
daysUntilDue: if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)
|
||||||
|
dueIn: if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))
|
||||||
|
daysUntilScheduled: if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
|
||||||
|
daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
|
||||||
|
daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
|
||||||
|
isOverdue: (due.isEmpty() == false) && date(due) < today() && status != "done"
|
||||||
|
isDueToday: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||||
|
isDueThisWeek: (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
|
||||||
|
isScheduledToday: (scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||||
|
isRecurring: recurrence && !recurrence.isEmpty()
|
||||||
|
hasTimeEstimate: timeEstimate && timeEstimate > 0
|
||||||
|
timeRemaining: if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
|
||||||
|
efficiencyRatio: if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)
|
||||||
|
timeTrackedThisWeek: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||||
|
timeTrackedToday: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
|
||||||
|
dueMonth: if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")
|
||||||
|
dueWeek: if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")
|
||||||
|
scheduledMonth: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")
|
||||||
|
scheduledWeek: if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")
|
||||||
|
dueDateCategory: if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))
|
||||||
|
timeEstimateCategory: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))
|
||||||
|
ageCategory: if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))
|
||||||
|
createdMonth: file.ctime.format("YYYY-MM")
|
||||||
|
modifiedMonth: file.mtime.format("YYYY-MM")
|
||||||
|
priorityCategory: if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))
|
||||||
|
projectCount: if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))
|
||||||
|
contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))
|
||||||
|
trackingStatus: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
|
||||||
|
nextDate: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))
|
||||||
|
daysUntilNext: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))
|
||||||
|
hasDate: (due.isEmpty() == false) || (scheduled.isEmpty() == false)
|
||||||
|
isToday: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))
|
||||||
|
isThisWeek: ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))
|
||||||
|
nextDateCategory: if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))
|
||||||
|
nextDateMonth: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))
|
||||||
|
nextDateWeek: if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))
|
||||||
|
urgencyScore: if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))
|
||||||
|
timeTrackedFormatted: if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")
|
||||||
|
dueDateDisplay: if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))
|
||||||
|
views:
|
||||||
|
- type: tasknotesTaskList
|
||||||
|
name: Manual Order
|
||||||
|
groupBy:
|
||||||
|
property: status
|
||||||
|
direction: ASC
|
||||||
|
order:
|
||||||
|
- status
|
||||||
|
- priority
|
||||||
|
- due
|
||||||
|
- scheduled
|
||||||
|
- projects
|
||||||
|
- contexts
|
||||||
|
- file.tags
|
||||||
|
- blockedBy
|
||||||
|
- file.name
|
||||||
|
- recurrence
|
||||||
|
- complete_instances
|
||||||
|
- file.tasks
|
||||||
|
sort:
|
||||||
|
- property: tasknotes_manual_order
|
||||||
|
direction: DESC
|
||||||
|
- type: tasknotesTaskList
|
||||||
|
name: All Tasks
|
||||||
|
order:
|
||||||
|
- status
|
||||||
|
- priority
|
||||||
|
- due
|
||||||
|
- scheduled
|
||||||
|
- projects
|
||||||
|
- contexts
|
||||||
|
- file.tags
|
||||||
|
- blockedBy
|
||||||
|
- file.name
|
||||||
|
- recurrence
|
||||||
|
- complete_instances
|
||||||
|
- file.tasks
|
||||||
|
sort:
|
||||||
|
- property: due
|
||||||
|
direction: ASC
|
||||||
|
- type: tasknotesTaskList
|
||||||
|
name: Not Blocked
|
||||||
|
filters:
|
||||||
|
and:
|
||||||
|
- or:
|
||||||
|
- and:
|
||||||
|
- recurrence.isEmpty()
|
||||||
|
- status != "done"
|
||||||
|
- and:
|
||||||
|
- recurrence.isEmpty() == false
|
||||||
|
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
||||||
|
- or:
|
||||||
|
- blockedBy.isEmpty()
|
||||||
|
- list(blockedBy).filter(file(if(value.isType("object"), value.uid, value)).properties.status != "done").isEmpty()
|
||||||
|
order:
|
||||||
|
- status
|
||||||
|
- priority
|
||||||
|
- due
|
||||||
|
- scheduled
|
||||||
|
- projects
|
||||||
|
- contexts
|
||||||
|
- file.tags
|
||||||
|
- blockedBy
|
||||||
|
- file.name
|
||||||
|
- recurrence
|
||||||
|
- complete_instances
|
||||||
|
- file.tasks
|
||||||
|
sort:
|
||||||
|
- property: formula.urgencyScore
|
||||||
|
direction: DESC
|
||||||
|
- type: tasknotesTaskList
|
||||||
|
name: Today
|
||||||
|
filters:
|
||||||
|
and:
|
||||||
|
- or:
|
||||||
|
- and:
|
||||||
|
- recurrence.isEmpty()
|
||||||
|
- status != "done"
|
||||||
|
- and:
|
||||||
|
- recurrence.isEmpty() == false
|
||||||
|
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
||||||
|
- or:
|
||||||
|
- and:
|
||||||
|
- due.isEmpty() == false
|
||||||
|
- date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||||
|
- and:
|
||||||
|
- scheduled.isEmpty() == false
|
||||||
|
- date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
|
||||||
|
order:
|
||||||
|
- status
|
||||||
|
- priority
|
||||||
|
- due
|
||||||
|
- scheduled
|
||||||
|
- projects
|
||||||
|
- contexts
|
||||||
|
- file.tags
|
||||||
|
- blockedBy
|
||||||
|
- file.name
|
||||||
|
- recurrence
|
||||||
|
- complete_instances
|
||||||
|
- file.tasks
|
||||||
|
sort:
|
||||||
|
- property: formula.urgencyScore
|
||||||
|
direction: DESC
|
||||||
|
- type: tasknotesTaskList
|
||||||
|
name: Overdue
|
||||||
|
filters:
|
||||||
|
and:
|
||||||
|
- or:
|
||||||
|
- and:
|
||||||
|
- recurrence.isEmpty()
|
||||||
|
- status != "done"
|
||||||
|
- and:
|
||||||
|
- recurrence.isEmpty() == false
|
||||||
|
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
||||||
|
- or:
|
||||||
|
- and:
|
||||||
|
- due.isEmpty() == false
|
||||||
|
- date(due) < today()
|
||||||
|
- and:
|
||||||
|
- scheduled.isEmpty() == false
|
||||||
|
- date(scheduled) < today()
|
||||||
|
order:
|
||||||
|
- status
|
||||||
|
- priority
|
||||||
|
- due
|
||||||
|
- scheduled
|
||||||
|
- projects
|
||||||
|
- contexts
|
||||||
|
- file.tags
|
||||||
|
- blockedBy
|
||||||
|
- file.name
|
||||||
|
- recurrence
|
||||||
|
- complete_instances
|
||||||
|
- file.tasks
|
||||||
|
sort:
|
||||||
|
- property: formula.urgencyScore
|
||||||
|
direction: DESC
|
||||||
|
- type: tasknotesTaskList
|
||||||
|
name: This Week
|
||||||
|
filters:
|
||||||
|
and:
|
||||||
|
- or:
|
||||||
|
- and:
|
||||||
|
- recurrence.isEmpty()
|
||||||
|
- status != "done"
|
||||||
|
- and:
|
||||||
|
- recurrence.isEmpty() == false
|
||||||
|
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
||||||
|
- or:
|
||||||
|
- and:
|
||||||
|
- due.isEmpty() == false
|
||||||
|
- date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD")
|
||||||
|
- date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
|
||||||
|
- and:
|
||||||
|
- scheduled.isEmpty() == false
|
||||||
|
- date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD")
|
||||||
|
- date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
|
||||||
|
order:
|
||||||
|
- status
|
||||||
|
- priority
|
||||||
|
- due
|
||||||
|
- scheduled
|
||||||
|
- projects
|
||||||
|
- contexts
|
||||||
|
- file.tags
|
||||||
|
- blockedBy
|
||||||
|
- file.name
|
||||||
|
- recurrence
|
||||||
|
- complete_instances
|
||||||
|
- file.tasks
|
||||||
|
sort:
|
||||||
|
- property: formula.urgencyScore
|
||||||
|
direction: DESC
|
||||||
|
- type: tasknotesTaskList
|
||||||
|
name: Unscheduled
|
||||||
|
filters:
|
||||||
|
and:
|
||||||
|
- or:
|
||||||
|
- and:
|
||||||
|
- recurrence.isEmpty()
|
||||||
|
- status != "done"
|
||||||
|
- and:
|
||||||
|
- recurrence.isEmpty() == false
|
||||||
|
- complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
|
||||||
|
- date(due).isEmpty()
|
||||||
|
- date(scheduled).isEmpty()
|
||||||
|
order:
|
||||||
|
- status
|
||||||
|
- priority
|
||||||
|
- due
|
||||||
|
- scheduled
|
||||||
|
- projects
|
||||||
|
- contexts
|
||||||
|
- file.tags
|
||||||
|
- blockedBy
|
||||||
|
- file.name
|
||||||
|
- recurrence
|
||||||
|
- complete_instances
|
||||||
|
- file.tasks
|
||||||
|
sort:
|
||||||
|
- property: status
|
||||||
|
direction: ASC
|
||||||
Reference in New Issue
Block a user