// Create a daily Habit Tracking visualization in Obsidian
// Requires Dataview plugin
// Scans dayly notes for individual tasks recorded as children of habit property in front matter
dv.header(2,"Daily Habit Tracker");
// Returns the currently tracked Habits from the most recent daily note
// (assumes files are named by date)
let currentHabits = () => dv.array( dv.pages('"_Daily/day"')
.filter(d => d.Habits))
.sort(d => d.file.name, 'desc')[0]['Habits']
// Array of Habit titles
let keys = Object.keys(currentHabits())
// Optional text to icon dictionary for headings
let prettyHeadings = {
Journal: "🖍",
Minfulness: "🧘",
Exercise: "💪",
Read: "🤓",
Vitmins: "💊"
}
// Returns Array of habit names translated to any icon dictionary matches
let prettifyHeading = (arr) => {
let newArr = [...arr]
return newArr.map( v => prettyHeadings[v] ?? v)
}
// Returns array with link to day file and values for that days habits
let dayResults = (d) => {
let results = [d.file.link,]
for (let i in keys) {
results.push( d.Habits[keys[i]] ? "🟩" : "⬜️" )
}
return results
}
// Dataview Array of tracked habits in reverse chronological order
let tabledata = dv.pages('"_Daily/day"')
.sort(d => d.file.name, 'desc')
.filter(d => d.Habits && dv.date(d.file.name) < moment())
.map(d => dayResults(d))
// Return array with current streak total for each habit
let streaks = (d) => {
let x = {...keys}
let t = 0
let tableArray = d.array()
let totals = []
for (let i in x) {
let t = 0
for (let j = 0; j < tableArray.length; j++) {
if (tableArray[j][parseInt(i) + 1] === "🟩") {
t = t + 1
}
else {
if (j > 0) {
break;
}
}
}
totals.push(t)
}
return totals
}
// Output a dv table of 10 most recent days habits
dv.table(
["Day", ...prettifyHeading(keys)],
[["Streaks",...streaks(tabledata)],...tabledata.slice(0, 10)]
)
Created
February 11, 2022 12:21
-
-
Save szuc/8820638f648b47ac97190856a2eedef0 to your computer and use it in GitHub Desktop.
Create a daily Habit Tracking visualization in Obsidian based on front matter in the daily notes
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment