Skip to content

Instantly share code, notes, and snippets.

@szuc
Created February 11, 2022 12:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save szuc/8820638f648b47ac97190856a2eedef0 to your computer and use it in GitHub Desktop.
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
// 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)]
)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment