saturday cleanup

main
iOS 3 years ago
parent fbcd3e95fa
commit 3f128fad63

@ -46,5 +46,7 @@
"obsidian-activity-history", "obsidian-activity-history",
"obsidian-stopwatch-plugin", "obsidian-stopwatch-plugin",
"obsidian-react-components", "obsidian-react-components",
"obsidian-style-settings" "obsidian-style-settings",
"obsidian-task-collector",
"obsidian-multiselect"
] ]

@ -181,7 +181,7 @@
"offset": 2 "offset": 2
}, },
"current": { "current": {
"day": 13, "day": 16,
"month": 0, "month": 0,
"year": 2022 "year": 2022
}, },
@ -853,7 +853,11 @@
"day": 24, "day": 24,
"month": 8 "month": 8
}, },
"category": "ID_a93b8bba4be8" "category": "ID_a93b8bba4be8",
"end": {
"day": 24,
"month": 8
}
}, },
{ {
"id": "ID_a8a998e8ba4a", "id": "ID_a8a998e8ba4a",
@ -1085,12 +1089,7 @@
"month": 2, "month": 2,
"day": 31 "day": 31
}, },
"category": "ID_3b8a489a19da", "category": "ID_3b8a489a19da"
"end": {
"year": 2022,
"month": 2,
"day": 31
}
}, },
{ {
"id": "ID_39284918f8ba", "id": "ID_39284918f8ba",
@ -1145,7 +1144,7 @@
"name": "Task" "name": "Task"
} }
], ],
"date": 1642056934070, "date": 1642234501461,
"displayWeeks": false "displayWeeks": false
} }
], ],

@ -12,8 +12,8 @@
"checkpointList": [ "checkpointList": [
{ {
"path": "/", "path": "/",
"date": "2022-01-13", "date": "2022-01-15",
"size": 713270 "size": 728319
} }
], ],
"activityHistory": [ "activityHistory": [
@ -42,7 +42,15 @@
}, },
{ {
"date": "2022-01-13", "date": "2022-01-13",
"value": 13397 "value": 13565
},
{
"date": "2022-01-14",
"value": 20766
},
{
"date": "2022-01-15",
"value": 3797
} }
] ]
} }

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
{"id":"obsidian-multiselect","name":"Multi Select","version":"0.0.1","minAppVersion":"0.13.19","description":"Select multiple notes from a dataview query and include their links the current note","author":"mdelobelle","authorUrl":"https://github.com/mdelobelle","isDesktopOnly":false}

@ -0,0 +1,65 @@
/* Sets all the text color to red! */
.modal-values-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
}
.value-selector-container{
margin-bottom: 5px;
display: inline
}
.value-selector-toggler {
display: inline-block;
vertical-align: top;
margin-right: 10px;
padding-top: 3px;
}
.value-selector-label{
display: inline-block;
margin-left: 10px;
}
.value-selector-aliases{
display: inline-block;
margin-left: 10px;
}
.aliases-list-container{
margin-left: 62px;
}
.value-grid-footer {
align-items: center;
display: flex;
justify-content: space-between;
}
.separator-container {
display: flex;
justify-content: flex-end;
align-items: center;
}
.separator-label {
margin-right: 10px;
}
.separator-link-label {
margin-left: 10px;
margin-right: 10px;
color: var(--text-muted);
font-size: 14px;
}
.separator-helper-label{
color: var(--text-muted);
font-size: 14px;
}
.buttons-container {
display: flex;
align-items: center;
}

