Last active
August 6, 2024 09:58
-
-
Save WebInspectInc/bf3f26e95899eb91782068d974ffa23e to your computer and use it in GitHub Desktop.
A small script for creating task completion graphs in Obsidian. See how to use this here: https://obsidian.rocks/plotting-task-completions-with-dataviewjs-and-obsidian-charts/
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const dateformat = "YYYY-MM-DD"; | |
const monthformat = "YYYY-MM"; | |
const yearformat = "YYYY"; | |
const days = parseInt(dv.current().days); | |
const months = parseInt(dv.current().months); | |
const years = parseInt(dv.current().years); | |
const projectFolder = dv.current().projectfolder || ''; | |
const graphColor = dv.current().lineColor || '#de454e'; | |
const charts = []; | |
if (!(days || months || years)) { | |
dv.el('strong', 'Task Graphs: to generate graphs, please add days, months, or years (or all three!) in your file properties.'); | |
} | |
function getDailyTasks(numDays) { | |
let dates = createArrayOfDates('days', dateformat, numDays); | |
return countTasks(dates); | |
} | |
function getMonthlyTasks(numMonths) { | |
let dates = createArrayOfDates('months', monthformat, numMonths); | |
return countTasks(dates); | |
} | |
function getYearlyTasks(numYears) { | |
let dates = createArrayOfDates('years', yearformat, numYears); | |
return countTasks(dates); | |
} | |
function createArrayOfDates(range, format, num) { | |
const start = moment().add(1, range).startOf('day'); | |
let dates = [...Array(num)]; | |
console.log(dates); | |
return dates.map(() => start.subtract(1, range).format(format).toString()); | |
} | |
function countTasks(dates) { | |
var taskAmounts = []; | |
var taskLabels = [] | |
for (let i = dates.length - 1;i>=0;i--) { | |
let doneSymb = '✅'; | |
let dString = `${doneSymb} ${dates[i]}`; | |
let tasks = dv.pages(projectFolder).file.tasks.where(t => t.text.includes(dString)); | |
taskLabels.push(dates[i]); | |
taskAmounts.push(tasks.length); | |
} | |
return { amounts: taskAmounts, labels: taskLabels }; | |
} | |
if (days) { | |
const dailyTasks = getDailyTasks(days); | |
charts.dayChart = { | |
type: 'line', | |
data: { | |
labels: dailyTasks.labels, | |
datasets: [{ | |
label: 'Daily completed tasks', | |
data: dailyTasks.amounts, | |
backgroundColor: [ | |
graphColor | |
], | |
borderColor: [ | |
graphColor | |
], | |
borderWidth: 1 | |
}] | |
} | |
} | |
} | |
if (months) { | |
const monthlyTasks = getMonthlyTasks(months); | |
charts.monthChart = { | |
type: 'line', | |
options: { | |
scales: { | |
y: { | |
beginAtZero: true | |
} | |
} | |
}, | |
data: { | |
labels: monthlyTasks.labels, | |
datasets: [{ | |
tension: 0.1, | |
label: 'Monthly completed tasks', | |
data: monthlyTasks.amounts, | |
backgroundColor: [ | |
graphColor | |
], | |
borderColor: [ | |
graphColor | |
], | |
borderWidth: 1 | |
}] | |
} | |
} | |
} | |
if (years) { | |
const yearlyTasks = getYearlyTasks(years); | |
charts.yearChart = { | |
type: 'line', | |
options: { | |
scales: { | |
y: { | |
beginAtZero: true | |
} | |
} | |
}, | |
data: { | |
labels: yearlyTasks.labels, | |
datasets: [{ | |
tension: 0.1, | |
label: 'Yearly completed tasks', | |
data: yearlyTasks.amounts, | |
backgroundColor: [ | |
graphColor | |
], | |
borderColor: [ | |
graphColor | |
], | |
borderWidth: 1 | |
}] | |
} | |
} | |
} | |
if (!window.renderChart) { | |
dv.el('strong', 'Task Graphs: Please install and/or enable the Obsidian Charts plugin'); | |
} else if (!input.container) { | |
dv.el('strong', 'Task Graphs: Your include has a syntax error. Please see documentation and supply the correct parameters.') | |
} else { | |
if (days) window.renderChart(charts.dayChart, input.container); | |
if (months) window.renderChart(charts.monthChart, input.container); | |
if (years) window.renderChart(charts.yearChart, input.container); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment