Files
Obsidian_Informatik/Templates/Progress template with date.md
T

2.3 KiB

<%* const title = await tp.system.prompt("What is the list for?"); const taskCount = Number(await tp.system.prompt("How many tasks total?")); const completedCount = Number(await tp.system.prompt("How many already completed?")); const dueDateStr = await tp.system.prompt("Due date (YYYY-MM-DD)");

const tag = title.toLowerCase().replace(/\s+/g, "-");

function formatDate(date) { return date.getFullYear() + "-" + String(date.getMonth() + 1).padStart(2, "0") + "-" + String(date.getDate()).padStart(2, "0"); }

tR += # ${title}\n\n;

// Dynamic dashboard tR += "```dataviewjs\n"; tR += "const tasks = dv.current().file.tasks;\n"; tR += const filtered = tasks.where(t => t.text.includes("#${tag}"));\n\n; tR += "const total = filtered.length;\n"; tR += "const completed = filtered.where(t => t.completed).length;\n"; tR += "const remaining = total - completed;\n\n"; tR += const due = new Date("${dueDateStr}");\n; tR += "const today = new Date();\n"; tR += "today.setHours(0,0,0,0);\n"; tR += "due.setHours(0,0,0,0);\n"; tR += "const days = Math.max(1, Math.ceil((due - today) / (1000 * 60 * 60 * 24)) + 1);\n\n";

tR += "dv.paragraph(Tasks: ${total});\n"; tR += "dv.paragraph(Completed: ${completed});\n"; tR += "dv.paragraph(Remaining: ${remaining});\n"; tR += "dv.paragraph(Days left: ${days});\n"; tR += "dv.paragraph(Tasks per day: ${Math.ceil(remaining / days)});\n"; tR += "```\n\n";

const today = new Date(); today.setHours(0, 0, 0, 0);

const dueDate = new Date(dueDateStr); dueDate.setHours(0, 0, 0, 0);

const daysLeft = Math.max( 1, Math.ceil((dueDate - today) / (1000 * 60 * 60 * 24)) + 1 );

const remainingTasks = taskCount - completedCount;

const base = Math.floor(remainingTasks / daysLeft); const remainder = remainingTasks % daysLeft;

// Completed tasks first for (let i = 1; i <= completedCount; i++) { tR += - [x] ${title} ${i} #${tag}\n; }

// Remaining tasks distributed across days let task = completedCount + 1;

for (let day = 0; day < daysLeft; day++) { const tasksToday = base + (day < remainder ? 1 : 0);

const date = new Date(today);
date.setDate(today.getDate() + day);

const dateStr = formatDate(date);

for (let i = 0; i < tasksToday; i++) {
    tR += `- [ ] ${title} ${task} 📅 ${dateStr} #${tag}\n`;
    task++;
}

} %>