@ -34,7 +34,7 @@
}, },
{ {
"title": "[[Storage and Syncing|Storage & Sync]]: Transfer pictures to ED", "title": "[[Storage and Syncing|Storage & Sync]]: Transfer pictures to ED",
"time": "2022-01-14", "time": "2022-04-15",
"rowNumber": 199 "rowNumber": 199
} }
], ],
@ -68,14 +68,24 @@
{ {
"title": "[[Life Admin]]: Monitor UK naturalisation (2021-08-02)", "title": "[[Life Admin]]: Monitor UK naturalisation (2021-08-02)",
"time": "2022-02-02", "time": "2022-02-02",
"rowNumber": 73
},
{
"title": "[[Life Admin]]: Get a [[Life Admin#Swiss Mobile|CH mobile line]]",
"time": "2022-03-31",
"rowNumber": 71 "rowNumber": 71
},
{
"title": "[[Life Admin]]: Cancel UK mobile line",
"time": "2022-03-31",
"rowNumber": 72
} }
], ],
"01.01 Life Orga/Lifestyle.md": [ "01.01 Life Orga/Lifestyle.md": [
{ {
"title": "[[Lifestyle]]: Continue building [[Lifestyle#Music Library|Music Library]]", "title": "[[Lifestyle]]: Continue building [[Lifestyle#Music Library|Music Library]]",
"time": "2022-03-30", "time": "2022-03-30",
"rowNumber": 74 "rowNumber": 73
}, },
{ {
"title": "[[Lifestyle]]: Re-start swimming", "title": "[[Lifestyle]]: Re-start swimming",
@ -85,7 +95,7 @@
{ {
"title": "[[Lifestyle]]: Re-start [[Lifestyle#polo|Polo]]", "title": "[[Lifestyle]]: Re-start [[Lifestyle#polo|Polo]]",
"time": "2022-06-30", "time": "2022-06-30",
"rowNumber": 73 "rowNumber": 72
} }
], ],
"05.02 Networks/Server Cloud.md": [ "05.02 Networks/Server Cloud.md": [
@ -119,29 +129,34 @@
"06.02 Investments/Equity Tasks.md": [ "06.02 Investments/Equity Tasks.md": [
{ {
"title": "[[Equity Tasks#internet alerts|monitor Equity news and publications]]", "title": "[[Equity Tasks#internet alerts|monitor Equity news and publications]]",
"time": "2022-01-14", "time": "2022-01-21",
"rowNumber": 73 "rowNumber": 73
} }
], ],
"06.02 Investments/Crypto Tasks.md": [ "06.02 Investments/Crypto Tasks.md": [
{ {
"title": "[[Crypto Tasks#internet alerts|monitor Crypto news and publications]]", "title": "[[Crypto Tasks#internet alerts|monitor Crypto news and publications]]",
"time": "2022-01-14", "time": "2022-01-21",
"rowNumber": 73 "rowNumber": 73
} }
], ],
"06.02 Investments/VC Tasks.md": [ "06.02 Investments/VC Tasks.md": [
{ {
"title": "[[VC Tasks#internet alerts|monitor VC news and publications]]", "title": "[[VC Tasks#internet alerts|monitor VC news and publications]]",
"time": "2022-01-14", "time": "2022-01-21",
"rowNumber": 73 "rowNumber": 73
} }
], ],
"01.01 Life Orga/Personal projects.md": [ "01.01 Life Orga/Personal projects.md": [
{ {
"title": "Refaire [[Personal projects#Chevalière|chevalière]] (Bastard & Flourville)", "title": "Continue [[@lebv.org Tasks|lebv.org]]",
"time": "2023-12-31", "time": "2022-06-28",
"rowNumber": 73 "rowNumber": 76
},
{
"title": "Acheter une [[Voitures|voiture]] ⏳ 2022-03-31",
"time": "2022-12-31",
"rowNumber": 77
}, },
{ {
"title": "Continuer à construire un petit trousseau d'[[Personal projects#art|art]]", "title": "Continuer à construire un petit trousseau d'[[Personal projects#art|art]]",
@ -149,14 +164,14 @@
"rowNumber": 74 "rowNumber": 74
}, },
{ {
"title": "Continue [[@lebv.org Tasks|lebv.org]]", "title": "Caligraph & frame life mementos",
"time": "2022-06-28", "time": "2023-06-30",
"rowNumber": 76 "rowNumber": 75
}, },
{ {
"title": "Acheter une [[Voitures|voiture]] ⏳ 2022-03-31", "title": "Refaire [[Personal projects#Chevalière|chevalière]] (Bastard & Flourville)",
"time": "2022-12-31", "time": "2023-12-31",
"rowNumber": 77 "rowNumber": 73
} }
], ],
"04.01 lebv.org/Hosting Tasks.md": [ "04.01 lebv.org/Hosting Tasks.md": [
@ -310,7 +325,7 @@
"01.03 Family/Jérôme Bédier.md": [ "01.03 Family/Jérôme Bédier.md": [
{ {
"title": ":birthday: **[[Jérôme Bédier|Jérôme]]**", "title": ":birthday: **[[Jérôme Bédier|Jérôme]]**",
"time": "2022-01-14", "time": "2023-01-14",
"rowNumber": 100 "rowNumber": 100
} }
], ],

@ -0,0 +1,15 @@
{
"completedAreaHeader": "### Completed to-dos",
"removeExpression": "",
"appendDateFormat": "",
"incompleteTaskValues": " ",
"supportCanceledTasks": true,
"rightClickComplete": false,
"rightClickMark": false,
"rightClickMove": true,
"rightClickReset": false,
"rightClickResetTask": false,
"rightClickResetAll": false,
"rightClickToggleAll": false,
"completedAreaRemoveCheckbox": false
}

@ -0,0 +1,729 @@
/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
__markAsModule(target);
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
for (let key of __getOwnPropNames(module2))
if (!__hasOwnProp.call(target, key) && key !== "default")
__defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
}
return target;
};
var __toModule = (module2) => {
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
var __async = (__this, __arguments, generator) => {
return new Promise((resolve, reject) => {
var fulfilled = (value) => {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
};
var rejected = (value) => {
try {
step(generator.throw(value));
} catch (e) {
reject(e);
}
};
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
step((generator = generator.apply(__this, __arguments)).next());
});
};
// src/main.ts
__export(exports, {
default: () => main_default
});
// src/taskcollector-Plugin.ts
var import_obsidian4 = __toModule(require("obsidian"));
// src/taskcollector-TaskCollector.ts
var import_obsidian = __toModule(require("obsidian"));
var TaskCollector = class {
constructor(app) {
this.app = app;
this.app = app;
this.completedOrCanceled = new RegExp(/^(\s*- \[)[xX-](\] .*)$/);
this.anyListItem = new RegExp(/^(\s*- )([^\\[].*)$/);
this.anyTaskMark = new RegExp(/^(\s*- \[).(\] .*)$/);
this.blockRef = new RegExp(/^(.*?)( \^[A-Za-z0-9-]+)?$/);
this.stripTask = new RegExp(/^(\s*-) \[.\] (.*)$/);
}
updateSettings(settings) {
this.settings = settings;
let momentMatchString = null;
if (settings.appendDateFormat) {
const literals = [];
const regex1 = RegExp("(\\[.*?\\]\\]?)", "g");
let match;
let i = 0;
momentMatchString = settings.appendDateFormat;
while ((match = regex1.exec(momentMatchString)) !== null) {
momentMatchString = momentMatchString.replace(match[0], `%$${i}$%`);
literals.push(match[0].substring(1, match[0].length - 1).replace(/\(/g, "\\(").replace(/\)/g, "\\)").replace(/\[/g, "\\[").replace(/\]/g, "\\]"));
i++;
}
momentMatchString = momentMatchString.replace("YYYY", "\\d{4}").replace("YY", "\\d{2}").replace("DD", "\\d{2}").replace("D", "\\d{1,2}").replace("MMM", "[A-Za-z]{3}").replace("MM", "\\d{2}").replace("M", "\\d{1,2}").replace("HH", "\\d{2}").replace("H", "\\d{1,2}").replace("hh", "\\d{2}").replace("h", "\\d{1,2}").replace("mm", "\\d{2}").replace("m", "\\d{1,2}");
if (literals.length > 0) {
for (let i2 = 0; i2 < literals.length; i2++) {
momentMatchString = momentMatchString.replace(`%$${i2}$%`, literals[i2]);
}
}
}
const completedTasks = this.settings.supportCanceledTasks ? "xX-" : "xX";
const rightClickTaskMenu = this.settings.rightClickComplete || this.settings.rightClickMark || this.settings.rightClickMove || this.settings.rightClickResetTask || this.settings.rightClickResetAll || this.settings.rightClickToggleAll;
this.initSettings = {
removeRegExp: this.tryCreateRemoveRegex(this.settings.removeExpression),
resetRegExp: this.tryCreateResetRegex(momentMatchString),
incompleteTaskRegExp: this.tryCreateIncompleteRegex(this.settings.incompleteTaskValues),
rightClickTaskMenu,
completedTasks,
completedTaskRegExp: this.tryCreateCompleteRegex(completedTasks)
};
}
tryCreateRemoveRegex(param) {
return param ? new RegExp(param, "g") : null;
}
tryCreateResetRegex(param) {
return param ? new RegExp(param + "( \\^[A-Za-z0-9-]+)?$") : null;
}
tryCreateCompleteRegex(param) {
return new RegExp(`^(\\s*- \\[)[${param}](\\] .*)$`);
}
tryCreateIncompleteRegex(param) {
return new RegExp(`^(\\s*- \\[)[${param}](\\] .*)$`);
}
removeCheckboxFromLine(lineText) {
return lineText.replace(this.stripTask, "$1 $2");
}
completeTaskLine(lineText, mark) {
let marked = lineText.replace(this.initSettings.incompleteTaskRegExp, "$1" + mark + "$2");
if (this.initSettings.removeRegExp) {
marked = marked.replace(this.initSettings.removeRegExp, "");
}
if (this.settings.appendDateFormat) {
let blockid = "";
const match = this.blockRef.exec(marked);
if (match && match[2]) {
marked = match[1];
blockid = match[2];
}
if (!marked.endsWith(" ")) {
marked += " ";
}
marked += (0, import_obsidian.moment)().format(this.settings.appendDateFormat) + blockid;
}
return marked;
}
completeEditorLineTask(editor, mark, i) {
const lineText = editor.getLine(i);
const incompleteTask = this.initSettings.incompleteTaskRegExp.exec(lineText);
if (incompleteTask) {
const marked = this.completeTaskLine(lineText, mark);
editor.setLine(i, marked);
}
}
markAllTasksComplete(source, mark) {
const lines = source.split("\n");
const result = [];
for (const line of lines) {
if (this.initSettings.incompleteTaskRegExp.exec(line)) {
result.push(this.completeTaskLine(line, mark));
} else {
result.push(line);
}
}
return result.join("\n");
}
markTaskInSource(source, mark, lines = []) {
const split = source.split("\n");
for (const n of lines) {
if (!this.anyTaskMark.test(split[n])) {
const match = this.anyListItem.exec(split[n]);
if (match && match[2]) {
console.debug("TC: list item, convert to a task %s", split[n]);
split[n] = match[1] + "[ ] " + match[2];
} else {
console.debug("TC: not a task or list item %s", split[n]);
continue;
}
}
if (this.initSettings.completedTasks.indexOf(mark) >= 0) {
if (this.isIncompleteTaskLine(split[n])) {
console.debug("TC: complete task with %s: %s", mark, split[n]);
split[n] = this.completeTaskLine(split[n], mark);
} else {
console.debug("TC: task already completed: %s", mark, split[n]);
}
} else if (this.settings.incompleteTaskValues.indexOf(mark) >= 0) {
console.debug("TC: reset task with %s: %s", mark, split[n]);
split[n] = this.resetTaskLine(split[n], mark);
} else if (mark === "Backspace") {
split[n] = this.removeCheckboxFromLine(split[n]);
} else {
console.debug("TC: unrecognized mark %s, check configuration settings", mark);
}
}
return split.join("\n");
}
resetTaskLine(lineText, mark = " ") {
let marked = lineText.replace(this.anyTaskMark, "$1" + mark + "$2");
let blockid = "";
const match = this.blockRef.exec(marked);
if (match && match[2]) {
marked = match[1];
blockid = match[2];
}
if (this.initSettings.resetRegExp) {
marked = marked.replace(this.initSettings.resetRegExp, "");
}
marked = marked.replace(/\s*$/, blockid);
return marked;
}
resetTaskOnLine(editor, i, mark) {
const lineText = editor.getLine(i);
const marked = this.resetTaskLine(lineText, mark);
editor.setLine(i, marked);
}
resetAllTasks(source) {
const LOG_HEADING = this.settings.completedAreaHeader || "## Log";
const lines = source.split("\n");
const result = [];
let inCompletedSection = false;
for (const line of lines) {
if (inCompletedSection) {
if (line.startsWith("#") || line.trim() === "---") {
inCompletedSection = false;
}
result.push(line);
} else if (line.trim() === LOG_HEADING) {
inCompletedSection = true;
result.push(line);
} else if (this.completedOrCanceled.exec(line)) {
result.push(this.resetTaskLine(line));
} else {
result.push(line);
}
}
return result.join("\n");
}
moveCompletedTasksInFile(source) {
const LOG_HEADING = this.settings.completedAreaHeader || "## Log";
const lines = source.split("\n");
if (source.indexOf(LOG_HEADING) < 0) {
if (lines[lines.length - 1].trim() !== "") {
lines.push("");
}
lines.push(LOG_HEADING);
}
const remaining = [];
const completedSection = [];
const newTasks = [];
let inCompletedSection = false;
let inTask = false;
let completedItemsIndex = lines.length;
for (let line of lines) {
if (inCompletedSection) {
if (line.startsWith("#") || line.trim() === "---") {
inCompletedSection = false;
remaining.push(line);
} else {
completedSection.push(line);
}
} else if (line.trim() === LOG_HEADING) {
inCompletedSection = true;
completedItemsIndex = remaining.push(line);
remaining.push("%%%COMPLETED_ITEMS_GO_HERE%%%");
} else {
const taskMatch = line.match(/^(\s*)- \[(.)\]/);
if (this.isCompletedTaskLine(line)) {
if (this.settings.completedAreaRemoveCheckbox) {
line = this.removeCheckboxFromLine(line);
}
inTask = true;
newTasks.push(line);
} else if (inTask && !taskMatch && line.match(/^( {2,}|\t)/)) {
newTasks.push(line);
} else {
inTask = false;
remaining.push(line);
}
}
}
let result = remaining.slice(0, completedItemsIndex).concat(...newTasks).concat(...completedSection);
if (completedItemsIndex < remaining.length - 1) {
result = result.concat(remaining.slice(completedItemsIndex + 1));
}
return result.join("\n");
}
isCompletedTaskLine(lineText) {
return this.initSettings.completedTaskRegExp.test(lineText);
}
isIncompleteTaskLine(lineText) {
return this.initSettings.incompleteTaskRegExp.test(lineText);
}
};
// src/taskcollector-Settings.ts
var DEFAULT_SETTINGS = {
completedAreaHeader: "## Log",
removeExpression: "",
appendDateFormat: "",
incompleteTaskValues: " ",
supportCanceledTasks: false,
rightClickComplete: false,
rightClickMark: false,
rightClickMove: false,
rightClickReset: false,
rightClickResetTask: false,
rightClickResetAll: false,
rightClickToggleAll: false,
completedAreaRemoveCheckbox: false
};
// src/taskcollector-SettingsTab.ts
var import_obsidian2 = __toModule(require("obsidian"));
var TaskCollectorSettingsTab = class extends import_obsidian2.PluginSettingTab {
constructor(app, plugin, taskCollector) {
super(app, plugin);
this.plugin = plugin;
this.taskCollector = taskCollector;
}
display() {
this.containerEl.empty();
this.containerEl.createEl("h1", { text: "Task Collector" });
const tempSettings = Object.assign(this.taskCollector.settings);
new import_obsidian2.Setting(this.containerEl).setName("Support canceled tasks").setDesc("Use a - to indicate canceled tasks. Canceled tasks are processed in the same way as completed tasks using options below.").addToggle((toggle) => toggle.setValue(tempSettings.supportCanceledTasks).onChange((value) => __async(this, null, function* () {
tempSettings.supportCanceledTasks = value;
this.taskCollector.updateSettings(tempSettings);
yield this.plugin.saveSettings();
})));
new import_obsidian2.Setting(this.containerEl).setName("Additional task types").setDesc("Specify the set of single characters that indicate in-progress or incomplete tasks, e.g. 'i> !?D'.").addText((text) => text.setPlaceholder("> !?").setValue(tempSettings.incompleteTaskValues).onChange((value) => __async(this, null, function* () {
if (value.contains("x") || value.contains("X")) {
console.log(`Set of characters should not contain the marker for completed tasks: ${value}`);
} else if (tempSettings.supportCanceledTasks && value.contains("-")) {
console.log(`Set of characters should not contain the marker for canceled tasks: ${value}`);
} else {
if (!value.contains(" ")) {
value = " " + value;
}
tempSettings.incompleteTaskValues = value;
this.taskCollector.updateSettings(tempSettings);
yield this.plugin.saveSettings();
}
})));
this.containerEl.createEl("h2", { text: "Completing tasks" });
this.containerEl.createEl("p", {
text: "Completed tasks, marked by 'x', 'X' (and optionally '-' for canceled items) gain special treatment based on the settings below."
});
new import_obsidian2.Setting(this.containerEl).setName("Append date to completed task").setDesc("If non-empty, append today's date in the given moment.js string format to the end of the task text.").addMomentFormat((momentFormat) => momentFormat.setPlaceholder("YYYY-MM-DD").setValue(tempSettings.appendDateFormat).onChange((value) => __async(this, null, function* () {
try {
(0, import_obsidian2.moment)().format(value);
tempSettings.appendDateFormat = value;
this.taskCollector.updateSettings(tempSettings);
yield this.plugin.saveSettings();
} catch (e) {
console.log(`Error parsing specified date format: ${value}`);
}
})));
new import_obsidian2.Setting(this.containerEl).setName("Remove text in completed task").setDesc("Text matching this regular expression should be removed from the task text. Be careful! Test your expression separately. The global flag, 'g' is used for a per-line match.").addText((text) => text.setPlaceholder(" #(todo|task)").setValue(tempSettings.removeExpression).onChange((value) => __async(this, null, function* () {
try {
this.taskCollector.tryCreateRemoveRegex(value);
tempSettings.removeExpression = value;
this.taskCollector.updateSettings(tempSettings);
yield this.plugin.saveSettings();
} catch (e) {
console.log(`Error parsing regular expression for text replacement: ${value}`);
}
})));
this.containerEl.createEl("h2", { text: "Moving completed tasks" });
new import_obsidian2.Setting(this.containerEl).setName("Completed area header").setDesc(`Completed (or canceled) items will be inserted under the specified header (most recent at the top). When scanning the document for completed/canceled tasks, the contents from this configured header to the next heading or separator (---) will be ignored. This heading will be created if the command is invoked and the heading does not exist. The default heading is '${DEFAULT_SETTINGS.completedAreaHeader}'.`).addText((text) => text.setPlaceholder("## Log").setValue(tempSettings.completedAreaHeader).onChange((value) => __async(this, null, function* () {
tempSettings.completedAreaHeader = value.trim();
this.taskCollector.updateSettings(tempSettings);
yield this.plugin.saveSettings();
})));
new import_obsidian2.Setting(this.containerEl).setName("Remove the checkbox from moved items").setDesc(`Remove the checkbox from completed (or canceled) tasks during the move to the completed area. This transforms tasks into normal list items. Task Collector will not be able to reset these items. They also will not appear in task searches or queries. The default value is: '${DEFAULT_SETTINGS.completedAreaRemoveCheckbox}'.`).addToggle((toggle) => toggle.setValue(tempSettings.completedAreaRemoveCheckbox).onChange((value) => __async(this, null, function* () {
tempSettings.completedAreaRemoveCheckbox = value;
this.taskCollector.updateSettings(tempSettings);
yield this.plugin.saveSettings();
})));
this.containerEl.createEl("h2", { text: "Right-click Menu items" });
this.containerEl.createEl("p", {
text: "Task Collector creates commands that can be bound to hotkeys or accessed using slash commands for marking tasks complete (or canceled) and resetting tasks to an incomplete state. The following settings add right click context menu items for those commands."
});
new import_obsidian2.Setting(this.containerEl).setName("Add menu item for marking a task").setDesc("Add an item to the right-click menu in edit mode to mark the task _on the current line (or within the current selection)_. This menu item will trigger a quick pop-up modal to select the desired mark value. The selected value will determine follow-on actions: complete, cancel, or reset.").addToggle((toggle) => toggle.setValue(tempSettings.rightClickMark).onChange((value) => __async(this, null, function* () {
tempSettings.rightClickMark = value;
this.taskCollector.updateSettings(tempSettings);
yield this.plugin.saveSettings();
})));
new import_obsidian2.Setting(this.containerEl).setName("Add menu item for completing a task").setDesc("Add an item to the right-click menu in edit mode to mark the task _on the current line (or within the current selection)_ complete. If canceled items are supported, an additional menu item will be added to mark selected tasks as canceled.").addToggle((toggle) => toggle.setValue(tempSettings.rightClickComplete).onChange((value) => __async(this, null, function* () {
tempSettings.rightClickComplete = value;
this.taskCollector.updateSettings(tempSettings);
yield this.plugin.saveSettings();
})));
new import_obsidian2.Setting(this.containerEl).setName("Add menu item for resetting a task").setDesc("Add an item to the right-click menu in edit mode to reset the task _on the current line (or within the current selection)_.").addToggle((toggle) => toggle.setValue(tempSettings.rightClickResetTask).onChange((value) => __async(this, null, function* () {
tempSettings.rightClickResetTask = value;
this.taskCollector.updateSettings(tempSettings);
yield this.plugin.saveSettings();
})));
new import_obsidian2.Setting(this.containerEl).setName("Add menu items for completing all tasks").setDesc("Add an item to the right-click menu in edit mode to mark _all_ incomplete tasks in the current document complete.").addToggle((toggle) => toggle.setValue(tempSettings.rightClickToggleAll).onChange((value) => __async(this, null, function* () {
tempSettings.rightClickToggleAll = value;
this.taskCollector.updateSettings(tempSettings);
yield this.plugin.saveSettings();
})));
new import_obsidian2.Setting(this.containerEl).setName("Add menu item for resetting all tasks").setDesc("Add an item to the right-click menu to reset _all_ completed (or canceled) tasks.").addToggle((toggle) => toggle.setValue(tempSettings.rightClickResetAll).onChange((value) => __async(this, null, function* () {
tempSettings.rightClickResetAll = value;
this.taskCollector.updateSettings(tempSettings);
yield this.plugin.saveSettings();
})));
new import_obsidian2.Setting(this.containerEl).setName("Add menu item for moving all completed tasks").setDesc("Add an item to the right-click menu to move _all_ completed (or canceled) tasks.").addToggle((toggle) => toggle.setValue(tempSettings.rightClickMove).onChange((value) => __async(this, null, function* () {
tempSettings.rightClickMove = value;
this.taskCollector.updateSettings(tempSettings);
yield this.plugin.saveSettings();
})));
}
};
// src/taskcollector-TaskMarkModal.ts
var import_obsidian3 = __toModule(require("obsidian"));
function getMark(app, taskCollector) {
return new Promise((resolve) => {
const modal = new TaskMarkModal(app, taskCollector);
modal.onClose = () => {
resolve(modal.chosenMark);
};
modal.open();
});
}
var TaskMarkModal = class extends import_obsidian3.Modal {
constructor(app, taskCollector) {
super(app);
this.taskCollector = taskCollector;
this.containerEl.id = "taskcollector-modal";
}
onOpen() {
const selector = this.contentEl.createDiv("taskcollector-selector markdown-preview-view");
const completedTasks = this.taskCollector.settings.supportCanceledTasks ? "xX-" : "xX";
const completedList = selector.createEl("ul");
this.addTaskValues(completedList, completedTasks, true);
const list = selector.createEl("ul");
this.addTaskValues(list, this.taskCollector.settings.incompleteTaskValues, false);
const footer = selector.createEl("nav");
const esc = footer.createSpan();
esc.innerHTML = "<b>esc</b> to dismiss";
const bksp = footer.createSpan();
bksp.innerHTML = "<b>bksp</b> to remove <code>[]</code>";
const self = this;
const keyListener = function(event) {
self.chosenMark = event.key;
event.preventDefault();
event.stopImmediatePropagation();
self.close();
};
this.scope.register([], null, keyListener);
this.scope.register(["Shift"], null, keyListener);
}
addTaskValues(list, choices, markComplete) {
const self = this;
for (const character of choices) {
const li = list.createEl("li", {
cls: "task-list-item" + (character == " " ? "" : " is-checked"),
attr: {
"data-task": character
}
});
li.addEventListener("click", function(event) {
self.chosenMark = character;
self.close();
});
const input = li.createEl("input", {
cls: "task-list-item-checkbox",
attr: {
id: "task-list-item-checkbox-" + character,
type: "checkbox",
style: "pointer-events: none;"
}
});
if (character != " ") {
input.setAttribute("checked", "");
}
li.createEl("span", {
text: character == " " ? "\u2423" : character,
attr: {
style: "pointer-events: none;"
}
});
}
}
onClose() {
this.contentEl.empty();
}
};
// src/taskcollector-Plugin.ts
var Icons;
(function(Icons2) {
Icons2["COMPLETE"] = "tc-complete-item";
Icons2["CANCEL"] = "tc-cancel-item";
Icons2["RESET"] = "tc-reset-item";
Icons2["MARK"] = "tc-mark-item";
Icons2["COMPLETE_ALL"] = "tc-complete-all-items";
Icons2["CLEAR"] = "tc-clear-all-items";
Icons2["MOVE"] = "tc-move-all-checked-items";
})(Icons || (Icons = {}));
var TaskCollectorPlugin = class extends import_obsidian4.Plugin {
constructor() {
super(...arguments);
this.handlersRegistered = false;
}
onload() {
return __async(this, null, function* () {
console.log("loading Task Collector (TC)");
this.taskCollector = new TaskCollector(this.app);
this.addSettingTab(new TaskCollectorSettingsTab(this.app, this, this.taskCollector));
yield this.loadSettings();
(0, import_obsidian4.addIcon)(Icons.COMPLETE, '<svg xmlns="http://www.w3.org/2000/svg" width="100px" height="100px" fill="currentColor" class="bi bi-check-square-fill" viewBox="0 0 16 16"> <path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm10.03 4.97a.75.75 0 0 1 .011 1.05l-3.992 4.99a.75.75 0 0 1-1.08.02L4.324 8.384a.75.75 0 1 1 1.06-1.06l2.094 2.093 3.473-4.425a.75.75 0 0 1 1.08-.022z"/></svg>');
(0, import_obsidian4.addIcon)(Icons.CANCEL, '<svg xmlns="http://www.w3.org/2000/svg" width="100px" height="100px" fill="currentColor" class="bi bi-dash-square-fill" viewBox="0 0 16 16"> <path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm2.5 7.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1 0-1z"/></svg>');
(0, import_obsidian4.addIcon)(Icons.RESET, '<svg xmlns="http://www.w3.org/2000/svg" width="100px" height="100px" fill="currentColor" class="bi bi-square-fill" viewBox="0 0 16 16"><path d="M0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V2z"/></svg>');
(0, import_obsidian4.addIcon)(Icons.MARK, '<svg class="bi bi-square-fill" width="100px" height="100px" fill="currentColor" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path transform="scale(.16)" d="m12.5 0a12.5 12.5 0 00-12.5 12.5v75a12.5 12.5 0 0012.5 12.5h75a12.5 12.5 0 0012.5-12.5v-75a12.5 12.5 0 00-12.5-12.5h-75zm38.146 21.135 8.7324 19.098 20.684 3.6328-15.465 14.207 2.9355 20.793-18.289-10.316-18.869 9.2188 4.1602-20.584-14.598-15.098 20.861-2.4043 9.8477-18.547z" stroke-width="6.25"/></svg>');
(0, import_obsidian4.addIcon)(Icons.COMPLETE_ALL, '<svg class="bi bi-square-fill" fill="currentColor" version="1.1" width="100px" height="100px" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="m2 0a2 2 0 00-2 2v12a2 2 0 002 2h12a2 2 0 002-2v-12a2 2 0 00-2-2h-12zm1.5098 2.041h1.5a1.5 1.5 0 011.5 1.5v1.5a1.5 1.5 0 01-1.5 1.5h-1.5a1.5 1.5 0 01-1.5-1.5v-1.5a1.5 1.5 0 011.5-1.5zm4.3945 1.2207h5.6895a.40645.5 0 01.40625.5v1a.40645.5 0 01-.40625.5h-5.6895a.40645.5 0 01-.40625-.5v-1a.40645.5 0 01.40625-.5zm-4.4023 6.2656h1.5a1.5 1.5 0 011.5 1.5v1.5a1.5 1.5 0 01-1.5 1.5h-1.5a1.5 1.5 0 01-1.5-1.5v-1.5a1.5 1.5 0 011.5-1.5zm4.4023 1.2656h5.6895a.40645.5 0 01.40625.5v1a.40645.5 0 01-.40625.5h-5.6895a.40645.5 0 01-.40625-.5v-1a.40645.5 0 01.40625-.5z"/><g transform="translate(.49737 -.0026315)" fill="currentColor"><path d="m3.6171 13.149a.5.5 0 01-.708 0l-1-1a.50063.50063 0 01.708-.708l.646.647 1.646-1.647a.50063.50063 0 01.708.708z"/><path d="m3.6171 5.6181a.5.5 0 01-.708 0l-1-1a.50063.50063 0 11.708-.708l.646.647 1.646-1.647a.50063.50063 0 11.708.708z"/></g></svg>');
(0, import_obsidian4.addIcon)(Icons.CLEAR, '<svg class="bi bi-square-fill" fill="currentColor" version="1.1" width="100px" height="100px" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="m2 0a2 2 0 00-2 2v12a2 2 0 002 2h12a2 2 0 002-2v-12a2 2 0 00-2-2h-12zm1.5098 2.041h1.5a1.5 1.5 0 011.5 1.5v1.5a1.5 1.5 0 01-1.5 1.5h-1.5a1.5 1.5 0 01-1.5-1.5v-1.5a1.5 1.5 0 011.5-1.5zm4.3945 1.2207h5.6895a.40645.5 0 01.40625.5v1a.40645.5 0 01-.40625.5h-5.6895a.40645.5 0 01-.40625-.5v-1a.40645.5 0 01.40625-.5zm-4.4023 6.2656h1.5a1.5 1.5 0 011.5 1.5v1.5a1.5 1.5 0 01-1.5 1.5h-1.5a1.5 1.5 0 01-1.5-1.5v-1.5a1.5 1.5 0 011.5-1.5zm4.4023 1.2656h5.6895a.40645.5 0 01.40625.5v1a.40645.5 0 01-.40625.5h-5.6895a.40645.5 0 01-.40625-.5v-1a.40645.5 0 01.40625-.5z"/></svg>');
(0, import_obsidian4.addIcon)(Icons.MOVE, '<svg xmlns="http://www.w3.org/2000/svg" width="100px" height="100px" fill="currentColor" class="bi bi-save-fill" viewBox="0 0 16 16"> <path d="M8.5 1.5A1.5 1.5 0 0 1 10 0h4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V2a2 2 0 0 1 2-2h6c-.314.418-.5.937-.5 1.5v7.793L4.854 6.646a.5.5 0 1 0-.708.708l3.5 3.5a.5.5 0 0 0 .708 0l3.5-3.5a.5.5 0 0 0-.708-.708L8.5 9.293V1.5z"/></svg>');
const completeTaskCommand = {
id: "task-collector-mark-done",
name: "Complete item",
icon: Icons.COMPLETE,
editorCallback: (editor, view) => {
this.markTaskOnLines("x", this.getCurrentLinesFromEditor(editor));
}
};
const cancelTaskCommand = {
id: "task-collector-mark-canceled",
name: "Cancel item",
icon: Icons.CANCEL,
editorCallback: (editor, view) => {
this.markTaskOnLines("-", this.getCurrentLinesFromEditor(editor));
}
};
const resetTaskCommand = {
id: "task-collector-mark-reset",
name: "Reset item",
icon: Icons.RESET,
editorCallback: (editor, view) => {
this.markTaskOnLines(" ", this.getCurrentLinesFromEditor(editor));
}
};
const markTaskCommand = {
id: "task-collector-mark",
name: "Mark item",
icon: Icons.MARK,
editorCallback: (editor, view) => __async(this, null, function* () {
const mark = yield getMark(this.app, this.taskCollector);
if (mark) {
this.markTaskOnLines(mark, this.getCurrentLinesFromEditor(editor));
}
})
};
const completeAllTasksCommand = {
id: "task-collector-mark-all-done",
name: "Complete all tasks",
icon: Icons.COMPLETE_ALL,
callback: () => __async(this, null, function* () {
this.completeAllTasks();
})
};
const clearAllTasksCommand = {
id: "task-collector-clear-all-items",
name: "Reset all completed tasks",
icon: Icons.CLEAR,
callback: () => __async(this, null, function* () {
this.resetAllTasks();
})
};
const moveTaskCommand = {
id: "task-collector-move-completed-tasks",
name: "Move all completed tasks to configured heading",
icon: Icons.MOVE,
callback: () => __async(this, null, function* () {
this.moveAllTasks();
})
};
this.addCommand(completeTaskCommand);
if (this.taskCollector.settings.supportCanceledTasks) {
this.addCommand(cancelTaskCommand);
}
this.addCommand(markTaskCommand);
this.addCommand(resetTaskCommand);
this.addCommand(moveTaskCommand);
this.addCommand(completeAllTasksCommand);
this.addCommand(clearAllTasksCommand);
this.registerHandlers();
});
}
getCurrentLinesFromEditor(editor) {
const lines = [];
if (editor.somethingSelected()) {
const cursorStart = editor.getCursor("from");
const cursorEnd = editor.getCursor("to");
for (let i = cursorStart.line; i <= cursorEnd.line; i++) {
lines.push(i);
}
editor.setSelection(cursorStart, {
line: cursorEnd.line,
ch: editor.getLine(cursorEnd.line).length
});
} else {
const anchor = editor.getCursor("from");
lines.push(anchor.line);
}
return lines;
}
buildMenu(menu, lines) {
if (this.taskCollector.settings.rightClickMark) {
menu.addItem((item) => item.setTitle("(TC) Mark Task").setIcon(Icons.MARK).onClick(() => __async(this, null, function* () {
const mark = yield getMark(this.app, this.taskCollector);
if (mark) {
this.markTaskOnLines(mark, lines);
}
})));
}
if (this.taskCollector.settings.rightClickComplete) {
menu.addItem((item) => item.setTitle("(TC) Complete Task").setIcon(Icons.COMPLETE).onClick(() => {
this.markTaskOnLines("x", lines);
}));
if (this.taskCollector.settings.supportCanceledTasks) {
menu.addItem((item) => item.setTitle("(TC) Cancel Task").setIcon(Icons.CANCEL).onClick(() => {
this.markTaskOnLines("-", lines);
}));
}
}
if (this.taskCollector.settings.rightClickResetTask) {
menu.addItem((item) => item.setTitle("(TC) Reset Task").setIcon(Icons.RESET).onClick(() => {
this.markTaskOnLines(" ", lines);
}));
}
if (this.taskCollector.settings.rightClickMove) {
menu.addItem((item) => item.setTitle("(TC) Move completed tasks").setIcon(Icons.MOVE).onClick(() => __async(this, null, function* () {
this.moveAllTasks();
})));
}
if (this.taskCollector.settings.rightClickToggleAll) {
menu.addItem((item) => item.setTitle("(TC) Complete All Tasks").setIcon(Icons.COMPLETE_ALL).onClick(() => __async(this, null, function* () {
this.completeAllTasks();
})));
}
if (this.taskCollector.settings.rightClickResetAll) {
menu.addItem((item) => item.setTitle("(TC) Reset All Tasks").setIcon(Icons.CLEAR).onClick(() => __async(this, null, function* () {
this.resetAllTasks();
})));
}
}
markTaskOnLines(mark, lines) {
return __async(this, null, function* () {
const activeFile = this.app.workspace.getActiveFile();
const source = yield this.app.vault.read(activeFile);
const result = this.taskCollector.markTaskInSource(source, mark, lines);
this.app.vault.modify(activeFile, result);
});
}
moveAllTasks() {
return __async(this, null, function* () {
const activeFile = this.app.workspace.getActiveFile();
const source = yield this.app.vault.read(activeFile);
const result = this.taskCollector.moveCompletedTasksInFile(source);
this.app.vault.modify(activeFile, result);
});
}
completeAllTasks() {
return __async(this, null, function* () {
const activeFile = this.app.workspace.getActiveFile();
const source = yield this.app.vault.read(activeFile);
const result = this.taskCollector.markAllTasksComplete(source, "x");
this.app.vault.modify(activeFile, result);
});
}
resetAllTasks() {
return __async(this, null, function* () {
const activeFile = this.app.workspace.getActiveFile();
const source = yield this.app.vault.read(activeFile);
const result = this.taskCollector.resetAllTasks(source);
this.app.vault.modify(activeFile, result);
});
}
registerHandlers() {
if (this.taskCollector.initSettings.rightClickTaskMenu && !this.handlersRegistered) {
this.handlersRegistered = true;
this.registerEvent(this.eventRef = this.app.workspace.on("editor-menu", (menu, editor) => {
this.buildMenu(menu, this.getCurrentLinesFromEditor(editor));
}));
this.registerMarkdownPostProcessor(this.postProcessor = (el, ctx) => {
const checkboxes = el.querySelectorAll(".task-list-item-checkbox");
if (!checkboxes.length)
return;
const section = ctx.getSectionInfo(el);
if (!section)
return;
const { lineStart } = section;
for (const checkbox of Array.from(checkboxes)) {
const line = Number(checkbox.dataset.line);
this.registerDomEvent(checkbox.parentElement, "contextmenu", (ev) => {
ev.preventDefault();
const view = this.app.workspace.getActiveViewOfType(import_obsidian4.MarkdownView);
if (view && view.editor) {
const menu = new import_obsidian4.Menu(this.app);
this.buildMenu(menu, [lineStart + line]);
menu.showAtMouseEvent(ev);
}
});
}
});
}
}
unregisterHandlers() {
this.handlersRegistered = false;
this.app.workspace.offref(this.eventRef);
this.eventRef = null;
import_obsidian4.MarkdownPreviewRenderer.unregisterPostProcessor(this.postProcessor);
}
onunload() {
console.log("unloading Task Collector");
}
loadSettings() {
return __async(this, null, function* () {
const settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData());
this.taskCollector.updateSettings(settings);
});
}
saveSettings() {
return __async(this, null, function* () {
yield this.saveData(this.taskCollector.settings);
if (this.taskCollector.initSettings.rightClickTaskMenu && !this.handlersRegistered) {
this.registerHandlers();
}
if (!this.taskCollector.initSettings.rightClickTaskMenu && this.handlersRegistered) {
this.unregisterHandlers();
}
});
}
};
// src/main.ts
var main_default = TaskCollectorPlugin;

@ -0,0 +1,10 @@
{
"id": "obsidian-task-collector",
"name": "Task Collector (TC)",
"version": "0.7.3",
"minAppVersion": "0.12.10",
"description": "Manage completed tasks within a document",
"author": "ebullient",
"authorUrl": "https://github.com/ebullient",
"isDesktopOnly": false
}

@ -0,0 +1,56 @@
#taskcollector-modal .modal-close-button {
display: none;
}
#taskcollector-modal .modal {
padding: 10px;
min-width: 200px;
max-width: 300px;
}
#taskcollector-modal .modal-content {
background-color: var(--background-secondary);
margin-top: 0px;
}
#taskcollector-modal .modal .markdown-preview-view {
padding: 5px;
}
#taskcollector-modal .modal .markdown-preview-view ul {
display: flex;
flex-wrap: wrap;
--gap: 3px;
--square: 45px;
margin: calc(-1 * var(--gap)) calc(1 * var(--gap));
margin-block-start: 0;
margin-block-end: 0;
padding-inline-start: 0;
}
#taskcollector-modal .modal .markdown-preview-view ul > li {
margin: var(--gap);
display: block;
width: var(--square);
height: var(--square);
background-color: var(--background-primary);
border: 1px solid var(--background-modifier-border);
border-radius: 2px;
text-indent: unset;
line-height: var(--square);
text-align: center;
}
#taskcollector-modal .modal .markdown-preview-view ul > li::before {
display: none;
}
#taskcollector-modal .modal .markdown-preview-view ul > li > span {
font-family: var(--font-monospace);
}
#taskcollector-modal .modal .markdown-preview-view ul > li > .task-list-item-checkbox {
margin-right: 4px;
}
#taskcollector-modal .modal .markdown-preview-view nav {
display: flex;
flex-wrap: wrap;
justify-content: space-around;
}
#taskcollector-modal .modal .markdown-preview-view nav span {
display: block;
font-size: .8em;
color: var(--text-muted);
}

