const goalPages = dv.pages("#process/goal"); let goals = new Set(); let activeProjects = new Set(); for(let goalPage of goalPages) { const projects = goalPage.file.inlinks.where((p) => { const mp = dv.page(p.path); return mp.tags?.includes("process/project"); }); const aufgaben = projects.values.map((p) => { const mp = dv.page(p); return mp.file.inlinks.where((t) => { const mt = dv.page(t.path); return mt.tags?.includes("process/task"); }) }); let totalTasksInTasks = 0; const totalTasksGoalPage = goalPage.file.tasks.length; const totalTasksInProjects = projects.values.reduce((acc, p) => { const mp = dv.page(p.path); const aufgaben = mp.file.inlinks.where((t) => { const mt = dv.page(t.path); return mt.tags?.includes("process/task"); }); totalTasksInTasks += aufgaben.values.reduce((act, t) => { const mt = dv.page(t.path); return act + mt.file.tasks.length; }, 0); return acc + mp.file.tasks.length; }, 0); let finishedTasksInTasks = 0; const finishedTasksGoalPage = goalPage.file.tasks.where( (t) => t.fullyCompleted === true ).length; const finishedTasksInProjects = projects.values.reduce((acc, p) => { const mp = dv.page(p.path); const aufgaben = mp.file.inlinks.where((t) => { const mt = dv.page(t.path); return mt.tags?.includes("process/task"); }); finishedTasksInTasks += aufgaben.values.reduce((act, t) => { const mt = dv.page(t.path); return act + mt.file.tasks.where((t) => t.fullyCompleted === true).length; }, 0); return acc + mp.file.tasks.where((t) => t.fullyCompleted === true).length; }, 0); const Target = totalTasksGoalPage + totalTasksInProjects + totalTasksInTasks; const Progress = finishedTasksGoalPage + finishedTasksInProjects + finishedTasksInTasks; const containerEl = createDiv(); const align = input?.alignLeft ? "left" : "center"; Object.assign(containerEl.style, { display: "flex", "flex-direction": "column", "align-items": align, "justify-content": "center", }); const max = Target || 0; const value = Progress || 0; const percent = Math.round((value / max) * 100) || 0; const progressBar = containerEl.createEl("progress"); Object.assign(progressBar, { max, value }); const progressText = containerEl.createEl("div"); Object.assign(progressText, { textContent: `${percent}% completed`, }); if (max > 0 && max != value) { goals.add([goalPage.file.link, dv.paragraph(containerEl.innerHTML), value, max, goalPage.Projects]); } } dv.table(["Title", "Bar", "Progress", "Target", "Projects"], Array.from(goals));