144 lines
3.3 KiB
JavaScript
144 lines
3.3 KiB
JavaScript
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 doneSymb = 'completion:: ';
|
|
//let dString = `${doneSymb} ${dates[i]}`;
|
|
let dString = `completion:: ${dates[i]}`;
|
|
let tasks = dv.pages(projectFolder).file.tasks.where(t => t.completed).where(t => t.text.includes(dString));
|
|
//let tasks = dv.pages(projectFolder).file.tasks.where(t => t.completion = dates[i]);
|
|
|
|
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);
|
|
}
|