@ -1,6 +1,7 @@
{ {
"pluginList": [ "pluginList": [
"Quorafind/Obsidian-Big-Calendar", "mdelobelle/obsidian-multiselect/",
"dbarenholz/obsidian-wordle",
"SkepticMystic/email-templates", "SkepticMystic/email-templates",
"nothingislost/obsidian-cooklang-importer", "nothingislost/obsidian-cooklang-importer",
"dbarenholz/obsidian-plaintext", "dbarenholz/obsidian-plaintext",

File diff suppressed because one or more lines are too long

@ -9,7 +9,7 @@
"state": { "state": {
"type": "markdown", "type": "markdown",
"state": { "state": {
"file": "00.01 Admin/Templates/Template Person.md", "file": "01.02 Home/@Main Dashboard.md",
"mode": "preview" "mode": "preview"
} }
} }
@ -76,7 +76,7 @@
"state": { "state": {
"type": "backlink", "type": "backlink",
"state": { "state": {
"file": "00.01 Admin/Templates/Template Person.md", "file": "01.02 Home/@Main Dashboard.md",
"collapseAll": false, "collapseAll": false,
"extraContext": false, "extraContext": false,
"sortOrder": "alphabetical", "sortOrder": "alphabetical",
@ -101,7 +101,7 @@
"state": { "state": {
"type": "outgoing-link", "type": "outgoing-link",
"state": { "state": {
"file": "00.01 Admin/Templates/Template Person.md", "file": "01.02 Home/@Main Dashboard.md",
"linksCollapsed": false, "linksCollapsed": false,
"unlinkedCollapsed": true "unlinkedCollapsed": true
} }
@ -144,15 +144,15 @@
}, },
"active": "9c08f31f4b20f340", "active": "9c08f31f4b20f340",
"lastOpenFiles": [ "lastOpenFiles": [
"00.01 Admin/Templates/Template Person.md",
"01.02 Home/@Main Dashboard.md", "01.02 Home/@Main Dashboard.md",
"01.03 Family/@Family organisation.md", "06.02 Investments/VC Tasks.md",
"01.03 Family/Timothée Bédier.md", "06.02 Investments/Equity Tasks.md",
"01.03 Family/Thaïs Bédier.md", "06.02 Investments/Crypto Tasks.md",
"01.03 Family/Séraphine Priso Le Bastart.md", "01.01 Life Orga/Family.md",
"01.03 Family/Quentin de Villeneuve.md", "01.01 Life Orga/Lifestyle.md",
"01.03 Family/Pierre Bédier.md", "01.01 Life Orga/Finances.md",
"01.03 Family/Philomène de Villeneuve.md", "01.01 Life Orga/Life Admin.md",
"01.03 Family/Opportune de Villeneuve.md" "01.01 Life Orga/IT & Computer.md",
"01.01 Life Orga/Personal projects.md"
] ]
} }

@ -56,6 +56,8 @@ style: number
https://github.com/SkepticMystic/email-templates https://github.com/SkepticMystic/email-templates
https://github.com/dbarenholz/obsidian-plaintext https://github.com/dbarenholz/obsidian-plaintext
[GitHub - dbarenholz/obsidian-wordle: Play Wordle in Obsidian.](https://github.com/dbarenholz/obsidian-wordle)
[GitHub - mdelobelle/obsidian-multiselect: Select multiple notes and include their links the current note](https://github.com/mdelobelle/obsidian-multiselect)
https://github.com/MSzturc/obsidian-advanced-slides https://github.com/MSzturc/obsidian-advanced-slides
https://github.com/Quorafind/Obsidian-Big-Calendar https://github.com/Quorafind/Obsidian-Big-Calendar
https://github.com/nothingislost/obsidian-cooklang-importer https://github.com/nothingislost/obsidian-cooklang-importer

@ -89,5 +89,15 @@ style: number
**Phone** | `=this.Person.Phone` **Phone** | `=this.Person.Phone`
**Email** | `=this.Person.Email` **Email** | `=this.Person.Email`
&emsp;
---
&emsp;
### Birthday
&emsp;
&emsp; &emsp;
&emsp; &emsp;

@ -4,6 +4,7 @@ ChildrenType: ["Note", "Task", "Recipe"]
JSXExample: "Hello JSX!" JSXExample: "Hello JSX!"
Number1: 1 Number1: 1
Number2: 3 Number2: 3
TimeStamp: 2022-01-15
--- ---
`jsx-<LoadiFrameButton title="" src="https://wallpapercave.com/wp/s1uSZJA.jpg" />` `jsx-<LoadiFrameButton title="" src="https://wallpapercave.com/wp/s1uSZJA.jpg" />`

@ -90,7 +90,6 @@ hide task count
&emsp; &emsp;
- [x] Re-start dialogue ✅ 2021-12-05
&emsp; &emsp;
@ -108,10 +107,12 @@ hide task count
&emsp; &emsp;
### Completed tasks ### Completed to-dos
&emsp; &emsp;
- [x] Re-start dialogue ✅ 2021-12-05
&emsp; &emsp;
--- ---

@ -71,10 +71,6 @@ All things related to personal Finances.
- [ ] [[Finances]]: Closing accounts with [[hLedger]] 📅 2022-01-28 - [ ] [[Finances]]: Closing accounts with [[hLedger]] 📅 2022-01-28
- [ ] [[Finances]]: Set up 2022 & CHF 📅 2022-01-21 - [ ] [[Finances]]: Set up 2022 & CHF 📅 2022-01-21
- [x] Set up Investments on [[hLedger]]
- [x] Explore Personal Accounting software
- [x] Consolidate financial views across geographies
- [x] Check [[Crypto Tasks|Crypto assets]]
&emsp; &emsp;
@ -189,6 +185,21 @@ hide task count
&emsp; &emsp;
### Completed to-dos
&emsp;
- [x] Set up Investments on [[hLedger]]
- [x] Explore Personal Accounting software
- [x] Consolidate financial views across geographies
- [x] Check [[Crypto Tasks|Crypto assets]]
&emsp;
---
&emsp;
### Dependencies ### Dependencies
%%🔐α GVwoQnHMhoUoG79zYoNrHATnyNt4bJAM3MoU+GZDPV4sv+ymhDKmr+g4lhplMB355WC0u+HJopXDmDyzCTMiLkjmzp0kaMuXNdXV/0leisQ+1BIKkbUu02e4VZvmCPmbajUvffUJvWSrDBYtWF2naicaaZzpUTRfdwkEZcn03ZqhO9Pv/BzrqnYf7VI/PQwmcZkToRe2kEIW34xYzY+gd9lY8ApfehMLWpyBAJCEXTZW6o7T53iPv2iAbj8PA7kzabaYta/MCGtzzSm5rGNYB0w5cE8/353/tQDgPpfakHziHPLingQLsqSZY+4= 🔐%% %%🔐α GVwoQnHMhoUoG79zYoNrHATnyNt4bJAM3MoU+GZDPV4sv+ymhDKmr+g4lhplMB355WC0u+HJopXDmDyzCTMiLkjmzp0kaMuXNdXV/0leisQ+1BIKkbUu02e4VZvmCPmbajUvffUJvWSrDBYtWF2naicaaZzpUTRfdwkEZcn03ZqhO9Pv/BzrqnYf7VI/PQwmcZkToRe2kEIW34xYzY+gd9lY8ApfehMLWpyBAJCEXTZW6o7T53iPv2iAbj8PA7kzabaYta/MCGtzzSm5rGNYB0w5cE8/353/tQDgPpfakHziHPLingQLsqSZY+4= 🔐%%

@ -70,15 +70,7 @@ All tasks and To-dos linked to IT and Computer
&emsp; &emsp;
- [x] Continue building server capabilities ✅ 2021-09-15
- [x] Find a good (&synced) [[IT & Computer#App dependencies|Calendar]] platform ✅ 2021-10-19
- [x] Set-up [[Nextcloud]]
- [x] Transfer [[Server Alias|aliases]]
- [x] Computer security: set-up [[IT & Computer#Snort|Snort]] ✅ 2021-09-15
- [x] Find a good downloading platform to replace [[IT & Computer#App dependencies|Vuze]]
- [x] Find an email Client to replace [[IT & Computer#App dependencies|Spark]] ✅ 2021-09-14
- [x] Subscribe to Obsidian Weekly round-up
&emsp; &emsp;
@ -195,6 +187,25 @@ hide task count
&emsp; &emsp;
### Completed to-dos
&emsp;
- [x] Continue building server capabilities ✅ 2021-09-15
- [x] Find a good (&synced) [[IT & Computer#App dependencies|Calendar]] platform ✅ 2021-10-19
- [x] Set-up [[Nextcloud]]
- [x] Transfer [[Server Alias|aliases]]
- [x] Computer security: set-up [[IT & Computer#Snort|Snort]] ✅ 2021-09-15
- [x] Find a good downloading platform to replace [[IT & Computer#App dependencies|Vuze]]
- [x] Find an email Client to replace [[IT & Computer#App dependencies|Spark]] ✅ 2021-09-14
- [x] Subscribe to Obsidian Weekly round-up
&emsp;
---
&emsp;
### Dependencies ### Dependencies
&emsp; &emsp;

@ -24,7 +24,7 @@ Parent:: [[@Life Organisation|Life Organisation]]
<center> <center>
<h6>Progress bar</h6> <h6>Progress bar</h6>
<progress max="100" value="75"></progress> <progress max="100" value="50"></progress>
</center> </center>
--- ---
@ -69,7 +69,20 @@ Repository of tasks and To-Dos re Utilities & Public service admin
&emsp; &emsp;
- [ ] [[Life Admin]]: Get a [[Life Admin#Swiss Mobile|CH mobile line]] 📅 2022-03-31
- [ ] [[Life Admin]]: Cancel UK mobile line 📅 2022-03-31
- [ ] [[Life Admin]]: Monitor UK naturalisation (2021-08-02) 📅 2022-02-02 - [ ] [[Life Admin]]: Monitor UK naturalisation (2021-08-02) 📅 2022-02-02
&emsp;
---
&emsp;
### Completed to-dos
&emsp;
- [x] Check Tax implication of Unemployment Benefits - [x] Check Tax implication of Unemployment Benefits
- [x] Election Register - [x] Election Register
- [x] Apply for a [[Life Admin#French ID|French ID]] - [x] Apply for a [[Life Admin#French ID|French ID]]
@ -90,5 +103,11 @@ Repository of tasks and To-Dos re Utilities & Public service admin
[Prise de rendez-vous](https://pastel.diplomatie.gouv.fr/rdvinternet/html-4.02.00/frameset/frameset.html?lcid=2&sgid=173&suid=5) [Prise de rendez-vous](https://pastel.diplomatie.gouv.fr/rdvinternet/html-4.02.00/frameset/frameset.html?lcid=2&sgid=173&suid=5)
&emsp:
#### Swiss Mobile
[Compare mobile plans: 78 deals from CHF 9.90 at comparis.ch](https://en.comparis.ch/telecom/mobile/angebote/alle-handyabos)
&emsp; &emsp;
&emsp; &emsp;

@ -70,12 +70,8 @@ Repository of Tasks & To-dos regarding life style.
&emsp; &emsp;
- [ ] [[Lifestyle]]: Re-start swimming 📅 2022-03-31 - [ ] [[Lifestyle]]: Re-start swimming 📅 2022-03-31
- [x] Stop smoking 📅 2021-12-31 ✅ 2021-12-05
- [ ] [[Lifestyle]]: Re-start [[Lifestyle#polo|Polo]] 📅 2022-06-30 - [ ] [[Lifestyle]]: Re-start [[Lifestyle#polo|Polo]] 📅 2022-06-30
- [ ] [[Lifestyle]]: Continue building [[Lifestyle#Music Library|Music Library]] 📅 2022-03-30 - [ ] [[Lifestyle]]: Continue building [[Lifestyle#Music Library|Music Library]] 📅 2022-03-30
- [x] [[Lifestyle]]: Build Movie library ✅ 2022-01-13
- [x] Organisation of holiday in France
- [x] Tattoo
&emsp; &emsp;
@ -107,6 +103,20 @@ hide task count
~~~ ~~~
``` ```
&emsp;
---
&emsp;
### Completed to-dos
&emsp;
- [x] Stop smoking 📅 2021-12-31 ✅ 2021-12-05
- [x] [[Lifestyle]]: Build Movie library ✅ 2022-01-13
- [x] Organisation of holiday in France
- [x] Tattoo
&emsp; &emsp;

@ -73,10 +73,9 @@ Keeping personal projects in check and on track.
- [ ] Refaire [[Personal projects#Chevalière|chevalière]] (Bastard & Flourville) 📅 2023-12-31 - [ ] Refaire [[Personal projects#Chevalière|chevalière]] (Bastard & Flourville) 📅 2023-12-31
- [ ] Continuer à construire un petit trousseau d'[[Personal projects#art|art]] 📅 2023-02-21 - [ ] Continuer à construire un petit trousseau d'[[Personal projects#art|art]] 📅 2023-02-21
- [ ] Caligraph & frame life mementos - [ ] Caligraph & frame life mementos 📅 2023-06-30
- [ ] Continue [[@lebv.org Tasks|lebv.org]] 📅 2022-06-28 - [ ] Continue [[@lebv.org Tasks|lebv.org]] 📅 2022-06-28
- [ ] Acheter une [[Voitures|voiture]] ⏳ 2022-03-31 📅 2022-12-31 - [ ] Acheter une [[Voitures|voiture]] ⏳ 2022-03-31 📅 2022-12-31
- [x] Post-hiring life hacks ✅ 2021-12-05
&emsp; &emsp;
@ -145,6 +144,18 @@ hide task count
&emsp; &emsp;
### Completed to-dos
&emsp;
- [x] Post-hiring life hacks ✅ 2021-12-05
&emsp;
---
&emsp;
### Dependencies ### Dependencies
&emsp; &emsp;

@ -98,7 +98,8 @@ style: number
&emsp; &emsp;
- [ ] :birthday: **[[Jérôme Bédier|Jérôme]]** 🔁 every year 📅 2022-01-14 - [ ] :birthday: **[[Jérôme Bédier|Jérôme]]** 🔁 every year 📅 2023-01-14
- [x] :birthday: **[[Jérôme Bédier|Jérôme]]** 🔁 every year 📅 2022-01-14 ✅ 2022-01-14
&emsp; &emsp;
&emsp; &emsp;

@ -42,6 +42,14 @@ id CreateNote
```button ```button
name Save name Save
type command type command

@ -0,0 +1,141 @@
---
ServingSize: 4
cssclass: recipeTable
Tag: ["Healthy", "Nuts", "NotYetTested"]
Date: 2021-09-21
DocType: "Recipe"
Hierarchy: "NonRoot"
location: [51.514678599999996, -0.18378583926867909]
CollapseMetaTable: Yes
Meta:
IsFavourite: False
Rating: 4
Recipe:
Courses: "Side dish"
Categories: "Vegetable"
Collections: "Mexican"
Source: https://www.bonappetit.com/recipe/cauliflower-tacos-with-cashew-crema
PreparationTime:
CookingTime: 60
OServingSize: 4
Ingredients:
- 1 green chile (such as serrano), finely grated
- 4 clove garlic, finely grated
- 0.25 cup cashew or almond butter
- 3 Tbsp. fresh lime juice
- 1 pinch Kosher salt
- 0.25 cup grapeseed or vegetable oil
- 2 tsp. ground cumin
- 2 tsp. smoked paprika
- 2 whole medium heads of cauliflower, cut into 1"2" florets
- 1 whole small white onion, thinly sliced
---
Parent:: [[@@Recipes|Recipes]], [[@Side dishes|Side dishes]]
---
&emsp;
```button
name Edit Recipe parameters
type command
action MetaEdit: Run MetaEdit
id EditMetaData
```
^button-CauliflowerwithCashewCremaEdit
```button
name Save
type command
action Save current file
id Save
```
^button-CauliflowerwithCashewCremaNSave
&emsp;
# Cauliflower with Cashew Crema
&emsp;
```toc
style: number
```
&emsp;
---
&emsp;
### Practical Informations
| |
|-|-
**Courses**: | `$=dv.current().Recipe.Courses`
**Categories**: | `$=dv.current().Recipe.Categories`
**Collections**: | `$=dv.current().Recipe.Collections`
**Serving size**: | `$=dv.current().ServingSize`
**Cooking time**: | `$=dv.current().Recipe.CookingTime` min
&emsp;
---
&emsp;
### Ingredients
&emsp;
```dataviewjs
dv.view("00.01 Admin/dv-views/query_ingredient", {ingredients: dv.current().Ingredients, originalportioncount: dv.current().Recipe.OServingSize})
```
&emsp;
---
&emsp;
### Instructions
&emsp;
#### Step 1
Using a fork, mix chile, garlic, cashew butter, lime juice, and 3 Tbsp. water in a small bowl to combine; season with salt. Set aside.
&emsp;
#### Step 2
Place a rack in lowest position; preheat oven to 450°. Stir garlic, oil, cumin, and paprika in a small bowl to combine. Arrange cauliflower on a rimmed baking sheet and pour spiced oil over. Season with salt and toss to evenly coat cauliflower. Roast, undisturbed, until dark brown and crisp on the bottom, 1520 minutes. Remove from oven and turn florets over. Continue to roast until second side is dark brown and crisp, 1520 minutes longer.
&emsp;
#### Step 3
Heat a large skillet over medium-high. Working in batches, toast tortillas in a single layer, turning halfway through, until warmed through, about 1 minute total. Transfer to plates.
&emsp;
#### Step 4
Spread each tortilla with some reserved sauce; top with cauliflower. Garnish with onion, avocado, radishes, and cilantro. Serve with lime wedges for squeezing over.
&emsp;
```ad-tip
title: Serving tip
Serve with sliced avocado, sliced radishes, cilantro leaves with tender stems, and lime wedges.
```
&emsp;
&emsp;

@ -0,0 +1,144 @@
---
ServingSize: 4
cssclass: recipeTable
Tag: ["Healthy", "NotYetTested"]
Date: 2021-09-21
DocType: "Recipe"
Hierarchy: "NonRoot"
location: [51.514678599999996, -0.18378583926867909]
CollapseMetaTable: Yes
Meta:
IsFavourite: False
Rating:
Recipe:
Courses: "Main dish"
Categories: "Fish"
Collections: "Middle Eastern"
Source: https://www.bonappetit.com/recipe/crispy-salmon-with-bulgur
PreparationTime:
CookingTime: 25
OServingSize: 4
Ingredients:
- 1 cup medium-grind bulgur
- 0.25 cup chopped dill
- 3 Tbsp. plus ¼ cup extra-virgin olive oil, divided
- 1 pinch Kosher salt, freshly ground pepper
- 1 whole small shallot, finely chopped
- 0.25 cup apple cider vinegar
- 0.25 cup sour cream
- 0.25 cup whole grain or Dijon mustard
- 4 whole 6-oz. skin-on salmon fillets
- 1 whole large fennel bulb, shaved ona mandoline or thinly sliced
- 8 whole radishes, trimmed, shaved on a mandoline or thinly sliced
---
Parent:: [[@@Recipes|Recipes]], [[@Main dishes|Main dishes]]
---
&emsp;
```button
name Edit Recipe parameters
type command
action MetaEdit: Run MetaEdit
id EditMetaData
```
^button-CrispySalmonwithBulgurEdit
```button
name Save
type command
action Save current file
id Save
```
^button-CrispySalmonwithBulgurNSave
&emsp;
# Crispy Salmon with Bulgur
&emsp;
```toc
style: number
```
&emsp;
---
&emsp;
### Practical Informations
| |
|-|-
**Courses**: | `$=dv.current().Recipe.Courses`
**Categories**: | `$=dv.current().Recipe.Categories`
**Collections**: | `$=dv.current().Recipe.Collections`
**Serving size**: | `$=dv.current().ServingSize`
**Cooking time**: | `$=dv.current().Recipe.CookingTime` min
&emsp;
---
&emsp;
### Ingredients
&emsp;
```dataviewjs
dv.view("00.01 Admin/dv-views/query_ingredient", {ingredients: dv.current().Ingredients, originalportioncount: dv.current().Recipe.OServingSize})
```
&emsp;
---
&emsp;
### Instructions
&emsp;
```ad-tip
title: Dressing
**Do ahead:** Dressing can be made 3 days ahead. Cover and chill.
```
&emsp;
#### Step 1
Bring 1 cup water to a boil in a small saucepan. Remove from heat and immediately add bulgur. Cover pan and let sit until bulgur is tender, about 10 minutes. Drain off excess water, then mix in dill and 2 Tbsp. oil. Season with salt and pepper.
&emsp;
#### Step 2
Meanwhile, whisk shallot, vinegar, sour cream, mustard, and ¼ cup oil in a small bowl until smooth; season dressing with salt. Set aside.
&emsp;
#### Step 3
Heat remaining 1 Tbsp. oil in a large nonstick skillet over medium-high. Season salmon with salt and arrange skin side down in skillet. Reduce heat to medium and cook, pressing down gently on fish, until skin is golden brown and crisp, 68 minutes. Turn fillets over and cook until just cooked through, about 3 minutes. Transfer to a large plate, arranging skin side up.
&emsp;
#### Step 4
Combine fennel and radishes in a large bowl. Drizzle reserved dressing over to suit your taste (you wont need all of it) and toss to coat. Season with more salt if needed.
&emsp;
#### Step 5
To serve, spoon bulgur among plates, dividing evenly, and top each with a salmon fillet and fennel and radish salad.
&emsp;

@ -0,0 +1,154 @@
---
ServingSize: 4
cssclass: recipeTable
Tag: ["Healthy", "NotYetTested"]
Date: 2021-09-21
DocType: "Recipe"
Hierarchy: "NonRoot"
location: [51.514678599999996, -0.18378583926867909]
CollapseMetaTable: Yes
Meta:
IsFavourite: False
Rating:
Recipe:
Courses: "Side dish"
Categories: "Vegetable"
Collections: "Asian"
Source: https://www.bonappetit.com/recipe/kung-pao-cauliflower
PreparationTime:
CookingTime: 30
OServingSize: 4
Ingredients:
- 2 tablespoons Chinese rice wine or dry sherry
- 2 teaspoons cornstarch
- 1 tablespoon plus 2 teaspoons soy sauce
- 1 tablespoon sherry vinegar
- 2 teaspoons hoisin sauce
- 2 teaspoons sugar
- 1 teaspoon toasted sesame oil
- 1 whole medium head of cauliflower
- 2 tablespoons vegetable oil, divided
- 3 ounces slab or thick-cut bacon, chopped
- 6 dried japones chiles, chiles de árbol, or other red chiles
- 1 teaspoon Sichuan peppercorns or ½ teaspoon cracked black peppercorns
- 3 whole scallions, dark-green and white parts separated, thinly sliced
- 1 whole serrano chile, sliced
- 1 whole 1-inch piece ginger, peeled, finely chopped
- 2 cloves garlic, sliced
- 0.25 cup unsalted, roasted peanuts
- 1 pinch Kosher salt
---
Parent:: [[@@Recipes|Recipes]], [[@Side dishes|Side dishes]]
---
&emsp;
```button
name Edit Recipe parameters
type command
action MetaEdit: Run MetaEdit
id EditMetaData
```
^button-KungPaoCauliflowerEdit
```button
name Save
type command
action Save current file
id Save
```
^button-KungPaoCauliflowerNSave
&emsp;
# Kung Pao Cauliflower
&emsp;
```toc
style: number
```
&emsp;
---
&emsp;
### Practical Informations
| |
|-|-
**Courses**: | `$=dv.current().Recipe.Courses`
**Categories**: | `$=dv.current().Recipe.Categories`
**Collections**: | `$=dv.current().Recipe.Collections`
**Serving size**: | `$=dv.current().ServingSize`
**Cooking time**: | `$=dv.current().Recipe.CookingTime` min
&emsp;
---
&emsp;
### Ingredients
&emsp;
```dataviewjs
dv.view("00.01 Admin/dv-views/query_ingredient", {ingredients: dv.current().Ingredients, originalportioncount: dv.current().Recipe.OServingSize})
```
&emsp;
---
&emsp;
### Instructions
&emsp;
#### Step 1
Stir wine, cornstarch, and 1 Tbsp. soy sauce in a medium bowl; set marinade aside.
&emsp;
#### Step 2
Stir vinegar, hoisin sauce, sugar, sesame oil, and remaining 2 tsp. soy sauce in a small bowl; set sauce aside.
&emsp;
#### Step 3
Remove leaves and cut cauliflower into medium florets. Trim woody end of stalk and discard, then cut stalk into ½"-thick pieces. Heat 1 Tbsp. vegetable oil in a wok or large cast-iron skillet over medium-high. Cook cauliflower, tossing occasionally, until browned in places and beginning to soften, 79 minutes. Give reserved marinade a stir to reincorporate cornstarch and add cauliflower to bowl; toss to coat. Toss occasionally while you cook the bacon.
&emsp;
#### Step 4
Reduce heat to medium. Cook bacon and remaining 1 Tbsp. vegetable oil in wok, stirring often, until bacon is browned and crisp, about 5 minutes. Add dried chiles and peppercorns and cook, tossing, just until fragrant (be careful not to burn), about 30 seconds. Transfer bacon, chiles, and peppercorns to a plate, leaving bacon drippings behind.
&emsp;
#### Step 5
Return cauliflower to wok with a slotted spoon; discard excess marinade. Cook cauliflower, tossing occasionally, until charred in spots and crisp-tender (short of scorching it, dont worry about letting it go pretty dark), 810 minutes. Add scallion whites, serrano chile, ginger, garlic, peanuts, and reserved sauce and cook, tossing often, until fragrant and cauliflower is tender, about 2 minutes. Add bacon mixture and cook, tossing, just until sauce coats cauliflower, about 1 minute; season with salt.
&emsp;
#### Step 6
Transfer to a platter and top with scallion greens. Serve with rice alongside.
&emsp;
&emsp;

@ -0,0 +1,134 @@
---
ServingSize: 4
cssclass: recipeTable
Tag: ["Healthy", "NotYetTested"]
Date: 2021-09-21
DocType: "Recipe"
Hierarchy: "NonRoot"
location: [51.514678599999996, -0.18378583926867909]
CollapseMetaTable: Yes
Meta:
IsFavourite: False
Rating:
Recipe:
Courses: "Side dish"
Categories: "Vegetable"
Collections: "Asian"
Source: https://www.bonappetit.com/recipe/sticky-and-spicy-baked-cauliflower
PreparationTime:
CookingTime: 50
OServingSize: 4
Ingredients:
- 1 cup all-purpose flour
- 0.5 cup cornstarch
- 2 tsp. baking powder
- 0.5 tsp. Morton kosher salt
- 1 whole large head of cauliflower (about 2½ lb.), cut into large florets
- 0.25 cup gochujang (Korean hot pepper paste)
- 3 Tbsp. soy sauce
- 2 Tbsp. pure maple syrup
- 2 Tbsp. mirin
- 2 tsp. unseasoned rice vinegar
---
Parent:: [[@@Recipes|Recipes]], [[@Side dishes|Side dishes]]
---
&emsp;
```button
name Edit Recipe parameters
type command
action MetaEdit: Run MetaEdit
id EditMetaData
```
^button-StickySpicyBakedCauliflowerEdit
```button
name Save
type command
action Save current file
id Save
```
^button-StickySpicyBakedCauliflowerNSave
&emsp;
# Sticky & Spicy Baked Cauliflower
&emsp;
```toc
style: number
```
&emsp;
---
&emsp;
### Practical Informations
| |
|-|-
**Courses**: | `$=dv.current().Recipe.Courses`
**Categories**: | `$=dv.current().Recipe.Categories`
**Collections**: | `$=dv.current().Recipe.Collections`
**Serving size**: | `$=dv.current().ServingSize`
**Cooking time**: | `$=dv.current().Recipe.CookingTime` min
&emsp;
---
&emsp;
### Ingredients
&emsp;
```dataviewjs
dv.view("00.01 Admin/dv-views/query_ingredient", {ingredients: dv.current().Ingredients, originalportioncount: dv.current().Recipe.OServingSize})
```
&emsp;
---
&emsp;
### Instructions
&emsp;
#### Step 1
Preheat oven to 400°. Whisk flour, cornstarch, baking powder, and salt in a large bowl to combine. Whisk in 1 cup water to create a thin pancake-like batter (you may need to add more water to achieve the right consistency). Using your hand or 2 forks and working one at a time, dip cauliflower florets into batter, letting excess drip back into bowl, and divide between 2 parchment-lined rimmed baking sheets. Bake cauliflower until edges are just beginning to turn golden brown, 2025 minutes.
&emsp;
#### Step 2
Meanwhile, whisk gochujang, soy sauce, maple syrup, mirin, and 1 cup water in a medium bowl. Pour sauce into a skillet large enough to hold all of the cauliflower florets (a 12" skillet should do it) and bring to a simmer over medium heat, whisking occasionally. Cook, whisking, until sauce is thick enough to coat a spoon, 810 minutes. Stir in vinegar and remove pan from heat.
&emsp;
#### Step 3
Using tongs, transfer cauliflower to skillet with glaze and toss until florets are evenly coated in sauce.
&emsp;
#### Step 4
Divide rice among shallow bowls and spoon cauliflower over. Top with sesame seeds and scallions.
&emsp;
&emsp;

@ -197,7 +197,8 @@ The following Apps require a manual backup:
- [x] [[Storage and Syncing|Storage & Sync]]: Backup Volumes to [[Sync|Sync.com]] 🔁 every 3 months on the 2nd Monday 📅 2021-12-01 ✅ 2022-01-08 - [x] [[Storage and Syncing|Storage & Sync]]: Backup Volumes to [[Sync|Sync.com]] 🔁 every 3 months on the 2nd Monday 📅 2021-12-01 ✅ 2022-01-08
- [x] [[Storage and Syncing|Storage & Sync]]: Backup Volumes to [[Sync|Sync.com]] 🔁 every 3 months on the 2nd Monday 📅 2021-09-16 ✅ 2021-10-16 - [x] [[Storage and Syncing|Storage & Sync]]: Backup Volumes to [[Sync|Sync.com]] 🔁 every 3 months on the 2nd Monday 📅 2021-09-16 ✅ 2021-10-16
- [x] Backup Volumes to [[Sync|Sync.com]] 🔁 every 3 months on the 2nd Monday ✅ 2021-09-15 - [x] Backup Volumes to [[Sync|Sync.com]] 🔁 every 3 months on the 2nd Monday ✅ 2021-09-15
- [ ] [[Storage and Syncing|Storage & Sync]]: Transfer pictures to ED 🔁 every 3 months on the 2nd Thursday 📅 2022-01-14 - [ ] [[Storage and Syncing|Storage & Sync]]: Transfer pictures to ED 🔁 every 3 months on the 2nd Thursday 📅 2022-04-15
- [x] [[Storage and Syncing|Storage & Sync]]: Transfer pictures to ED 🔁 every 3 months on the 2nd Thursday 📅 2022-01-14 ✅ 2022-01-14
- [x] [[Storage and Syncing|Storage & Sync]]: Transfer pictures to ED 🔁 every 3 months on the 2nd Thursday 📅 2021-10-20 ✅ 2022-01-08 - [x] [[Storage and Syncing|Storage & Sync]]: Transfer pictures to ED 🔁 every 3 months on the 2nd Thursday 📅 2021-10-20 ✅ 2022-01-08
- [x] [[Storage and Syncing|Storage & Sync]]: Transfer pictures to ED 🔁 every 3 months on the 2nd Thursday ✅ 2021-10-19 - [x] [[Storage and Syncing|Storage & Sync]]: Transfer pictures to ED 🔁 every 3 months on the 2nd Thursday ✅ 2021-10-19

@ -6,7 +6,7 @@ Date: 2021-08-17
DocType: "Investment" DocType: "Investment"
Hierarchy: "NonRoot" Hierarchy: "NonRoot"
location: [47.1644093,8.5153325] location: [47.1644093,8.5153325]
TimeStamp: 2022-01-12 TimeStamp: 2022-01-14
Investment: Investment:
Type: "Crypto" Type: "Crypto"
Style: "Growth" Style: "Growth"
@ -15,7 +15,7 @@ Investment:
Trading: Trading:
PDate: 2021-03-22 PDate: 2021-03-22
PPrice: 8.007 PPrice: 8.007
LPrice: 9.18 LPrice: 8.28
CollapseMetaTable: yes CollapseMetaTable: yes
--- ---
@ -98,7 +98,7 @@ The token itself has limited use cases hence its high dependence on mass adoptio
```ad-product ```ad-product
title: Price update title: Price update
ANT:USD price = 9.18, volume = 10,536.62, change = 0.04 on 2022-01-12T23:03:02 ANT:USD price = 8.28, volume = 19,334.89, change = -0.12 on 2022-01-14T17:39:02
``` ```
ANT is the token that gives rights to participate in the governance of Aragon, a DAO itself. It is understood that users of Aragon solutions would want a share of the decision-making on the future of the service and price should therefore be correlated to adoption. ANT is the token that gives rights to participate in the governance of Aragon, a DAO itself. It is understood that users of Aragon solutions would want a share of the decision-making on the future of the service and price should therefore be correlated to adoption.

@ -5,7 +5,7 @@ Tag: ["Infrastructure", "Bridge", "Investment"]
Date: 2021-08-17 Date: 2021-08-17
DocType: "Investment" DocType: "Investment"
Hierarchy: "NonRoot" Hierarchy: "NonRoot"
TimeStamp: 2022-01-12 TimeStamp: 2022-01-14
location: [19.2824849, -81.24453276644255] location: [19.2824849, -81.24453276644255]
Investment: Investment:
Type: "Crypto" Type: "Crypto"
@ -15,7 +15,7 @@ Investment:
Trading: Trading:
PDate: 2021-03-06 PDate: 2021-03-06
PPrice: 28.68538 PPrice: 28.68538
LPrice: 26.63 LPrice: 24.74
CollapseMetaTable: yes CollapseMetaTable: yes
--- ---
@ -99,7 +99,7 @@ Maturing project with Institutional buying support.
```ad-product ```ad-product
title: Price update title: Price update
LINK:USD price = 26.63, volume = 4,040,879.63, change = -0.05 on 2022-01-12T23:04:02 LINK:USD price = 24.74, volume = 4,128,244.11, change = -0.01 on 2022-01-14T17:40:02
``` ```
The LINK token is the utility token of the network (i.e. the mean of exchange of information and gas fees) linking its value to the traffic in the network and therefore adoption. The LINK token is the utility token of the network (i.e. the mean of exchange of information and gas fees) linking its value to the traffic in the network and therefore adoption.

@ -24,7 +24,7 @@ Parent:: [[@Investment Task master|Tasks for Investments]], [[Crypto Investments
<center> <center>
<h6>Progress bar</h6> <h6>Progress bar</h6>
<progress max="100" value="43"></progress> <progress max="100" value="57"></progress>
</center> </center>
--- ---
@ -71,7 +71,22 @@ All tasks and to-dos Crypto-related.
[[#^Top|TOP]] [[#^Top|TOP]]
&emsp; &emsp;
- [ ] [[Crypto Tasks#internet alerts|monitor Crypto news and publications]] 🔁 every week on Friday 📅 2022-01-14 - [ ] [[Crypto Tasks#internet alerts|monitor Crypto news and publications]] 🔁 every week on Friday 📅 2022-01-21
- [ ] Vote for [[EOS]] block producers 🔁 every month on the 1st Tuesday
- [ ] Check [[Nimbus]] earnings 🔁 every month on the 2nd Monday
- [ ] Find staking for [[Aragon]]
&emsp;
---
&emsp;
### Completed to-dos
&emsp;
- [x] [[Crypto Tasks#internet alerts|monitor Crypto news and publications]] 🔁 every week on Friday 📅 2022-01-15 ✅ 2022-01-14
- [x] [[Crypto Tasks#internet alerts|monitor Crypto news and publications]] 🔁 every week on Friday 📅 2022-01-07 ✅ 2022-01-08 - [x] [[Crypto Tasks#internet alerts|monitor Crypto news and publications]] 🔁 every week on Friday 📅 2022-01-07 ✅ 2022-01-08
- [x] [[Crypto Tasks#internet alerts|monitor Crypto news and publications]] 🔁 every week on Friday 📅 2021-12-31 ✅ 2021-12-31 - [x] [[Crypto Tasks#internet alerts|monitor Crypto news and publications]] 🔁 every week on Friday 📅 2021-12-31 ✅ 2021-12-31
- [x] [[Crypto Tasks#internet alerts|monitor Crypto news and publications]] 🔁 every week on Friday 📅 2021-12-24 ✅ 2021-12-24 - [x] [[Crypto Tasks#internet alerts|monitor Crypto news and publications]] 🔁 every week on Friday 📅 2021-12-24 ✅ 2021-12-24
@ -89,14 +104,15 @@ All tasks and to-dos Crypto-related.
- [x] [[Crypto Tasks#internet alerts|monitor Crypto news and publications]] 🔁 every week on Friday 📅 2021-10-01 ✅ 2021-10-01 - [x] [[Crypto Tasks#internet alerts|monitor Crypto news and publications]] 🔁 every week on Friday 📅 2021-10-01 ✅ 2021-10-01
- [x] [[Crypto Tasks#internet alerts|monitor Crypto news and publications]] 🔁 every week on Friday ✅ 2021-09-24 - [x] [[Crypto Tasks#internet alerts|monitor Crypto news and publications]] 🔁 every week on Friday ✅ 2021-09-24
- [x] Monitor [[Crypto Tasks#Storj|Storj]] (Blockchain storage) ✅ 2021-09-14 - [x] Monitor [[Crypto Tasks#Storj|Storj]] (Blockchain storage) ✅ 2021-09-14
- [ ] Monitor [[Crypto Tasks#GuardTime|GuardTime]], [[Crypto Tasks#Paxos|Paxos]] (Equity with proprietary Blockchain solutions for Defence or Private purposes) - [x] Monitor [[Crypto Tasks#GuardTime|GuardTime]], [[Crypto Tasks#Paxos|Paxos]] (Equity with proprietary Blockchain solutions for Defence or Private purposes) ✅ 2022-01-14
- [ ] Vote for [[EOS]] block producers 🔁 every month on the 1st Tuesday - [x] Vote for [[EOS]] block producers 🔁 every month on the 1st Tuesday ✅ 2022-01-14
- [ ] Check [[Nimbus]] earnings 🔁 every month on the 2nd Monday - [x] Vote for [[EOS]] block producers 🔁 every month on the 1st Tuesday ✅ 2022-01-14
- [ ] Find staking for [[Aragon]] - [x] Check [[Nimbus]] earnings 🔁 every month on the 2nd Monday ✅ 2022-01-14
- [x] Find staking for [[Ocean Protocol|OCEAN]] ✅ 2021-09-21 - [x] Find staking for [[Ocean Protocol|OCEAN]] ✅ 2021-09-21
- [x] Geo-tag HQ of investment - [x] Geo-tag HQ of investment
- [x] Tokenomics section - [x] Tokenomics section
&emsp; &emsp;
--- ---

@ -5,7 +5,7 @@ Tag: ["Blockchain", "Infrastructure", "ESG", "Investment"]
Date: 2021-08-17 Date: 2021-08-17
DocType: "Investment" DocType: "Investment"
Hierarchy: "NonRoot" Hierarchy: "NonRoot"
TimeStamp: 2022-01-12 TimeStamp: 2022-01-14
location: [19.2953549, -81.3807776] location: [19.2953549, -81.3807776]
Investment: Investment:
Type: "Crypto" Type: "Crypto"
@ -15,7 +15,7 @@ Investment:
Trading: Trading:
PDate: 2021-03-06 PDate: 2021-03-06
PPrice: 4.57 PPrice: 4.57
LPrice: 2.88 LPrice: 2.87
CollapseMetaTable: yes CollapseMetaTable: yes
--- ---
@ -110,7 +110,7 @@ It is also the first Blockchain technology to advertise a 'Carbon-Neutral' footp
```ad-product ```ad-product
title: Price update title: Price update
EOS:USD price = 2.88, volume = 10,540,042.02, change = -0.01 on 2022-01-12T23:10:03 EOS:USD price = 2.87, volume = 12,067,328.17, change = 0.01 on 2022-01-14T17:41:02
``` ```
EOS is the utility token powering the mainnet. It is used to 'buy' RAM on the blockchain, by buying EOS. Each individual or instance receive RAM priority in accordance to the number of tokens they hold. EOS is the utility token powering the mainnet. It is used to 'buy' RAM on the blockchain, by buying EOS. Each individual or instance receive RAM priority in accordance to the number of tokens they hold.

@ -5,7 +5,7 @@ Tag: ["NFT", "Gaming", "ESG", "Investment"]
Date: 2021-08-17 Date: 2021-08-17
DocType: "Investment" DocType: "Investment"
Hierarchy: "NonRoot" Hierarchy: "NonRoot"
TimeStamp: 2022-01-12 TimeStamp: 2022-01-14
location: [1.2813384, 103.85091665] location: [1.2813384, 103.85091665]
Investment: Investment:
Type: "Crypto" Type: "Crypto"
@ -15,7 +15,7 @@ Investment:
Trading: Trading:
PDate: 2021-03-08 PDate: 2021-03-08
PPrice: 1.9 PPrice: 1.9
LPrice: 2.56 LPrice: 2.41
CollapseMetaTable: yes CollapseMetaTable: yes
--- ---
@ -100,7 +100,7 @@ Adoption and competition risk are high; even higher since NFT have made the head
```ad-product ```ad-product
title: Price update title: Price update
ENJ:USD price = 2.56, volume = 11,794,408.55, change = 0.05 on 2022-01-12T23:08:01 ENJ:USD price = 2.41, volume = 12,825,556.08, change = 0.00 on 2022-01-14T17:40:02
``` ```
The ENJ token represents the utility token of Enjin, which primary aim is to mint NFTs for gaming and artistic purposes. Circulation and availability is deemed to decrease as that token represents the reserve value of each NFT minted. The ENJ token represents the utility token of Enjin, which primary aim is to mint NFTs for gaming and artistic purposes. Circulation and availability is deemed to decrease as that token represents the reserve value of each NFT minted.

@ -71,7 +71,19 @@ Note summarising all tasks and to-dos for Listed Equity investments.
[[#^Top|TOP]] [[#^Top|TOP]]
&emsp; &emsp;
- [ ] [[Equity Tasks#internet alerts|monitor Equity news and publications]] 🔁 every week on Friday 📅 2022-01-14 - [ ] [[Equity Tasks#internet alerts|monitor Equity news and publications]] 🔁 every week on Friday 📅 2022-01-21
&emsp;
---
&emsp;
### Completed to-dos
&emsp;
- [x] [[Equity Tasks#internet alerts|monitor Equity news and publications]] 🔁 every week on Friday 📅 2022-01-14 ✅ 2022-01-14
- [x] [[Equity Tasks#internet alerts|monitor Equity news and publications]] 🔁 every week on Friday 📅 2022-01-07 ✅ 2022-01-08 - [x] [[Equity Tasks#internet alerts|monitor Equity news and publications]] 🔁 every week on Friday 📅 2022-01-07 ✅ 2022-01-08
- [x] [[Equity Tasks#internet alerts|monitor Equity news and publications]] 🔁 every week on Friday 📅 2021-12-31 ✅ 2021-12-31 - [x] [[Equity Tasks#internet alerts|monitor Equity news and publications]] 🔁 every week on Friday 📅 2021-12-31 ✅ 2021-12-31
- [x] [[Equity Tasks#internet alerts|monitor Equity news and publications]] 🔁 every week on Friday 📅 2021-12-24 ✅ 2021-12-24 - [x] [[Equity Tasks#internet alerts|monitor Equity news and publications]] 🔁 every week on Friday 📅 2021-12-24 ✅ 2021-12-24

@ -5,7 +5,7 @@ Tag: ["Blockchain", "Infrastructure", "ESG", "Investment"]
Date: 2021-08-17 Date: 2021-08-17
DocType: "Investment" DocType: "Investment"
Hierarchy: "NonRoot" Hierarchy: "NonRoot"
TimeStamp: 2022-01-12 TimeStamp: 2022-01-14
location: [36.14231564218552, -5.352527091457547] location: [36.14231564218552, -5.352527091457547]
Investment: Investment:
Type: "Crypto" Type: "Crypto"
@ -100,7 +100,7 @@ The technology is sufficiently disruptive for growing significantly over the nex
```ad-product ```ad-product
title: Price update title: Price update
HOT:USD price = 0.01, volume = 848,587,100.00, change = 0.00 on 2022-01-12T23:12:02 HOT:USD price = 0.01, volume = 866,968,767.33, change = 0.00 on 2022-01-14T17:42:02
``` ```
HOT is an ERC20 placeholder for the native Holofuel and its value currently fluctuates with investors' interests in the project. The native token price should be relatively stable and be mostly used to buy/sell storage and RAM through self-hosting. HOT is an ERC20 placeholder for the native Holofuel and its value currently fluctuates with investors' interests in the project. The native token price should be relatively stable and be mostly used to buy/sell storage and RAM through self-hosting.

@ -5,7 +5,7 @@ Tag: ["Data", "Industrial", "Marketplace", "AI"]
Date: 2021-08-17 Date: 2021-08-17
DocType: "Investment" DocType: "Investment"
Hierarchy: "NonRoot" Hierarchy: "NonRoot"
TimeStamp: 2022-01-12 TimeStamp: 2022-01-14
location: [1.336245, 103.8866274] location: [1.336245, 103.8866274]
Investment: Investment:
Type: "Crypto" Type: "Crypto"
@ -15,7 +15,7 @@ Investment:
Trading: Trading:
PDate: 2021-03-15 PDate: 2021-03-15
PPrice: 1.47497 PPrice: 1.47497
LPrice: 0.79 LPrice: 0.76
CollapseMetaTable: yes CollapseMetaTable: yes
--- ---
@ -99,7 +99,7 @@ The token itself has little utility beyond powering the marketplace and therefor
```ad-product ```ad-product
title: Price update title: Price update
OCEAN:USD price = 0.79, volume = 97,672.32, change = 0.00 on 2022-01-12T23:15:02 OCEAN:USD price = 0.76, volume = 126,444.59, change = 0.00 on 2022-01-14T17:43:02
``` ```
The OCEAN token powers the marketplace and will benefit from generated transactions and adoption. However, the token appears to be a simple currency mean and therefore may not hold an intrinsic value. Instead, token holders are encouraged to participate in liquidity pools between dataset-specific tokens and OCEAN to guarantee the liquidity of dataset-linked currencies and increase wealth through staking. The OCEAN token powers the marketplace and will benefit from generated transactions and adoption. However, the token appears to be a simple currency mean and therefore may not hold an intrinsic value. Instead, token holders are encouraged to participate in liquidity pools between dataset-specific tokens and OCEAN to guarantee the liquidity of dataset-linked currencies and increase wealth through staking.

@ -5,7 +5,7 @@ Tag: ["Infrastructure", "Bridge", "Investment"]
Date: 2021-08-17 Date: 2021-08-17
DocType: "Investment" DocType: "Investment"
Hierarchy: "NonRoot" Hierarchy: "NonRoot"
TimeStamp: 2022-01-12 TimeStamp: 2022-01-14
location: [47.1644093,8.5153325] location: [47.1644093,8.5153325]
Investment: Investment:
Type: "Crypto" Type: "Crypto"
@ -15,7 +15,7 @@ Investment:
Trading: Trading:
PDate: 2021-03-15 PDate: 2021-03-15
PPrice: 34.52 PPrice: 34.52
LPrice: 27.37 LPrice: 27.21
CollapseMetaTable: yes CollapseMetaTable: yes
--- ---
@ -100,7 +100,7 @@ The main risk today lies in the supply side and so-called Inflation, which in th
```ad-product ```ad-product
title: Price update title: Price update
DOT:USD price = 27.37, volume = 7,072,021.25, change = 0.03 on 2022-01-12T23:16:02 DOT:USD price = 27.21, volume = 8,755,718.32, change = 0.00 on 2022-01-14T17:43:02
``` ```
DOT is the utility token of the Bridge and will therefore benefit from traffic, adoption and use. DOT is the utility token of the Bridge and will therefore benefit from traffic, adoption and use.

@ -71,7 +71,20 @@ Tasks and to-dos for VC investments.
[[#^Top|TOP]] [[#^Top|TOP]]
&emsp; &emsp;
- [ ] [[VC Tasks#internet alerts|monitor VC news and publications]] 🔁 every week on Friday 📅 2022-01-14 - [ ] [[VC Tasks#internet alerts|monitor VC news and publications]] 🔁 every week on Friday 📅 2022-01-21
- [ ] Integrate 'Current Valuations' in note
&emsp;
---
&emsp;
### Completed to-dos
&emsp;
- [x] [[VC Tasks#internet alerts|monitor VC news and publications]] 🔁 every week on Friday 📅 2022-01-15 ✅ 2022-01-14
- [x] [[VC Tasks#internet alerts|monitor VC news and publications]] 🔁 every week on Friday 📅 2022-01-07 ✅ 2022-01-08 - [x] [[VC Tasks#internet alerts|monitor VC news and publications]] 🔁 every week on Friday 📅 2022-01-07 ✅ 2022-01-08
- [x] [[VC Tasks#internet alerts|monitor VC news and publications]] 🔁 every week on Friday 📅 2021-12-31 ✅ 2021-12-31 - [x] [[VC Tasks#internet alerts|monitor VC news and publications]] 🔁 every week on Friday 📅 2021-12-31 ✅ 2021-12-31
- [x] [[VC Tasks#internet alerts|monitor VC news and publications]] 🔁 every week on Friday 📅 2021-12-24 ✅ 2021-12-24 - [x] [[VC Tasks#internet alerts|monitor VC news and publications]] 🔁 every week on Friday 📅 2021-12-24 ✅ 2021-12-24
@ -91,11 +104,6 @@ Tasks and to-dos for VC investments.
- [x] download Tax status of [[QED Naval]] ✅ 2021-10-01 - [x] download Tax status of [[QED Naval]] ✅ 2021-10-01
- [x] Geo-tag HQ of investment - [x] Geo-tag HQ of investment
- [x] Give context on [[Le Miel de Paris]] - [x] Give context on [[Le Miel de Paris]]
- [ ] Integrate 'Current Valuations' in note
&emsp;
---
&emsp; &emsp;

Loading…
Cancel
Save